Annotation of 42BSD/etc/ifconfig.c, revision 1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.