1*12691Ssam /* getnetent.c 4.8 83/05/23 */ 27896Ssam 37896Ssam #include <stdio.h> 4*12691Ssam #include <sys/types.h> 57896Ssam #include <sys/socket.h> 67896Ssam #include <netdb.h> 77896Ssam #include <ctype.h> 87896Ssam 97896Ssam #define MAXALIASES 35 107896Ssam 119808Ssam static char NETDB[] = "/etc/networks"; 127896Ssam static FILE *netf = NULL; 137896Ssam static char line[BUFSIZ+1]; 147896Ssam static struct netent net; 157896Ssam static char *net_aliases[MAXALIASES]; 167896Ssam static int stayopen = 0; 177896Ssam static char *any(); 187896Ssam 197896Ssam setnetent(f) 207896Ssam int f; 217896Ssam { 227896Ssam if (netf == NULL) 237896Ssam netf = fopen(NETDB, "r" ); 247896Ssam else 257896Ssam rewind(netf); 267896Ssam stayopen |= f; 277896Ssam } 287896Ssam 297896Ssam endnetent() 307896Ssam { 317896Ssam if (netf && !stayopen) { 327896Ssam fclose(netf); 337896Ssam netf = NULL; 347896Ssam } 357896Ssam } 367896Ssam 377896Ssam struct netent * 387896Ssam getnetent() 397896Ssam { 407896Ssam char *p; 417896Ssam register char *cp, **q; 427896Ssam 437896Ssam if (netf == NULL && (netf = fopen(NETDB, "r" )) == NULL) 447896Ssam return (NULL); 457896Ssam again: 467896Ssam p = fgets(line, BUFSIZ, netf); 477896Ssam if (p == NULL) 487896Ssam return (NULL); 497896Ssam if (*p == '#') 507896Ssam goto again; 517896Ssam cp = any(p, "#\n"); 527896Ssam if (cp == NULL) 537896Ssam goto again; 547896Ssam *cp = '\0'; 557896Ssam net.n_name = p; 567896Ssam cp = any(p, " \t"); 577896Ssam if (cp == NULL) 587896Ssam goto again; 597896Ssam *cp++ = '\0'; 607896Ssam while (*cp == ' ' || *cp == '\t') 617896Ssam cp++; 627896Ssam p = any(cp, " \t"); 637896Ssam if (p != NULL) 647896Ssam *p++ = '\0'; 658364Ssam net.n_net = inet_network(cp); 668342Ssam net.n_addrtype = AF_INET; 679190Ssam q = net.n_aliases = net_aliases; 6810087Ssam if (p != NULL) 699190Ssam cp = p; 7010087Ssam while (cp && *cp) { 7110087Ssam if (*cp == ' ' || *cp == '\t') { 7210087Ssam cp++; 7310087Ssam continue; 747896Ssam } 7510087Ssam if (q < &net_aliases[MAXALIASES - 1]) 7610087Ssam *q++ = cp; 7710087Ssam cp = any(cp, " \t"); 7810087Ssam if (cp != NULL) 7910087Ssam *cp++ = '\0'; 807896Ssam } 817896Ssam *q = NULL; 827896Ssam return (&net); 837896Ssam } 847896Ssam 857896Ssam static char * 867896Ssam any(cp, match) 877896Ssam register char *cp; 887896Ssam char *match; 897896Ssam { 907896Ssam register char *mp, c; 917896Ssam 927896Ssam while (c = *cp) { 937896Ssam for (mp = match; *mp; mp++) 947896Ssam if (*mp == c) 957896Ssam return (cp); 967896Ssam cp++; 977896Ssam } 987896Ssam return ((char *)0); 997896Ssam } 100