diff options
author | ume <ume@FreeBSD.org> | 2005-04-19 14:41:13 +0000 |
---|---|---|
committer | ume <ume@FreeBSD.org> | 2005-04-19 14:41:13 +0000 |
commit | 9af2b4271232977fe523e77ee8fd7b200a23e98f (patch) | |
tree | 0e2d39bbb214743f8707b7ef40ff135b1ee0fa32 /lib/libc/net/getproto.c | |
parent | 6c9d475a3bb8332173bada9cd081a2aa96c32b1a (diff) | |
download | FreeBSD-src-9af2b4271232977fe523e77ee8fd7b200a23e98f.zip FreeBSD-src-9af2b4271232977fe523e77ee8fd7b200a23e98f.tar.gz |
- add getproto{byname,bynumber,ent}_r for internal use within libc.
- make getproto{byname,bynumber,ent} thread-safe.
Diffstat (limited to 'lib/libc/net/getproto.c')
-rw-r--r-- | lib/libc/net/getproto.c | 32 |
1 files changed, 21 insertions, 11 deletions
diff --git a/lib/libc/net/getproto.c b/lib/libc/net/getproto.c index b22bc51..400fa7c 100644 --- a/lib/libc/net/getproto.c +++ b/lib/libc/net/getproto.c @@ -38,20 +38,30 @@ static char sccsid[] = "@(#)getproto.c 8.1 (Berkeley) 6/4/93"; __FBSDID("$FreeBSD$"); #include <netdb.h> +#include "netdb_private.h" -extern int _proto_stayopen; +int +getprotobynumber_r(int proto, struct protoent *pe, struct protoent_data *ped) +{ + int error; + + setprotoent_r(ped->stayopen, ped); + while ((error = getprotoent_r(pe, ped)) == 0) + if (pe->p_proto == proto) + break; + if (!ped->stayopen) + endprotoent_r(ped); + return (error); +} struct protoent * -getprotobynumber(proto) - int proto; +getprotobynumber(int proto) { - struct protoent *p; + struct protodata *pd; - setprotoent(_proto_stayopen); - while ( (p = getprotoent()) ) - if (p->p_proto == proto) - break; - if (!_proto_stayopen) - endprotoent(); - return (p); + if ((pd = __protodata_init()) == NULL) + return (NULL); + if (getprotobynumber_r(proto, &pd->proto, &pd->data) != 0) + return (NULL); + return (&pd->proto); } |