1d7ce700605e1af0e455e31ec11f19ff21d26b525darylm/*
2d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * Copyright (c) 1983, 1993
3d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *	The Regents of the University of California.  All rights reserved.
4d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *
5d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * Redistribution and use in source and binary forms, with or without
6d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * modification, are permitted provided that the following conditions
7d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * are met:
8d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * 1. Redistributions of source code must retain the above copyright
9d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *    notice, this list of conditions and the following disclaimer.
10d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * 2. Redistributions in binary form must reproduce the above copyright
11d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *    notice, this list of conditions and the following disclaimer in the
12d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *    documentation and/or other materials provided with the distribution.
13d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * 3. All advertising materials mentioning features or use of this software
14d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *    must display the following acknowledgement:
15d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *	This product includes software developed by the University of
16d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *	California, Berkeley and its contributors.
17d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * 4. Neither the name of the University nor the names of its contributors
18d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *    may be used to endorse or promote products derived from this software
19d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *    without specific prior written permission.
20d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *
21d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31d7ce700605e1af0e455e31ec11f19ff21d26b525darylm * SUCH DAMAGE.
32d7ce700605e1af0e455e31ec11f19ff21d26b525darylm */
33d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
34d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#if defined(LIBC_SCCS) && !defined(lint)
35d7ce700605e1af0e455e31ec11f19ff21d26b525darylmstatic char sccsid[] = "@(#)getprotoent.c	8.1 (Berkeley) 6/4/93";
36d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#endif /* LIBC_SCCS and not lint */
37d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
38d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#include <sys/types.h>
39d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#include <sys/socket.h>
40d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#include <netdb.h>
41d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#include <stdio.h>
42d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#include <stdlib.h>
43d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#include <string.h>
44d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
45d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#define	MAXALIASES	35
46d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
47d7ce700605e1af0e455e31ec11f19ff21d26b525darylmstatic FILE *protof = NULL;
48d7ce700605e1af0e455e31ec11f19ff21d26b525darylmstatic char line[BUFSIZ+1];
49d7ce700605e1af0e455e31ec11f19ff21d26b525darylmstatic struct protoent proto;
50d7ce700605e1af0e455e31ec11f19ff21d26b525darylmstatic char *proto_aliases[MAXALIASES];
51d7ce700605e1af0e455e31ec11f19ff21d26b525darylmint _proto_stayopen;
52d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
53d7ce700605e1af0e455e31ec11f19ff21d26b525darylmvoid
54d7ce700605e1af0e455e31ec11f19ff21d26b525darylmsetprotoent(int f)
55d7ce700605e1af0e455e31ec11f19ff21d26b525darylm{
56d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	if (protof == NULL)
57d7ce700605e1af0e455e31ec11f19ff21d26b525darylm		protof = fopen(_PATH_PROTOCOLS, "r" );
58d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	else
59d7ce700605e1af0e455e31ec11f19ff21d26b525darylm		rewind(protof);
60d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	_proto_stayopen |= f;
61d7ce700605e1af0e455e31ec11f19ff21d26b525darylm}
62d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
63d7ce700605e1af0e455e31ec11f19ff21d26b525darylmvoid
64d7ce700605e1af0e455e31ec11f19ff21d26b525darylmendprotoent()
65d7ce700605e1af0e455e31ec11f19ff21d26b525darylm{
66d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	if (protof) {
67d7ce700605e1af0e455e31ec11f19ff21d26b525darylm		fclose(protof);
68d7ce700605e1af0e455e31ec11f19ff21d26b525darylm		protof = NULL;
69d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	}
70d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	_proto_stayopen = 0;
71d7ce700605e1af0e455e31ec11f19ff21d26b525darylm}
72d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
73d7ce700605e1af0e455e31ec11f19ff21d26b525darylmstruct protoent *
74d7ce700605e1af0e455e31ec11f19ff21d26b525darylmgetprotoent()
75d7ce700605e1af0e455e31ec11f19ff21d26b525darylm{
76d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	char *p;
77d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	register char *cp, **q;
78d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
79d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	if (protof == NULL && (protof = fopen(_PATH_PROTOCOLS, "r" )) == NULL)
80d7ce700605e1af0e455e31ec11f19ff21d26b525darylm		return (NULL);
81d7ce700605e1af0e455e31ec11f19ff21d26b525darylmagain:
82d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	if ((p = fgets(line, BUFSIZ, protof)) == NULL)
83d7ce700605e1af0e455e31ec11f19ff21d26b525darylm		return (NULL);
84d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	if (*p == '#')
85d7ce700605e1af0e455e31ec11f19ff21d26b525darylm		goto again;
86d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	cp = strpbrk(p, "#\n");
87d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	if (cp == NULL)
88d7ce700605e1af0e455e31ec11f19ff21d26b525darylm		goto again;
89d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	*cp = '\0';
90d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	proto.p_name = p;
91d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	cp = strpbrk(p, " \t");
92d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	if (cp == NULL)
93d7ce700605e1af0e455e31ec11f19ff21d26b525darylm		goto again;
94d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	*cp++ = '\0';
95d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	while (*cp == ' ' || *cp == '\t')
96d7ce700605e1af0e455e31ec11f19ff21d26b525darylm		cp++;
97d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	p = strpbrk(cp, " \t");
98d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	if (p != NULL)
99d7ce700605e1af0e455e31ec11f19ff21d26b525darylm		*p++ = '\0';
100d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	proto.p_proto = atoi(cp);
101d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	q = proto.p_aliases = proto_aliases;
102d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	if (p != NULL) {
103d7ce700605e1af0e455e31ec11f19ff21d26b525darylm		cp = p;
104d7ce700605e1af0e455e31ec11f19ff21d26b525darylm		while (cp && *cp) {
105d7ce700605e1af0e455e31ec11f19ff21d26b525darylm			if (*cp == ' ' || *cp == '\t') {
106d7ce700605e1af0e455e31ec11f19ff21d26b525darylm				cp++;
107d7ce700605e1af0e455e31ec11f19ff21d26b525darylm				continue;
108d7ce700605e1af0e455e31ec11f19ff21d26b525darylm			}
109d7ce700605e1af0e455e31ec11f19ff21d26b525darylm			if (q < &proto_aliases[MAXALIASES - 1])
110d7ce700605e1af0e455e31ec11f19ff21d26b525darylm				*q++ = cp;
111d7ce700605e1af0e455e31ec11f19ff21d26b525darylm			cp = strpbrk(cp, " \t");
112d7ce700605e1af0e455e31ec11f19ff21d26b525darylm			if (cp != NULL)
113d7ce700605e1af0e455e31ec11f19ff21d26b525darylm				*cp++ = '\0';
114d7ce700605e1af0e455e31ec11f19ff21d26b525darylm		}
115d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	}
116d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	*q = NULL;
117d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	return (&proto);
118d7ce700605e1af0e455e31ec11f19ff21d26b525darylm}
119