1511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall/*
2511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * Copyright (c) 1983, 1993
3511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *	The Regents of the University of California.  All rights reserved.
4511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *
5511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * Redistribution and use in source and binary forms, with or without
6511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * modification, are permitted provided that the following conditions
7511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * are met:
8511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * 1. Redistributions of source code must retain the above copyright
9511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *    notice, this list of conditions and the following disclaimer.
10511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * 2. Redistributions in binary form must reproduce the above copyright
11511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *    notice, this list of conditions and the following disclaimer in the
12511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *    documentation and/or other materials provided with the distribution.
13511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * 3. All advertising materials mentioning features or use of this software
14511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *    must display the following acknowledgement:
15511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *	This product includes software developed by the University of
16511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *	California, Berkeley and its contributors.
17511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * 4. Neither the name of the University nor the names of its contributors
18511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *    may be used to endorse or promote products derived from this software
19511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *    without specific prior written permission.
20511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *
21511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * SUCH DAMAGE.
32511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall */
33511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
34511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#if defined(LIBC_SCCS) && !defined(lint)
35511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallstatic char sccsid[] = "@(#)getservent.c	8.1 (Berkeley) 6/4/93";
36511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#endif /* LIBC_SCCS and not lint */
37511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
38511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#include <sys/types.h>
39511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#include <string.h>
40511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
41511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#include <stdlib.h>
42511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#include <ctype.h>
43511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#include <net/netdb.h>
44511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#include <stdio.h>
45511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#include <errno.h>
46511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#include <arpa/nameser.h>
47511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
48511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#define	MAXALIASES	35
49511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
50511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallstatic char SERVDB[] = _PATH_SERVICES;
51511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallstatic FILE *servf = NULL;
52511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallstatic char line[BUFSIZ+1];
53511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallstatic struct servent serv;
54511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallstatic char *serv_aliases[MAXALIASES];
55511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallint _serv_stayopen;
56511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
57511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallvoid
58511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallsetservent(f)
59511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	int f;
60511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall{
61511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	if (servf == NULL)
62511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		servf = fopen(SERVDB, "r" );
63511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	else
64511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		rewind(servf);
65511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	_serv_stayopen |= f;
66511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall}
67511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
68511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallvoid
69511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallendservent()
70511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall{
71511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	if (servf) {
72511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		fclose(servf);
73511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		servf = NULL;
74511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	}
75511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	_serv_stayopen = 0;
76511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall}
77511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
78511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallstruct servent *
79511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallgetservent()
80511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall{
81511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	char *p;
82511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	register char *cp, **q;
83511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
84511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	if (servf == NULL && (servf = fopen(SERVDB, "r" )) == NULL)
85511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		return (NULL);
86511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallagain:
87511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	if ((p = fgets(line, BUFSIZ, servf)) == NULL)
88511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		return (NULL);
89511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	if (*p == '#')
90511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		goto again;
91511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	cp = strpbrk(p, "#\n");
92511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	if (cp == NULL)
93511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		goto again;
94511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	*cp = '\0';
95511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	serv.s_name = p;
96511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	p = strpbrk(p, " \t");
97511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	if (p == NULL)
98511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		goto again;
99511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	*p++ = '\0';
100511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	while (*p == ' ' || *p == '\t')
101511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		p++;
102511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	cp = strpbrk(p, ",/");
103511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	if (cp == NULL)
104511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		goto again;
105511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	*cp++ = '\0';
106511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	serv.s_port = htons((u_short)atoi(p));
107511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	serv.s_proto = cp;
108511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	q = serv.s_aliases = serv_aliases;
109511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	cp = strpbrk(cp, " \t");
110511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	if (cp != NULL)
111511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		*cp++ = '\0';
112511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	while (cp && *cp) {
113511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		if (*cp == ' ' || *cp == '\t') {
114511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall			cp++;
115511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall			continue;
116511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		}
117511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		if (q < &serv_aliases[MAXALIASES - 1])
118511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall			*q++ = cp;
119511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		cp = strpbrk(cp, " \t");
120511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		if (cp != NULL)
121511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall			*cp++ = '\0';
122511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	}
123511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	*q = NULL;
124511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	return (&serv);
125511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall}
126