summaryrefslogtreecommitdiffstats
path: root/PICA_netconf.c
diff options
context:
space:
mode:
authorAnton <anton@picapica>2017-12-29 19:37:48 +0400
committerAnton <anton@picapica>2017-12-29 19:37:48 +0400
commitc99e6b3a859f109d7cc92822ba0daed0b190a8ec (patch)
tree36230fd946ccf76781aac6925d3793888e8c6170 /PICA_netconf.c
parentcaae4bb3a47fddf97b6b28e5e6eea3420c8b255c (diff)
downloadpica-pica-c99e6b3a859f109d7cc92822ba0daed0b190a8ec.tar.gz
pica-pica-c99e6b3a859f109d7cc92822ba0daed0b190a8ec.zip
implemented PICA_guess_listening_addr_ipv4() for *nix using getifaddrs()
Diffstat (limited to 'PICA_netconf.c')
-rw-r--r--PICA_netconf.c44
1 files changed, 44 insertions, 0 deletions
diff --git a/PICA_netconf.c b/PICA_netconf.c
index da48c52..8bf2b4e 100644
--- a/PICA_netconf.c
+++ b/PICA_netconf.c
@@ -8,6 +8,12 @@
#include <stdio.h>
#endif
+#ifndef WIN32
+#include <sys/types.h>
+#include <ifaddrs.h>
+#include <net/if.h>
+#endif
+
#define PREFIX4 htonl(0xf0000000U)
#define PREFIX8 htonl(0xff000000U)
#define PREFIX12 htonl(0xfff00000U)
@@ -34,6 +40,44 @@ int PICA_is_reserved_addr_ipv4(in_addr_t addr)
return 0;
}
+in_addr_t PICA_guess_listening_addr_ipv4()
+{
+ in_addr_t retaddr = INADDR_ANY;
+ int found_global = 0;
+#ifndef WIN32
+ struct ifaddrs *ifaddr, *ifa;
+
+ if (getifaddrs(&ifaddr) == -1)
+ return INADDR_ANY;
+
+ for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next)
+ {
+ if (ifa->ifa_addr == NULL)
+ continue;
+
+ if (ifa->ifa_addr->sa_family != AF_INET)
+ continue;
+
+ if (ifa->ifa_flags & IFF_LOOPBACK)
+ continue;
+
+ if (!((ifa->ifa_flags & IFF_RUNNING) && (ifa->ifa_flags & IFF_UP)))
+ continue;
+
+ if (!found_global)
+ {
+ retaddr = ((struct sockaddr_in*)ifa->ifa_addr)->sin_addr.s_addr;
+
+ if (!PICA_is_reserved_addr_ipv4(retaddr))
+ found_global = 1;
+ }
+ }
+#else
+
+#endif
+ return retaddr;
+}
+
#ifdef HAVE_LIBMINIUPNPC
int PICA_upnp_autoconfigure_ipv4(int public_port, int local_port, char *public_ip)
{