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 #include #include +#include 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); }