|
|
1.1 ! root 1: #include <sys/types.h> ! 2: #include <sys/types.h> ! 3: #include <sys/stat.h> ! 4: #include <sys/inet/in.h> ! 5: #include <stdio.h> ! 6: #include <ctype.h> ! 7: ! 8: ! 9: struct namefile { ! 10: char *name; ! 11: char *data; ! 12: long time; ! 13: }; ! 14: ! 15: static struct namefile files[] = { ! 16: { "/tmp/networks", 0, 0 }, ! 17: { 0, 0, 0}, ! 18: }; ! 19: ! 20: struct hash { ! 21: struct hash *next; ! 22: in_addr addr; ! 23: char *name; ! 24: }; ! 25: ! 26: #define HSIZE 1023 ! 27: static struct hash ht[HSIZE]; ! 28: ! 29: /* imported */ ! 30: extern char *in_getw(); ! 31: extern char *malloc(); ! 32: ! 33: /* exported */ ! 34: int in_host_dostat=1; ! 35: ! 36: static int ! 37: getfile(i) ! 38: int i; ! 39: { ! 40: int fd; ! 41: struct stat sbuf; ! 42: unsigned int x; ! 43: ! 44: if (in_host_dostat) ! 45: stat(files[i].name, &sbuf); ! 46: else ! 47: sbuf.st_mtime = files[i].time; ! 48: if (files[i].data == 0 || sbuf.st_mtime>files[i].time) { ! 49: if (!in_host_dostat) ! 50: stat(files[i].name, &sbuf); ! 51: fd = open(files[i].name, 0); ! 52: if (fd<0) ! 53: return -1; ! 54: if (files[i].data!=0) ! 55: free(files[i].data); ! 56: x = sbuf.st_size; ! 57: files[i].data = malloc(x+2); ! 58: if (files[i].data==0) { ! 59: close(fd); ! 60: return -1; ! 61: } ! 62: if (read(fd, files[i].data, x)!=x){ ! 63: close(fd); ! 64: return -1; ! 65: } ! 66: close(fd); ! 67: files[i].data[sbuf.st_size] = '\n'; ! 68: files[i].data[sbuf.st_size+1] = 0; ! 69: files[i].time = sbuf.st_mtime; ! 70: for (i=0; i<HSIZE; i++) ! 71: ht[i].addr = 0; ! 72: } ! 73: return 0; ! 74: } ! 75: ! 76: #define SKIPWHITE while(*p==' ' || *p=='\t') p++ ! 77: #define GETBLACK xp = b;\ ! 78: while(*p!=' ' && *p!='\t' && *p!='\n' && *p!='\0')\ ! 79: *xp++ = *p++;\ ! 80: *xp = '\0' ! 81: ! 82: char * ! 83: in_host(addr) ! 84: in_addr addr; ! 85: { ! 86: register char *p, *xp; ! 87: unsigned char *yp; ! 88: static char b[32]; ! 89: int i; ! 90: in_addr x, in_netof(), in_aton(); ! 91: ! 92: if (addr==0) ! 93: return "*"; ! 94: i = addr==in_netof(addr) ? 0 : 1; ! 95: if (getfile(i) < 0) { ! 96: perror(files[i].name); ! 97: } else if (addr == ht[addr%HSIZE].addr) { ! 98: p = ht[addr%HSIZE].name; ! 99: GETBLACK; ! 100: return(b); ! 101: } else for (p = files[i].data; *p; p++){ ! 102: /* get number */ ! 103: SKIPWHITE; ! 104: GETBLACK; ! 105: x = in_aton(b); ! 106: SKIPWHITE; ! 107: if (x != 0 && *p != '\n') { ! 108: /* get name & insert into hash table */ ! 109: i = x%HSIZE; ! 110: ht[i].addr = x; ! 111: ht[i].name = p; ! 112: GETBLACK; ! 113: ! 114: /* see if this is the one */ ! 115: if (x==addr) ! 116: return b; ! 117: } ! 118: /* drop rest of line */ ! 119: while(*p!='\n'&&*p!='\0') p++; ! 120: } ! 121: yp = (unsigned char *) &addr; ! 122: sprintf(b, "%d.%d.%d.%d", yp[3], yp[2], yp[1], yp[0]); ! 123: return(b); ! 124: } ! 125: ! 126: main() ! 127: { ! 128: in_addr net, addr, onet; ! 129: char line[128]; ! 130: char *name, *cp; ! 131: ! 132: onet = -1; ! 133: while(gets(line)!=NULL) { ! 134: /* comments */ ! 135: if (line[0]=='#'||line[0]=='\n' || line[0]==' ' || line[0]=='\t'){ ! 136: puts(line); ! 137: continue; ! 138: } ! 139: ! 140: /* get addr and net */ ! 141: for (name=line; *name&&*name!=' '&&*name!='\t'; name++) ! 142: ; ! 143: if (*name=='\0') ! 144: continue; ! 145: *name++ = '\0'; ! 146: if ((addr=in_aton(line))==0 || (net=in_netof(addr))==0) { ! 147: printf("%s %s\n", line, name); ! 148: continue; ! 149: } ! 150: if (net!=onet) { ! 151: onet = net; ! 152: printf("%s %s\n", in_ntoa(net), in_host(net)); ! 153: } ! 154: ! 155: /* get name */ ! 156: for (; *name==' '||*name=='\t'; name++) ! 157: ; ! 158: if (*name=='\0') ! 159: continue; ! 160: for (cp=name; *cp&&*cp!=' '&&*cp!='\t'; cp++) ! 161: ; ! 162: if (*cp!='\0') ! 163: *cp++ = '\0'; ! 164: ! 165: /* print out both addresses */ ! 166: printf("%s %s/%s %s %s\n", line, in_host(net),name,name,cp); ! 167: } ! 168: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.