2 * Copyright (c) 1989, 1993, 1995
3 * The Regents of the University of California. All rights reserved.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * 3. All advertising materials mentioning features or use of this software
14 * must display the following acknowledgement:
15 * This product includes software developed by the University of
16 * California, Berkeley and its contributors.
17 * 4. Neither the name of the University nor the names of its contributors
18 * may be used to endorse or promote products derived from this software
19 * without specific prior written permission.
21 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
35 * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC")
36 * Portions Copyright (c) 1996,1999 by Internet Software Consortium.
38 * Permission to use, copy, modify, and distribute this software for any
39 * purpose with or without fee is hereby granted, provided that the above
40 * copyright notice and this permission notice appear in all copies.
42 * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
43 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
44 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR
45 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
46 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
47 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
48 * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
51 #if defined(LIBC_SCCS) && !defined(lint)
52 static const char rcsid
[] = "$Id: lcl_pr.c,v 1.1.2.1 2004/03/09 09:17:33 marka Exp $";
53 #endif /* LIBC_SCCS and not lint */
57 #include "port_before.h"
59 #include <sys/types.h>
60 #include <netinet/in.h>
61 #include <arpa/nameser.h>
71 #include <isc/memcluster.h>
73 #include "port_after.h"
78 #ifndef _PATH_PROTOCOLS
79 #define _PATH_PROTOCOLS "/etc/protocols"
88 struct protoent proto
;
89 char * proto_aliases
[MAXALIASES
];
94 static void pr_close(struct irs_pr
*);
95 static struct protoent
* pr_next(struct irs_pr
*);
96 static struct protoent
* pr_byname(struct irs_pr
*, const char *);
97 static struct protoent
* pr_bynumber(struct irs_pr
*, int);
98 static void pr_rewind(struct irs_pr
*);
99 static void pr_minimize(struct irs_pr
*);
110 irs_lcl_pr(struct irs_acc
*this) {
114 if (!(pr
= memget(sizeof *pr
))) {
118 if (!(pvt
= memget(sizeof *pvt
))) {
119 memput(pr
, sizeof *this);
123 memset(pvt
, 0, sizeof *pvt
);
125 pr
->close
= pr_close
;
126 pr
->byname
= pr_byname
;
127 pr
->bynumber
= pr_bynumber
;
129 pr
->rewind
= pr_rewind
;
130 pr
->minimize
= pr_minimize
;
139 pr_close(struct irs_pr
*this) {
140 struct pvt
*pvt
= (struct pvt
*)this->private;
143 (void) fclose(pvt
->fp
);
144 memput(pvt
, sizeof *pvt
);
145 memput(this, sizeof *this);
148 static struct protoent
*
149 pr_byname(struct irs_pr
*this, const char *name
) {
155 while ((p
= pr_next(this))) {
156 if (!strcmp(p
->p_name
, name
))
158 for (cp
= p
->p_aliases
; *cp
; cp
++)
159 if (!strcmp(*cp
, name
))
166 static struct protoent
*
167 pr_bynumber(struct irs_pr
*this, int proto
) {
171 while ((p
= pr_next(this)))
172 if (p
->p_proto
== proto
)
178 pr_rewind(struct irs_pr
*this) {
179 struct pvt
*pvt
= (struct pvt
*)this->private;
182 if (fseek(pvt
->fp
, 0L, SEEK_SET
) == 0)
184 (void)fclose(pvt
->fp
);
186 if (!(pvt
->fp
= fopen(_PATH_PROTOCOLS
, "r" )))
188 if (fcntl(fileno(pvt
->fp
), F_SETFD
, 1) < 0) {
189 (void)fclose(pvt
->fp
);
194 static struct protoent
*
195 pr_next(struct irs_pr
*this) {
196 struct pvt
*pvt
= (struct pvt
*)this->private;
198 char *bufp
, *ndbuf
, *dbuf
= NULL
;
199 int c
, bufsiz
, offset
;
209 if ((p
= fgets(bufp
+ offset
, bufsiz
- offset
, pvt
->fp
)) == NULL
) {
214 if (!strchr(p
, '\n') && !feof(pvt
->fp
)) {
216 /* allocate space for longer line */
218 if ((ndbuf
= malloc(bufsiz
+ GROWBUF
)) != NULL
)
221 ndbuf
= realloc(dbuf
, bufsiz
+ GROWBUF
);
226 offset
= strlen(dbuf
);
228 /* allocation failed; skip this long line */
229 while ((c
= getc(pvt
->fp
)) != EOF
)
243 cp
= strpbrk(p
, "#\n");
246 pvt
->proto
.p_name
= p
;
247 cp
= strpbrk(p
, " \t");
251 while (*cp
== ' ' || *cp
== '\t')
253 p
= strpbrk(cp
, " \t");
256 pvt
->proto
.p_proto
= atoi(cp
);
257 q
= pvt
->proto
.p_aliases
= pvt
->proto_aliases
;
261 if (*cp
== ' ' || *cp
== '\t') {
265 if (q
< &pvt
->proto_aliases
[MAXALIASES
- 1])
267 cp
= strpbrk(cp
, " \t");
273 return (&pvt
->proto
);
277 pr_minimize(struct irs_pr
*this) {
278 struct pvt
*pvt
= (struct pvt
*)this->private;
280 if (pvt
->fp
!= NULL
) {
281 (void)fclose(pvt
->fp
);