diff options
| -rw-r--r-- | src/network/getaddrinfo.c | 19 | 
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);  	} | 
