1 /* getnetent.c 4.8 83/05/23 */ 2 3 #include <stdio.h> 4 #include <sys/types.h> 5 #include <sys/socket.h> 6 #include <netdb.h> 7 #include <ctype.h> 8 9 #define MAXALIASES 35 10 11 static char NETDB[] = "/etc/networks"; 12 static FILE *netf = NULL; 13 static char line[BUFSIZ+1]; 14 static struct netent net; 15 static char *net_aliases[MAXALIASES]; 16 static int stayopen = 0; 17 static char *any(); 18 19 setnetent(f) 20 int f; 21 { 22 if (netf == NULL) 23 netf = fopen(NETDB, "r" ); 24 else 25 rewind(netf); 26 stayopen |= f; 27 } 28 29 endnetent() 30 { 31 if (netf && !stayopen) { 32 fclose(netf); 33 netf = NULL; 34 } 35 } 36 37 struct netent * 38 getnetent() 39 { 40 char *p; 41 register char *cp, **q; 42 43 if (netf == NULL && (netf = fopen(NETDB, "r" )) == NULL) 44 return (NULL); 45 again: 46 p = fgets(line, BUFSIZ, netf); 47 if (p == NULL) 48 return (NULL); 49 if (*p == '#') 50 goto again; 51 cp = any(p, "#\n"); 52 if (cp == NULL) 53 goto again; 54 *cp = '\0'; 55 net.n_name = p; 56 cp = any(p, " \t"); 57 if (cp == NULL) 58 goto again; 59 *cp++ = '\0'; 60 while (*cp == ' ' || *cp == '\t') 61 cp++; 62 p = any(cp, " \t"); 63 if (p != NULL) 64 *p++ = '\0'; 65 net.n_net = inet_network(cp); 66 net.n_addrtype = AF_INET; 67 q = net.n_aliases = net_aliases; 68 if (p != NULL) 69 cp = p; 70 while (cp && *cp) { 71 if (*cp == ' ' || *cp == '\t') { 72 cp++; 73 continue; 74 } 75 if (q < &net_aliases[MAXALIASES - 1]) 76 *q++ = cp; 77 cp = any(cp, " \t"); 78 if (cp != NULL) 79 *cp++ = '\0'; 80 } 81 *q = NULL; 82 return (&net); 83 } 84 85 static char * 86 any(cp, match) 87 register char *cp; 88 char *match; 89 { 90 register char *mp, c; 91 92 while (c = *cp) { 93 for (mp = match; *mp; mp++) 94 if (*mp == c) 95 return (cp); 96 cp++; 97 } 98 return ((char *)0); 99 } 100