From: George Kashperko <george@znau.edu.ua>

Make mlppp support more generic interface naming other than pppX
Signed-off-by: George Kashperko <george@znau.edu.ua>
---
 pppd/multilink.c |   55 +++++++++++++++++++++++++++++++++------------
 pppd/sys-linux.c |   12 +++++++++
 2 files changed, 53 insertions(+), 14 deletions(-)
--- a/pppd/multilink.c
+++ b/pppd/multilink.c
@@ -35,6 +35,7 @@
 #include <signal.h>
 #include <netinet/in.h>
 #include <unistd.h>
+#include <net/if.h>
 
 #include "pppd.h"
 #include "fsm.h"
@@ -56,7 +57,8 @@ static void iterate_bundle_links(void (*
 
 static int get_default_epdisc(struct epdisc *);
 static int parse_num(char *str, const char *key, int *valp);
-static int owns_unit(TDB_DATA pid, int unit);
+static int parse_str(char *str, const char *key, char *buf, int buflen);
+static int owns_link(TDB_DATA pid, char *ifname);
 
 #define set_ip_epdisc(ep, addr) do {	\
 	ep->length = 4;			\
@@ -197,35 +199,38 @@ mp_join_bundle(void)
 	key.dptr = bundle_id;
 	key.dsize = p - bundle_id;
 	pid = tdb_fetch(pppdb, key);
+
 	if (pid.dptr != NULL) {
+		char tmp[IFNAMSIZ];
+
 		/* bundle ID exists, see if the pppd record exists */
 		rec = tdb_fetch(pppdb, pid);
+
 		if (rec.dptr != NULL && rec.dsize > 0) {
 			/* make sure the string is null-terminated */
 			rec.dptr[rec.dsize-1] = 0;
-			/* parse the interface number */
-			parse_num(rec.dptr, "UNIT=", &unit);
+
 			/* check the pid value */
 			if (!parse_num(rec.dptr, "PPPD_PID=", &pppd_pid)
+			    || !parse_str(rec.dptr, "IFNAME=", tmp, sizeof(tmp))
+			    || !parse_num(rec.dptr, "IFUNIT=", &unit)
 			    || !process_exists(pppd_pid)
-			    || !owns_unit(pid, unit))
+			    || !owns_link(pid, tmp))
 				unit = -1;
 			free(rec.dptr);
 		}
 		free(pid.dptr);
-	}
 
-	if (unit >= 0) {
 		/* attach to existing unit */
-		if (bundle_attach(unit)) {
+		if (unit >= 0 && bundle_attach(unit)) {
 			set_ifunit(0);
 			script_setenv("BUNDLE", bundle_id + 7, 0);
 			make_bundle_links(1);
 			unlock_db();
-			info("Link attached to %s", ifname);
+			info("Link attached to %s", tmp);
 			return 1;
+			/* attach failed because bundle doesn't exist */
 		}
-		/* attach failed because bundle doesn't exist */
 	}
 
 	/* we have to make a new bundle */
@@ -405,20 +410,39 @@ parse_num(char *str, const char *key, in
 	return 0;
 }
 
+static int
+parse_str(char *str, const char *key, char *buf, int buflen)
+{
+	char *p, *endp;
+	int i;
+
+	p = strstr(str, key);
+	if (p) {
+		p += strlen(key);
+		while (--buflen && *p != 0 && *p != ';')
+			*(buf++) = *(p++);
+		*buf = 0;
+		return 1;
+	}
+	return 0;
+}
+
 /*
- * Check whether the pppd identified by `key' still owns ppp unit `unit'.
+ * Check whether the pppd identified by `key' still owns ppp link `ifname'.
  */
 static int
-owns_unit(TDB_DATA key, int unit)
+owns_link(TDB_DATA key, char *ifname)
 {
-	char ifkey[32];
+	char ifkey[7 + IFNAMSIZ];
 	TDB_DATA kd, vd;
 	int ret = 0;
 
-	slprintf(ifkey, sizeof(ifkey), "UNIT=%d", unit);
+	slprintf(ifkey, sizeof(ifkey), "IFNAME=%s", ifname);
+
 	kd.dptr = ifkey;
 	kd.dsize = strlen(ifkey);
 	vd = tdb_fetch(pppdb, kd);
+
 	if (vd.dptr != NULL) {
 		ret = vd.dsize == key.dsize
 			&& memcmp(vd.dptr, key.dptr, vd.dsize) == 0;
--- a/pppd/sys-linux.c
+++ b/pppd/sys-linux.c
@@ -706,6 +706,16 @@ void cfg_bundle(int mrru, int mtru, int
 	add_fd(ppp_dev_fd);
 }
 
+static void
+setenv_ifunit(void)
+{
+#ifdef USE_TDB
+	char tmp[11];
+	slprintf(tmp, sizeof(tmp), "%d", ifunit);
+	script_setenv("IFUNIT", tmp, 0);
+#endif
+}
+
 /*
  * make_new_bundle - create a new PPP unit (i.e. a bundle)
  * and connect our channel to it.  This should only get called
@@ -724,6 +734,8 @@ void make_new_bundle(int mrru, int mtru,
 
 	/* set the mrru and flags */
 	cfg_bundle(mrru, mtru, rssn, tssn);
+
+	setenv_ifunit();
 }
 
 /*
