mirror of
https://github.com/kenzok8/small-package
synced 2025-01-08 13:27:36 +08:00
148 lines
3.7 KiB
Diff
148 lines
3.7 KiB
Diff
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();
|
|
}
|
|
|
|
/*
|