70 lines
1.8 KiB
Diff
70 lines
1.8 KiB
Diff
diff '--color=auto' -uNr work.orig/lanio.c work/lanio.c
|
|
--- work.orig/lanio.c 2026-04-07 21:42:06.177575795 +0200
|
|
+++ work/lanio.c 2026-04-07 21:44:23.040535064 +0200
|
|
@@ -63,6 +63,7 @@
|
|
#include <unistd.h>
|
|
#include <time.h>
|
|
#include <string.h>
|
|
+#include <ifaddrs.h>
|
|
|
|
typedef int DWORD;
|
|
#define closesocket close
|
|
@@ -671,39 +672,29 @@
|
|
|
|
int GetInterfaces (unsigned int ips[])
|
|
{
|
|
- int i,j,cnt;
|
|
- FILE *fp;
|
|
- char *pnt,ln[256];
|
|
+ struct ifaddrs *ifaddr, *ifa;
|
|
struct sockaddr_in *sinp;
|
|
- struct ifreq ifr;
|
|
- int s; /* Socket */
|
|
- char local_ip_addr[16];
|
|
-
|
|
- fp = fopen ("/proc/net/dev","r");
|
|
- if (!fp) return (0);
|
|
- s = socket(AF_INET, SOCK_DGRAM, 0);
|
|
+ int cnt = 0;
|
|
+ int i;
|
|
|
|
- cnt = 0;
|
|
- pnt = fgets (ln,sizeof (ln),fp);
|
|
- while (pnt) {
|
|
- i = 0;
|
|
- while (ln[i] == ' ') i++;
|
|
- if (!memcmp (ln+i,"eth",3) || !memcmp (ln+i,"wlan",4)) {
|
|
- j = i;
|
|
- while ((ln[j] >= '0' && ln[j] <= '9') || (ln[j] >= 'a' && ln[j] <= 'z') || (ln[j] >= 'A' && ln[j] <= 'Z')) j++;
|
|
- ln[j] = 0;
|
|
- memset (&ifr,0,sizeof (ifr));
|
|
- strcpy(ifr.ifr_name, ln+i);
|
|
- ioctl(s, SIOCGIFADDR, &ifr);
|
|
- sinp = (struct sockaddr_in*)&ifr.ifr_addr;
|
|
- ips[cnt++] = sinp->sin_addr.s_addr;
|
|
+ if (getifaddrs(&ifaddr) == -1) return (0);
|
|
+
|
|
+ for (ifa = ifaddr; ifa != NULL && cnt < 32; ifa = ifa->ifa_next) {
|
|
+ if (!ifa->ifa_addr) continue;
|
|
+ if (ifa->ifa_addr->sa_family != AF_INET) continue;
|
|
+ if (!(ifa->ifa_flags & IFF_UP)) continue;
|
|
+ if (ifa->ifa_flags & (IFF_LOOPBACK | IFF_POINTOPOINT)) continue;
|
|
+
|
|
+ sinp = (struct sockaddr_in *)ifa->ifa_addr;
|
|
+
|
|
+ /* avoid duplicates */
|
|
+ for (i = 0; i < cnt; i++) {
|
|
+ if (ips[i] == sinp->sin_addr.s_addr) break;
|
|
}
|
|
- pnt = fgets (ln,sizeof (ln),fp);
|
|
+ if (i == cnt) ips[cnt++] = sinp->sin_addr.s_addr;
|
|
}
|
|
|
|
- close (s);
|
|
- fclose (fp);
|
|
-
|
|
+ freeifaddrs(ifaddr);
|
|
return (cnt);
|
|
}
|
|
|