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