Fixed some bugs in the unix version and added many more options
authorPat Thoyts <patthoyts@users.sourceforge.net>
Wed, 24 Jun 2009 19:47:59 +0000 (20:47 +0100)
committerPat Thoyts <patthoyts@users.sourceforge.net>
Wed, 24 Jun 2009 19:47:59 +0000 (20:47 +0100)
unix/tcl_resolv.c

index ed1e98898122b5dc1c68f49f84f2748042e3d3e6..f65f960880e99a80728d2a797b25e990f2c6c9f1 100644 (file)
 #include <ctype.h>
 
 static int
-Resolv(const char *hostname, int ai_family, int ai_flags)
+Resolv(const char *node, int ai_socktype, int ai_family, int ai_flags)
 {
     struct addrinfo hints;
     struct addrinfo *res, *resPtr;
     int r = 0;
+    const char *service = NULL;
 
-    memset(&hints, sizeof(hints), 0);
+    memset(&hints, 0, sizeof(hints));
+    hints.ai_socktype = ai_socktype;
     hints.ai_family = ai_family;
     hints.ai_flags = ai_flags;
-    hints.ai_socktype = 0;
 
-    if (ai_flags | AI_PASSIVE && strlen(hostname) == 0) hostname = NULL;
+    if ((ai_flags & AI_PASSIVE) && strlen(node) == 0) {
+        node = NULL;
+        service = "0";
+        hints.ai_flags |= AI_NUMERICSERV;
+    }
     
-    r = getaddrinfo(hostname, "", &hints, &res);
+    r = getaddrinfo(node, service, &hints, &res);
     if (r) {
         printf("error: ");
         printf(gai_strerror(r));
@@ -60,7 +65,8 @@ int
 main(int argc, char *const argv[])
 {
     int ai_family = PF_UNSPEC;
-    int ai_flags = AI_CANONNAME;
+    int ai_flags = 0;
+    int ai_socktype = SOCK_STREAM;
     int n;
 
     for (n = 1; n < argc; ++n) {
@@ -69,18 +75,29 @@ main(int argc, char *const argv[])
         } else if (strncmp("-6", argv[n], 2) == 0) {
             ai_family = PF_INET6;
         } else if (strncmp("-passive", argv[n], 8) == 0) {
-            ai_flags = AI_PASSIVE;
+            ai_flags |= AI_PASSIVE;
+        } else if (strncmp("-canon", argv[n], 6) == 0) {
+            ai_flags |= AI_CANONNAME;
+        } else if (strncmp("-addrconfig", argv[n], 11) == 0) {
+            ai_flags |= AI_ADDRCONFIG;
+        } else if (strncmp("-v4mapped", argv[n], 9) == 0) {
+            ai_flags |= AI_V4MAPPED;
+        } else if (strncmp("-all", argv[n], 4) == 0) {
+            ai_flags |= AI_ALL | AI_V4MAPPED;
+        } else if (strncmp("-dgram", argv[n], 6) == 0) {
+            ai_socktype = SOCK_DGRAM;
         } else {
-            fprintf(stderr, "usage: tcl_resolv ?-4? ?-6?\n");
+            fprintf(stderr, "usage: tcl_resolv ?-4? ?-6? ?-passive?"
+                    " ?-canon? ?-addrconfig? ?-v4mapped? ?-all? ?-dgram?\n");
             return 2;
         }
     }
 
     while (1) {
-        char buffer [NI_MAXHOST + 1];
+        char buffer [NI_MAXHOST];
         char *host, *p;
 
-        host = fgets(buffer, sizeof(buffer), stdin);
+        host = fgets(buffer, sizeof(buffer)-1, stdin);
         if (host == NULL)
             break;
         
@@ -92,7 +109,7 @@ main(int argc, char *const argv[])
             --p;
         *++p = 0;
 
-        Resolv(host, ai_family, ai_flags);
+        Resolv(host, ai_socktype, ai_family, ai_flags);
     }
     return 0;
 }