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