1 /*	$NetBSD: getprotoent.c,v 1.1.1.1 2009/04/12 15:33:38 christos Exp $	*/
2 
3 /*
4  * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC")
5  * Copyright (c) 1996,1999 by Internet Software Consortium.
6  *
7  * Permission to use, copy, modify, and distribute this software for any
8  * purpose with or without fee is hereby granted, provided that the above
9  * copyright notice and this permission notice appear in all copies.
10  *
11  * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
12  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13  * MERCHANTABILITY AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR
14  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
17  * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18  */
19 
20 #if !defined(LINT) && !defined(CODECENTER)
21 static const char rcsid[] = "Id: getprotoent.c,v 1.4 2005/04/27 04:56:26 sra Exp";
22 #endif
23 
24 /* Imports */
25 
26 #include "port_before.h"
27 
28 #if !defined(__BIND_NOSTATIC)
29 
30 #include <sys/types.h>
31 
32 #include <netinet/in.h>
33 #include <arpa/nameser.h>
34 
35 #include <errno.h>
36 #include <resolv.h>
37 #include <stdio.h>
38 #include <string.h>
39 
40 #include <irs.h>
41 
42 #include "port_after.h"
43 
44 #include "irs_data.h"
45 
46 /* Forward */
47 
48 static struct net_data *init(void);
49 
50 /* Public */
51 
52 struct protoent *
53 getprotoent() {
54 	struct net_data *net_data = init();
55 
56 	return (getprotoent_p(net_data));
57 }
58 
59 struct protoent *
60 getprotobyname(const char *name) {
61 	struct net_data *net_data = init();
62 
63 	return (getprotobyname_p(name, net_data));
64 }
65 
66 struct protoent *
67 getprotobynumber(int proto) {
68 	struct net_data *net_data = init();
69 
70 	return (getprotobynumber_p(proto, net_data));
71 }
72 
73 void
74 setprotoent(int stayopen) {
75 	struct net_data *net_data = init();
76 
77 	setprotoent_p(stayopen, net_data);
78 }
79 
80 void
81 endprotoent() {
82 	struct net_data *net_data = init();
83 
84 	endprotoent_p(net_data);
85 }
86 
87 /* Shared private. */
88 
89 struct protoent *
90 getprotoent_p(struct net_data *net_data) {
91 	struct irs_pr *pr;
92 
93 	if (!net_data || !(pr = net_data->pr))
94 		return (NULL);
95 	net_data->pr_last = (*pr->next)(pr);
96 	return (net_data->pr_last);
97 }
98 
99 struct protoent *
100 getprotobyname_p(const char *name, struct net_data *net_data) {
101 	struct irs_pr *pr;
102 	char **pap;
103 
104 	if (!net_data || !(pr = net_data->pr))
105 		return (NULL);
106 	if (net_data->pr_stayopen && net_data->pr_last) {
107 		if (!strcmp(net_data->pr_last->p_name, name))
108 			return (net_data->pr_last);
109 		for (pap = net_data->pr_last->p_aliases; pap && *pap; pap++)
110 			if (!strcmp(name, *pap))
111 				return (net_data->pr_last);
112 	}
113 	net_data->pr_last = (*pr->byname)(pr, name);
114 	if (!net_data->pr_stayopen)
115 		endprotoent();
116 	return (net_data->pr_last);
117 }
118 
119 struct protoent *
120 getprotobynumber_p(int proto, struct net_data *net_data) {
121 	struct irs_pr *pr;
122 
123 	if (!net_data || !(pr = net_data->pr))
124 		return (NULL);
125 	if (net_data->pr_stayopen && net_data->pr_last)
126 		if (net_data->pr_last->p_proto == proto)
127 			return (net_data->pr_last);
128 	net_data->pr_last = (*pr->bynumber)(pr, proto);
129 	if (!net_data->pr_stayopen)
130 		endprotoent();
131 	return (net_data->pr_last);
132 }
133 
134 void
135 setprotoent_p(int stayopen, struct net_data *net_data) {
136 	struct irs_pr *pr;
137 
138 	if (!net_data || !(pr = net_data->pr))
139 		return;
140 	(*pr->rewind)(pr);
141 	net_data->pr_stayopen = (stayopen != 0);
142 	if (stayopen == 0)
143 		net_data_minimize(net_data);
144 }
145 
146 void
147 endprotoent_p(struct net_data *net_data) {
148 	struct irs_pr *pr;
149 
150 	if ((net_data != NULL) && ((pr = net_data->pr) != NULL))
151 		(*pr->minimize)(pr);
152 }
153 
154 /* Private */
155 
156 static struct net_data *
157 init() {
158 	struct net_data *net_data;
159 
160 	if (!(net_data = net_data_init(NULL)))
161 		goto error;
162 	if (!net_data->pr) {
163 		net_data->pr = (*net_data->irs->pr_map)(net_data->irs);
164 
165 		if (!net_data->pr || !net_data->res) {
166  error:
167 			errno = EIO;
168 			return (NULL);
169 		}
170 		(*net_data->pr->res_set)(net_data->pr, net_data->res, NULL);
171 	}
172 
173 	return (net_data);
174 }
175 
176 #endif /*__BIND_NOSTATIC*/
177 
178 /*! \file */
179