about summary refs log tree commit diff
path: root/src/network/getaddrinfo.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/network/getaddrinfo.c')
-rw-r--r--src/network/getaddrinfo.c34
1 files changed, 4 insertions, 30 deletions
diff --git a/src/network/getaddrinfo.c b/src/network/getaddrinfo.c
index d9913445..c88d558c 100644
--- a/src/network/getaddrinfo.c
+++ b/src/network/getaddrinfo.c
@@ -11,7 +11,7 @@ int getaddrinfo(const char *restrict host, const char *restrict serv, const stru
 	struct address addrs[MAXADDRS];
 	char canon[256], *outcanon;
 	int nservs, naddrs, nais, canon_len, i, j, k;
-	int family = AF_UNSPEC, flags = 0, proto = 0;
+	int family = AF_UNSPEC, flags = 0, proto = 0, socktype = 0;
 	struct aibuf {
 		struct addrinfo ai;
 		union sa {
@@ -24,6 +24,7 @@ int getaddrinfo(const char *restrict host, const char *restrict serv, const stru
 		family = hint->ai_family;
 		flags = hint->ai_flags;
 		proto = hint->ai_protocol;
+		socktype = hint->ai_socktype;
 
 		const int mask = AI_PASSIVE | AI_CANONNAME | AI_NUMERICHOST |
 			AI_V4MAPPED | AI_ALL | AI_ADDRCONFIG | AI_NUMERICSERV;
@@ -38,35 +39,9 @@ int getaddrinfo(const char *restrict host, const char *restrict serv, const stru
 		default:
 			return EAI_FAMILY;
 		}
-
-		switch (hint->ai_socktype) {
-		case SOCK_STREAM:
-			switch (proto) {
-			case 0:
-				proto = IPPROTO_TCP;
-			case IPPROTO_TCP:
-				break;
-			default:
-				return EAI_SERVICE;
-			}
-			break;
-		case SOCK_DGRAM:
-			switch (proto) {
-			case 0:
-				proto = IPPROTO_UDP;
-			case IPPROTO_UDP:
-				break;
-			default:
-				return EAI_SERVICE;
-			}
-		case 0:
-			break;
-		default:
-			return EAI_SOCKTYPE;
-		}
 	}
 
-	nservs = __lookup_serv(ports, serv, proto, flags);
+	nservs = __lookup_serv(ports, serv, proto, socktype, flags);
 	if (nservs < 0) return nservs;
 
 	naddrs = __lookup_name(addrs, canon, host, family, flags);
@@ -87,8 +62,7 @@ int getaddrinfo(const char *restrict host, const char *restrict serv, const stru
 	for (k=i=0; i<naddrs; i++) for (j=0; j<nservs; j++, k++) {
 		out[k].ai = (struct addrinfo){
 			.ai_family = addrs[i].family,
-			.ai_socktype = ports[j].proto == IPPROTO_TCP
-				? SOCK_STREAM : SOCK_DGRAM,
+			.ai_socktype = ports[j].socktype,
 			.ai_protocol = ports[j].proto,
 			.ai_addrlen = addrs[i].family == AF_INET
 				? sizeof(struct sockaddr_in)