--- sa.c 2003/01/06 13:11:23 1.73
+++ sa.c 2003/02/07 20:47:51 1.74
@@ -252,6 +252,7 @@
((tv).tv_sec == 0 && (tv).tv_usec == 0)
/* convert Internet address from presentation to network format */
+#ifndef HAVE_GETADDRINFO
static int sa_inet_pton(int family, const char *strptr, void *addrptr)
{
#ifdef HAVE_INET_PTON
@@ -278,6 +279,7 @@
return 0;
#endif
}
+#endif /* !HAVE_GETADDRINFO */
/* convert Internet address from network to presentation format */
static const char *sa_inet_ntop(int family, const void *src, char *dst, size_t size)
@@ -481,13 +483,19 @@
socklen_t sl;
struct sockaddr *sa;
struct sockaddr_un un;
+#ifdef HAVE_GETADDRINFO
+ struct addrinfo ai_hints;
+ struct addrinfo *ai = NULL;
+ int err;
+#else
struct sockaddr_in sa4;
#ifdef AF_INET6
struct sockaddr_in6 sa6;
#endif
- int bIPv6;
struct hostent *he;
+#endif
struct servent *se;
+ int bIPv6;
int bNumeric;
char *cpHost;
char *cpPort;
@@ -598,6 +606,28 @@
nPort = ntohs(se->s_port);
}
+#ifdef HAVE_GETADDRINFO
+ memset(&ai_hints, 0, sizeof(ai_hints));
+ ai_hints.ai_family = PF_UNSPEC;
+ if ((err = getaddrinfo(cpHost, NULL, &ai_hints, &ai)) != 0) {
+ if (err == EAI_MEMORY)
+ return SA_RC(SA_ERR_MEM);
+ else if (err == EAI_SYSTEM)
+ return SA_RC(SA_ERR_SYS);
+ else
+ return SA_RC(SA_ERR_ARG);
+ }
+ sa = ai->ai_addr;
+ sl = ai->ai_addrlen;
+ sf = ai->ai_family;
+ if (sf == AF_INET)
+ ((struct sockaddr_in *)sa)->sin_port = htons(nPort);
+ else if (sf == AF_INET6)
+ ((struct sockaddr_in6 *)sa)->sin6_port = htons(nPort);
+ else
+ return SA_RC(SA_ERR_ARG);
+#else /* !HAVE_GETADDRINFO */
+
/* mandatory(!) socket address structure initialization */
memset(&sa4, 0, sizeof(sa4));
#ifdef AF_INET6
@@ -648,6 +678,7 @@
}
else
return SA_RC(SA_ERR_ARG);
+#endif /* !HAVE_GETADDRINFO */
}
else
return SA_RC(SA_ERR_ARG);
@@ -661,6 +692,11 @@
saa->slBuf = sl;
saa->nFamily = (int)sf;
+#ifdef HAVE_GETADDRINFO
+ if (ai != NULL)
+ freeaddrinfo(ai);
+#endif
+
return SA_OK;
}
|