#ifndef lint static char sccsid[] = "@(#)netrange.c 1.1 94/10/31 Copyright 1987 Sun Microsystems Inc."; #endif #include #include #include #include #include #include "netrange.h" extern u_long inet_addr (); extern int debug; char *netrange_file = "/etc/ipalloc.netrange"; static hostrange retval [MAX_RANGE + 1]; hostrange * get_hostrange (ipnetnum) u_long ipnetnum; { FILE *f = fopen (netrange_file, "r"); u_long netnum; int i; char buf [8192], *cp; /* FILE FORMAT: * [,]* * where * ... decimal dot notation, includes subnet # * ... or - * and malformed ranges are ignored. * * XXX this will turn to EZDB ops someday */ if (debug) { netnum = htonl(ipnetnum); printf ("get_hostrange %s\n", inet_ntoa (netnum)); } if (!f) return (hostrange *) NULL; bzero ((char *) retval, sizeof (retval)); while (!feof (f)) { if (!fgets (buf, sizeof (buf), f)) continue; if ((cp = strchr (buf, '#')) != (char *) NULL) *cp = 0; if ((cp = strtok (buf, " \n\t")) == (char *) NULL) continue; netnum = ntohl (inet_addr (cp)); if (debug) printf ("?? 0x%08x matches arg 0x%08x ??\n", netnum, ipnetnum); if (netnum != ipnetnum) continue; for (i = 0; i < MAX_RANGE; i++) { cp = strtok ((char *) NULL, ","); /* XXX allow backslash-newline continuation */ if (!cp) goto done; switch (sscanf (cp, "%ld-%ld", &retval [i].h_start, &retval [i].h_end)) { case 1: retval[i].h_end = retval [i].h_start; /* FALLTHROUGH */ case 2: if (debug) printf ("%d-%d\n", retval[i].h_start, retval[i].h_end); continue; default: i--; continue; } } } done: (void) fclose (f); return retval; }