]> arthur.barton.de Git - ngircd-alex.git/blobdiff - src/ipaddr/ng_ipaddr.c
Test suite/platformtest.sh: Detect when tests have been skipped
[ngircd-alex.git] / src / ipaddr / ng_ipaddr.c
index b412cc83af6e2789b03b2e34f7b74b4c962f8f1c..37f75b6de919f64d7ddbdfb9ac24a5b3d0e51a75 100644 (file)
@@ -1,11 +1,14 @@
 /*
- * Functions for AF_ agnostic ipv4/ipv6 handling.
- *
  * (c) 2008 Florian Westphal <fw@strlen.de>, public domain.
  */
 
 #include "portab.h"
 
+/**
+ * @file
+ * Functions for AF_ agnostic ipv4/ipv6 handling.
+ */
+
 #include <assert.h>
 #include <stdio.h>
 #include <string.h>
@@ -20,7 +23,7 @@
 GLOBAL bool
 ng_ipaddr_init(ng_ipaddr_t *addr, const char *ip_str, UINT16 port)
 {
-#ifdef HAVE_GETADDRINFO
+#ifdef HAVE_WORKING_GETADDRINFO
        int ret;
        char portstr[64];
        struct addrinfo *res0;
@@ -29,7 +32,12 @@ ng_ipaddr_init(ng_ipaddr_t *addr, const char *ip_str, UINT16 port)
        assert(ip_str);
 
        memset(&hints, 0, sizeof(hints));
+#ifdef AI_NUMERICHOST
        hints.ai_flags = AI_NUMERICHOST;
+#endif
+#ifndef WANT_IPV6      /* do not convert ipv6 addresses */
+       hints.ai_family = AF_INET;
+#endif
 
        /* some getaddrinfo implementations require that ai_socktype is set. */
        hints.ai_socktype = SOCK_STREAM;
@@ -38,12 +46,11 @@ ng_ipaddr_init(ng_ipaddr_t *addr, const char *ip_str, UINT16 port)
        snprintf(portstr, sizeof(portstr), "%u", (unsigned int) port);
 
        ret = getaddrinfo(ip_str, portstr, &hints, &res0);
-       assert(ret == 0);
        if (ret != 0)
                return false;
 
-       assert(sizeof(*addr) >= res0->ai_addrlen);
-       if (sizeof(*addr) >= res0->ai_addrlen)
+       assert(sizeof(*addr) >= (size_t)res0->ai_addrlen);
+       if (sizeof(*addr) >= (size_t)res0->ai_addrlen)
                memcpy(addr, res0->ai_addr, res0->ai_addrlen);
        else
                ret = -1;
@@ -51,6 +58,10 @@ ng_ipaddr_init(ng_ipaddr_t *addr, const char *ip_str, UINT16 port)
        return ret == 0;
 #else /* HAVE_GETADDRINFO */
        assert(ip_str);
+       memset(addr, 0, sizeof *addr);
+#ifdef HAVE_sockaddr_in_len
+       addr->sin4.sin_len = sizeof(addr->sin4);
+#endif
        addr->sin4.sin_family = AF_INET;
 # ifdef HAVE_INET_ATON
        if (inet_aton(ip_str, &addr->sin4.sin_addr) == 0)
@@ -151,7 +162,8 @@ ng_ipaddr_tostr_r(const ng_ipaddr_t *addr, char *str)
        if (*str == ':') {
                char tmp[NG_INET_ADDRSTRLEN] = "0";
                ret = getnameinfo(sa, ng_ipaddr_salen(addr),
-                               tmp+1, sizeof(tmp) -1, NULL, 0, NI_NUMERICHOST);
+                                 tmp + 1, (socklen_t)sizeof(tmp) - 1,
+                                 NULL, 0, NI_NUMERICHOST);
                if (ret == 0)
                        strlcpy(str, tmp, NG_INET_ADDRSTRLEN);
        }