|
|
1.1 ! root 1: #ifndef lint ! 2: static char sccsid[] = "@(#)ifconfig.c 4.5 (Berkeley) 11/2/83"; ! 3: #endif ! 4: ! 5: #include <sys/types.h> ! 6: #include <sys/socket.h> ! 7: #include <sys/ioctl.h> ! 8: ! 9: #include <netinet/in.h> ! 10: #include <net/if.h> ! 11: ! 12: #include <stdio.h> ! 13: #include <errno.h> ! 14: #include <ctype.h> ! 15: #include <netdb.h> ! 16: ! 17: struct ifreq ifr; ! 18: struct sockaddr_in sin = { AF_INET }; ! 19: char name[30]; ! 20: int flags; ! 21: int s; ! 22: ! 23: int setifflags(), setifaddr(); ! 24: ! 25: struct cmd { ! 26: char *c_name; ! 27: int c_parameter; ! 28: int (*c_func)(); ! 29: } cmds[] = { ! 30: { "up", IFF_UP, setifflags } , ! 31: { "down", -IFF_UP, setifflags }, ! 32: { "trailers", -IFF_NOTRAILERS,setifflags }, ! 33: { "-trailers", IFF_NOTRAILERS, setifflags }, ! 34: { "arp", -IFF_NOARP, setifflags }, ! 35: { "-arp", IFF_NOARP, setifflags }, ! 36: { "debug", IFF_DEBUG, setifflags }, ! 37: { "-debug", -IFF_DEBUG, setifflags }, ! 38: #ifdef notdef ! 39: #define EN_SWABIPS 0x100 ! 40: { "swabips", EN_SWABIPS, setifflags }, ! 41: { "-swabips", -EN_SWABIPS, setifflags }, ! 42: #endif ! 43: { 0, 0, setifaddr }, ! 44: }; ! 45: ! 46: main(argc, argv) ! 47: int argc; ! 48: char *argv[]; ! 49: { ! 50: ! 51: if (argc < 2) { ! 52: fprintf(stderr, "usage: ifconfig interface %s %s %s\n", ! 53: "[ address ] [ up ] [ down ]", ! 54: "[ trailers | -trailers ]", ! 55: "[ arp | -arp ]"); ! 56: exit(1); ! 57: } ! 58: s = socket(AF_INET, SOCK_DGRAM, 0); ! 59: if (s < 0) { ! 60: perror("ifconfig: socket"); ! 61: exit(1); ! 62: } ! 63: argc--, argv++; ! 64: strcpy(name, *argv); ! 65: strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); ! 66: if (ioctl(s, SIOCGIFFLAGS, (caddr_t)&ifr) < 0) { ! 67: Perror("ioctl (SIOCGIFFLAGS)"); ! 68: exit(1); ! 69: } ! 70: flags = ifr.ifr_flags; ! 71: argc--, argv++; ! 72: if (argc == 0) { ! 73: status(); ! 74: exit(0); ! 75: } ! 76: while (argc > 0) { ! 77: register struct cmd *p; ! 78: ! 79: for (p = cmds; p->c_name; p++) ! 80: if (strcmp(*argv, p->c_name) == 0) ! 81: break; ! 82: if (p->c_func) ! 83: (*p->c_func)(*argv, p->c_parameter); ! 84: argc--, argv++; ! 85: } ! 86: exit(0); ! 87: } ! 88: ! 89: /*ARGSUSED*/ ! 90: setifaddr(addr, param) ! 91: char *addr; ! 92: int param; ! 93: { ! 94: ! 95: getaddr(addr, (struct sockaddr_in *)&ifr.ifr_addr); ! 96: strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); ! 97: if (ioctl(s, SIOCSIFADDR, (caddr_t)&ifr) < 0) ! 98: Perror("ioctl (SIOCSIFADDR)"); ! 99: } ! 100: ! 101: setifflags(vname, value) ! 102: char *vname; ! 103: int value; ! 104: { ! 105: ! 106: if (value < 0) { ! 107: value = -value; ! 108: flags &= ~value; ! 109: } else ! 110: flags |= value; ! 111: ifr.ifr_flags = flags; ! 112: strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); ! 113: if (ioctl(s, SIOCSIFFLAGS, (caddr_t)&ifr) < 0) ! 114: Perror(vname); ! 115: } ! 116: ! 117: status() ! 118: { ! 119: struct sockaddr_in *sin; ! 120: ! 121: strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); ! 122: if (ioctl(s, SIOCGIFADDR, (caddr_t)&ifr) < 0) ! 123: Perror("ioctl (SIOCGIFADDR)"); ! 124: sin = (struct sockaddr_in *)&ifr.ifr_addr; ! 125: printf("%s: %s ", name, inet_ntoa(sin->sin_addr)); ! 126: #define IFFBITS \ ! 127: "\020\1UP\2BROADCAST\3DEBUG\4ROUTE\5POINTOPOINT\6NOTRAILERS\7RUNNING\10NOARP" ! 128: printb("flags", flags, IFFBITS); putchar('\n'); ! 129: } ! 130: ! 131: Perror(cmd) ! 132: char *cmd; ! 133: { ! 134: extern int errno; ! 135: ! 136: fprintf(stderr, "ifconfig: "); ! 137: switch (errno) { ! 138: ! 139: case ENXIO: ! 140: fprintf(stderr, "%s: ", cmd); ! 141: fprintf(stderr, "no such interface\n"); ! 142: break; ! 143: ! 144: case EPERM: ! 145: fprintf(stderr, "%s: permission denied\n"); ! 146: break; ! 147: ! 148: default: ! 149: perror(cmd); ! 150: } ! 151: exit(1); ! 152: } ! 153: ! 154: struct in_addr inet_makeaddr(); ! 155: ! 156: getaddr(s, sin) ! 157: char *s; ! 158: struct sockaddr_in *sin; ! 159: { ! 160: struct hostent *hp; ! 161: struct netent *np; ! 162: int val; ! 163: ! 164: hp = gethostbyname(s); ! 165: if (hp) { ! 166: sin->sin_family = hp->h_addrtype; ! 167: bcopy(hp->h_addr, (char *)&sin->sin_addr, hp->h_length); ! 168: return; ! 169: } ! 170: np = getnetbyname(s); ! 171: if (np) { ! 172: sin->sin_family = np->n_addrtype; ! 173: sin->sin_addr = inet_makeaddr(np->n_net, INADDR_ANY); ! 174: return; ! 175: } ! 176: sin->sin_family = AF_INET; ! 177: val = inet_addr(s); ! 178: if (val != -1) { ! 179: sin->sin_addr.s_addr = val; ! 180: return; ! 181: } ! 182: val = inet_network(s); ! 183: if (val != -1) { ! 184: sin->sin_addr = inet_makeaddr(val, INADDR_ANY); ! 185: return; ! 186: } ! 187: fprintf(stderr, "%s: bad value\n", s); ! 188: exit(1); ! 189: } ! 190: ! 191: /* ! 192: * Print a value a la the %b format of the kernel's printf ! 193: */ ! 194: printb(s, v, bits) ! 195: char *s; ! 196: register char *bits; ! 197: register unsigned short v; ! 198: { ! 199: register int i, any = 0; ! 200: register char c; ! 201: ! 202: if (bits && *bits == 8) ! 203: printf("%s=%o", s, v); ! 204: else ! 205: printf("%s=%x", s, v); ! 206: bits++; ! 207: if (bits) { ! 208: putchar('<'); ! 209: while (i = *bits++) { ! 210: if (v & (1 << (i-1))) { ! 211: if (any) ! 212: putchar(','); ! 213: any = 1; ! 214: for (; (c = *bits) > 32; bits++) ! 215: putchar(c); ! 216: } else ! 217: for (; *bits > 32; bits++) ! 218: ; ! 219: } ! 220: putchar('>'); ! 221: } ! 222: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.