summaryrefslogtreecommitdiff
path: root/cpan/dist/Socket6/getnameinfo.c
diff options
context:
space:
mode:
Diffstat (limited to 'cpan/dist/Socket6/getnameinfo.c')
-rw-r--r--cpan/dist/Socket6/getnameinfo.c39
1 files changed, 27 insertions, 12 deletions
diff --git a/cpan/dist/Socket6/getnameinfo.c b/cpan/dist/Socket6/getnameinfo.c
index f06236d8..3e264c74 100644
--- a/cpan/dist/Socket6/getnameinfo.c
+++ b/cpan/dist/Socket6/getnameinfo.c
@@ -1,6 +1,6 @@
/*
* Mar 8, 2000 by Hajimu UMEMOTO <ume@mahoroba.org>
- * $Id: getnameinfo.c,v 1.3 2000/03/09 19:31:23 ume Exp $
+ * $Id: getnameinfo.c,v 1.8 2004/01/04 10:13:44 ume Exp $
*
* This module is besed on ssh-1.2.27-IPv6-1.5 written by
* KIKUCHI Takahiro <kick@kyoto.wide.ad.jp>
@@ -22,8 +22,12 @@
#include <string.h>
#include "gai.h"
+#ifndef HAVE_SOCKLEN_T
+typedef unsigned int socklen_t;
+#endif /* HAVE_SOCKLEN_T */
+
int
-getnameinfo(const struct sockaddr *sa, size_t salen,
+getnameinfo(const struct sockaddr *sa, socklen_t salen,
char *host, size_t hostlen, char *serv, size_t servlen, int flags)
{
struct sockaddr_in *sin = (struct sockaddr_in *)sa;
@@ -31,30 +35,41 @@ getnameinfo(const struct sockaddr *sa, size_t salen,
char tmpserv[16];
if (serv) {
- sprintf(tmpserv, "%d", ntohs(sin->sin_port));
+ snprintf(tmpserv, sizeof(tmpserv), "%d", ntohs(sin->sin_port));
if (strlen(tmpserv) > servlen)
return EAI_MEMORY;
else
strcpy(serv, tmpserv);
}
- if (host)
- if (flags & NI_NUMERICHOST)
- if (strlen(inet_ntoa(sin->sin_addr)) > hostlen)
+ if (host) {
+ if (flags & NI_NUMERICHOST) {
+ if (flags & NI_NAMEREQD)
+ return EAI_NONAME;
+ if (strlen(inet_ntoa(sin->sin_addr)) >= hostlen)
return EAI_MEMORY;
else {
strcpy(host, inet_ntoa(sin->sin_addr));
return 0;
}
- else
- if (hp = gethostbyaddr((char *)&sin->sin_addr,
- sizeof(struct in_addr), AF_INET))
- if (strlen(hp->h_name) > hostlen)
+ } else {
+ hp = gethostbyaddr((char *)&sin->sin_addr,
+ sizeof(struct in_addr), AF_INET);
+ if (hp)
+ if (strlen(hp->h_name) >= hostlen)
return EAI_MEMORY;
else {
strcpy(host, hp->h_name);
return 0;
}
- else
- return EAI_NODATA;
+ else if (flags & NI_NAMEREQD)
+ return EAI_NONAME;
+ else if (strlen(inet_ntoa(sin->sin_addr)) >= hostlen)
+ return EAI_MEMORY;
+ else {
+ strcpy(host, inet_ntoa(sin->sin_addr));
+ return 0;
+ }
+ }
+ }
return 0;
}