Update the manpage as well, and some whitespace to make its source more legible.
[tinc] / lib / fake-getnameinfo.c
index 50d0722..796efdf 100644 (file)
@@ -9,58 +9,47 @@
  * that ai_family is AF_INET. Don't use it for another purpose.
  */
 
-#include "config.h"
-
-#include <stdio.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <netdb.h>
-#include <string.h>
-
-#include <system.h>
+#include "system.h"
 
 #include "fake-getnameinfo.h"
 #include "fake-getaddrinfo.h"
 
 #ifndef HAVE_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;
+       if(!host || !hostlen)
+               return 0;
 
-                       strcpy(host, hp->h_name);
-                       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 */