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[] = "@(#)getservent.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 <string.h>
43d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#include <stdlib.h>
44d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#ifdef YP
45d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#include <rpc/rpc.h>
46d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#include <rpcsvc/yp_prot.h>
47d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#include <rpcsvc/ypclnt.h>
48d7ce700605e1af0e455e31ec11f19ff21d26b525darylmstatic int serv_stepping_yp = 0;
49d7ce700605e1af0e455e31ec11f19ff21d26b525darylmextern int _yp_check __P(( char ** ));
50d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#endif
51d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
52d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
53d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#define	MAXALIASES	35
54d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
55d7ce700605e1af0e455e31ec11f19ff21d26b525darylmstatic FILE *servf = NULL;
56d7ce700605e1af0e455e31ec11f19ff21d26b525darylmstatic char line[BUFSIZ+1];
57d7ce700605e1af0e455e31ec11f19ff21d26b525darylmstatic struct servent serv;
58d7ce700605e1af0e455e31ec11f19ff21d26b525darylmstatic char *serv_aliases[MAXALIASES];
59d7ce700605e1af0e455e31ec11f19ff21d26b525darylmint _serv_stayopen;
60d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
61d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#ifdef YP
62d7ce700605e1af0e455e31ec11f19ff21d26b525darylmchar *___getservbyname_yp = NULL;
63d7ce700605e1af0e455e31ec11f19ff21d26b525darylmchar *___getservbyproto_yp = NULL;
64d7ce700605e1af0e455e31ec11f19ff21d26b525darylmint ___getservbyport_yp = 0;
65d7ce700605e1af0e455e31ec11f19ff21d26b525darylmstatic char *yp_domain = NULL;
66d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
67d7ce700605e1af0e455e31ec11f19ff21d26b525darylmstatic int
68d7ce700605e1af0e455e31ec11f19ff21d26b525darylm_getservbyport_yp(line)
69d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	char *line;
70d7ce700605e1af0e455e31ec11f19ff21d26b525darylm{
71d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	char *result;
72d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	int resultlen;
73d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	char buf[YPMAXRECORD + 2];
74d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	int rv;
75d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
76d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	snprintf(buf, sizeof(buf), "%d/%s", ntohs(___getservbyport_yp),
77d7ce700605e1af0e455e31ec11f19ff21d26b525darylm						___getservbyproto_yp);
78d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
79d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	___getservbyport_yp = 0;
80d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	___getservbyproto_yp = NULL;
81d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
82d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	if(!yp_domain) {
83d7ce700605e1af0e455e31ec11f19ff21d26b525darylm		if(yp_get_default_domain(&yp_domain))
84d7ce700605e1af0e455e31ec11f19ff21d26b525darylm			return (0);
85d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	}
86d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
87d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	/*
88d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	 * We have to be a little flexible here. Ideally you're supposed
89d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	 * to have both a services.byname and a services.byport map, but
90d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	 * some systems have only services.byname. FreeBSD cheats a little
91d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	 * by putting the services.byport information in the same map as
92d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	 * services.byname so that either case will work. We allow for both
93d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	 * possibilities here: if there is no services.byport map, we try
94d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	 * services.byname instead.
95d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	 */
96d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	if ((rv = yp_match(yp_domain, "services.byport", buf, strlen(buf),
97d7ce700605e1af0e455e31ec11f19ff21d26b525darylm						&result, &resultlen))) {
98d7ce700605e1af0e455e31ec11f19ff21d26b525darylm		if (rv == YPERR_MAP) {
99d7ce700605e1af0e455e31ec11f19ff21d26b525darylm			if (yp_match(yp_domain, "services.byname", buf,
100d7ce700605e1af0e455e31ec11f19ff21d26b525darylm					strlen(buf), &result, &resultlen))
101d7ce700605e1af0e455e31ec11f19ff21d26b525darylm			return(0);
102d7ce700605e1af0e455e31ec11f19ff21d26b525darylm		} else
103d7ce700605e1af0e455e31ec11f19ff21d26b525darylm			return(0);
104d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	}
105d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
106d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	/* getservent() expects lines terminated with \n -- make it happy */
107d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	snprintf(line, BUFSIZ, "%.*s\n", resultlen, result);
108d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
109d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	free(result);
110d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	return(1);
111d7ce700605e1af0e455e31ec11f19ff21d26b525darylm}
112d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
113d7ce700605e1af0e455e31ec11f19ff21d26b525darylmstatic int
114d7ce700605e1af0e455e31ec11f19ff21d26b525darylm_getservbyname_yp(line)
115d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	char *line;
116d7ce700605e1af0e455e31ec11f19ff21d26b525darylm{
117d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	char *result;
118d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	int resultlen;
119d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	char buf[YPMAXRECORD + 2];
120d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
121d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	if(!yp_domain) {
122d7ce700605e1af0e455e31ec11f19ff21d26b525darylm		if(yp_get_default_domain(&yp_domain))
123d7ce700605e1af0e455e31ec11f19ff21d26b525darylm			return (0);
124d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	}
125d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
126d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	snprintf(buf, sizeof(buf), "%s/%s", ___getservbyname_yp,
127d7ce700605e1af0e455e31ec11f19ff21d26b525darylm						___getservbyproto_yp);
128d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
129d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	___getservbyname_yp = 0;
130d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	___getservbyproto_yp = NULL;
131d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
132d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	if (yp_match(yp_domain, "services.byname", buf, strlen(buf),
133d7ce700605e1af0e455e31ec11f19ff21d26b525darylm						&result, &resultlen)) {
134d7ce700605e1af0e455e31ec11f19ff21d26b525darylm		return(0);
135d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	}
136d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
137d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	/* getservent() expects lines terminated with \n -- make it happy */
138d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	snprintf(line, BUFSIZ, "%.*s\n", resultlen, result);
139d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
140d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	free(result);
141d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	return(1);
142d7ce700605e1af0e455e31ec11f19ff21d26b525darylm}
143d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
144d7ce700605e1af0e455e31ec11f19ff21d26b525darylmstatic int
145d7ce700605e1af0e455e31ec11f19ff21d26b525darylm_getservent_yp(line)
146d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	char *line;
147d7ce700605e1af0e455e31ec11f19ff21d26b525darylm{
148d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	static char *key = NULL;
149d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	static int keylen;
150d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	char *lastkey, *result;
151d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	int resultlen;
152d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	int rv;
153d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
154d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	if(!yp_domain) {
155d7ce700605e1af0e455e31ec11f19ff21d26b525darylm		if(yp_get_default_domain(&yp_domain))
156d7ce700605e1af0e455e31ec11f19ff21d26b525darylm			return (0);
157d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	}
158d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
159d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	if (!serv_stepping_yp) {
160d7ce700605e1af0e455e31ec11f19ff21d26b525darylm		if (key)
161d7ce700605e1af0e455e31ec11f19ff21d26b525darylm			free(key);
162d7ce700605e1af0e455e31ec11f19ff21d26b525darylm		if ((rv = yp_first(yp_domain, "services.byname", &key, &keylen,
163d7ce700605e1af0e455e31ec11f19ff21d26b525darylm			     &result, &resultlen))) {
164d7ce700605e1af0e455e31ec11f19ff21d26b525darylm			serv_stepping_yp = 0;
165d7ce700605e1af0e455e31ec11f19ff21d26b525darylm			return(0);
166d7ce700605e1af0e455e31ec11f19ff21d26b525darylm		}
167d7ce700605e1af0e455e31ec11f19ff21d26b525darylm		serv_stepping_yp = 1;
168d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	} else {
169d7ce700605e1af0e455e31ec11f19ff21d26b525darylm		lastkey = key;
170d7ce700605e1af0e455e31ec11f19ff21d26b525darylm		rv = yp_next(yp_domain, "services.byname", key, keylen, &key,
171d7ce700605e1af0e455e31ec11f19ff21d26b525darylm			     &keylen, &result, &resultlen);
172d7ce700605e1af0e455e31ec11f19ff21d26b525darylm		free(lastkey);
173d7ce700605e1af0e455e31ec11f19ff21d26b525darylm		if (rv) {
174d7ce700605e1af0e455e31ec11f19ff21d26b525darylm			serv_stepping_yp = 0;
175d7ce700605e1af0e455e31ec11f19ff21d26b525darylm			return (0);
176d7ce700605e1af0e455e31ec11f19ff21d26b525darylm		}
177d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	}
178d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
179d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	/* getservent() expects lines terminated with \n -- make it happy */
180d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	snprintf(line, BUFSIZ, "%.*s\n", resultlen, result);
181d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
182d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	free(result);
183d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
184d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	return(1);
185d7ce700605e1af0e455e31ec11f19ff21d26b525darylm}
186d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#endif
187d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
188d7ce700605e1af0e455e31ec11f19ff21d26b525darylmvoid
189d7ce700605e1af0e455e31ec11f19ff21d26b525darylmsetservent(int f)
190d7ce700605e1af0e455e31ec11f19ff21d26b525darylm{
191d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	if (servf == NULL)
192d7ce700605e1af0e455e31ec11f19ff21d26b525darylm		servf = fopen(_PATH_SERVICES, "r" );
193d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	else
194d7ce700605e1af0e455e31ec11f19ff21d26b525darylm		rewind(servf);
195d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	_serv_stayopen |= f;
196d7ce700605e1af0e455e31ec11f19ff21d26b525darylm}
197d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
198d7ce700605e1af0e455e31ec11f19ff21d26b525darylmvoid
199d7ce700605e1af0e455e31ec11f19ff21d26b525darylmendservent()
200d7ce700605e1af0e455e31ec11f19ff21d26b525darylm{
201d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	if (servf) {
202d7ce700605e1af0e455e31ec11f19ff21d26b525darylm		fclose(servf);
203d7ce700605e1af0e455e31ec11f19ff21d26b525darylm		servf = NULL;
204d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	}
205d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	_serv_stayopen = 0;
206d7ce700605e1af0e455e31ec11f19ff21d26b525darylm}
207d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
208d7ce700605e1af0e455e31ec11f19ff21d26b525darylmstruct servent *
209d7ce700605e1af0e455e31ec11f19ff21d26b525darylmgetservent()
210d7ce700605e1af0e455e31ec11f19ff21d26b525darylm{
211d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	char *p;
212d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	register char *cp, **q;
213d7ce700605e1af0e455e31ec11f19ff21d26b525darylm
214d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#ifdef YP
215d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	if (serv_stepping_yp && _getservent_yp(line)) {
216d7ce700605e1af0e455e31ec11f19ff21d26b525darylm		p = (char *)&line;
217d7ce700605e1af0e455e31ec11f19ff21d26b525darylm		goto unpack;
218d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	}
219d7ce700605e1af0e455e31ec11f19ff21d26b525darylmtryagain:
220d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#endif
221d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	if (servf == NULL && (servf = fopen(_PATH_SERVICES, "r" )) == NULL)
222d7ce700605e1af0e455e31ec11f19ff21d26b525darylm		return (NULL);
223d7ce700605e1af0e455e31ec11f19ff21d26b525darylmagain:
224d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	if ((p = fgets(line, BUFSIZ, servf)) == NULL)
225d7ce700605e1af0e455e31ec11f19ff21d26b525darylm		return (NULL);
226d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#ifdef YP
227d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	if (*p == '+' && _yp_check(NULL)) {
228d7ce700605e1af0e455e31ec11f19ff21d26b525darylm		if (___getservbyname_yp != NULL) {
229d7ce700605e1af0e455e31ec11f19ff21d26b525darylm			if (!_getservbyname_yp(line))
230d7ce700605e1af0e455e31ec11f19ff21d26b525darylm				goto tryagain;
231d7ce700605e1af0e455e31ec11f19ff21d26b525darylm		}
232d7ce700605e1af0e455e31ec11f19ff21d26b525darylm		else if (___getservbyport_yp != 0) {
233d7ce700605e1af0e455e31ec11f19ff21d26b525darylm			if (!_getservbyport_yp(line))
234d7ce700605e1af0e455e31ec11f19ff21d26b525darylm				goto tryagain;
235d7ce700605e1af0e455e31ec11f19ff21d26b525darylm		}
236d7ce700605e1af0e455e31ec11f19ff21d26b525darylm		else if (!_getservent_yp(line))
237d7ce700605e1af0e455e31ec11f19ff21d26b525darylm			goto tryagain;
238d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	}
239d7ce700605e1af0e455e31ec11f19ff21d26b525darylmunpack:
240d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#endif
241d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	if (*p == '#')
242d7ce700605e1af0e455e31ec11f19ff21d26b525darylm		goto again;
243d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	cp = strpbrk(p, "#\n");
244d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	if (cp == NULL)
245d7ce700605e1af0e455e31ec11f19ff21d26b525darylm		goto again;
246d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	*cp = '\0';
247d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	serv.s_name = p;
248d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	p = strpbrk(p, " \t");
249d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	if (p == NULL)
250d7ce700605e1af0e455e31ec11f19ff21d26b525darylm		goto again;
251d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	*p++ = '\0';
252d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	while (*p == ' ' || *p == '\t')
253d7ce700605e1af0e455e31ec11f19ff21d26b525darylm		p++;
254d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	cp = strpbrk(p, ",/");
255d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	if (cp == NULL)
256d7ce700605e1af0e455e31ec11f19ff21d26b525darylm		goto again;
257d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	*cp++ = '\0';
258d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	serv.s_port = htons((u_short)atoi(p));
259d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	serv.s_proto = cp;
260d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	q = serv.s_aliases = serv_aliases;
261d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	cp = strpbrk(cp, " \t");
262d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	if (cp != NULL)
263d7ce700605e1af0e455e31ec11f19ff21d26b525darylm		*cp++ = '\0';
264d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	while (cp && *cp) {
265d7ce700605e1af0e455e31ec11f19ff21d26b525darylm		if (*cp == ' ' || *cp == '\t') {
266d7ce700605e1af0e455e31ec11f19ff21d26b525darylm			cp++;
267d7ce700605e1af0e455e31ec11f19ff21d26b525darylm			continue;
268d7ce700605e1af0e455e31ec11f19ff21d26b525darylm		}
269d7ce700605e1af0e455e31ec11f19ff21d26b525darylm		if (q < &serv_aliases[MAXALIASES - 1])
270d7ce700605e1af0e455e31ec11f19ff21d26b525darylm			*q++ = cp;
271d7ce700605e1af0e455e31ec11f19ff21d26b525darylm		cp = strpbrk(cp, " \t");
272d7ce700605e1af0e455e31ec11f19ff21d26b525darylm		if (cp != NULL)
273d7ce700605e1af0e455e31ec11f19ff21d26b525darylm			*cp++ = '\0';
274d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	}
275d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	*q = NULL;
276d7ce700605e1af0e455e31ec11f19ff21d26b525darylm	return (&serv);
277d7ce700605e1af0e455e31ec11f19ff21d26b525darylm}
278