2357
|
1 |
--- dlls/iphlpapi/ifenum.c.orig 2010-03-03 03:09:08.782656836 -0800
|
|
2 |
+++ dlls/iphlpapi/ifenum.c 2010-03-03 03:10:13.961076590 -0800
|
|
3 |
@@ -298,7 +298,66 @@
|
|
4 |
return ret;
|
|
5 |
}
|
|
6 |
|
|
7 |
-#if defined (SIOCGIFHWADDR)
|
|
8 |
+#if defined (SIOCGARP)
|
|
9 |
+static DWORD getInterfacePhysicalByName(const char *name, PDWORD len, PBYTE addr,
|
|
10 |
+ PDWORD type)
|
|
11 |
+{
|
|
12 |
+ DWORD ret;
|
|
13 |
+ int fd;
|
|
14 |
+
|
|
15 |
+ if (!name || !len || !addr || !type)
|
|
16 |
+ return ERROR_INVALID_PARAMETER;
|
|
17 |
+
|
|
18 |
+ fd = socket(PF_INET, SOCK_DGRAM, 0);
|
|
19 |
+ if (fd != -1) {
|
|
20 |
+ if (isLoopbackInterface(fd, name)) {
|
|
21 |
+ *type = MIB_IF_TYPE_LOOPBACK;
|
|
22 |
+ memset(addr, 0, *len);
|
|
23 |
+ *len = 0;
|
|
24 |
+ ret=NOERROR;
|
|
25 |
+ }
|
|
26 |
+ else {
|
|
27 |
+ struct arpreq arp;
|
|
28 |
+ struct sockaddr_in *saddr;
|
|
29 |
+ struct ifreq ifr;
|
|
30 |
+
|
|
31 |
+ /* get IP addr */
|
|
32 |
+ lstrcpynA(ifr.ifr_name, name, IFNAMSIZ);
|
|
33 |
+ ioctl(fd, SIOCGIFADDR, &ifr);
|
|
34 |
+ memset(&arp, 0, sizeof(struct arpreq));
|
|
35 |
+ arp.arp_pa.sa_family = AF_INET;
|
|
36 |
+ saddr = (struct sockaddr_in *)&arp; /* proto addr is first member */
|
|
37 |
+ saddr->sin_family = AF_INET;
|
|
38 |
+ memcpy(&saddr->sin_addr.s_addr, ifr.ifr_addr.sa_data + 2, sizeof(DWORD));
|
|
39 |
+ if ((ioctl(fd, SIOCGARP, &arp)))
|
|
40 |
+ ret = ERROR_INVALID_DATA;
|
|
41 |
+ else {
|
|
42 |
+ /* FIXME: heh: who said it was ethernet? */
|
|
43 |
+ int addrLen = ETH_ALEN;
|
|
44 |
+
|
|
45 |
+ if (addrLen > *len) {
|
|
46 |
+ ret = ERROR_INSUFFICIENT_BUFFER;
|
|
47 |
+ *len = addrLen;
|
|
48 |
+ }
|
|
49 |
+ else {
|
|
50 |
+ if (addrLen > 0)
|
|
51 |
+ memcpy(addr, &arp.arp_ha.sa_data[0], addrLen);
|
|
52 |
+ /* zero out remaining bytes for broken implementations */
|
|
53 |
+ memset(addr + addrLen, 0, *len - addrLen);
|
|
54 |
+ *len = addrLen;
|
|
55 |
+ *type = MIB_IF_TYPE_ETHERNET;
|
|
56 |
+ ret = NO_ERROR;
|
|
57 |
+ }
|
|
58 |
+ }
|
|
59 |
+ }
|
|
60 |
+ close(fd);
|
|
61 |
+ }
|
|
62 |
+ else
|
|
63 |
+ ret = ERROR_NO_MORE_FILES;
|
|
64 |
+
|
|
65 |
+ return ret;
|
|
66 |
+}
|
|
67 |
+#elif defined (SIOCGIFHWADDR)
|
|
68 |
static DWORD getInterfacePhysicalByName(const char *name, PDWORD len, PBYTE addr,
|
|
69 |
PDWORD type)
|
|
70 |
{
|
|
71 |
@@ -386,65 +445,6 @@
|
|
72 |
ret = ERROR_NO_MORE_FILES;
|
|
73 |
return ret;
|
|
74 |
}
|
|
75 |
-#elif defined (SIOCGARP)
|
|
76 |
-static DWORD getInterfacePhysicalByName(const char *name, PDWORD len, PBYTE addr,
|
|
77 |
- PDWORD type)
|
|
78 |
-{
|
|
79 |
- DWORD ret;
|
|
80 |
- int fd;
|
|
81 |
-
|
|
82 |
- if (!name || !len || !addr || !type)
|
|
83 |
- return ERROR_INVALID_PARAMETER;
|
|
84 |
-
|
|
85 |
- fd = socket(PF_INET, SOCK_DGRAM, 0);
|
|
86 |
- if (fd != -1) {
|
|
87 |
- if (isLoopbackInterface(fd, name)) {
|
|
88 |
- *type = MIB_IF_TYPE_LOOPBACK;
|
|
89 |
- memset(addr, 0, *len);
|
|
90 |
- *len = 0;
|
|
91 |
- ret=NOERROR;
|
|
92 |
- }
|
|
93 |
- else {
|
|
94 |
- struct arpreq arp;
|
|
95 |
- struct sockaddr_in *saddr;
|
|
96 |
- struct ifreq ifr;
|
|
97 |
-
|
|
98 |
- /* get IP addr */
|
|
99 |
- lstrcpynA(ifr.ifr_name, name, IFNAMSIZ);
|
|
100 |
- ioctl(fd, SIOCGIFADDR, &ifr);
|
|
101 |
- memset(&arp, 0, sizeof(struct arpreq));
|
|
102 |
- arp.arp_pa.sa_family = AF_INET;
|
|
103 |
- saddr = (struct sockaddr_in *)&arp; /* proto addr is first member */
|
|
104 |
- saddr->sin_family = AF_INET;
|
|
105 |
- memcpy(&saddr->sin_addr.s_addr, ifr.ifr_addr.sa_data + 2, sizeof(DWORD));
|
|
106 |
- if ((ioctl(fd, SIOCGARP, &arp)))
|
|
107 |
- ret = ERROR_INVALID_DATA;
|
|
108 |
- else {
|
|
109 |
- /* FIXME: heh: who said it was ethernet? */
|
|
110 |
- int addrLen = ETH_ALEN;
|
|
111 |
-
|
|
112 |
- if (addrLen > *len) {
|
|
113 |
- ret = ERROR_INSUFFICIENT_BUFFER;
|
|
114 |
- *len = addrLen;
|
|
115 |
- }
|
|
116 |
- else {
|
|
117 |
- if (addrLen > 0)
|
|
118 |
- memcpy(addr, &arp.arp_ha.sa_data[0], addrLen);
|
|
119 |
- /* zero out remaining bytes for broken implementations */
|
|
120 |
- memset(addr + addrLen, 0, *len - addrLen);
|
|
121 |
- *len = addrLen;
|
|
122 |
- *type = MIB_IF_TYPE_ETHERNET;
|
|
123 |
- ret = NO_ERROR;
|
|
124 |
- }
|
|
125 |
- }
|
|
126 |
- }
|
|
127 |
- close(fd);
|
|
128 |
- }
|
|
129 |
- else
|
|
130 |
- ret = ERROR_NO_MORE_FILES;
|
|
131 |
-
|
|
132 |
- return ret;
|
|
133 |
-}
|
|
134 |
#elif defined (HAVE_SYS_SYSCTL_H) && defined (HAVE_NET_IF_DL_H)
|
|
135 |
static DWORD getInterfacePhysicalByName(const char *name, PDWORD len, PBYTE addr,
|
|
136 |
PDWORD type)
|