Files
linamh/app-misc/irtrans-irclient/files/irtrans-irclient-6.01.16-ethernet.patch
2026-04-07 22:23:49 +02:00

71 lines
1.8 KiB
Diff

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