diff options
Diffstat (limited to 'src/lib/libc/net/getservbyname.c')
-rw-r--r-- | src/lib/libc/net/getservbyname.c | 33 |
1 files changed, 12 insertions, 21 deletions
diff --git a/src/lib/libc/net/getservbyname.c b/src/lib/libc/net/getservbyname.c index c5f42a7b9c..597c42497f 100644 --- a/src/lib/libc/net/getservbyname.c +++ b/src/lib/libc/net/getservbyname.c | |||
@@ -28,27 +28,22 @@ | |||
28 | */ | 28 | */ |
29 | 29 | ||
30 | #if defined(LIBC_SCCS) && !defined(lint) | 30 | #if defined(LIBC_SCCS) && !defined(lint) |
31 | static char rcsid[] = "$OpenBSD: getservbyname.c,v 1.7 2004/09/16 03:16:50 deraadt Exp $"; | 31 | static char rcsid[] = "$OpenBSD: getservbyname.c,v 1.8 2004/10/17 20:24:23 millert Exp $"; |
32 | #endif /* LIBC_SCCS and not lint */ | 32 | #endif /* LIBC_SCCS and not lint */ |
33 | 33 | ||
34 | #include <netdb.h> | 34 | #include <netdb.h> |
35 | #include <stdio.h> | ||
35 | #include <string.h> | 36 | #include <string.h> |
36 | #include "thread_private.h" | ||
37 | |||
38 | extern int _serv_stayopen; | ||
39 | |||
40 | _THREAD_PRIVATE_MUTEX(getservbyname_r); | ||
41 | 37 | ||
42 | struct servent * | 38 | struct servent * |
43 | getservbyname_r(const char *name, const char *proto, struct servent *se, | 39 | getservbyname_r(const char *name, const char *proto, struct servent *se, |
44 | char *buf, int buflen) | 40 | struct servent_data *sd) |
45 | { | 41 | { |
46 | struct servent *p; | 42 | struct servent *p; |
47 | char **cp; | 43 | char **cp; |
48 | 44 | ||
49 | _THREAD_PRIVATE_MUTEX_LOCK(getservbyname_r); | 45 | setservent_r(sd->stayopen, sd); |
50 | setservent(_serv_stayopen); | 46 | while ((p = getservent_r(se, sd))) { |
51 | while ((p = getservent())) { | ||
52 | if (strcmp(name, p->s_name) == 0) | 47 | if (strcmp(name, p->s_name) == 0) |
53 | goto gotname; | 48 | goto gotname; |
54 | for (cp = p->s_aliases; *cp; cp++) | 49 | for (cp = p->s_aliases; *cp; cp++) |
@@ -59,22 +54,18 @@ gotname: | |||
59 | if (proto == 0 || strcmp(p->s_proto, proto) == 0) | 54 | if (proto == 0 || strcmp(p->s_proto, proto) == 0) |
60 | break; | 55 | break; |
61 | } | 56 | } |
62 | if (!_serv_stayopen) | 57 | if (!sd->stayopen && sd->fp != NULL) { |
63 | endservent(); | 58 | fclose(sd->fp); |
64 | _THREAD_PRIVATE_MUTEX_UNLOCK(getservbyname_r); | 59 | sd->fp = NULL; |
60 | } | ||
65 | return (p); | 61 | return (p); |
66 | } | 62 | } |
67 | 63 | ||
68 | struct servent * | 64 | struct servent * |
69 | getservbyname(const char *name, const char *proto) | 65 | getservbyname(const char *name, const char *proto) |
70 | { | 66 | { |
71 | _THREAD_PRIVATE_KEY(getservbyname); | 67 | extern struct servent_data _servent_data; |
72 | static char buf[4096]; | 68 | static struct servent serv; |
73 | char *bufp = (char*)_THREAD_PRIVATE(getservbyname, buf, NULL); | ||
74 | 69 | ||
75 | if (bufp == NULL) | 70 | return (getservbyname_r(name, proto, &serv, &_servent_data)); |
76 | return (NULL); | ||
77 | return getservbyname_r(name, proto, (struct servent*) bufp, | ||
78 | bufp + sizeof(struct servent), | ||
79 | sizeof buf - sizeof(struct servent) ); | ||
80 | } | 71 | } |