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[] = "@(#)getprotoent.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 <stdlib.h> 43d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#include <string.h> 44d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 45d7ce700605e1af0e455e31ec11f19ff21d26b525darylm#define MAXALIASES 35 46d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 47d7ce700605e1af0e455e31ec11f19ff21d26b525darylmstatic FILE *protof = NULL; 48d7ce700605e1af0e455e31ec11f19ff21d26b525darylmstatic char line[BUFSIZ+1]; 49d7ce700605e1af0e455e31ec11f19ff21d26b525darylmstatic struct protoent proto; 50d7ce700605e1af0e455e31ec11f19ff21d26b525darylmstatic char *proto_aliases[MAXALIASES]; 51d7ce700605e1af0e455e31ec11f19ff21d26b525darylmint _proto_stayopen; 52d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 53d7ce700605e1af0e455e31ec11f19ff21d26b525darylmvoid 54d7ce700605e1af0e455e31ec11f19ff21d26b525darylmsetprotoent(int f) 55d7ce700605e1af0e455e31ec11f19ff21d26b525darylm{ 56d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (protof == NULL) 57d7ce700605e1af0e455e31ec11f19ff21d26b525darylm protof = fopen(_PATH_PROTOCOLS, "r" ); 58d7ce700605e1af0e455e31ec11f19ff21d26b525darylm else 59d7ce700605e1af0e455e31ec11f19ff21d26b525darylm rewind(protof); 60d7ce700605e1af0e455e31ec11f19ff21d26b525darylm _proto_stayopen |= f; 61d7ce700605e1af0e455e31ec11f19ff21d26b525darylm} 62d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 63d7ce700605e1af0e455e31ec11f19ff21d26b525darylmvoid 64d7ce700605e1af0e455e31ec11f19ff21d26b525darylmendprotoent() 65d7ce700605e1af0e455e31ec11f19ff21d26b525darylm{ 66d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (protof) { 67d7ce700605e1af0e455e31ec11f19ff21d26b525darylm fclose(protof); 68d7ce700605e1af0e455e31ec11f19ff21d26b525darylm protof = NULL; 69d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } 70d7ce700605e1af0e455e31ec11f19ff21d26b525darylm _proto_stayopen = 0; 71d7ce700605e1af0e455e31ec11f19ff21d26b525darylm} 72d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 73d7ce700605e1af0e455e31ec11f19ff21d26b525darylmstruct protoent * 74d7ce700605e1af0e455e31ec11f19ff21d26b525darylmgetprotoent() 75d7ce700605e1af0e455e31ec11f19ff21d26b525darylm{ 76d7ce700605e1af0e455e31ec11f19ff21d26b525darylm char *p; 77d7ce700605e1af0e455e31ec11f19ff21d26b525darylm register char *cp, **q; 78d7ce700605e1af0e455e31ec11f19ff21d26b525darylm 79d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (protof == NULL && (protof = fopen(_PATH_PROTOCOLS, "r" )) == NULL) 80d7ce700605e1af0e455e31ec11f19ff21d26b525darylm return (NULL); 81d7ce700605e1af0e455e31ec11f19ff21d26b525darylmagain: 82d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if ((p = fgets(line, BUFSIZ, protof)) == NULL) 83d7ce700605e1af0e455e31ec11f19ff21d26b525darylm return (NULL); 84d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (*p == '#') 85d7ce700605e1af0e455e31ec11f19ff21d26b525darylm goto again; 86d7ce700605e1af0e455e31ec11f19ff21d26b525darylm cp = strpbrk(p, "#\n"); 87d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (cp == NULL) 88d7ce700605e1af0e455e31ec11f19ff21d26b525darylm goto again; 89d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *cp = '\0'; 90d7ce700605e1af0e455e31ec11f19ff21d26b525darylm proto.p_name = p; 91d7ce700605e1af0e455e31ec11f19ff21d26b525darylm cp = strpbrk(p, " \t"); 92d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (cp == NULL) 93d7ce700605e1af0e455e31ec11f19ff21d26b525darylm goto again; 94d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *cp++ = '\0'; 95d7ce700605e1af0e455e31ec11f19ff21d26b525darylm while (*cp == ' ' || *cp == '\t') 96d7ce700605e1af0e455e31ec11f19ff21d26b525darylm cp++; 97d7ce700605e1af0e455e31ec11f19ff21d26b525darylm p = strpbrk(cp, " \t"); 98d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (p != NULL) 99d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *p++ = '\0'; 100d7ce700605e1af0e455e31ec11f19ff21d26b525darylm proto.p_proto = atoi(cp); 101d7ce700605e1af0e455e31ec11f19ff21d26b525darylm q = proto.p_aliases = proto_aliases; 102d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (p != NULL) { 103d7ce700605e1af0e455e31ec11f19ff21d26b525darylm cp = p; 104d7ce700605e1af0e455e31ec11f19ff21d26b525darylm while (cp && *cp) { 105d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (*cp == ' ' || *cp == '\t') { 106d7ce700605e1af0e455e31ec11f19ff21d26b525darylm cp++; 107d7ce700605e1af0e455e31ec11f19ff21d26b525darylm continue; 108d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } 109d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (q < &proto_aliases[MAXALIASES - 1]) 110d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *q++ = cp; 111d7ce700605e1af0e455e31ec11f19ff21d26b525darylm cp = strpbrk(cp, " \t"); 112d7ce700605e1af0e455e31ec11f19ff21d26b525darylm if (cp != NULL) 113d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *cp++ = '\0'; 114d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } 115d7ce700605e1af0e455e31ec11f19ff21d26b525darylm } 116d7ce700605e1af0e455e31ec11f19ff21d26b525darylm *q = NULL; 117d7ce700605e1af0e455e31ec11f19ff21d26b525darylm return (&proto); 118d7ce700605e1af0e455e31ec11f19ff21d26b525darylm} 119