diff '--color=auto' -uNr work.orig/ip_assign.c work/ip_assign.c
--- work.orig/ip_assign.c	2026-04-07 21:30:05.374732873 +0200
+++ work/ip_assign.c	2026-04-07 21:36:29.609991318 +0200
@@ -48,6 +48,7 @@
 #include <sys/ioctl.h>
 #include <stdlib.h>
 #include <unistd.h>
+#include <ifaddrs.h>
 
 
 typedef int SOCKET;
@@ -249,39 +250,29 @@
 #ifndef WIN32
 int GetInterfaces (uint 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);
-
-	cnt = 0;
-	pnt = fgets (ln,sizeof (ln),fp);
-	while (pnt) {
-		i = 0;
-		while (ln[i] == ' ') i++;
-		if (!memcmp (ln+i,"eth",3)) {
-			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;
+	int cnt = 0;
+	int i;
+
+	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 when an address appears multiple times */
+		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);
 }
 #endif
