1*7896Ssam /* getnetent.c 4.1 82/08/25 */ 2*7896Ssam 3*7896Ssam #include <stdio.h> 4*7896Ssam #include <sys/socket.h> 5*7896Ssam #include <netdb.h> 6*7896Ssam #include <ctype.h> 7*7896Ssam 8*7896Ssam #define MAXALIASES 35 9*7896Ssam 10*7896Ssam static char *NETDB = "/usr/lib/networks"; 11*7896Ssam static FILE *netf = NULL; 12*7896Ssam static char line[BUFSIZ+1]; 13*7896Ssam static struct netent net; 14*7896Ssam static char *net_aliases[MAXALIASES]; 15*7896Ssam static int stayopen = 0; 16*7896Ssam static unsigned long value(); 17*7896Ssam static char *any(); 18*7896Ssam 19*7896Ssam setnetent(f) 20*7896Ssam int f; 21*7896Ssam { 22*7896Ssam if (netf == NULL) 23*7896Ssam netf = fopen(NETDB, "r" ); 24*7896Ssam else 25*7896Ssam rewind(netf); 26*7896Ssam stayopen |= f; 27*7896Ssam } 28*7896Ssam 29*7896Ssam endnetent() 30*7896Ssam { 31*7896Ssam if (netf && !stayopen) { 32*7896Ssam fclose(netf); 33*7896Ssam netf = NULL; 34*7896Ssam } 35*7896Ssam } 36*7896Ssam 37*7896Ssam struct netent * 38*7896Ssam getnetent() 39*7896Ssam { 40*7896Ssam char *p; 41*7896Ssam register char *cp, **q; 42*7896Ssam 43*7896Ssam if (netf == NULL && (netf = fopen(NETDB, "r" )) == NULL) 44*7896Ssam return (NULL); 45*7896Ssam again: 46*7896Ssam p = fgets(line, BUFSIZ, netf); 47*7896Ssam if (p == NULL) 48*7896Ssam return (NULL); 49*7896Ssam if (*p == '#') 50*7896Ssam goto again; 51*7896Ssam cp = any(p, "#\n"); 52*7896Ssam if (cp == NULL) 53*7896Ssam goto again; 54*7896Ssam *cp = '\0'; 55*7896Ssam net.n_name = p; 56*7896Ssam cp = any(p, " \t"); 57*7896Ssam if (cp == NULL) 58*7896Ssam goto again; 59*7896Ssam *cp++ = '\0'; 60*7896Ssam while (*cp == ' ' || *cp == '\t') 61*7896Ssam cp++; 62*7896Ssam p = any(cp, " \t"); 63*7896Ssam if (p != NULL) 64*7896Ssam *p++ = '\0'; 65*7896Ssam net.n_net = value(cp); 66*7896Ssam net.n_aliases = net_aliases; 67*7896Ssam q = net_aliases, cp = p; 68*7896Ssam while (*cp) { 69*7896Ssam if (*cp == ' ' || *cp == '\t') { 70*7896Ssam cp++; 71*7896Ssam continue; 72*7896Ssam } 73*7896Ssam if (q < &net_aliases[MAXALIASES - 1]) 74*7896Ssam *q++ = cp; 75*7896Ssam cp = any(cp, " \t"); 76*7896Ssam if (*cp != NULL) 77*7896Ssam *cp++ = '\0'; 78*7896Ssam } 79*7896Ssam *q = NULL; 80*7896Ssam return (&net); 81*7896Ssam } 82*7896Ssam 83*7896Ssam static unsigned long 84*7896Ssam value(cp) 85*7896Ssam register char *cp; 86*7896Ssam { 87*7896Ssam register unsigned long val, base, n; 88*7896Ssam register char c; 89*7896Ssam unsigned long parts[4], *pp = parts; 90*7896Ssam 91*7896Ssam again: 92*7896Ssam val = 0; base = 10; 93*7896Ssam if (*cp == '0') 94*7896Ssam base = 8, cp++; 95*7896Ssam if (*cp == 'x' || *cp == 'X') 96*7896Ssam base = 16, cp++; 97*7896Ssam while (c = *cp) { 98*7896Ssam if (isdigit(c)) { 99*7896Ssam val = (val * base) + (c - '0'); 100*7896Ssam cp++; 101*7896Ssam continue; 102*7896Ssam } 103*7896Ssam if (base == 16 && isxdigit(c)) { 104*7896Ssam val = (val << 4) + (c + 10 - (islower(c) ? 'a' : 'A')); 105*7896Ssam cp++; 106*7896Ssam continue; 107*7896Ssam } 108*7896Ssam break; 109*7896Ssam } 110*7896Ssam if (*cp == '.') { 111*7896Ssam /* 112*7896Ssam * Internet format: 113*7896Ssam * a.b.c.d 114*7896Ssam * a.b.c (with c treated as 16-bits) 115*7896Ssam * a.b (with b treated as 24 bits) 116*7896Ssam */ 117*7896Ssam if (pp >= parts + 4) 118*7896Ssam return (-1); 119*7896Ssam *pp++ = val, cp++; 120*7896Ssam goto again; 121*7896Ssam } 122*7896Ssam if (*cp && !isspace(*cp)) 123*7896Ssam return (-1); 124*7896Ssam n = pp - parts; 125*7896Ssam if (n > 0) { 126*7896Ssam if (n > 4) 127*7896Ssam return (-1); 128*7896Ssam *pp++ = val; n++; 129*7896Ssam val = parts[0]; 130*7896Ssam if (n > 1) 131*7896Ssam val <<= 24; 132*7896Ssam if (n > 2) 133*7896Ssam val |= (parts[1] & 0xff) << 16; 134*7896Ssam if (n > 3) 135*7896Ssam val |= (parts[2] & 0xff) << 8; 136*7896Ssam if (n > 1) 137*7896Ssam val |= parts[n - 1]; 138*7896Ssam #if vax || pdp11 139*7896Ssam val = htonl(val); 140*7896Ssam #endif 141*7896Ssam } 142*7896Ssam return (val); 143*7896Ssam } 144*7896Ssam 145*7896Ssam static char * 146*7896Ssam any(cp, match) 147*7896Ssam register char *cp; 148*7896Ssam char *match; 149*7896Ssam { 150*7896Ssam register char *mp, c; 151*7896Ssam 152*7896Ssam while (c = *cp) { 153*7896Ssam for (mp = match; *mp; mp++) 154*7896Ssam if (*mp == c) 155*7896Ssam return (cp); 156*7896Ssam cp++; 157*7896Ssam } 158*7896Ssam return ((char *)0); 159*7896Ssam } 160