* that ai_family is AF_INET. Don't use it for another purpose.
*/
-#include "config.h"
-
-#include <sys/types.h>
-#include <netinet/in.h>
-#include <sys/socket.h>
-#include <netdb.h>
-#include <string.h>
-
-#include <system.h>
+#include "system.h"
#include "fake-getnameinfo.h"
+#include "fake-getaddrinfo.h"
-#ifndef HAVE_GETNAMEINFO
+#if !HAVE_DECL_GETNAMEINFO
-int getnameinfo(const struct sockaddr *sa, size_t salen, char *host,
- size_t hostlen, char *serv, size_t servlen, int flags)
+int getnameinfo(const struct sockaddr *sa, size_t salen, char *host, size_t hostlen, char *serv, size_t servlen, int flags)
{
struct sockaddr_in *sin = (struct sockaddr_in *)sa;
struct hostent *hp;
- char tmpserv[16];
+ int len;
- if (serv) {
- snprintf(tmpserv, sizeof(tmpserv), "%d", ntohs(sin->sin_port));
- if (strlen(tmpserv) >= servlen)
+ if(sa->sa_family != AF_INET)
+ return EAI_FAMILY;
+
+ if(serv && servlen) {
+ len = snprintf(serv, servlen, "%d", ntohs(sin->sin_port));
+ if(len < 0 || len >= servlen)
return EAI_MEMORY;
- else
- strcpy(serv, tmpserv);
}
- if (host) {
- if (flags & NI_NUMERICHOST) {
- if (strlen(inet_ntoa(sin->sin_addr)) >= hostlen)
- return EAI_MEMORY;
-
- strcpy(host, inet_ntoa(sin->sin_addr));
- return 0;
- } else {
- hp = gethostbyaddr((char *)&sin->sin_addr,
- sizeof(struct in_addr), AF_INET);
- if (hp == NULL)
- return EAI_NODATA;
-
- if (strlen(hp->h_name) >= hostlen)
- return EAI_MEMORY;
-
- strcpy(host, hp->h_name);
- return 0;
- }
+ if(!host || !hostlen)
+ return 0;
+
+ if(flags & NI_NUMERICHOST) {
+ len = snprintf(host, hostlen, "%s", inet_ntoa(sin->sin_addr));
+ if(len < 0 || len >= hostlen)
+ return EAI_MEMORY;
+ return 0;
}
+
+ hp = gethostbyaddr((char *)&sin->sin_addr, sizeof(struct in_addr), AF_INET);
+
+ if(!hp || !hp->h_name || !hp->h_name[0])
+ return EAI_NODATA;
+
+ len = snprintf(host, hostlen, "%s", hp->h_name);
+ if(len < 0 || len >= hostlen)
+ return EAI_MEMORY;
+
return 0;
}
#endif /* !HAVE_GETNAMEINFO */