/*
- * 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>
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;
- struct addrinfo hints = {
-#ifndef WANT_IPV6 /* only accept v4 addresses */
- .ai_family = AF_INET,
+ struct addrinfo hints;
+
+ 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
- .ai_flags = AI_NUMERICHOST
- };
- if (ip_str == NULL)
- hints.ai_flags |= AI_PASSIVE;
+ /* some getaddrinfo implementations require that ai_socktype is set. */
+ hints.ai_socktype = SOCK_STREAM;
/* silly, but ngircd stores UINT16 in server config, not string */
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;
freeaddrinfo(res0);
return ret == 0;
#else /* HAVE_GETADDRINFO */
- if (ip_str == NULL)
- ip_str = "0.0.0.0";
+ 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)
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);
}