121811Skarels /* 221811Skarels * Copyright (c) 1983 Regents of the University of California. 334941Sbostic * All rights reserved. 434941Sbostic * 5*42702Sbostic * %sccs.include.redist.c% 621811Skarels */ 721811Skarels 814869Ssam #ifndef lint 921811Skarels char copyright[] = 1021811Skarels "@(#) Copyright (c) 1983 Regents of the University of California.\n\ 1121811Skarels All rights reserved.\n"; 1234941Sbostic #endif /* not lint */ 1314869Ssam 1421811Skarels #ifndef lint 15*42702Sbostic static char sccsid[] = "@(#)ifconfig.c 4.27 (Berkeley) 06/01/90"; 1634941Sbostic #endif /* not lint */ 1721811Skarels 1814869Ssam #include <sys/types.h> 1914869Ssam #include <sys/socket.h> 2014869Ssam #include <sys/ioctl.h> 2114869Ssam 2222485Ssklower #include <net/if.h> 2314869Ssam #include <netinet/in.h> 2414869Ssam 2522485Ssklower #define NSIP 2622485Ssklower #include <netns/ns.h> 2722485Ssklower #include <netns/ns_if.h> 2822485Ssklower 2937479Ssklower #define EON 3037315Ssklower #include <netiso/iso.h> 3137315Ssklower #include <netiso/iso_var.h> 3237479Ssklower #include <sys/protosw.h> 3337315Ssklower 3414869Ssam #include <stdio.h> 3514869Ssam #include <errno.h> 3614869Ssam #include <ctype.h> 3714869Ssam #include <netdb.h> 3814869Ssam 3922485Ssklower extern int errno; 4037315Ssklower struct ifreq ifr, ridreq; 4137315Ssklower struct ifaliasreq addreq; 4237315Ssklower struct iso_ifreq iso_ridreq; 4337315Ssklower struct iso_aliasreq iso_addreq; 4437315Ssklower struct sockaddr_in netmask; 4537315Ssklower 4614869Ssam char name[30]; 4721811Skarels int flags; 4826185Skarels int metric; 4916329Skarels int setaddr; 5022485Ssklower int setipdst; 5137315Ssklower int doalias; 5237479Ssklower int clearaddr; 5337315Ssklower int newaddr = 1; 5414869Ssam int s; 5521811Skarels extern int errno; 5614869Ssam 5721811Skarels int setifflags(), setifaddr(), setifdstaddr(), setifnetmask(); 5826185Skarels int setifmetric(), setifbroadaddr(), setifipdst(); 5937315Ssklower int notealias(), setsnpaoffset(); 6014869Ssam 6121811Skarels #define NEXTARG 0xffffff 6221811Skarels 6314869Ssam struct cmd { 6414869Ssam char *c_name; 6521811Skarels int c_parameter; /* NEXTARG means next argv */ 6614869Ssam int (*c_func)(); 6714869Ssam } cmds[] = { 6814869Ssam { "up", IFF_UP, setifflags } , 6914869Ssam { "down", -IFF_UP, setifflags }, 7014869Ssam { "trailers", -IFF_NOTRAILERS,setifflags }, 7114869Ssam { "-trailers", IFF_NOTRAILERS, setifflags }, 7215359Skarels { "arp", -IFF_NOARP, setifflags }, 7315359Skarels { "-arp", IFF_NOARP, setifflags }, 7415286Sleres { "debug", IFF_DEBUG, setifflags }, 7515286Sleres { "-debug", -IFF_DEBUG, setifflags }, 7637315Ssklower { "alias", IFF_UP, notealias }, 7737315Ssklower { "-alias", -IFF_UP, notealias }, 7837315Ssklower { "delete", -IFF_UP, notealias }, 7915004Ssam #ifdef notdef 8021811Skarels #define EN_SWABIPS 0x1000 8115004Ssam { "swabips", EN_SWABIPS, setifflags }, 8215004Ssam { "-swabips", -EN_SWABIPS, setifflags }, 8315004Ssam #endif 8421811Skarels { "netmask", NEXTARG, setifnetmask }, 8526185Skarels { "metric", NEXTARG, setifmetric }, 8637315Ssklower { "snpaoffset", NEXTARG, setsnpaoffset }, 8721811Skarels { "broadcast", NEXTARG, setifbroadaddr }, 8822485Ssklower { "ipdst", NEXTARG, setifipdst }, 8914869Ssam { 0, 0, setifaddr }, 9017218Stef { 0, 0, setifdstaddr }, 9114869Ssam }; 9214869Ssam 9322485Ssklower /* 9422485Ssklower * XNS support liberally adapted from 9522485Ssklower * code written at the University of Maryland 9622485Ssklower * principally by James O'Toole and Chris Torek. 9722485Ssklower */ 9822485Ssklower int in_status(), in_getaddr(); 9922485Ssklower int xns_status(), xns_getaddr(); 10037315Ssklower int iso_status(), iso_getaddr(); 10122485Ssklower 10222485Ssklower /* Known address families */ 10322485Ssklower struct afswtch { 10422485Ssklower char *af_name; 10522485Ssklower short af_af; 10622485Ssklower int (*af_status)(); 10722485Ssklower int (*af_getaddr)(); 10837315Ssklower int af_difaddr; 10937315Ssklower int af_aifaddr; 11037315Ssklower caddr_t af_ridreq; 11137315Ssklower caddr_t af_addreq; 11222485Ssklower } afs[] = { 11337315Ssklower #define C(x) ((caddr_t) &x) 11437315Ssklower { "inet", AF_INET, in_status, in_getaddr, 11537315Ssklower SIOCDIFADDR, SIOCAIFADDR, C(ridreq), C(addreq) }, 11637315Ssklower { "ns", AF_NS, xns_status, xns_getaddr, 11737315Ssklower SIOCDIFADDR, SIOCAIFADDR, C(ridreq), C(addreq) }, 11837315Ssklower { "iso", AF_ISO, iso_status, iso_getaddr, 11937315Ssklower SIOCDIFADDR_ISO, SIOCAIFADDR_ISO, C(iso_ridreq), C(iso_addreq) }, 12037315Ssklower { 0, 0, 0, 0 } 12122485Ssklower }; 12222485Ssklower 12322485Ssklower struct afswtch *afp; /*the address family being set or asked about*/ 12422485Ssklower 12537315Ssklower int testing = 0; 12637315Ssklower Ioctl(a,b,c) { 12737315Ssklower int error = 0; 12837315Ssklower if (testing) 12937315Ssklower printf("would call ioctl with %x, %x, %x\n", a, b, c); 13037315Ssklower else 13137315Ssklower error = ioctl(a, b, c); 13237315Ssklower return error; 13337315Ssklower } 13437315Ssklower #define ioctl(a, b, c) Ioctl(a,b,c) 13537315Ssklower 13614869Ssam main(argc, argv) 13714869Ssam int argc; 13814869Ssam char *argv[]; 13914869Ssam { 14022485Ssklower int af = AF_INET; 14137315Ssklower register struct afswtch *rafp; 14227061Skarels 14314869Ssam if (argc < 2) { 14430789Sbostic fprintf(stderr, "usage: ifconfig interface\n%s%s%s%s%s", 14526185Skarels "\t[ af [ address [ dest_addr ] ] [ up ] [ down ]", 14626185Skarels "[ netmask mask ] ]\n", 14726185Skarels "\t[ metric n ]\n", 14826185Skarels "\t[ trailers | -trailers ]\n", 14926185Skarels "\t[ arp | -arp ]\n"); 15014869Ssam exit(1); 15114869Ssam } 15222485Ssklower argc--, argv++; 15324248Ssklower strncpy(name, *argv, sizeof(name)); 15422485Ssklower strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name)); 15522485Ssklower argc--, argv++; 15622485Ssklower if (argc > 0) { 15737315Ssklower for (afp = rafp = afs; rafp->af_name; rafp++) 15837315Ssklower if (strcmp(rafp->af_name, *argv) == 0) { 15937315Ssklower afp = rafp; argc--; argv++; 16022485Ssklower break; 16122485Ssklower } 16237315Ssklower rafp = afp; 16337315Ssklower af = ifr.ifr_addr.sa_family = rafp->af_af; 16422485Ssklower } 16522485Ssklower s = socket(af, SOCK_DGRAM, 0); 16614869Ssam if (s < 0) { 16714869Ssam perror("ifconfig: socket"); 16814869Ssam exit(1); 16914869Ssam } 17014869Ssam if (ioctl(s, SIOCGIFFLAGS, (caddr_t)&ifr) < 0) { 17114869Ssam Perror("ioctl (SIOCGIFFLAGS)"); 17214869Ssam exit(1); 17314869Ssam } 17422485Ssklower strncpy(ifr.ifr_name, name, sizeof ifr.ifr_name); 17521811Skarels flags = ifr.ifr_flags; 17626185Skarels if (ioctl(s, SIOCGIFMETRIC, (caddr_t)&ifr) < 0) 17726185Skarels perror("ioctl (SIOCGIFMETRIC)"); 17826185Skarels else 17926185Skarels metric = ifr.ifr_metric; 18014869Ssam if (argc == 0) { 18114869Ssam status(); 18214869Ssam exit(0); 18314869Ssam } 18414869Ssam while (argc > 0) { 18514869Ssam register struct cmd *p; 18614869Ssam 18714869Ssam for (p = cmds; p->c_name; p++) 18814869Ssam if (strcmp(*argv, p->c_name) == 0) 18914869Ssam break; 19017218Stef if (p->c_name == 0 && setaddr) 19117218Stef p++; /* got src, do dst */ 19221811Skarels if (p->c_func) { 19321811Skarels if (p->c_parameter == NEXTARG) { 19421811Skarels (*p->c_func)(argv[1]); 19521811Skarels argc--, argv++; 19621811Skarels } else 19721811Skarels (*p->c_func)(*argv, p->c_parameter); 19821811Skarels } 19914869Ssam argc--, argv++; 20014869Ssam } 20137479Ssklower if (setipdst && af==AF_NS) { 20237479Ssklower struct nsip_req rq; 20337479Ssklower int size = sizeof(rq); 20437479Ssklower 20537479Ssklower rq.rq_ns = addreq.ifra_addr; 20637479Ssklower rq.rq_ip = addreq.ifra_dstaddr; 20737479Ssklower 20837479Ssklower if (setsockopt(s, 0, SO_NSIP_ROUTE, &rq, size) < 0) 20937479Ssklower Perror("Encapsulation Routing"); 21037479Ssklower } 21137315Ssklower if (clearaddr) { 21237315Ssklower int ret; 21337315Ssklower strncpy(rafp->af_ridreq, name, sizeof ifr.ifr_name); 21437315Ssklower if ((ret = ioctl(s, rafp->af_difaddr, rafp->af_ridreq)) < 0) { 21537315Ssklower if (errno == EADDRNOTAVAIL && (doalias >= 0)) { 21637315Ssklower /* means no previous address for interface */ 21737315Ssklower } else 21837315Ssklower Perror("ioctl (SIOCDIFADDR)"); 21937315Ssklower } 22021811Skarels } 22137315Ssklower if (newaddr) { 22237315Ssklower strncpy(rafp->af_addreq, name, sizeof ifr.ifr_name); 22337315Ssklower if (ioctl(s, rafp->af_aifaddr, rafp->af_addreq) < 0) 22437315Ssklower Perror("ioctl (SIOCAIFADDR)"); 22516329Skarels } 22614869Ssam exit(0); 22714869Ssam } 22837315Ssklower #define RIDADDR 0 22937315Ssklower #define ADDR 1 23037315Ssklower #define MASK 2 23137315Ssklower #define DSTADDR 3 23214869Ssam 23314869Ssam /*ARGSUSED*/ 23414869Ssam setifaddr(addr, param) 23514869Ssam char *addr; 23622485Ssklower short param; 23714869Ssam { 23816329Skarels /* 23916329Skarels * Delay the ioctl to set the interface addr until flags are all set. 24016329Skarels * The address interpretation may depend on the flags, 24116329Skarels * and the flags may change when the address is set. 24215390Skarels */ 24316329Skarels setaddr++; 24440830Ssklower if (doalias == 0) 24537479Ssklower clearaddr = 1; 24637315Ssklower (*afp->af_getaddr)(addr, (doalias >= 0 ? ADDR : RIDADDR)); 24714869Ssam } 24814869Ssam 24921811Skarels setifnetmask(addr) 25021811Skarels char *addr; 25121811Skarels { 25237315Ssklower (*afp->af_getaddr)(addr, MASK); 25321811Skarels } 25421811Skarels 25521811Skarels setifbroadaddr(addr) 25621811Skarels char *addr; 25721811Skarels { 25837315Ssklower (*afp->af_getaddr)(addr, DSTADDR); 25921811Skarels } 26021811Skarels 26122485Ssklower setifipdst(addr) 26222485Ssklower char *addr; 26322485Ssklower { 26437315Ssklower in_getaddr(addr, DSTADDR); 26522485Ssklower setipdst++; 26637479Ssklower clearaddr = 0; 26737479Ssklower newaddr = 0; 26822485Ssklower } 26937479Ssklower #define rqtosa(x) (&(((struct ifreq *)(afp->x))->ifr_addr)) 27017218Stef /*ARGSUSED*/ 27137315Ssklower notealias(addr, param) 27237315Ssklower char *addr; 27337315Ssklower { 27437479Ssklower if (setaddr && doalias == 0 && param < 0) 27537479Ssklower bcopy((caddr_t)rqtosa(af_addreq), 27637479Ssklower (caddr_t)rqtosa(af_ridreq), 27737479Ssklower rqtosa(af_addreq)->sa_len); 27837315Ssklower doalias = param; 27937479Ssklower if (param < 0) { 28037479Ssklower clearaddr = 1; 28137479Ssklower newaddr = 0; 28237479Ssklower } else 28337315Ssklower clearaddr = 0; 28437315Ssklower } 28537315Ssklower 28637315Ssklower /*ARGSUSED*/ 28717218Stef setifdstaddr(addr, param) 28817218Stef char *addr; 28917218Stef int param; 29017218Stef { 29137315Ssklower (*afp->af_getaddr)(addr, DSTADDR); 29217218Stef } 29317218Stef 29414870Ssam setifflags(vname, value) 29514870Ssam char *vname; 29622485Ssklower short value; 29714869Ssam { 29822485Ssklower if (ioctl(s, SIOCGIFFLAGS, (caddr_t)&ifr) < 0) { 29922485Ssklower Perror("ioctl (SIOCGIFFLAGS)"); 30022485Ssklower exit(1); 30122485Ssklower } 30222485Ssklower strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); 30322485Ssklower flags = ifr.ifr_flags; 30414869Ssam 30514869Ssam if (value < 0) { 30614869Ssam value = -value; 30721811Skarels flags &= ~value; 30814869Ssam } else 30921811Skarels flags |= value; 31021811Skarels ifr.ifr_flags = flags; 31114869Ssam if (ioctl(s, SIOCSIFFLAGS, (caddr_t)&ifr) < 0) 31214870Ssam Perror(vname); 31314869Ssam } 31414869Ssam 31526185Skarels setifmetric(val) 31626185Skarels char *val; 31726185Skarels { 31826185Skarels strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); 31926185Skarels ifr.ifr_metric = atoi(val); 32026185Skarels if (ioctl(s, SIOCSIFMETRIC, (caddr_t)&ifr) < 0) 32126185Skarels perror("ioctl (set metric)"); 32226185Skarels } 32326185Skarels 32437315Ssklower setsnpaoffset(val) 32537315Ssklower char *val; 32637315Ssklower { 32737315Ssklower iso_addreq.ifra_snpaoffset = atoi(val); 32837315Ssklower } 32937315Ssklower 33026185Skarels #define IFFBITS \ 33126185Skarels "\020\1UP\2BROADCAST\3DEBUG\4LOOPBACK\5POINTOPOINT\6NOTRAILERS\7RUNNING\10NOARP\ 33226185Skarels " 33326185Skarels 33422485Ssklower /* 33522485Ssklower * Print the status of the interface. If an address family was 33622485Ssklower * specified, show it and it only; otherwise, show them all. 33722485Ssklower */ 33814869Ssam status() 33914869Ssam { 34022485Ssklower register struct afswtch *p = afp; 34122485Ssklower short af = ifr.ifr_addr.sa_family; 34222485Ssklower 34326185Skarels printf("%s: ", name); 34426185Skarels printb("flags", flags, IFFBITS); 34526185Skarels if (metric) 34626185Skarels printf(" metric %d", metric); 34726185Skarels putchar('\n'); 34822485Ssklower if ((p = afp) != NULL) { 34928468Skarels (*p->af_status)(1); 35028468Skarels } else for (p = afs; p->af_name; p++) { 35122485Ssklower ifr.ifr_addr.sa_family = p->af_af; 35228468Skarels (*p->af_status)(0); 35322485Ssklower } 35422485Ssklower } 35522485Ssklower 35628468Skarels in_status(force) 35728468Skarels int force; 35822485Ssklower { 35914869Ssam struct sockaddr_in *sin; 36022485Ssklower char *inet_ntoa(); 36114869Ssam 36227061Skarels strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); 36321811Skarels if (ioctl(s, SIOCGIFADDR, (caddr_t)&ifr) < 0) { 36428468Skarels if (errno == EADDRNOTAVAIL || errno == EAFNOSUPPORT) { 36528468Skarels if (!force) 36628468Skarels return; 36721811Skarels bzero((char *)&ifr.ifr_addr, sizeof(ifr.ifr_addr)); 36828468Skarels } else 36928468Skarels perror("ioctl (SIOCGIFADDR)"); 37021811Skarels } 37114869Ssam sin = (struct sockaddr_in *)&ifr.ifr_addr; 37226429Skarels printf("\tinet %s ", inet_ntoa(sin->sin_addr)); 37328468Skarels strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); 37428468Skarels if (ioctl(s, SIOCGIFNETMASK, (caddr_t)&ifr) < 0) { 37528468Skarels if (errno != EADDRNOTAVAIL) 37628468Skarels perror("ioctl (SIOCGIFNETMASK)"); 37728468Skarels bzero((char *)&ifr.ifr_addr, sizeof(ifr.ifr_addr)); 37828468Skarels } else 37928468Skarels netmask.sin_addr = 38028468Skarels ((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr; 38117218Stef if (flags & IFF_POINTOPOINT) { 38221811Skarels if (ioctl(s, SIOCGIFDSTADDR, (caddr_t)&ifr) < 0) { 38321811Skarels if (errno == EADDRNOTAVAIL) 38421811Skarels bzero((char *)&ifr.ifr_addr, sizeof(ifr.ifr_addr)); 38521811Skarels else 38628468Skarels perror("ioctl (SIOCGIFDSTADDR)"); 38721811Skarels } 38822485Ssklower strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); 38917218Stef sin = (struct sockaddr_in *)&ifr.ifr_dstaddr; 39017218Stef printf("--> %s ", inet_ntoa(sin->sin_addr)); 39117218Stef } 39221811Skarels printf("netmask %x ", ntohl(netmask.sin_addr.s_addr)); 39321811Skarels if (flags & IFF_BROADCAST) { 39421811Skarels if (ioctl(s, SIOCGIFBRDADDR, (caddr_t)&ifr) < 0) { 39521811Skarels if (errno == EADDRNOTAVAIL) 39628468Skarels bzero((char *)&ifr.ifr_addr, sizeof(ifr.ifr_addr)); 39728468Skarels else 39828468Skarels perror("ioctl (SIOCGIFADDR)"); 39921811Skarels } 40022485Ssklower strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); 40121811Skarels sin = (struct sockaddr_in *)&ifr.ifr_addr; 40228468Skarels if (sin->sin_addr.s_addr != 0) 40328468Skarels printf("broadcast %s", inet_ntoa(sin->sin_addr)); 40421811Skarels } 40526185Skarels putchar('\n'); 40614869Ssam } 40714869Ssam 40822485Ssklower 40928468Skarels xns_status(force) 41028468Skarels int force; 41122485Ssklower { 41222485Ssklower struct sockaddr_ns *sns; 41322485Ssklower 41422485Ssklower close(s); 41522485Ssklower s = socket(AF_NS, SOCK_DGRAM, 0); 41622485Ssklower if (s < 0) { 41730692Smckusick if (errno == EPROTONOSUPPORT) 41824248Ssklower return; 41922485Ssklower perror("ifconfig: socket"); 42022485Ssklower exit(1); 42122485Ssklower } 42222485Ssklower if (ioctl(s, SIOCGIFADDR, (caddr_t)&ifr) < 0) { 42328468Skarels if (errno == EADDRNOTAVAIL || errno == EAFNOSUPPORT) { 42428468Skarels if (!force) 42528468Skarels return; 42628468Skarels bzero((char *)&ifr.ifr_addr, sizeof(ifr.ifr_addr)); 42728468Skarels } else 42828468Skarels perror("ioctl (SIOCGIFADDR)"); 42922485Ssklower } 43022485Ssklower strncpy(ifr.ifr_name, name, sizeof ifr.ifr_name); 43122485Ssklower sns = (struct sockaddr_ns *)&ifr.ifr_addr; 43226185Skarels printf("\tns %s ", ns_ntoa(sns->sns_addr)); 43326101Ssklower if (flags & IFF_POINTOPOINT) { /* by W. Nesheim@Cornell */ 43426101Ssklower if (ioctl(s, SIOCGIFDSTADDR, (caddr_t)&ifr) < 0) { 43526101Ssklower if (errno == EADDRNOTAVAIL) 43626101Ssklower bzero((char *)&ifr.ifr_addr, sizeof(ifr.ifr_addr)); 43726101Ssklower else 43826101Ssklower Perror("ioctl (SIOCGIFDSTADDR)"); 43926101Ssklower } 44026101Ssklower strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); 44126101Ssklower sns = (struct sockaddr_ns *)&ifr.ifr_dstaddr; 44226101Ssklower printf("--> %s ", ns_ntoa(sns->sns_addr)); 44326101Ssklower } 44422485Ssklower putchar('\n'); 44522485Ssklower } 44622485Ssklower 44737315Ssklower iso_status(force) 44837315Ssklower int force; 44937315Ssklower { 45037315Ssklower struct sockaddr_iso *siso; 45137315Ssklower struct iso_ifreq ifr; 45237315Ssklower 45337315Ssklower close(s); 45437315Ssklower s = socket(AF_ISO, SOCK_DGRAM, 0); 45537315Ssklower if (s < 0) { 45637315Ssklower if (errno == EPROTONOSUPPORT) 45737315Ssklower return; 45837315Ssklower perror("ifconfig: socket"); 45937315Ssklower exit(1); 46037315Ssklower } 46137315Ssklower if (ioctl(s, SIOCGIFADDR, (caddr_t)&ifr) < 0) { 46237315Ssklower if (errno == EADDRNOTAVAIL || errno == EAFNOSUPPORT) { 46337315Ssklower if (!force) 46437315Ssklower return; 46537315Ssklower bzero((char *)&ifr.ifr_Addr, sizeof(ifr.ifr_Addr)); 46637315Ssklower } else 46737315Ssklower perror("ioctl (SIOCGIFADDR)"); 46837315Ssklower } 46937315Ssklower strncpy(ifr.ifr_name, name, sizeof ifr.ifr_name); 47037315Ssklower siso = &ifr.ifr_Addr; 47137315Ssklower printf("\tiso %s ", iso_ntoa(siso->siso_addr)); 47237315Ssklower if (ioctl(s, SIOCGIFNETMASK, (caddr_t)&ifr) < 0) { 47337315Ssklower if (errno != EADDRNOTAVAIL) 47437315Ssklower perror("ioctl (SIOCGIFNETMASK)"); 47537315Ssklower } else { 47637315Ssklower printf("\n netmask %s ", iso_ntoa(siso->siso_addr)); 47737315Ssklower } 47837315Ssklower if (flags & IFF_POINTOPOINT) { 47937315Ssklower if (ioctl(s, SIOCGIFDSTADDR, (caddr_t)&ifr) < 0) { 48037315Ssklower if (errno == EADDRNOTAVAIL) 48137315Ssklower bzero((char *)&ifr.ifr_Addr, sizeof(ifr.ifr_Addr)); 48237315Ssklower else 48337315Ssklower Perror("ioctl (SIOCGIFDSTADDR)"); 48437315Ssklower } 48537315Ssklower strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); 48637315Ssklower siso = &ifr.ifr_Addr; 48737315Ssklower printf("--> %s ", iso_ntoa(siso->siso_addr)); 48837315Ssklower } 48937315Ssklower putchar('\n'); 49037315Ssklower } 49137315Ssklower 49214869Ssam Perror(cmd) 49314869Ssam char *cmd; 49414869Ssam { 49514869Ssam extern int errno; 49614869Ssam 49714869Ssam fprintf(stderr, "ifconfig: "); 49814869Ssam switch (errno) { 49914869Ssam 50014869Ssam case ENXIO: 50122485Ssklower fprintf(stderr, "%s: no such interface\n", cmd); 50214869Ssam break; 50314869Ssam 50414869Ssam case EPERM: 50516822Slepreau fprintf(stderr, "%s: permission denied\n", cmd); 50614869Ssam break; 50714869Ssam 50814869Ssam default: 50914869Ssam perror(cmd); 51014869Ssam } 51114869Ssam exit(1); 51214869Ssam } 51314869Ssam 51414869Ssam struct in_addr inet_makeaddr(); 51514869Ssam 51637315Ssklower #define SIN(x) ((struct sockaddr_in *) &(x)) 51737315Ssklower struct sockaddr_in *sintab[] = { 51837315Ssklower SIN(ridreq.ifr_addr), SIN(addreq.ifra_addr), 51937315Ssklower SIN(addreq.ifra_mask), SIN(addreq.ifra_broadaddr)}; 52037315Ssklower 52137315Ssklower in_getaddr(s, which) 52214869Ssam char *s; 52314869Ssam { 52437315Ssklower register struct sockaddr_in *sin = sintab[which]; 52514869Ssam struct hostent *hp; 52614869Ssam struct netent *np; 52714869Ssam int val; 52814869Ssam 52939210Ssklower sin->sin_len = sizeof(*sin); 53039210Ssklower if (which != MASK) 53137315Ssklower sin->sin_family = AF_INET; 53239210Ssklower 53339210Ssklower if ((val = inet_addr(s)) != -1) 53421811Skarels sin->sin_addr.s_addr = val; 53539210Ssklower else if (hp = gethostbyname(s)) 53614869Ssam bcopy(hp->h_addr, (char *)&sin->sin_addr, hp->h_length); 53739210Ssklower else if (np = getnetbyname(s)) 53814869Ssam sin->sin_addr = inet_makeaddr(np->n_net, INADDR_ANY); 53939210Ssklower else { 54039210Ssklower fprintf(stderr, "%s: bad value\n", s); 54139210Ssklower exit(1); 54214869Ssam } 54314869Ssam } 54414869Ssam 54514869Ssam /* 54614869Ssam * Print a value a la the %b format of the kernel's printf 54714869Ssam */ 54814869Ssam printb(s, v, bits) 54914869Ssam char *s; 55014869Ssam register char *bits; 55114869Ssam register unsigned short v; 55214869Ssam { 55314869Ssam register int i, any = 0; 55414869Ssam register char c; 55514869Ssam 55614869Ssam if (bits && *bits == 8) 55714869Ssam printf("%s=%o", s, v); 55814869Ssam else 55914869Ssam printf("%s=%x", s, v); 56014869Ssam bits++; 56114869Ssam if (bits) { 56214869Ssam putchar('<'); 56314869Ssam while (i = *bits++) { 56414869Ssam if (v & (1 << (i-1))) { 56514869Ssam if (any) 56614869Ssam putchar(','); 56714869Ssam any = 1; 56814869Ssam for (; (c = *bits) > 32; bits++) 56914869Ssam putchar(c); 57014869Ssam } else 57114869Ssam for (; *bits > 32; bits++) 57214869Ssam ; 57314869Ssam } 57414869Ssam putchar('>'); 57514869Ssam } 57614869Ssam } 57722485Ssklower 57837315Ssklower #define SNS(x) ((struct sockaddr_ns *) &(x)) 57937315Ssklower struct sockaddr_ns *snstab[] = { 58037315Ssklower SNS(ridreq.ifr_addr), SNS(addreq.ifra_addr), 58137315Ssklower SNS(addreq.ifra_mask), SNS(addreq.ifra_broadaddr)}; 58237315Ssklower 58337315Ssklower xns_getaddr(addr, which) 58422485Ssklower char *addr; 58522485Ssklower { 58637315Ssklower struct sockaddr_ns *sns = snstab[which]; 58726101Ssklower struct ns_addr ns_addr(); 58837315Ssklower 58922485Ssklower sns->sns_family = AF_NS; 59037227Ssklower sns->sns_len = sizeof(*sns); 59126101Ssklower sns->sns_addr = ns_addr(addr); 59237315Ssklower if (which == MASK) 59337315Ssklower printf("Attempt to set XNS netmask will be ineffectual\n"); 59422485Ssklower } 59537315Ssklower 59637315Ssklower #define SISO(x) ((struct sockaddr_iso *) &(x)) 59737315Ssklower struct sockaddr_iso *sisotab[] = { 59837315Ssklower SISO(iso_ridreq.ifr_Addr), SISO(iso_addreq.ifra_addr), 59937315Ssklower SISO(iso_addreq.ifra_mask), SISO(iso_addreq.ifra_dstaddr)}; 60037315Ssklower 60137315Ssklower iso_getaddr(addr, which) 60237315Ssklower char *addr; 60337315Ssklower { 60437315Ssklower struct sockaddr_iso *siso = sisotab[which]; 60537315Ssklower struct iso_addr *iso_addr(); 60637315Ssklower siso->siso_addr = *iso_addr(addr); 60737315Ssklower if (which == MASK) { 60839210Ssklower siso->siso_len = TSEL(siso) - (caddr_t)(siso); 60937315Ssklower siso->siso_nlen = 0; 61037315Ssklower } else { 61137315Ssklower siso->siso_family = AF_ISO; 61237315Ssklower siso->siso_len = sizeof(*siso); 61337315Ssklower } 61437315Ssklower } 615