about summary refs log tree commit diff
path: root/src/network
diff options
context:
space:
mode:
Diffstat (limited to 'src/network')
-rw-r--r--src/network/getaddrinfo.c19
1 files changed, 16 insertions, 3 deletions
diff --git a/src/network/getaddrinfo.c b/src/network/getaddrinfo.c
index 93c75160..d16b6561 100644
--- a/src/network/getaddrinfo.c
+++ b/src/network/getaddrinfo.c
@@ -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);
 	}