diff -r -U4 ppp-2.4.4/pppd/main.c ppp-2.4.4+ifname/pppd/main.c --- ppp-2.4.4/pppd/main.c 2006-06-04 04:52:50.000000000 +0100 +++ ppp-2.4.4+ifname/pppd/main.c 2009-11-01 11:36:48.000000000 +0000 @@ -735,10 +735,13 @@ void set_ifunit(iskey) int iskey; { - info("Using interface %s%d", PPP_DRV_NAME, ifunit); - slprintf(ifname, sizeof(ifname), "%s%d", PPP_DRV_NAME, ifunit); + if (use_ifname[0] == 0) + slprintf(ifname, sizeof(ifname), "%s%d", PPP_DRV_NAME, ifunit); + else + slprintf(ifname, sizeof(ifname), "%s", use_ifname); + info("Using interface %s", ifname); script_setenv("IFNAME", ifname, iskey); if (iskey) { create_pidfile(getpid()); /* write pid to file */ create_linkpidfile(getpid()); diff -r -U4 ppp-2.4.4/pppd/options.c ppp-2.4.4+ifname/pppd/options.c --- ppp-2.4.4/pppd/options.c 2006-06-18 12:26:00.000000000 +0100 +++ ppp-2.4.4+ifname/pppd/options.c 2009-11-01 11:01:11.000000000 +0000 @@ -109,8 +109,9 @@ int log_to_fd = 1; /* send log messages to this fd too */ bool log_default = 1; /* log_to_fd is default (stdout) */ int maxfail = 10; /* max # of unsuccessful connection attempts */ char linkname[MAXPATHLEN]; /* logical name for link */ +char use_ifname[IFNAMSIZ]; /* physical name for PPP link */ bool tune_kernel; /* may alter kernel settings */ int connect_delay = 1000; /* wait this many ms after connect script */ int req_unit = -1; /* requested interface unit */ bool multilink = 0; /* Enable multilink operation */ @@ -253,8 +254,11 @@ { "linkname", o_string, linkname, "Set logical name for link", OPT_PRIO | OPT_PRIV | OPT_STATIC, NULL, MAXPATHLEN }, + { "ifname", o_string, use_ifname, + "Set physical name for PPP interface", + OPT_PRIO | OPT_PRIV | OPT_STATIC, NULL, IFNAMSIZ }, { "maxfail", o_int, &maxfail, "Maximum number of unsuccessful connection attempts to allow", OPT_PRIO }, diff -r -U4 ppp-2.4.4/pppd/pppd.h ppp-2.4.4+ifname/pppd/pppd.h --- ppp-2.4.4/pppd/pppd.h 2005-08-26 00:59:34.000000000 +0100 +++ ppp-2.4.4+ifname/pppd/pppd.h 2009-11-01 11:19:10.000000000 +0000 @@ -54,8 +54,9 @@ #include /* for MAXPATHLEN and BSD4_4, if defined */ #include /* for u_int32_t, if defined */ #include /* for struct timeval */ #include +#include #include "patchlevel.h" #if defined(__STDC__) #include @@ -307,8 +308,9 @@ extern char *record_file; /* File to record chars sent/received */ extern bool sync_serial; /* Device is synchronous serial device */ extern int maxfail; /* Max # of unsuccessful connection attempts */ extern char linkname[MAXPATHLEN]; /* logical name for link */ +extern char use_ifname[IFNAMSIZ]; /* physical name for PPP interface */ extern bool tune_kernel; /* May alter kernel settings as necessary */ extern int connect_delay; /* Time to delay after connect script */ extern int max_data_rate; /* max bytes/sec through charshunt */ extern int req_unit; /* interface unit number to use */ diff -r -U4 ppp-2.4.4/pppd/sys-linux.c ppp-2.4.4+ifname/pppd/sys-linux.c --- ppp-2.4.4/pppd/sys-linux.c 2005-08-26 23:44:35.000000000 +0100 +++ ppp-2.4.4+ifname/pppd/sys-linux.c 2009-11-01 11:33:02.000000000 +0000 @@ -167,8 +167,12 @@ /* We can get an EIO error on an ioctl if the modem has hung up */ #define ok_error(num) ((num)==EIO) +#if !defined(PPP_DRV_NAME) +#define PPP_DRV_NAME "ppp" +#endif /* !defined(PPP_DRV_NAME) */ + static int tty_disc = N_TTY; /* The TTY discipline */ static int ppp_disc = N_PPP; /* The PPP discpline */ static int initfdflags = -1; /* Initial file descriptor flags for fd */ static int ppp_fd = -1; /* fd which is set to PPP discipline */ @@ -612,9 +616,10 @@ * Assumes new_style_driver. */ static int make_ppp_unit() { - int x, flags; + struct ifreq ifr; + int x, flags, s; if (ppp_dev_fd >= 0) { dbglog("in make_ppp_unit, already had /dev/ppp open?"); close(ppp_dev_fd); @@ -635,8 +640,34 @@ x = ioctl(ppp_dev_fd, PPPIOCNEWUNIT, &ifunit); } if (x < 0) error("Couldn't create new ppp unit: %m"); + + if (use_ifname[0] != 0) { + s = socket(PF_INET, SOCK_DGRAM, 0); + if (s < 0) + s = socket(PF_PACKET, SOCK_DGRAM, 0); + if (s < 0) + s = socket(PF_INET6, SOCK_DGRAM, 0); + if (s < 0) + s = socket(PF_UNIX, SOCK_DGRAM, 0); + if (s >= 0) { + slprintf(ifr.ifr_name, sizeof(ifr.ifr_name), "%s%d", PPP_DRV_NAME, ifunit); + slprintf(ifr.ifr_newname, sizeof(ifr.ifr_newname), "%s", use_ifname); + x = ioctl(s, SIOCSIFNAME, &ifr); + close(s); + } else { + x = s; + } + if (x < 0) { + error("Couldn't rename %s to %s", ifr.ifr_name, ifr.ifr_newname); + close(ppp_dev_fd); + ppp_dev_fd = -1; + } else { + info("Renamed %s to %s", ifr.ifr_name, ifr.ifr_newname); + } + } + return x; } /* diff -r -U4 ppp-2.4.4/pppstats/pppstats.c ppp-2.4.4+ifname/pppstats/pppstats.c --- ppp-2.4.4/pppstats/pppstats.c 2002-11-09 11:24:43.000000000 +0000 +++ ppp-2.4.4+ifname/pppstats/pppstats.c 2009-11-01 15:24:31.000000000 +0000 @@ -505,12 +505,14 @@ usage(); if (argc > 0) interface = argv[0]; +/* if (sscanf(interface, PPP_DRV_NAME "%d", &unit) != 1) { fprintf(stderr, "%s: invalid interface '%s' specified\n", progname, interface); } +*/ #ifndef STREAMS { struct ifreq ifr;