diff options
Diffstat (limited to 'cpan/dist/Socket6/getnameinfo.c')
| -rw-r--r-- | cpan/dist/Socket6/getnameinfo.c | 39 |
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; } |
