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

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);
}