getaddrinfo /etc/services lookup support
authorRich Felker <dalias@aerifal.cx>
Sun, 22 Jul 2012 23:42:44 +0000 (19:42 -0400)
committerRich Felker <dalias@aerifal.cx>
Sun, 22 Jul 2012 23:42:44 +0000 (19:42 -0400)
src/network/getaddrinfo.c

index 93c75160d649a5f1cf141eea3cb45bb5a44a2b3a..d16b6561a51f9f1828340c7146efd74ca5731e2c 100644 (file)
@@ -58,7 +58,6 @@ int getaddrinfo(const char *host, const char *serv, const struct addrinfo *hint,
        union sa sa = {{0}};
        unsigned char reply[1024];
        int i, j;
-       //char hostbuf[256];
        char line[512];
        FILE *f, _f;
        unsigned char _buf[1024];
@@ -79,10 +78,24 @@ int getaddrinfo(const char *host, const char *serv, const struct addrinfo *hint,
                port = strtoul(serv, &z, 10);
                if (!*z && port > 65535) return EAI_SERVICE;
                if (!port) {
+                       size_t servlen = strlen(serv);
+                       char protname[4];
+
                        if (flags & AI_NUMERICSERV) return EAI_SERVICE;
 
-                       //f = fopen("/etc/services", "rb");
-                       return EAI_SERVICE;
+                       f = __fopen_rb_ca("/etc/services", &_f, _buf, sizeof _buf);
+                       if (!f) return EAI_SERVICE;
+                       while (fgets(line, sizeof line, f)) {
+                               if (strncmp(line, serv, servlen))
+                                       continue;
+                               if (sscanf(line+servlen, "%lu/%3s", &port, protname) < 2)
+                                       continue;
+                               if (strcmp(protname, proto==IPPROTO_UDP ? "udp" : "tcp"))
+                                       continue;
+                               break;
+                       }
+                       __fclose_ca(f);
+                       if (feof(f)) return EAI_SERVICE;
                }
                port = htons(port);
        }