Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/C/VLC/contrib/src/upnp/   (VLC Media Plyer ©)  Datei vom 23.9.2026 mit Größe 7 kB image not shown  

Quelle  revert-ifaddrs.patch  Sprache: unbekannt

 
Spracherkennung für: .patch vermutete Sprache: VDM {VDM[40] SQL[36] Lisp[33]} [Methode: maximale Elemente, drei Dimensionen]

From 1a6b54b37ac16d91d3d75ef1017a6ee5971a855f Mon Sep 17 00:00:00 2001
From: Alaric Senat <dev.asenat@posteo.net>
Date: Tue, 15 Jun 2021 16:29:07 +0200
Subject: [PATCH] Revert "upnpapi.c: assume that getifaddrs is available"

This reverts commit aa0166c9a87a6f02632a0c55fb6174b6a1bf8289.
---
 upnp/src/api/upnpapi.c | 227 ++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 225 insertions(+), 2 deletions(-)

diff --git a/upnp/src/api/upnpapi.c b/upnp/src/api/upnpapi.c
index 2e95bbfc..3d524941 100644
--- a/upnp/src/api/upnpapi.c
+++ b/upnp/src/api/upnpapi.c
@@ -3558,6 +3558,7 @@ int UpnpDownloadXmlDoc(const char *url, IXML_Document **xmlDoc)
  }
 }
 
+#if (defined(BSD) && BSD >= 199306) || defined(__FreeBSD_kernel__)
 /*!
  * \brief Computes prefix length from IPv6 netmask.
  *
@@ -3580,6 +3581,7 @@ static unsigned UpnpComputeIpv6PrefixLength(struct sockaddr_in6 *Netmask)
 
  return prefix_length;
 }
+#endif
 
 int UpnpGetIfInfo(const char *IfName)
 {
@@ -3743,7 +3745,8 @@ int UpnpGetIfInfo(const char *IfName)
  }
  inet_ntop(AF_INET, &v4_addr, gIF_IPV4, sizeof(gIF_IPV4));
  inet_ntop(AF_INET6, &v6_addr, gIF_IPV6, sizeof(gIF_IPV6));
-#else
+#elif (defined(BSD) && BSD >= 199306) || \
+ defined(__FreeBSD_kernel__) /* _WIN32 */

  struct ifaddrs *ifap, *ifa;
  struct in_addr v4_addr = {0};
  struct in_addr v4_netmask = {0};
@@ -3904,7 +3907,227 @@ int UpnpGetIfInfo(const char *IfName)
    gIF_IPV6_ULA_GUA_PREFIX_LENGTH = v6ulagua_prefix;
   }
  }
-#endif
+#else /* (defined(BSD) && BSD >= 199306) || defined(__FreeBSD_kernel__) */ /* _WIN32 */
+ struct ifreq ifArray[MAX_INTERFACES];
+ struct ifconf ifConf;
+ struct ifreq ifReq;
+ FILE *inet6_procfd;
+ int i;
+ int LocalSock;
+ struct in6_addr v6_addr;
+ unsigned if_idx;
+ unsigned if_prefix;
+ char addr6[8][5];
+ char buf[INET6_ADDRSTRLEN];
+ int ifname_found = 0;
+ int valid_addr_found = 0;
+
+ /* Copy interface name, if it was provided. */
+ if (IfName != NULL) {
+  if (strlen(IfName) > sizeof(gIF_NAME))
+   return UPNP_E_INVALID_INTERFACE;
+
+  memset(gIF_NAME, 0, sizeof(gIF_NAME));
+  strncpy(gIF_NAME, IfName, sizeof(gIF_NAME) - 1);
+  ifname_found = 1;
+ }
+ /* Create an unbound datagram socket to do the SIOCGIFADDR ioctl on.  */
+ if ((LocalSock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) ==
+  INVALID_SOCKET) {
+  UpnpPrintf(UPNP_ALL,
+   API,
+   __FILE__,
+   __LINE__,
+   "Can't create addrlist socket\n");
+  return UPNP_E_INIT;
+ }
+ /* Get the interface configuration information...  */
+ ifConf.ifc_len = (int)sizeof ifArray;
+ ifConf.ifc_ifcu.ifcu_buf = (char *)ifArray;
+
+ if (ioctl(LocalSock, SIOCGIFCONF, &ifConf) < 0) {
+  UpnpPrintf(UPNP_ALL,
+   API,
+   __FILE__,
+   __LINE__,
+   "DiscoverInterfaces: SIOCGIFCONF returned error\n");
+  close(LocalSock);
+  return UPNP_E_INIT;
+ }
+ if (ifConf.ifc_len == sizeof ifArray) {
+  UpnpPrintf(UPNP_ALL,
+   API,
+   __FILE__,
+   __LINE__,
+   "DiscoverInterfaces: ifConf.ifc_len == sizeof ifArray, "
+   "an overflow might have occurred, "
+   "operation should be retried with a bigger buffer.\n");
+ }
+ /* Cycle through the list of interfaces looking for IP addresses.  */
+ for (i = 0; i < ifConf.ifc_len; i += (int)(sizeof(struct ifreq))) {
+  struct ifreq *pifReq = (struct ifreq *)(ifConf.ifc_buf + i);
+  /* See if this is the sort of interface we want to deal with. */
+  memset(ifReq.ifr_name, 0, sizeof(ifReq.ifr_name));
+  strncpy(ifReq.ifr_name,
+   pifReq->ifr_name,
+   sizeof(ifReq.ifr_name) - 1);
+  if (ioctl(LocalSock, SIOCGIFFLAGS, &ifReq) < 0) {
+   UpnpPrintf(UPNP_ALL,
+    API,
+    __FILE__,
+    __LINE__,
+    "Can't get interface flags for %s:\n",
+    ifReq.ifr_name);
+  }
+  /* Skip LOOPBACK interfaces, DOWN interfaces and interfaces that
+  * don't support MULTICAST. */

+  if ((ifReq.ifr_flags & IFF_LOOPBACK) ||
+   (!(ifReq.ifr_flags & IFF_UP)) ||
+   (!(ifReq.ifr_flags & IFF_MULTICAST))) {
+   continue;
+  }
+  if (ifname_found == 0) {
+   /* We have found a valid interface name. Keep it. */
+   memset(gIF_NAME, 0, sizeof(gIF_NAME));
+   strncpy(gIF_NAME,
+    pifReq->ifr_name,
+    sizeof(gIF_NAME) - 1);
+   ifname_found = 1;
+  } else {
+   if (strncmp(gIF_NAME,
+        pifReq->ifr_name,
+        sizeof(gIF_NAME)) != 0) {
+    /* This is not the interface we're looking for.
+  */

+    continue;
+   }
+  }
+  /* Check address family. */
+  if (pifReq->ifr_addr.sa_family == AF_INET) {
+   /* Copy interface name, IPv4 address, IPv4 netmask and
+  * interface index. */

+   memset(gIF_NAME, 0, sizeof(gIF_NAME));
+   strncpy(gIF_NAME,
+    pifReq->ifr_name,
+    sizeof(gIF_NAME) - 1);
+   inet_ntop(AF_INET,
+    &((struct sockaddr_in *)&pifReq->ifr_addr)
+      ->sin_addr,
+    gIF_IPV4,
+    sizeof(gIF_IPV4));
+   if (ioctl(LocalSock, SIOCGIFNETMASK, &ifReq) < 0) {
+    UpnpPrintf(UPNP_ALL,
+     API,
+     __FILE__,
+     __LINE__,
+     "Can't get interface netmask for %s:\n",
+     ifReq.ifr_name);
+   }
+   inet_ntop(AF_INET,
+    &((struct sockaddr_in *)&ifReq.ifr_netmask)
+      ->sin_addr,
+    gIF_IPV4_NETMASK,
+    sizeof(gIF_IPV4_NETMASK));
+   gIF_INDEX = if_nametoindex(gIF_NAME);
+   valid_addr_found = 1;
+   break;
+  } else {
+   /* Address is not IPv4 */
+   ifname_found = 0;
+  }
+ }
+ close(LocalSock);
+ /* Failed to find a valid interface, or valid address. */
+ if (ifname_found == 0 || valid_addr_found == 0) {
+  UpnpPrintf(UPNP_CRITICAL,
+   API,
+   __FILE__,
+   __LINE__,
+   "Failed to find an adapter with valid IP addresses for "
+   "use.\n");
+
+  return UPNP_E_INVALID_INTERFACE;
+ }
+ /* Try to get the IPv6 address for the same interface  */
+ /* from "/proc/net/if_inet6", if possible. */
+ inet6_procfd = fopen("/proc/net/if_inet6", "r");
+ if (inet6_procfd) {
+  while (fscanf(inet6_procfd,
+          "%4s%4s%4s%4s%4s%4s%4s%4s %02x %02x %*02x "
+          "%*02x %*20s\n",
+          addr6[0],
+          addr6[1],
+          addr6[2],
+          addr6[3],
+          addr6[4],
+          addr6[5],
+          addr6[6],
+          addr6[7],
+          &if_idx,
+          &if_prefix) != EOF) {
+   /* Get same interface as IPv4 address retrieved. */
+   if (gIF_INDEX == if_idx) {
+    snprintf(buf,
+     sizeof(buf),
+     "%s:%s:%s:%s:%s:%s:%s:%s",
+     addr6[0],
+     addr6[1],
+     addr6[2],
+     addr6[3],
+     addr6[4],
+     addr6[5],
+     addr6[6],
+     addr6[7]);
+    /* Validate formed address and check for
+  * link-local. */

+    if (inet_pton(AF_INET6, buf, &v6_addr) > 0) {
+     if (IN6_IS_ADDR_ULA(&v6_addr)) {
+      /* Got valid IPv6 ula. */
+      memset(gIF_IPV6_ULA_GUA,
+       0,
+       sizeof(gIF_IPV6_ULA_GUA));
+      strncpy(gIF_IPV6_ULA_GUA,
+       buf,
+       sizeof(gIF_IPV6_ULA_GUA) -
+        1);
+      gIF_IPV6_ULA_GUA_PREFIX_LENGTH =
+       if_prefix;
+     } else if (IN6_IS_ADDR_GLOBAL(
+          &v6_addr) &&
+         strlen(gIF_IPV6_ULA_GUA) ==
+          (size_t)0) {
+      /* got a GUA, should store it
+  * while no ULA is found */

+      memset(gIF_IPV6_ULA_GUA,
+       0,
+       sizeof(gIF_IPV6_ULA_GUA));
+      strncpy(gIF_IPV6_ULA_GUA,
+       buf,
+       sizeof(gIF_IPV6_ULA_GUA) -
+        1);
+      gIF_IPV6_ULA_GUA_PREFIX_LENGTH =
+       if_prefix;
+     } else if (IN6_IS_ADDR_LINKLOCAL(
+          &v6_addr) &&
+         strlen(gIF_IPV6) ==
+          (size_t)0) {
+      /* got a Link local IPv6
+  * address. */

+      memset(gIF_IPV6,
+       0,
+       sizeof(gIF_IPV6));
+      strncpy(gIF_IPV6,
+       buf,
+       sizeof(gIF_IPV6) - 1);
+      gIF_IPV6_PREFIX_LENGTH =
+       if_prefix;
+     }
+    }
+   }
+  }
+  fclose(inet6_procfd);
+ }
+#endif /* (defined(BSD) && BSD >= 199306) || defined(__FreeBSD_kernel__) */ /* _WIN32 */
  UpnpPrintf(UPNP_INFO,
   API,
   __FILE__,
-- 
2.31.1


[Dauer der Verarbeitung: 0.5 Sekunden, vorverarbeitet 2026-10-24]