]>
Commit | Line | Data |
---|---|---|
0bc5d371 MT |
1 | diff -up ppp-2.4.5/pppd/ether.c.inc.eth ppp-2.4.5/pppd/ether.c.inc |
2 | --- ppp-2.4.5/pppd/ether.c.inc.eth 2011-06-01 10:28:35.356139063 +0200 | |
3 | +++ ppp-2.4.5/pppd/ether.c.inc 2011-06-01 11:20:37.876897352 +0200 | |
4 | @@ -0,0 +1,46 @@ | |
5 | +#define PREF_ETH "eth" | |
6 | +#define PREF_EM "em" | |
7 | + | |
8 | +static char *dev_file = "/proc/self/net/dev"; | |
9 | + | |
10 | +/* | |
11 | + * get_first_ethernet - return the name of the first ethernet-style | |
12 | + * interface on this system. | |
13 | + */ | |
14 | +char * | |
15 | +get_first_ethernet() | |
16 | +{ | |
17 | + FILE *f; | |
18 | + char buf[255], *dv, *smc; | |
19 | + char pci[16]; | |
20 | + | |
21 | + memset(pci, 0, sizeof(pci)); | |
22 | + if ((f = fopen(dev_file, "r")) != NULL) | |
23 | + { | |
24 | + // go through network dev file | |
25 | + while (fgets (buf, sizeof(buf), f) != NULL) | |
26 | + { | |
27 | + // the line describes interface | |
28 | + if ((smc = strchr(buf, ':')) != NULL) | |
29 | + { | |
30 | + // trim white characters | |
31 | + for (dv=buf, *smc=0; *dv <= ' '; dv++) ; | |
32 | + // is "eth" (originial ethernet name) or "em" (ethernet on board) | |
33 | + if (!strncmp(dv, PREF_ETH, strlen(PREF_ETH)) || | |
34 | + !strncmp(dv, PREF_EM, strlen(PREF_EM))) | |
35 | + { | |
36 | + return strdup(dv); | |
37 | + } | |
38 | + // remember the first pci NIC-card | |
39 | + if (strlen(pci) == 0 && dv[0] == 'p' && isdigit(dv[1])) | |
40 | + { | |
41 | + strcpy(pci, dv); | |
42 | + } | |
43 | + } | |
44 | + } | |
45 | + fclose(f); | |
46 | + } | |
47 | + // return pci NIC-card or nil if no if name | |
48 | + return strlen(pci) > 0 ? strdup(pci) : 0L; | |
49 | +} | |
50 | + | |
51 | diff -up ppp-2.4.5/pppd/plugins/rp-pppoe/pppoe-discovery.c.eth ppp-2.4.5/pppd/plugins/rp-pppoe/pppoe-discovery.c | |
52 | --- ppp-2.4.5/pppd/plugins/rp-pppoe/pppoe-discovery.c.eth 2011-06-01 09:39:13.099343548 +0200 | |
53 | +++ ppp-2.4.5/pppd/plugins/rp-pppoe/pppoe-discovery.c 2011-06-01 11:41:02.188252304 +0200 | |
54 | @@ -47,6 +47,8 @@ | |
55 | #include <net/if_arp.h> | |
56 | #endif | |
57 | ||
58 | +#include "../../ether.c.inc" | |
59 | + | |
60 | char *xstrdup(const char *s); | |
61 | void usage(void); | |
62 | ||
63 | @@ -686,7 +688,7 @@ int main(int argc, char *argv[]) | |
64 | ||
65 | /* default interface name */ | |
66 | if (!conn->ifName) | |
67 | - conn->ifName = strdup("eth0"); | |
68 | + conn->ifName = get_first_ethernet(); | |
69 | ||
70 | conn->discoverySocket = -1; | |
71 | conn->sessionSocket = -1; | |
72 | diff -up ppp-2.4.5/pppd/sys-linux.c.eth ppp-2.4.5/pppd/sys-linux.c | |
73 | --- ppp-2.4.5/pppd/sys-linux.c.eth 2011-06-01 09:39:13.074343397 +0200 | |
74 | +++ ppp-2.4.5/pppd/sys-linux.c 2011-06-01 11:50:13.736565685 +0200 | |
75 | @@ -144,6 +144,8 @@ | |
76 | #include <sys/locks.h> | |
77 | #endif | |
78 | ||
79 | +#include "ether.c.inc" | |
80 | + | |
81 | #ifdef INET6 | |
82 | #ifndef _LINUX_IN6_H | |
83 | /* | |
84 | @@ -1869,16 +1871,6 @@ get_if_hwaddr(u_char *addr, char *name) | |
85 | return ret; | |
86 | } | |
87 | ||
88 | -/* | |
89 | - * get_first_ethernet - return the name of the first ethernet-style | |
90 | - * interface on this system. | |
91 | - */ | |
92 | -char * | |
93 | -get_first_ethernet() | |
94 | -{ | |
95 | - return "eth0"; | |
96 | -} | |
97 | - | |
98 | /******************************************************************** | |
99 | * | |
100 | * Return user specified netmask, modified by any mask we might determine | |
101 | @@ -2783,6 +2775,7 @@ ether_to_eui64(eui64_t *p_eui64) | |
102 | struct ifreq ifr; | |
103 | int skfd; | |
104 | const unsigned char *ptr; | |
105 | + char warn_msg[80]; | |
106 | ||
107 | skfd = socket_fd(PF_INET6, SOCK_DGRAM, 0); | |
108 | if(skfd == -1) | |
109 | @@ -2791,11 +2784,13 @@ ether_to_eui64(eui64_t *p_eui64) | |
110 | return 0; | |
111 | } | |
112 | ||
113 | - strcpy(ifr.ifr_name, "eth0"); | |
114 | + strcpy(ifr.ifr_name, get_first_ethernet()); | |
115 | if(ioctl(skfd, SIOCGIFHWADDR, &ifr) < 0) | |
116 | { | |
117 | close(skfd); | |
118 | - warn("could not obtain hardware address for eth0"); | |
119 | + snprintf(warn_msg, sizeof(warn_msg), | |
120 | + "could not obtain hardware address for %s", ifr.ifr_name); | |
121 | + warn(warn_msg); | |
122 | return 0; | |
123 | } | |
124 | close(skfd); |