projects
/
musl
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
b4f632b
)
getaddrinfo /etc/services lookup support
author
Rich Felker
<dalias@aerifal.cx>
Sun, 22 Jul 2012 23:42:44 +0000
(19:42 -0400)
committer
Rich Felker
<dalias@aerifal.cx>
Sun, 22 Jul 2012 23:42:44 +0000
(19:42 -0400)
src/network/getaddrinfo.c
patch
|
blob
|
history
diff --git
a/src/network/getaddrinfo.c
b/src/network/getaddrinfo.c
index
93c7516
..
d16b656
100644
(file)
--- 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;
union sa sa = {{0}};
unsigned char reply[1024];
int i, j;
- //char hostbuf[256];
char line[512];
FILE *f, _f;
unsigned char _buf[1024];
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) {
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;
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);
}
}
port = htons(port);
}