diff options
Diffstat (limited to 'contrib/bind/lib/irs/getprotoent.c')
-rw-r--r-- | contrib/bind/lib/irs/getprotoent.c | 139 |
1 files changed, 96 insertions, 43 deletions
diff --git a/contrib/bind/lib/irs/getprotoent.c b/contrib/bind/lib/irs/getprotoent.c index f79a1c6..e3bfc37 100644 --- a/contrib/bind/lib/irs/getprotoent.c +++ b/contrib/bind/lib/irs/getprotoent.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996 by Internet Software Consortium. + * Copyright (c) 1996,1999 by Internet Software Consortium. * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -16,16 +16,22 @@ */ #if !defined(LINT) && !defined(CODECENTER) -static char rcsid[] = "$Id: getprotoent.c,v 1.9 1997/12/04 04:57:53 halley Exp $"; +static const char rcsid[] = "$Id: getprotoent.c,v 1.15 1999/10/13 16:39:31 vixie Exp $"; #endif /* Imports */ #include "port_before.h" +#if !defined(__BIND_NOSTATIC) + #include <sys/types.h> +#include <netinet/in.h> +#include <arpa/nameser.h> + #include <errno.h> +#include <resolv.h> #include <stdio.h> #include <irs.h> @@ -36,85 +42,132 @@ static char rcsid[] = "$Id: getprotoent.c,v 1.9 1997/12/04 04:57:53 halley Exp $ /* Forward */ -static struct irs_pr * init(void); +static struct net_data *init(void); /* Public */ struct protoent * getprotoent() { - struct irs_pr *pr = init(); - - if (!pr) - return (NULL); - net_data.pr_last = (*pr->next)(pr); - return (net_data.pr_last); + struct net_data *net_data = init(); + + return (getprotoent_p(net_data)); } struct protoent * getprotobyname(const char *name) { - struct irs_pr *pr = init(); + struct net_data *net_data = init(); + + return (getprotobyname_p(name, net_data)); +} + +struct protoent * +getprotobynumber(int proto) { + struct net_data *net_data = init(); + + return (getprotobynumber_p(proto, net_data)); +} + +void +setprotoent(int stayopen) { + struct net_data *net_data = init(); + + setprotoent_p(stayopen, net_data); +} + +void +endprotoent() { + struct net_data *net_data = init(); + + endprotoent_p(net_data); +} + +/* Shared private. */ + +struct protoent * +getprotoent_p(struct net_data *net_data) { + struct irs_pr *pr; + + if (!net_data || !(pr = net_data->pr)) + return (NULL); + net_data->pr_last = (*pr->next)(pr); + return (net_data->pr_last); +} + +struct protoent * +getprotobyname_p(const char *name, struct net_data *net_data) { + struct irs_pr *pr; char **pap; - if (!pr) + if (!net_data || !(pr = net_data->pr)) return (NULL); - if (net_data.pr_stayopen && net_data.pr_last) { - if (!strcmp(net_data.pr_last->p_name, name)) - return (net_data.pr_last); - for (pap = net_data.pr_last->p_aliases; pap && *pap; pap++) + if (net_data->pr_stayopen && net_data->pr_last) { + if (!strcmp(net_data->pr_last->p_name, name)) + return (net_data->pr_last); + for (pap = net_data->pr_last->p_aliases; pap && *pap; pap++) if (!strcmp(name, *pap)) - return (net_data.pr_last); + return (net_data->pr_last); } - net_data.pr_last = (*pr->byname)(pr, name); - if (!net_data.pr_stayopen) + net_data->pr_last = (*pr->byname)(pr, name); + if (!net_data->pr_stayopen) endprotoent(); - return (net_data.pr_last); + return (net_data->pr_last); } struct protoent * -getprotobynumber(int proto) { - struct irs_pr *pr = init(); +getprotobynumber_p(int proto, struct net_data *net_data) { + struct irs_pr *pr; - if (!pr) + if (!net_data || !(pr = net_data->pr)) return (NULL); - if (net_data.pr_stayopen && net_data.pr_last) - if (net_data.pr_last->p_proto == proto) - return (net_data.pr_last); - net_data.pr_last = (*pr->bynumber)(pr, proto); - if (!net_data.pr_stayopen) + if (net_data->pr_stayopen && net_data->pr_last) + if (net_data->pr_last->p_proto == proto) + return (net_data->pr_last); + net_data->pr_last = (*pr->bynumber)(pr, proto); + if (!net_data->pr_stayopen) endprotoent(); - return (net_data.pr_last); + return (net_data->pr_last); } void -setprotoent(int stayopen) { - struct irs_pr *pr = init(); +setprotoent_p(int stayopen, struct net_data *net_data) { + struct irs_pr *pr; - if (!pr) + if (!net_data || !(pr = net_data->pr)) return; (*pr->rewind)(pr); - net_data.pr_stayopen = (stayopen != 0); + net_data->pr_stayopen = (stayopen != 0); + if (stayopen == 0) + net_data_minimize(net_data); } void -endprotoent() { - struct irs_pr *pr = init(); +endprotoent_p(struct net_data *net_data) { + struct irs_pr *pr; - if (pr != NULL) + if ((net_data != NULL) && ((pr = net_data->pr) != NULL)) (*pr->minimize)(pr); } /* Private */ -static struct irs_pr * +static struct net_data * init() { - if (!net_data_init()) + struct net_data *net_data; + + if (!(net_data = net_data_init(NULL))) goto error; - if (!net_data.pr) - net_data.pr = (*net_data.irs->pr_map)(net_data.irs); - if (!net_data.pr) { + if (!net_data->pr) { + net_data->pr = (*net_data->irs->pr_map)(net_data->irs); + + if (!net_data->pr || !net_data->res) { error: - errno = EIO; - return (NULL); + errno = EIO; + return (NULL); + } + (*net_data->pr->res_set)(net_data->pr, net_data->res, NULL); } - return (net_data.pr); + + return (net_data); } + +#endif /*__BIND_NOSTATIC*/ |