1 1.22 nia /* $NetBSD: getnetent.c,v 1.22 2020/06/05 11:16:15 nia Exp $ */ 2 1.4 cgd 3 1.1 cgd /* 4 1.4 cgd * Copyright (c) 1983, 1993 5 1.4 cgd * The Regents of the University of California. All rights reserved. 6 1.1 cgd * 7 1.1 cgd * Redistribution and use in source and binary forms, with or without 8 1.1 cgd * modification, are permitted provided that the following conditions 9 1.1 cgd * are met: 10 1.1 cgd * 1. Redistributions of source code must retain the above copyright 11 1.1 cgd * notice, this list of conditions and the following disclaimer. 12 1.1 cgd * 2. Redistributions in binary form must reproduce the above copyright 13 1.1 cgd * notice, this list of conditions and the following disclaimer in the 14 1.1 cgd * documentation and/or other materials provided with the distribution. 15 1.15 agc * 3. Neither the name of the University nor the names of its contributors 16 1.1 cgd * may be used to endorse or promote products derived from this software 17 1.1 cgd * without specific prior written permission. 18 1.1 cgd * 19 1.1 cgd * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 20 1.1 cgd * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21 1.1 cgd * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22 1.1 cgd * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 23 1.1 cgd * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 24 1.1 cgd * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 25 1.1 cgd * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 26 1.1 cgd * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 27 1.1 cgd * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 28 1.1 cgd * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29 1.1 cgd * SUCH DAMAGE. 30 1.8 mrg * 31 1.8 mrg * Portions Copyright (c) 1993 Carlos Leandro and Rui Salgueiro 32 1.8 mrg * Dep. Matematica Universidade de Coimbra, Portugal, Europe 33 1.8 mrg * 34 1.8 mrg * Permission to use, copy, modify, and distribute this software for any 35 1.8 mrg * purpose with or without fee is hereby granted, provided that the above 36 1.8 mrg * copyright notice and this permission notice appear in all copies. 37 1.8 mrg * 38 1.8 mrg * from getnetent.c 1.1 (Coimbra) 93/06/02 39 1.1 cgd */ 40 1.1 cgd 41 1.9 christos #include <sys/cdefs.h> 42 1.1 cgd #if defined(LIBC_SCCS) && !defined(lint) 43 1.4 cgd #if 0 44 1.4 cgd static char sccsid[] = "@(#)getnetent.c 8.1 (Berkeley) 6/4/93"; 45 1.12 perry static char rcsid[] = "Id: getnetent.c,v 8.4 1997/06/01 20:34:37 vixie Exp "; 46 1.4 cgd #else 47 1.22 nia __RCSID("$NetBSD: getnetent.c,v 1.22 2020/06/05 11:16:15 nia Exp $"); 48 1.4 cgd #endif 49 1.1 cgd #endif /* LIBC_SCCS and not lint */ 50 1.1 cgd 51 1.11 jtc #include "namespace.h" 52 1.1 cgd #include <sys/types.h> 53 1.1 cgd #include <sys/socket.h> 54 1.1 cgd #include <netinet/in.h> 55 1.1 cgd #include <arpa/inet.h> 56 1.1 cgd #include <netdb.h> 57 1.1 cgd #include <stdio.h> 58 1.1 cgd #include <string.h> 59 1.1 cgd 60 1.11 jtc #ifdef __weak_alias 61 1.13 mycroft __weak_alias(endnetent,_endnetent) 62 1.13 mycroft __weak_alias(getnetent,_getnetent) 63 1.13 mycroft __weak_alias(setnetent,_setnetent) 64 1.11 jtc #endif 65 1.11 jtc 66 1.1 cgd #define MAXALIASES 35 67 1.1 cgd 68 1.1 cgd static FILE *netf; 69 1.1 cgd static char line[BUFSIZ+1]; 70 1.1 cgd static struct netent net; 71 1.1 cgd static char *net_aliases[MAXALIASES]; 72 1.1 cgd int _net_stayopen; 73 1.1 cgd 74 1.21 matt static void __setnetent(int); 75 1.21 matt static void __endnetent(void); 76 1.8 mrg 77 1.8 mrg void 78 1.21 matt setnetent(int stayopen) 79 1.8 mrg { 80 1.8 mrg 81 1.8 mrg sethostent(stayopen); 82 1.11 jtc __setnetent(stayopen); 83 1.8 mrg } 84 1.8 mrg 85 1.1 cgd void 86 1.21 matt endnetent(void) 87 1.8 mrg { 88 1.8 mrg 89 1.8 mrg endhostent(); 90 1.11 jtc __endnetent(); 91 1.8 mrg } 92 1.8 mrg 93 1.11 jtc static void 94 1.21 matt __setnetent(int f) 95 1.1 cgd { 96 1.8 mrg 97 1.1 cgd if (netf == NULL) 98 1.19 christos netf = fopen(_PATH_NETWORKS, "re"); 99 1.1 cgd else 100 1.1 cgd rewind(netf); 101 1.1 cgd _net_stayopen |= f; 102 1.1 cgd } 103 1.1 cgd 104 1.11 jtc static void 105 1.21 matt __endnetent(void) 106 1.1 cgd { 107 1.8 mrg 108 1.1 cgd if (netf) { 109 1.1 cgd fclose(netf); 110 1.1 cgd netf = NULL; 111 1.1 cgd } 112 1.1 cgd _net_stayopen = 0; 113 1.1 cgd } 114 1.1 cgd 115 1.1 cgd struct netent * 116 1.21 matt getnetent(void) 117 1.1 cgd { 118 1.1 cgd char *p; 119 1.1 cgd register char *cp, **q; 120 1.1 cgd 121 1.19 christos if (netf == NULL && (netf = fopen(_PATH_NETWORKS, "re")) == NULL) 122 1.1 cgd return (NULL); 123 1.16 kleink #if (defined(__sparc__) && defined(_LP64)) || \ 124 1.22 nia defined(__alpha__) 125 1.16 kleink net.__n_pad0 = 0; 126 1.16 kleink #endif 127 1.1 cgd again: 128 1.20 christos p = fgets(line, (int)sizeof line, netf); 129 1.1 cgd if (p == NULL) 130 1.1 cgd return (NULL); 131 1.1 cgd if (*p == '#') 132 1.1 cgd goto again; 133 1.1 cgd cp = strpbrk(p, "#\n"); 134 1.1 cgd if (cp == NULL) 135 1.1 cgd goto again; 136 1.1 cgd *cp = '\0'; 137 1.1 cgd net.n_name = p; 138 1.1 cgd cp = strpbrk(p, " \t"); 139 1.1 cgd if (cp == NULL) 140 1.1 cgd goto again; 141 1.1 cgd *cp++ = '\0'; 142 1.1 cgd while (*cp == ' ' || *cp == '\t') 143 1.1 cgd cp++; 144 1.1 cgd p = strpbrk(cp, " \t"); 145 1.1 cgd if (p != NULL) 146 1.1 cgd *p++ = '\0'; 147 1.1 cgd net.n_net = inet_network(cp); 148 1.1 cgd net.n_addrtype = AF_INET; 149 1.1 cgd q = net.n_aliases = net_aliases; 150 1.14 itojun if (p != NULL) { 151 1.1 cgd cp = p; 152 1.7 mrg while (cp && *cp) { 153 1.7 mrg if (*cp == ' ' || *cp == '\t') { 154 1.7 mrg cp++; 155 1.7 mrg continue; 156 1.7 mrg } 157 1.7 mrg if (q < &net_aliases[MAXALIASES - 1]) 158 1.7 mrg *q++ = cp; 159 1.7 mrg cp = strpbrk(cp, " \t"); 160 1.7 mrg if (cp != NULL) 161 1.7 mrg *cp++ = '\0'; 162 1.1 cgd } 163 1.1 cgd } 164 1.1 cgd *q = NULL; 165 1.1 cgd return (&net); 166 1.1 cgd } 167