From eae90a29f226809527585d7ba688d0af8627db58 Mon Sep 17 00:00:00 2001 From: millert <> Date: Sun, 17 Oct 2004 20:24:23 +0000 Subject: Reentrant versions of getprotoent(3) and getservent(3). Adapted from changes in NetBSD by Christos. OK otto@ --- src/lib/libc/net/getservbyport.c | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) (limited to 'src/lib/libc/net/getservbyport.c') diff --git a/src/lib/libc/net/getservbyport.c b/src/lib/libc/net/getservbyport.c index 992a77d638..e8b8efc504 100644 --- a/src/lib/libc/net/getservbyport.c +++ b/src/lib/libc/net/getservbyport.c @@ -28,29 +28,38 @@ */ #if defined(LIBC_SCCS) && !defined(lint) -static char rcsid[] = "$OpenBSD: getservbyport.c,v 1.4 2003/06/02 20:18:35 millert Exp $"; +static char rcsid[] = "$OpenBSD: getservbyport.c,v 1.5 2004/10/17 20:24:23 millert Exp $"; #endif /* LIBC_SCCS and not lint */ #include +#include #include -extern int _serv_stayopen; - struct servent * -getservbyport(port, proto) - int port; - const char *proto; +getservbyport_r(int port, const char *proto, struct servent *se, + struct servent_data *sd) { - register struct servent *p; + struct servent *p; - setservent(_serv_stayopen); - while ((p = getservent())) { + setservent_r(sd->stayopen, sd); + while ((p = getservent_r(se, sd))) { if (p->s_port != port) continue; if (proto == 0 || strcmp(p->s_proto, proto) == 0) break; } - if (!_serv_stayopen) - endservent(); + if (!sd->stayopen && sd->fp != NULL) { + fclose(sd->fp); + sd->fp = NULL; + } return (p); } + +struct servent * +getservbyport(int port, const char *proto) +{ + extern struct servent_data _servent_data; + static struct servent serv; + + return (getservbyport_r(port, proto, &serv, &_servent_data)); +} -- cgit v1.2.3-55-g6feb