Annotation of 42BSD/etc/ifconfig.c, revision 1.1.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.