diff options
Diffstat (limited to '')
| -rw-r--r-- | src/lib/libc/net/getservbyname.c | 26 |
1 files changed, 24 insertions, 2 deletions
diff --git a/src/lib/libc/net/getservbyname.c b/src/lib/libc/net/getservbyname.c index 25f0e27d06..7375c89404 100644 --- a/src/lib/libc/net/getservbyname.c +++ b/src/lib/libc/net/getservbyname.c | |||
| @@ -32,21 +32,28 @@ | |||
| 32 | */ | 32 | */ |
| 33 | 33 | ||
| 34 | #if defined(LIBC_SCCS) && !defined(lint) | 34 | #if defined(LIBC_SCCS) && !defined(lint) |
| 35 | static char rcsid[] = "$OpenBSD: getservbyname.c,v 1.3 1997/07/09 01:08:34 millert Exp $"; | 35 | static char rcsid[] = "$OpenBSD: getservbyname.c,v 1.4 1998/11/20 11:18:44 d Exp $"; |
| 36 | #endif /* LIBC_SCCS and not lint */ | 36 | #endif /* LIBC_SCCS and not lint */ |
| 37 | 37 | ||
| 38 | #include <netdb.h> | 38 | #include <netdb.h> |
| 39 | #include <string.h> | 39 | #include <string.h> |
| 40 | #include "thread_private.h" | ||
| 40 | 41 | ||
| 41 | extern int _serv_stayopen; | 42 | extern int _serv_stayopen; |
| 42 | 43 | ||
| 44 | _THREAD_PRIVATE_MUTEX(getservbyname_r) | ||
| 45 | |||
| 43 | struct servent * | 46 | struct servent * |
| 44 | getservbyname(name, proto) | 47 | getservbyname_r(name, proto, se, buf, buflen) |
| 45 | const char *name, *proto; | 48 | const char *name, *proto; |
| 49 | struct servent *se; | ||
| 50 | char *buf; | ||
| 51 | int buflen; | ||
| 46 | { | 52 | { |
| 47 | register struct servent *p; | 53 | register struct servent *p; |
| 48 | register char **cp; | 54 | register char **cp; |
| 49 | 55 | ||
| 56 | _THREAD_PRIVATE_MUTEX_LOCK(getservbyname_r); | ||
| 50 | setservent(_serv_stayopen); | 57 | setservent(_serv_stayopen); |
| 51 | while ((p = getservent())) { | 58 | while ((p = getservent())) { |
| 52 | if (strcmp(name, p->s_name) == 0) | 59 | if (strcmp(name, p->s_name) == 0) |
| @@ -61,5 +68,20 @@ gotname: | |||
| 61 | } | 68 | } |
| 62 | if (!_serv_stayopen) | 69 | if (!_serv_stayopen) |
| 63 | endservent(); | 70 | endservent(); |
| 71 | _THREAD_PRIVATE_MUTEX_UNLOCK(getservbyname_r); | ||
| 64 | return (p); | 72 | return (p); |
| 65 | } | 73 | } |
| 74 | |||
| 75 | struct servent *getservbyname(name, proto) | ||
| 76 | const char *name, *proto; | ||
| 77 | { | ||
| 78 | _THREAD_PRIVATE_KEY(getservbyname) | ||
| 79 | static char buf[4096]; | ||
| 80 | char *bufp = (char*)_THREAD_PRIVATE(getservbyname, buf, NULL); | ||
| 81 | |||
| 82 | if (bufp == NULL) | ||
| 83 | return (NULL); | ||
| 84 | return getservbyname_r(name, proto, (struct servent*) bufp, | ||
| 85 | bufp + sizeof(struct servent), | ||
| 86 | sizeof buf - sizeof(struct servent) ); | ||
| 87 | } | ||
