diff options
Diffstat (limited to 'src/network/lookup_serv.c')
-rw-r--r-- | src/network/lookup_serv.c | 36 |
1 files changed, 35 insertions, 1 deletions
diff --git a/src/network/lookup_serv.c b/src/network/lookup_serv.c index a9be0f3d..4faa5bc7 100644 --- a/src/network/lookup_serv.c +++ b/src/network/lookup_serv.c @@ -7,13 +7,43 @@ #include "lookup.h" #include "stdio_impl.h" -int __lookup_serv(struct service buf[static MAXSERVS], const char *name, int proto, int flags) +int __lookup_serv(struct service buf[static MAXSERVS], const char *name, int proto, int socktype, int flags) { char line[128]; int cnt = 0; char *p, *z = ""; unsigned long port = 0; + switch (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: + if (name) return EAI_SERVICE; + buf[0].port = 0; + buf[0].proto = proto; + buf[0].socktype = socktype; + return 1; + } + if (name) { if (!*name) return EAI_SERVICE; port = strtoul(name, &z, 10); @@ -22,10 +52,12 @@ int __lookup_serv(struct service buf[static MAXSERVS], const char *name, int pro if (port > 65535) return EAI_SERVICE; if (proto != IPPROTO_UDP) { buf[cnt].port = port; + buf[cnt].socktype = SOCK_STREAM; buf[cnt++].proto = IPPROTO_TCP; } if (proto != IPPROTO_TCP) { buf[cnt].port = port; + buf[cnt].socktype = SOCK_DGRAM; buf[cnt++].proto = IPPROTO_UDP; } return cnt; @@ -58,11 +90,13 @@ int __lookup_serv(struct service buf[static MAXSERVS], const char *name, int pro if (!strncmp(z, "/udp", 4)) { if (proto == IPPROTO_TCP) continue; buf[cnt].port = port; + buf[cnt].socktype = SOCK_DGRAM; buf[cnt++].proto = IPPROTO_UDP; } if (!strncmp(z, "/tcp", 4)) { if (proto == IPPROTO_UDP) continue; buf[cnt].port = port; + buf[cnt].socktype = SOCK_STREAM; buf[cnt++].proto = IPPROTO_TCP; } } |