summaryrefslogtreecommitdiff
path: root/src/lib/libc/net/getservbyname.c
diff options
context:
space:
mode:
authord <>1998-11-20 11:18:51 +0000
committerd <>1998-11-20 11:18:51 +0000
commitc1f295aa8666eb1c08a1edf944ac5617659a066c (patch)
treeefe0a5dfb4f9767f96ab03ce9c00dc5bcc98074c /src/lib/libc/net/getservbyname.c
parent5a11336d3f08469f2747ebcf26ae777dba46fd22 (diff)
downloadopenbsd-c1f295aa8666eb1c08a1edf944ac5617659a066c.tar.gz
openbsd-c1f295aa8666eb1c08a1edf944ac5617659a066c.tar.bz2
openbsd-c1f295aa8666eb1c08a1edf944ac5617659a066c.zip
Add thread-safety to libc, so that libc_r will build (on i386 at least).
All POSIX libc api now there (to P1003.1c/D10) (more md stuff is needed for other libc/arch/*) (setlogin is no longer a special syscall) Add -pthread option to gcc (that makes it use -lc_r and -D_POSIX_THREADS). Doc some re-entrant routines Add libc_r to intro(3) dig() uses some libc srcs and an extra -I was needed there. Add more md stuff to libc_r. Update includes for the pthreads api Update libc_r TODO
Diffstat (limited to 'src/lib/libc/net/getservbyname.c')
-rw-r--r--src/lib/libc/net/getservbyname.c26
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)
35static char rcsid[] = "$OpenBSD: getservbyname.c,v 1.3 1997/07/09 01:08:34 millert Exp $"; 35static 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
41extern int _serv_stayopen; 42extern int _serv_stayopen;
42 43
44_THREAD_PRIVATE_MUTEX(getservbyname_r)
45
43struct servent * 46struct servent *
44getservbyname(name, proto) 47getservbyname_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
75struct 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}