1*ee67461eSJoseph Mingrone /* 2*ee67461eSJoseph Mingrone * Copyright (c) 1983, 1993 The Regents of the University of California. 3*ee67461eSJoseph Mingrone * Copyright (c) 1993 Digital Equipment Corporation. 4*ee67461eSJoseph Mingrone * Copyright (c) 2012 G. Vanem <gvanem@yahoo.no>. 5*ee67461eSJoseph Mingrone * Copyright (c) 2017 Ali Abdulkadir <autostart.ini@gmail.com>. 6*ee67461eSJoseph Mingrone * All rights reserved. 7*ee67461eSJoseph Mingrone * 8*ee67461eSJoseph Mingrone * Redistribution and use in source and binary forms, with or without 9*ee67461eSJoseph Mingrone * modification, are permitted provided that the following conditions 10*ee67461eSJoseph Mingrone * are met: 11*ee67461eSJoseph Mingrone * 1. Redistributions of source code must retain the above copyright 12*ee67461eSJoseph Mingrone * notice, this list of conditions and the following disclaimer. 13*ee67461eSJoseph Mingrone * 2. Redistributions in binary form must reproduce the above copyright 14*ee67461eSJoseph Mingrone * notice, this list of conditions and the following disclaimer in the 15*ee67461eSJoseph Mingrone * documentation and/or other materials provided with the distribution. 16*ee67461eSJoseph Mingrone * 3. All advertising materials mentioning features or use of this software 17*ee67461eSJoseph Mingrone * must display the following acknowledgement: 18*ee67461eSJoseph Mingrone * This product includes software developed by the University of 19*ee67461eSJoseph Mingrone * California, Berkeley and its contributors. 20*ee67461eSJoseph Mingrone * 4. Neither the name of the University nor the names of its contributors 21*ee67461eSJoseph Mingrone * may be used to endorse or promote products derived from this software 22*ee67461eSJoseph Mingrone * without specific prior written permission. 23*ee67461eSJoseph Mingrone * 24*ee67461eSJoseph Mingrone * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 25*ee67461eSJoseph Mingrone * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 26*ee67461eSJoseph Mingrone * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 27*ee67461eSJoseph Mingrone * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 28*ee67461eSJoseph Mingrone * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 29*ee67461eSJoseph Mingrone * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 30*ee67461eSJoseph Mingrone * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 31*ee67461eSJoseph Mingrone * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 32*ee67461eSJoseph Mingrone * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 33*ee67461eSJoseph Mingrone * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 34*ee67461eSJoseph Mingrone * SUCH DAMAGE. 35*ee67461eSJoseph Mingrone */ 36*ee67461eSJoseph Mingrone 37*ee67461eSJoseph Mingrone #include <config.h> 38*ee67461eSJoseph Mingrone 39*ee67461eSJoseph Mingrone #include <netdissect-stdinc.h> 40*ee67461eSJoseph Mingrone #include <getservent.h> 41*ee67461eSJoseph Mingrone 42*ee67461eSJoseph Mingrone static FILE *servf = NULL; 43*ee67461eSJoseph Mingrone static char line[BUFSIZ+1]; 44*ee67461eSJoseph Mingrone static struct servent serv; 45*ee67461eSJoseph Mingrone static char *serv_aliases[MAXALIASES]; 46*ee67461eSJoseph Mingrone int _serv_stayopen; 47*ee67461eSJoseph Mingrone const char *etc_path(const char *file); 48*ee67461eSJoseph Mingrone 49*ee67461eSJoseph Mingrone /* 50*ee67461eSJoseph Mingrone * Check if <file> exists in the current directory and, if so, return it. 51*ee67461eSJoseph Mingrone * Else return either "%SYSTEMROOT%\System32\drivers\etc\<file>" 52*ee67461eSJoseph Mingrone * or $PREFIX/etc/<file>. 53*ee67461eSJoseph Mingrone * "<file>" is aka __PATH_SERVICES (aka "services" on Windows and 54*ee67461eSJoseph Mingrone * "/etc/services" on other platforms that would need this). 55*ee67461eSJoseph Mingrone */ 56*ee67461eSJoseph Mingrone const char *etc_path(const char *file) 57*ee67461eSJoseph Mingrone { 58*ee67461eSJoseph Mingrone const char *env = getenv(__PATH_SYSROOT); 59*ee67461eSJoseph Mingrone static char path[_MAX_PATH]; 60*ee67461eSJoseph Mingrone 61*ee67461eSJoseph Mingrone /* see if "<file>" exists locally or whether __PATH_SYSROOT is valid */ 62*ee67461eSJoseph Mingrone if (fopen(file, "r") || !env) 63*ee67461eSJoseph Mingrone return (file); 64*ee67461eSJoseph Mingrone else 65*ee67461eSJoseph Mingrone #ifdef _WIN32 66*ee67461eSJoseph Mingrone snprintf(path, sizeof(path), "%s%s%s", env, __PATH_ETC_INET, file); 67*ee67461eSJoseph Mingrone #else 68*ee67461eSJoseph Mingrone snprintf(path, sizeof(path), "%s%s", env, file); 69*ee67461eSJoseph Mingrone #endif 70*ee67461eSJoseph Mingrone return (path); 71*ee67461eSJoseph Mingrone } 72*ee67461eSJoseph Mingrone 73*ee67461eSJoseph Mingrone void 74*ee67461eSJoseph Mingrone setservent(int f) 75*ee67461eSJoseph Mingrone { 76*ee67461eSJoseph Mingrone if (servf == NULL) 77*ee67461eSJoseph Mingrone servf = fopen(etc_path(__PATH_SERVICES), "r"); 78*ee67461eSJoseph Mingrone else 79*ee67461eSJoseph Mingrone rewind(servf); 80*ee67461eSJoseph Mingrone _serv_stayopen |= f; 81*ee67461eSJoseph Mingrone } 82*ee67461eSJoseph Mingrone 83*ee67461eSJoseph Mingrone void 84*ee67461eSJoseph Mingrone endservent(void) 85*ee67461eSJoseph Mingrone { 86*ee67461eSJoseph Mingrone if (servf) { 87*ee67461eSJoseph Mingrone fclose(servf); 88*ee67461eSJoseph Mingrone servf = NULL; 89*ee67461eSJoseph Mingrone } 90*ee67461eSJoseph Mingrone _serv_stayopen = 0; 91*ee67461eSJoseph Mingrone } 92*ee67461eSJoseph Mingrone 93*ee67461eSJoseph Mingrone struct servent * 94*ee67461eSJoseph Mingrone getservent(void) 95*ee67461eSJoseph Mingrone { 96*ee67461eSJoseph Mingrone char *p; 97*ee67461eSJoseph Mingrone char *cp, **q; 98*ee67461eSJoseph Mingrone 99*ee67461eSJoseph Mingrone if (servf == NULL && (servf = fopen(etc_path(__PATH_SERVICES), "r")) == NULL) 100*ee67461eSJoseph Mingrone return (NULL); 101*ee67461eSJoseph Mingrone 102*ee67461eSJoseph Mingrone again: 103*ee67461eSJoseph Mingrone if ((p = fgets(line, BUFSIZ, servf)) == NULL) 104*ee67461eSJoseph Mingrone return (NULL); 105*ee67461eSJoseph Mingrone if (*p == '#') 106*ee67461eSJoseph Mingrone goto again; 107*ee67461eSJoseph Mingrone cp = strpbrk(p, "#\n"); 108*ee67461eSJoseph Mingrone if (cp == NULL) 109*ee67461eSJoseph Mingrone goto again; 110*ee67461eSJoseph Mingrone *cp = '\0'; 111*ee67461eSJoseph Mingrone serv.s_name = p; 112*ee67461eSJoseph Mingrone p = strpbrk(p, " \t"); 113*ee67461eSJoseph Mingrone if (p == NULL) 114*ee67461eSJoseph Mingrone goto again; 115*ee67461eSJoseph Mingrone *p++ = '\0'; 116*ee67461eSJoseph Mingrone while (*p == ' ' || *p == '\t') 117*ee67461eSJoseph Mingrone p++; 118*ee67461eSJoseph Mingrone cp = strpbrk(p, ",/"); 119*ee67461eSJoseph Mingrone if (cp == NULL) 120*ee67461eSJoseph Mingrone goto again; 121*ee67461eSJoseph Mingrone *cp++ = '\0'; 122*ee67461eSJoseph Mingrone serv.s_port = htons((u_short)atoi(p)); 123*ee67461eSJoseph Mingrone serv.s_proto = cp; 124*ee67461eSJoseph Mingrone q = serv.s_aliases = serv_aliases; 125*ee67461eSJoseph Mingrone cp = strpbrk(cp, " \t"); 126*ee67461eSJoseph Mingrone if (cp != NULL) 127*ee67461eSJoseph Mingrone *cp++ = '\0'; 128*ee67461eSJoseph Mingrone while (cp && *cp) { 129*ee67461eSJoseph Mingrone if (*cp == ' ' || *cp == '\t') { 130*ee67461eSJoseph Mingrone cp++; 131*ee67461eSJoseph Mingrone continue; 132*ee67461eSJoseph Mingrone } 133*ee67461eSJoseph Mingrone if (q < &serv_aliases[MAXALIASES - 1]) 134*ee67461eSJoseph Mingrone *q++ = cp; 135*ee67461eSJoseph Mingrone cp = strpbrk(cp, " \t"); 136*ee67461eSJoseph Mingrone if (cp != NULL) 137*ee67461eSJoseph Mingrone *cp++ = '\0'; 138*ee67461eSJoseph Mingrone } 139*ee67461eSJoseph Mingrone *q = NULL; 140*ee67461eSJoseph Mingrone return (&serv); 141*ee67461eSJoseph Mingrone } 142