|
|
1.1 ! root 1: #include <values.h> ! 2: #include <stdio.h> ! 3: #include <sys/param.h> ! 4: #include <sys/filio.h> ! 5: #include <sys/inio.h> ! 6: #include <sys/enio.h> ! 7: #include <sys/inet/in.h> ! 8: #include <sys/inet/ip_var.h> ! 9: #include <nlist.h> ! 10: ! 11: extern errno; ! 12: extern char *optarg; ! 13: extern int optind; ! 14: extern int ip_ld; ! 15: ! 16: struct nlist nl[] = { ! 17: {"_ip_arps", 0}, ! 18: {"_arpcnt", 0}, ! 19: {0, 0} ! 20: }; ! 21: #define NL_ARP 0 ! 22: #define NL_NARP 1 ! 23: ! 24: #define MAXARP 512 ! 25: struct x{ ! 26: unsigned int inaddr; ! 27: unsigned char enaddr[6]; ! 28: } goo; ! 29: struct ip_arp arp[MAXARP]; ! 30: int kern_fd; ! 31: ! 32: usage() ! 33: { ! 34: fprintf(stderr, "usage:\tarp hostname\n"); ! 35: fprintf(stderr, "\tarp -a [unix] [kmem]\n"); ! 36: fprintf(stderr, "\tarp -d hostname\n"); ! 37: fprintf(stderr, "\tarp -s hostname ether_addr\n"); ! 38: exit(1); ! 39: } ! 40: ! 41: main(argc, argv) ! 42: char *argv[]; ! 43: { ! 44: int c, narp; ! 45: int allf; ! 46: int deletef; ! 47: int setf; ! 48: char *xinu; ! 49: char *kmem; ! 50: ! 51: allf = deletef = setf = 0; ! 52: xinu = "/unix"; ! 53: kmem = "/dev/kmem"; ! 54: ! 55: while((c = getopt(argc, argv, "ads")) != -1) { ! 56: switch(c){ ! 57: case 'a': ! 58: allf = 1; ! 59: break; ! 60: case 'd': ! 61: deletef = 1; ! 62: break; ! 63: case 's': ! 64: setf = 1; ! 65: break; ! 66: default: ! 67: usage(); ! 68: } ! 69: } ! 70: ! 71: if(allf+setf+deletef > 1) ! 72: usage(); ! 73: ! 74: if(allf){ ! 75: if (argc > optind+1) ! 76: xinu = argv[optind++]; ! 77: if (argc > optind) ! 78: kmem = argv[optind]; ! 79: kern_init(xinu, kmem); ! 80: displayall(); ! 81: } else if(setf){ ! 82: if(optind != argc-2) ! 83: usage(); ! 84: set(argv[optind], argv[optind+1]); ! 85: } else if(deletef){ ! 86: if(optind != argc-1) ! 87: usage(); ! 88: delete(argv[optind]); ! 89: } else { ! 90: if(optind >= argc) ! 91: usage(); ! 92: kern_init(xinu, kmem); ! 93: narp = readarps(); ! 94: for(; optind < argc; optind++) ! 95: display(narp, argv[optind]); ! 96: } ! 97: } ! 98: ! 99: etherparse(to, from) ! 100: unsigned char *to; ! 101: char *from; ! 102: { ! 103: int tdig; ! 104: int fdig; ! 105: int i; ! 106: ! 107: if(strlen(from) != 12){ ! 108: fprintf(stderr, "illegal ether address %s\n", from); ! 109: exit(1); ! 110: } ! 111: ! 112: for(i = 0; i < 6; i++){ ! 113: fdig = *from++; ! 114: tdig = fdig > 'a' ? (fdig - 'a' + 10) ! 115: : (fdig > 'A' ? (fdig - 'A' + 10) : (fdig - '0')); ! 116: fdig = *from++; ! 117: tdig <<= 4; ! 118: tdig |= fdig > 'a' ? (fdig - 'a' + 10) ! 119: : (fdig > 'A' ? (fdig - 'A' + 10) : (fdig - '0')); ! 120: *to++ = tdig; ! 121: } ! 122: } ! 123: ! 124: set(host, address) ! 125: char* host; ! 126: char *address; ! 127: { ! 128: int pfd[2]; ! 129: int i; ! 130: ! 131: goo.inaddr = in_address(host); ! 132: if(goo.inaddr == 0){ ! 133: fprintf(stderr, "can't find ip address for %s\n", host); ! 134: return; ! 135: } ! 136: etherparse(goo.enaddr, address); ! 137: if(pipe(pfd) < 0){ ! 138: perror("setting"); ! 139: exit(1); ! 140: } ! 141: if(ioctl(pfd[0], FIOPUSHLD, &ip_ld) < 0){ ! 142: perror("setting"); ! 143: exit(1); ! 144: } ! 145: if(ioctl(pfd[0], IPIORESOLVE, &goo) < 0) ! 146: perror("can't set ether address"); ! 147: close(pfd[0]); ! 148: close(pfd[1]); ! 149: } ! 150: ! 151: delete(host) ! 152: char *host; ! 153: { ! 154: int i; ! 155: int pfd[2]; ! 156: ! 157: ! 158: goo.inaddr = in_address(host); ! 159: if(goo.inaddr == 0){ ! 160: fprintf(stderr, "can't find ip address for %s\n", host); ! 161: return; ! 162: } ! 163: ! 164: if(pipe(pfd) < 0){ ! 165: perror("setting"); ! 166: exit(1); ! 167: } ! 168: if(ioctl(pfd[0], FIOPUSHLD, &ip_ld) < 0){ ! 169: perror("setting"); ! 170: exit(1); ! 171: } ! 172: ! 173: /* ! 174: * this assumes the hashing algorithm is the same as that of ! 175: * the system ! 176: */ ! 177: for(i = 0; i < 256; i++){ ! 178: goo.inaddr = i; ! 179: if(ioctl(pfd[0], IPIORESOLVE, &goo) < 0){ ! 180: fprintf(stderr, "can't delete ether address for %s\n", host); ! 181: break; ! 182: } ! 183: } ! 184: close(pfd[0]); ! 185: close(pfd[1]); ! 186: } ! 187: ! 188: kern_init(xinu, kmem) ! 189: char *xinu, *kmem; ! 190: { ! 191: int i; ! 192: ! 193: nlist(xinu, nl); ! 194: if((long)nl[0].n_value == 0){ ! 195: fprintf(stderr, "nlist %s failed\n", xinu); ! 196: exit(1); ! 197: } ! 198: if(strcmp(kmem, "/dev/kmem") != 0){ ! 199: for(i = 0; nl[i].n_name; i++){ ! 200: nl[i].n_value &= 0xffffff; ! 201: } ! 202: } ! 203: kern_fd = open(kmem, 0); ! 204: if(kern_fd < 0){ ! 205: perror(kmem); ! 206: exit(1); ! 207: } ! 208: } ! 209: ! 210: doseek(nlitem) ! 211: unsigned int nlitem; ! 212: { ! 213: if (nl[nlitem].n_value == 0) ! 214: return -1; ! 215: if(lseek(kern_fd, (long)nl[nlitem].n_value, 0) == -1){ ! 216: perror("seek"); ! 217: exit(1); ! 218: } ! 219: return 0; ! 220: } ! 221: ! 222: void ! 223: doseekoff(nlitem, offset) ! 224: unsigned int nlitem; ! 225: unsigned int offset; ! 226: { ! 227: if(lseek(kern_fd, (long)(nl[nlitem].n_value+offset), 0) == -1){ ! 228: perror("seek"); ! 229: exit(1); ! 230: } ! 231: } ! 232: ! 233: void ! 234: doread(addr, size) ! 235: char *addr; ! 236: unsigned int size; ! 237: { ! 238: if(read(kern_fd, addr, size) < 0){ ! 239: perror("read"); ! 240: exit(1); ! 241: } ! 242: } ! 243: ! 244: readarps() ! 245: { ! 246: int narp; ! 247: ! 248: if (doseek(NL_NARP) < 0) { ! 249: fprintf(stderr, "Arp not compiled into this kernel\n"); ! 250: exit(1); ! 251: } ! 252: doread((char *)&narp, sizeof narp); ! 253: if (narp > MAXARP){ ! 254: fprintf(stderr, "more arps than I can handle\n"); ! 255: narp = MAXARP; ! 256: } ! 257: doseek(NL_ARP); ! 258: doread((char *)arp, narp*sizeof(struct ip_arp)); ! 259: return narp; ! 260: } ! 261: ! 262: displayall() ! 263: { ! 264: int narp, i, j; ! 265: ! 266: narp = readarps(); ! 267: for(i = 0; i < narp; i++){ ! 268: if(arp[i].inaddr >= MAXARP){ ! 269: printf("%s %28.28s ", in_ntoa(arp[i].inaddr), in_host(arp[i].inaddr)); ! 270: for(j = 0; j < 6; j++){ ! 271: printf("%02x", arp[i].enaddr[j]); ! 272: } ! 273: printf("\n"); ! 274: } ! 275: } ! 276: } ! 277: ! 278: display(narp, host) ! 279: int narp; ! 280: char *host; ! 281: { ! 282: int i, j; ! 283: ! 284: goo.inaddr = in_address(host); ! 285: if(goo.inaddr == 0){ ! 286: fprintf(stderr, "can't find ip address for %s\n", host); ! 287: return; ! 288: } ! 289: for(i = 0; i < narp; i++){ ! 290: if(arp[i].inaddr == goo.inaddr){ ! 291: printf("%.15s %.28s ", in_ntoa(arp[i].inaddr), in_host(arp[i].inaddr)); ! 292: for(j = 0; j < 6; j++){ ! 293: printf("%02x", arp[i].enaddr[j]); ! 294: } ! 295: printf("\n"); ! 296: } ! 297: } ! 298: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.