121811Skarels /* 221811Skarels * Copyright (c) 1983 Regents of the University of California. 334941Sbostic * All rights reserved. 434941Sbostic * 534941Sbostic * Redistribution and use in source and binary forms are permitted 634941Sbostic * provided that the above copyright notice and this paragraph are 734941Sbostic * duplicated in all such forms and that any documentation, 834941Sbostic * advertising materials, and other materials related to such 934941Sbostic * distribution and use acknowledge that the software was developed 1034941Sbostic * by the University of California, Berkeley. The name of the 1134941Sbostic * University may not be used to endorse or promote products derived 1234941Sbostic * from this software without specific prior written permission. 1334941Sbostic * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR 1434941Sbostic * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED 1534941Sbostic * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. 1621811Skarels */ 1721811Skarels 1814869Ssam #ifndef lint 1921811Skarels char copyright[] = 2021811Skarels "@(#) Copyright (c) 1983 Regents of the University of California.\n\ 2121811Skarels All rights reserved.\n"; 2234941Sbostic #endif /* not lint */ 2314869Ssam 2421811Skarels #ifndef lint 25*40830Ssklower static char sccsid[] = "@(#)ifconfig.c 4.26 (Berkeley) 04/06/90"; 2634941Sbostic #endif /* not lint */ 2721811Skarels 2814869Ssam #include <sys/types.h> 2914869Ssam #include <sys/socket.h> 3014869Ssam #include <sys/ioctl.h> 3114869Ssam 3222485Ssklower #include <net/if.h> 3314869Ssam #include <netinet/in.h> 3414869Ssam 3522485Ssklower #define NSIP 3622485Ssklower #include <netns/ns.h> 3722485Ssklower #include <netns/ns_if.h> 3822485Ssklower 3937479Ssklower #define EON 4037315Ssklower #include <netiso/iso.h> 4137315Ssklower #include <netiso/iso_var.h> 4237479Ssklower #include <sys/protosw.h> 4337315Ssklower 4414869Ssam #include <stdio.h> 4514869Ssam #include <errno.h> 4614869Ssam #include <ctype.h> 4714869Ssam #include <netdb.h> 4814869Ssam 4922485Ssklower extern int errno; 5037315Ssklower struct ifreq ifr, ridreq; 5137315Ssklower struct ifaliasreq addreq; 5237315Ssklower struct iso_ifreq iso_ridreq; 5337315Ssklower struct iso_aliasreq iso_addreq; 5437315Ssklower struct sockaddr_in netmask; 5537315Ssklower 5614869Ssam char name[30]; 5721811Skarels int flags; 5826185Skarels int metric; 5916329Skarels int setaddr; 6022485Ssklower int setipdst; 6137315Ssklower int doalias; 6237479Ssklower int clearaddr; 6337315Ssklower int newaddr = 1; 6414869Ssam int s; 6521811Skarels extern int errno; 6614869Ssam 6721811Skarels int setifflags(), setifaddr(), setifdstaddr(), setifnetmask(); 6826185Skarels int setifmetric(), setifbroadaddr(), setifipdst(); 6937315Ssklower int notealias(), setsnpaoffset(); 7014869Ssam 7121811Skarels #define NEXTARG 0xffffff 7221811Skarels 7314869Ssam struct cmd { 7414869Ssam char *c_name; 7521811Skarels int c_parameter; /* NEXTARG means next argv */ 7614869Ssam int (*c_func)(); 7714869Ssam } cmds[] = { 7814869Ssam { "up", IFF_UP, setifflags } , 7914869Ssam { "down", -IFF_UP, setifflags }, 8014869Ssam { "trailers", -IFF_NOTRAILERS,setifflags }, 8114869Ssam { "-trailers", IFF_NOTRAILERS, setifflags }, 8215359Skarels { "arp", -IFF_NOARP, setifflags }, 8315359Skarels { "-arp", IFF_NOARP, setifflags }, 8415286Sleres { "debug", IFF_DEBUG, setifflags }, 8515286Sleres { "-debug", -IFF_DEBUG, setifflags }, 8637315Ssklower { "alias", IFF_UP, notealias }, 8737315Ssklower { "-alias", -IFF_UP, notealias }, 8837315Ssklower { "delete", -IFF_UP, notealias }, 8915004Ssam #ifdef notdef 9021811Skarels #define EN_SWABIPS 0x1000 9115004Ssam { "swabips", EN_SWABIPS, setifflags }, 9215004Ssam { "-swabips", -EN_SWABIPS, setifflags }, 9315004Ssam #endif 9421811Skarels { "netmask", NEXTARG, setifnetmask }, 9526185Skarels { "metric", NEXTARG, setifmetric }, 9637315Ssklower { "snpaoffset", NEXTARG, setsnpaoffset }, 9721811Skarels { "broadcast", NEXTARG, setifbroadaddr }, 9822485Ssklower { "ipdst", NEXTARG, setifipdst }, 9914869Ssam { 0, 0, setifaddr }, 10017218Stef { 0, 0, setifdstaddr }, 10114869Ssam }; 10214869Ssam 10322485Ssklower /* 10422485Ssklower * XNS support liberally adapted from 10522485Ssklower * code written at the University of Maryland 10622485Ssklower * principally by James O'Toole and Chris Torek. 10722485Ssklower */ 10822485Ssklower int in_status(), in_getaddr(); 10922485Ssklower int xns_status(), xns_getaddr(); 11037315Ssklower int iso_status(), iso_getaddr(); 11122485Ssklower 11222485Ssklower /* Known address families */ 11322485Ssklower struct afswtch { 11422485Ssklower char *af_name; 11522485Ssklower short af_af; 11622485Ssklower int (*af_status)(); 11722485Ssklower int (*af_getaddr)(); 11837315Ssklower int af_difaddr; 11937315Ssklower int af_aifaddr; 12037315Ssklower caddr_t af_ridreq; 12137315Ssklower caddr_t af_addreq; 12222485Ssklower } afs[] = { 12337315Ssklower #define C(x) ((caddr_t) &x) 12437315Ssklower { "inet", AF_INET, in_status, in_getaddr, 12537315Ssklower SIOCDIFADDR, SIOCAIFADDR, C(ridreq), C(addreq) }, 12637315Ssklower { "ns", AF_NS, xns_status, xns_getaddr, 12737315Ssklower SIOCDIFADDR, SIOCAIFADDR, C(ridreq), C(addreq) }, 12837315Ssklower { "iso", AF_ISO, iso_status, iso_getaddr, 12937315Ssklower SIOCDIFADDR_ISO, SIOCAIFADDR_ISO, C(iso_ridreq), C(iso_addreq) }, 13037315Ssklower { 0, 0, 0, 0 } 13122485Ssklower }; 13222485Ssklower 13322485Ssklower struct afswtch *afp; /*the address family being set or asked about*/ 13422485Ssklower 13537315Ssklower int testing = 0; 13637315Ssklower Ioctl(a,b,c) { 13737315Ssklower int error = 0; 13837315Ssklower if (testing) 13937315Ssklower printf("would call ioctl with %x, %x, %x\n", a, b, c); 14037315Ssklower else 14137315Ssklower error = ioctl(a, b, c); 14237315Ssklower return error; 14337315Ssklower } 14437315Ssklower #define ioctl(a, b, c) Ioctl(a,b,c) 14537315Ssklower 14614869Ssam main(argc, argv) 14714869Ssam int argc; 14814869Ssam char *argv[]; 14914869Ssam { 15022485Ssklower int af = AF_INET; 15137315Ssklower register struct afswtch *rafp; 15227061Skarels 15314869Ssam if (argc < 2) { 15430789Sbostic fprintf(stderr, "usage: ifconfig interface\n%s%s%s%s%s", 15526185Skarels "\t[ af [ address [ dest_addr ] ] [ up ] [ down ]", 15626185Skarels "[ netmask mask ] ]\n", 15726185Skarels "\t[ metric n ]\n", 15826185Skarels "\t[ trailers | -trailers ]\n", 15926185Skarels "\t[ arp | -arp ]\n"); 16014869Ssam exit(1); 16114869Ssam } 16222485Ssklower argc--, argv++; 16324248Ssklower strncpy(name, *argv, sizeof(name)); 16422485Ssklower strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name)); 16522485Ssklower argc--, argv++; 16622485Ssklower if (argc > 0) { 16737315Ssklower for (afp = rafp = afs; rafp->af_name; rafp++) 16837315Ssklower if (strcmp(rafp->af_name, *argv) == 0) { 16937315Ssklower afp = rafp; argc--; argv++; 17022485Ssklower break; 17122485Ssklower } 17237315Ssklower rafp = afp; 17337315Ssklower af = ifr.ifr_addr.sa_family = rafp->af_af; 17422485Ssklower } 17522485Ssklower s = socket(af, SOCK_DGRAM, 0); 17614869Ssam if (s < 0) { 17714869Ssam perror("ifconfig: socket"); 17814869Ssam exit(1); 17914869Ssam } 18014869Ssam if (ioctl(s, SIOCGIFFLAGS, (caddr_t)&ifr) < 0) { 18114869Ssam Perror("ioctl (SIOCGIFFLAGS)"); 18214869Ssam exit(1); 18314869Ssam } 18422485Ssklower strncpy(ifr.ifr_name, name, sizeof ifr.ifr_name); 18521811Skarels flags = ifr.ifr_flags; 18626185Skarels if (ioctl(s, SIOCGIFMETRIC, (caddr_t)&ifr) < 0) 18726185Skarels perror("ioctl (SIOCGIFMETRIC)"); 18826185Skarels else 18926185Skarels metric = ifr.ifr_metric; 19014869Ssam if (argc == 0) { 19114869Ssam status(); 19214869Ssam exit(0); 19314869Ssam } 19414869Ssam while (argc > 0) { 19514869Ssam register struct cmd *p; 19614869Ssam 19714869Ssam for (p = cmds; p->c_name; p++) 19814869Ssam if (strcmp(*argv, p->c_name) == 0) 19914869Ssam break; 20017218Stef if (p->c_name == 0 && setaddr) 20117218Stef p++; /* got src, do dst */ 20221811Skarels if (p->c_func) { 20321811Skarels if (p->c_parameter == NEXTARG) { 20421811Skarels (*p->c_func)(argv[1]); 20521811Skarels argc--, argv++; 20621811Skarels } else 20721811Skarels (*p->c_func)(*argv, p->c_parameter); 20821811Skarels } 20914869Ssam argc--, argv++; 21014869Ssam } 21137479Ssklower if (setipdst && af==AF_NS) { 21237479Ssklower struct nsip_req rq; 21337479Ssklower int size = sizeof(rq); 21437479Ssklower 21537479Ssklower rq.rq_ns = addreq.ifra_addr; 21637479Ssklower rq.rq_ip = addreq.ifra_dstaddr; 21737479Ssklower 21837479Ssklower if (setsockopt(s, 0, SO_NSIP_ROUTE, &rq, size) < 0) 21937479Ssklower Perror("Encapsulation Routing"); 22037479Ssklower } 22137315Ssklower if (clearaddr) { 22237315Ssklower int ret; 22337315Ssklower strncpy(rafp->af_ridreq, name, sizeof ifr.ifr_name); 22437315Ssklower if ((ret = ioctl(s, rafp->af_difaddr, rafp->af_ridreq)) < 0) { 22537315Ssklower if (errno == EADDRNOTAVAIL && (doalias >= 0)) { 22637315Ssklower /* means no previous address for interface */ 22737315Ssklower } else 22837315Ssklower Perror("ioctl (SIOCDIFADDR)"); 22937315Ssklower } 23021811Skarels } 23137315Ssklower if (newaddr) { 23237315Ssklower strncpy(rafp->af_addreq, name, sizeof ifr.ifr_name); 23337315Ssklower if (ioctl(s, rafp->af_aifaddr, rafp->af_addreq) < 0) 23437315Ssklower Perror("ioctl (SIOCAIFADDR)"); 23516329Skarels } 23614869Ssam exit(0); 23714869Ssam } 23837315Ssklower #define RIDADDR 0 23937315Ssklower #define ADDR 1 24037315Ssklower #define MASK 2 24137315Ssklower #define DSTADDR 3 24214869Ssam 24314869Ssam /*ARGSUSED*/ 24414869Ssam setifaddr(addr, param) 24514869Ssam char *addr; 24622485Ssklower short param; 24714869Ssam { 24816329Skarels /* 24916329Skarels * Delay the ioctl to set the interface addr until flags are all set. 25016329Skarels * The address interpretation may depend on the flags, 25116329Skarels * and the flags may change when the address is set. 25215390Skarels */ 25316329Skarels setaddr++; 254*40830Ssklower if (doalias == 0) 25537479Ssklower clearaddr = 1; 25637315Ssklower (*afp->af_getaddr)(addr, (doalias >= 0 ? ADDR : RIDADDR)); 25714869Ssam } 25814869Ssam 25921811Skarels setifnetmask(addr) 26021811Skarels char *addr; 26121811Skarels { 26237315Ssklower (*afp->af_getaddr)(addr, MASK); 26321811Skarels } 26421811Skarels 26521811Skarels setifbroadaddr(addr) 26621811Skarels char *addr; 26721811Skarels { 26837315Ssklower (*afp->af_getaddr)(addr, DSTADDR); 26921811Skarels } 27021811Skarels 27122485Ssklower setifipdst(addr) 27222485Ssklower char *addr; 27322485Ssklower { 27437315Ssklower in_getaddr(addr, DSTADDR); 27522485Ssklower setipdst++; 27637479Ssklower clearaddr = 0; 27737479Ssklower newaddr = 0; 27822485Ssklower } 27937479Ssklower #define rqtosa(x) (&(((struct ifreq *)(afp->x))->ifr_addr)) 28017218Stef /*ARGSUSED*/ 28137315Ssklower notealias(addr, param) 28237315Ssklower char *addr; 28337315Ssklower { 28437479Ssklower if (setaddr && doalias == 0 && param < 0) 28537479Ssklower bcopy((caddr_t)rqtosa(af_addreq), 28637479Ssklower (caddr_t)rqtosa(af_ridreq), 28737479Ssklower rqtosa(af_addreq)->sa_len); 28837315Ssklower doalias = param; 28937479Ssklower if (param < 0) { 29037479Ssklower clearaddr = 1; 29137479Ssklower newaddr = 0; 29237479Ssklower } else 29337315Ssklower clearaddr = 0; 29437315Ssklower } 29537315Ssklower 29637315Ssklower /*ARGSUSED*/ 29717218Stef setifdstaddr(addr, param) 29817218Stef char *addr; 29917218Stef int param; 30017218Stef { 30137315Ssklower (*afp->af_getaddr)(addr, DSTADDR); 30217218Stef } 30317218Stef 30414870Ssam setifflags(vname, value) 30514870Ssam char *vname; 30622485Ssklower short value; 30714869Ssam { 30822485Ssklower if (ioctl(s, SIOCGIFFLAGS, (caddr_t)&ifr) < 0) { 30922485Ssklower Perror("ioctl (SIOCGIFFLAGS)"); 31022485Ssklower exit(1); 31122485Ssklower } 31222485Ssklower strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); 31322485Ssklower flags = ifr.ifr_flags; 31414869Ssam 31514869Ssam if (value < 0) { 31614869Ssam value = -value; 31721811Skarels flags &= ~value; 31814869Ssam } else 31921811Skarels flags |= value; 32021811Skarels ifr.ifr_flags = flags; 32114869Ssam if (ioctl(s, SIOCSIFFLAGS, (caddr_t)&ifr) < 0) 32214870Ssam Perror(vname); 32314869Ssam } 32414869Ssam 32526185Skarels setifmetric(val) 32626185Skarels char *val; 32726185Skarels { 32826185Skarels strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); 32926185Skarels ifr.ifr_metric = atoi(val); 33026185Skarels if (ioctl(s, SIOCSIFMETRIC, (caddr_t)&ifr) < 0) 33126185Skarels perror("ioctl (set metric)"); 33226185Skarels } 33326185Skarels 33437315Ssklower setsnpaoffset(val) 33537315Ssklower char *val; 33637315Ssklower { 33737315Ssklower iso_addreq.ifra_snpaoffset = atoi(val); 33837315Ssklower } 33937315Ssklower 34026185Skarels #define IFFBITS \ 34126185Skarels "\020\1UP\2BROADCAST\3DEBUG\4LOOPBACK\5POINTOPOINT\6NOTRAILERS\7RUNNING\10NOARP\ 34226185Skarels " 34326185Skarels 34422485Ssklower /* 34522485Ssklower * Print the status of the interface. If an address family was 34622485Ssklower * specified, show it and it only; otherwise, show them all. 34722485Ssklower */ 34814869Ssam status() 34914869Ssam { 35022485Ssklower register struct afswtch *p = afp; 35122485Ssklower short af = ifr.ifr_addr.sa_family; 35222485Ssklower 35326185Skarels printf("%s: ", name); 35426185Skarels printb("flags", flags, IFFBITS); 35526185Skarels if (metric) 35626185Skarels printf(" metric %d", metric); 35726185Skarels putchar('\n'); 35822485Ssklower if ((p = afp) != NULL) { 35928468Skarels (*p->af_status)(1); 36028468Skarels } else for (p = afs; p->af_name; p++) { 36122485Ssklower ifr.ifr_addr.sa_family = p->af_af; 36228468Skarels (*p->af_status)(0); 36322485Ssklower } 36422485Ssklower } 36522485Ssklower 36628468Skarels in_status(force) 36728468Skarels int force; 36822485Ssklower { 36914869Ssam struct sockaddr_in *sin; 37022485Ssklower char *inet_ntoa(); 37114869Ssam 37227061Skarels strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); 37321811Skarels if (ioctl(s, SIOCGIFADDR, (caddr_t)&ifr) < 0) { 37428468Skarels if (errno == EADDRNOTAVAIL || errno == EAFNOSUPPORT) { 37528468Skarels if (!force) 37628468Skarels return; 37721811Skarels bzero((char *)&ifr.ifr_addr, sizeof(ifr.ifr_addr)); 37828468Skarels } else 37928468Skarels perror("ioctl (SIOCGIFADDR)"); 38021811Skarels } 38114869Ssam sin = (struct sockaddr_in *)&ifr.ifr_addr; 38226429Skarels printf("\tinet %s ", inet_ntoa(sin->sin_addr)); 38328468Skarels strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); 38428468Skarels if (ioctl(s, SIOCGIFNETMASK, (caddr_t)&ifr) < 0) { 38528468Skarels if (errno != EADDRNOTAVAIL) 38628468Skarels perror("ioctl (SIOCGIFNETMASK)"); 38728468Skarels bzero((char *)&ifr.ifr_addr, sizeof(ifr.ifr_addr)); 38828468Skarels } else 38928468Skarels netmask.sin_addr = 39028468Skarels ((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr; 39117218Stef if (flags & IFF_POINTOPOINT) { 39221811Skarels if (ioctl(s, SIOCGIFDSTADDR, (caddr_t)&ifr) < 0) { 39321811Skarels if (errno == EADDRNOTAVAIL) 39421811Skarels bzero((char *)&ifr.ifr_addr, sizeof(ifr.ifr_addr)); 39521811Skarels else 39628468Skarels perror("ioctl (SIOCGIFDSTADDR)"); 39721811Skarels } 39822485Ssklower strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); 39917218Stef sin = (struct sockaddr_in *)&ifr.ifr_dstaddr; 40017218Stef printf("--> %s ", inet_ntoa(sin->sin_addr)); 40117218Stef } 40221811Skarels printf("netmask %x ", ntohl(netmask.sin_addr.s_addr)); 40321811Skarels if (flags & IFF_BROADCAST) { 40421811Skarels if (ioctl(s, SIOCGIFBRDADDR, (caddr_t)&ifr) < 0) { 40521811Skarels if (errno == EADDRNOTAVAIL) 40628468Skarels bzero((char *)&ifr.ifr_addr, sizeof(ifr.ifr_addr)); 40728468Skarels else 40828468Skarels perror("ioctl (SIOCGIFADDR)"); 40921811Skarels } 41022485Ssklower strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); 41121811Skarels sin = (struct sockaddr_in *)&ifr.ifr_addr; 41228468Skarels if (sin->sin_addr.s_addr != 0) 41328468Skarels printf("broadcast %s", inet_ntoa(sin->sin_addr)); 41421811Skarels } 41526185Skarels putchar('\n'); 41614869Ssam } 41714869Ssam 41822485Ssklower 41928468Skarels xns_status(force) 42028468Skarels int force; 42122485Ssklower { 42222485Ssklower struct sockaddr_ns *sns; 42322485Ssklower 42422485Ssklower close(s); 42522485Ssklower s = socket(AF_NS, SOCK_DGRAM, 0); 42622485Ssklower if (s < 0) { 42730692Smckusick if (errno == EPROTONOSUPPORT) 42824248Ssklower return; 42922485Ssklower perror("ifconfig: socket"); 43022485Ssklower exit(1); 43122485Ssklower } 43222485Ssklower if (ioctl(s, SIOCGIFADDR, (caddr_t)&ifr) < 0) { 43328468Skarels if (errno == EADDRNOTAVAIL || errno == EAFNOSUPPORT) { 43428468Skarels if (!force) 43528468Skarels return; 43628468Skarels bzero((char *)&ifr.ifr_addr, sizeof(ifr.ifr_addr)); 43728468Skarels } else 43828468Skarels perror("ioctl (SIOCGIFADDR)"); 43922485Ssklower } 44022485Ssklower strncpy(ifr.ifr_name, name, sizeof ifr.ifr_name); 44122485Ssklower sns = (struct sockaddr_ns *)&ifr.ifr_addr; 44226185Skarels printf("\tns %s ", ns_ntoa(sns->sns_addr)); 44326101Ssklower if (flags & IFF_POINTOPOINT) { /* by W. Nesheim@Cornell */ 44426101Ssklower if (ioctl(s, SIOCGIFDSTADDR, (caddr_t)&ifr) < 0) { 44526101Ssklower if (errno == EADDRNOTAVAIL) 44626101Ssklower bzero((char *)&ifr.ifr_addr, sizeof(ifr.ifr_addr)); 44726101Ssklower else 44826101Ssklower Perror("ioctl (SIOCGIFDSTADDR)"); 44926101Ssklower } 45026101Ssklower strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); 45126101Ssklower sns = (struct sockaddr_ns *)&ifr.ifr_dstaddr; 45226101Ssklower printf("--> %s ", ns_ntoa(sns->sns_addr)); 45326101Ssklower } 45422485Ssklower putchar('\n'); 45522485Ssklower } 45622485Ssklower 45737315Ssklower iso_status(force) 45837315Ssklower int force; 45937315Ssklower { 46037315Ssklower struct sockaddr_iso *siso; 46137315Ssklower struct iso_ifreq ifr; 46237315Ssklower 46337315Ssklower close(s); 46437315Ssklower s = socket(AF_ISO, SOCK_DGRAM, 0); 46537315Ssklower if (s < 0) { 46637315Ssklower if (errno == EPROTONOSUPPORT) 46737315Ssklower return; 46837315Ssklower perror("ifconfig: socket"); 46937315Ssklower exit(1); 47037315Ssklower } 47137315Ssklower if (ioctl(s, SIOCGIFADDR, (caddr_t)&ifr) < 0) { 47237315Ssklower if (errno == EADDRNOTAVAIL || errno == EAFNOSUPPORT) { 47337315Ssklower if (!force) 47437315Ssklower return; 47537315Ssklower bzero((char *)&ifr.ifr_Addr, sizeof(ifr.ifr_Addr)); 47637315Ssklower } else 47737315Ssklower perror("ioctl (SIOCGIFADDR)"); 47837315Ssklower } 47937315Ssklower strncpy(ifr.ifr_name, name, sizeof ifr.ifr_name); 48037315Ssklower siso = &ifr.ifr_Addr; 48137315Ssklower printf("\tiso %s ", iso_ntoa(siso->siso_addr)); 48237315Ssklower if (ioctl(s, SIOCGIFNETMASK, (caddr_t)&ifr) < 0) { 48337315Ssklower if (errno != EADDRNOTAVAIL) 48437315Ssklower perror("ioctl (SIOCGIFNETMASK)"); 48537315Ssklower } else { 48637315Ssklower printf("\n netmask %s ", iso_ntoa(siso->siso_addr)); 48737315Ssklower } 48837315Ssklower if (flags & IFF_POINTOPOINT) { 48937315Ssklower if (ioctl(s, SIOCGIFDSTADDR, (caddr_t)&ifr) < 0) { 49037315Ssklower if (errno == EADDRNOTAVAIL) 49137315Ssklower bzero((char *)&ifr.ifr_Addr, sizeof(ifr.ifr_Addr)); 49237315Ssklower else 49337315Ssklower Perror("ioctl (SIOCGIFDSTADDR)"); 49437315Ssklower } 49537315Ssklower strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); 49637315Ssklower siso = &ifr.ifr_Addr; 49737315Ssklower printf("--> %s ", iso_ntoa(siso->siso_addr)); 49837315Ssklower } 49937315Ssklower putchar('\n'); 50037315Ssklower } 50137315Ssklower 50214869Ssam Perror(cmd) 50314869Ssam char *cmd; 50414869Ssam { 50514869Ssam extern int errno; 50614869Ssam 50714869Ssam fprintf(stderr, "ifconfig: "); 50814869Ssam switch (errno) { 50914869Ssam 51014869Ssam case ENXIO: 51122485Ssklower fprintf(stderr, "%s: no such interface\n", cmd); 51214869Ssam break; 51314869Ssam 51414869Ssam case EPERM: 51516822Slepreau fprintf(stderr, "%s: permission denied\n", cmd); 51614869Ssam break; 51714869Ssam 51814869Ssam default: 51914869Ssam perror(cmd); 52014869Ssam } 52114869Ssam exit(1); 52214869Ssam } 52314869Ssam 52414869Ssam struct in_addr inet_makeaddr(); 52514869Ssam 52637315Ssklower #define SIN(x) ((struct sockaddr_in *) &(x)) 52737315Ssklower struct sockaddr_in *sintab[] = { 52837315Ssklower SIN(ridreq.ifr_addr), SIN(addreq.ifra_addr), 52937315Ssklower SIN(addreq.ifra_mask), SIN(addreq.ifra_broadaddr)}; 53037315Ssklower 53137315Ssklower in_getaddr(s, which) 53214869Ssam char *s; 53314869Ssam { 53437315Ssklower register struct sockaddr_in *sin = sintab[which]; 53514869Ssam struct hostent *hp; 53614869Ssam struct netent *np; 53714869Ssam int val; 53814869Ssam 53939210Ssklower sin->sin_len = sizeof(*sin); 54039210Ssklower if (which != MASK) 54137315Ssklower sin->sin_family = AF_INET; 54239210Ssklower 54339210Ssklower if ((val = inet_addr(s)) != -1) 54421811Skarels sin->sin_addr.s_addr = val; 54539210Ssklower else if (hp = gethostbyname(s)) 54614869Ssam bcopy(hp->h_addr, (char *)&sin->sin_addr, hp->h_length); 54739210Ssklower else if (np = getnetbyname(s)) 54814869Ssam sin->sin_addr = inet_makeaddr(np->n_net, INADDR_ANY); 54939210Ssklower else { 55039210Ssklower fprintf(stderr, "%s: bad value\n", s); 55139210Ssklower exit(1); 55214869Ssam } 55314869Ssam } 55414869Ssam 55514869Ssam /* 55614869Ssam * Print a value a la the %b format of the kernel's printf 55714869Ssam */ 55814869Ssam printb(s, v, bits) 55914869Ssam char *s; 56014869Ssam register char *bits; 56114869Ssam register unsigned short v; 56214869Ssam { 56314869Ssam register int i, any = 0; 56414869Ssam register char c; 56514869Ssam 56614869Ssam if (bits && *bits == 8) 56714869Ssam printf("%s=%o", s, v); 56814869Ssam else 56914869Ssam printf("%s=%x", s, v); 57014869Ssam bits++; 57114869Ssam if (bits) { 57214869Ssam putchar('<'); 57314869Ssam while (i = *bits++) { 57414869Ssam if (v & (1 << (i-1))) { 57514869Ssam if (any) 57614869Ssam putchar(','); 57714869Ssam any = 1; 57814869Ssam for (; (c = *bits) > 32; bits++) 57914869Ssam putchar(c); 58014869Ssam } else 58114869Ssam for (; *bits > 32; bits++) 58214869Ssam ; 58314869Ssam } 58414869Ssam putchar('>'); 58514869Ssam } 58614869Ssam } 58722485Ssklower 58837315Ssklower #define SNS(x) ((struct sockaddr_ns *) &(x)) 58937315Ssklower struct sockaddr_ns *snstab[] = { 59037315Ssklower SNS(ridreq.ifr_addr), SNS(addreq.ifra_addr), 59137315Ssklower SNS(addreq.ifra_mask), SNS(addreq.ifra_broadaddr)}; 59237315Ssklower 59337315Ssklower xns_getaddr(addr, which) 59422485Ssklower char *addr; 59522485Ssklower { 59637315Ssklower struct sockaddr_ns *sns = snstab[which]; 59726101Ssklower struct ns_addr ns_addr(); 59837315Ssklower 59922485Ssklower sns->sns_family = AF_NS; 60037227Ssklower sns->sns_len = sizeof(*sns); 60126101Ssklower sns->sns_addr = ns_addr(addr); 60237315Ssklower if (which == MASK) 60337315Ssklower printf("Attempt to set XNS netmask will be ineffectual\n"); 60422485Ssklower } 60537315Ssklower 60637315Ssklower #define SISO(x) ((struct sockaddr_iso *) &(x)) 60737315Ssklower struct sockaddr_iso *sisotab[] = { 60837315Ssklower SISO(iso_ridreq.ifr_Addr), SISO(iso_addreq.ifra_addr), 60937315Ssklower SISO(iso_addreq.ifra_mask), SISO(iso_addreq.ifra_dstaddr)}; 61037315Ssklower 61137315Ssklower iso_getaddr(addr, which) 61237315Ssklower char *addr; 61337315Ssklower { 61437315Ssklower struct sockaddr_iso *siso = sisotab[which]; 61537315Ssklower struct iso_addr *iso_addr(); 61637315Ssklower siso->siso_addr = *iso_addr(addr); 61737315Ssklower if (which == MASK) { 61839210Ssklower siso->siso_len = TSEL(siso) - (caddr_t)(siso); 61937315Ssklower siso->siso_nlen = 0; 62037315Ssklower } else { 62137315Ssklower siso->siso_family = AF_ISO; 62237315Ssklower siso->siso_len = sizeof(*siso); 62337315Ssklower } 62437315Ssklower } 625