summaryrefslogtreecommitdiff
path: root/src/lib/libc/net/getservbyname.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libc/net/getservbyname.c')
-rw-r--r--src/lib/libc/net/getservbyname.c33
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)
31static char rcsid[] = "$OpenBSD: getservbyname.c,v 1.7 2004/09/16 03:16:50 deraadt Exp $"; 31static 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
38extern int _serv_stayopen;
39
40_THREAD_PRIVATE_MUTEX(getservbyname_r);
41 37
42struct servent * 38struct servent *
43getservbyname_r(const char *name, const char *proto, struct servent *se, 39getservbyname_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
68struct servent * 64struct servent *
69getservbyname(const char *name, const char *proto) 65getservbyname(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}