121811Skarels /* 251367Swilliam * Copyright (c) 1983 The Regents of the University of California. 334941Sbostic * All rights reserved. 434941Sbostic * 551367Swilliam * %sccs.include.redist.c% 621811Skarels */ 721811Skarels 814869Ssam #ifndef lint 921811Skarels char copyright[] = 1051367Swilliam "@(#) Copyright (c) 1983 The Regents of the University of California.\n\ 1121811Skarels All rights reserved.\n"; 1234941Sbostic #endif /* not lint */ 1314869Ssam 1421811Skarels #ifndef lint 15*54813Ssklower static char sccsid[] = "@(#)ifconfig.c 5.8 (Berkeley) 07/08/92"; 1634941Sbostic #endif /* not lint */ 1721811Skarels 1846782Sbostic #include <sys/param.h> 1914869Ssam #include <sys/socket.h> 2014869Ssam #include <sys/ioctl.h> 2114869Ssam 2222485Ssklower #include <net/if.h> 2314869Ssam #include <netinet/in.h> 2446782Sbostic #include <arpa/inet.h> 2514869Ssam 2622485Ssklower #define NSIP 2722485Ssklower #include <netns/ns.h> 2822485Ssklower #include <netns/ns_if.h> 2946782Sbostic #include <netdb.h> 3022485Ssklower 3137479Ssklower #define EON 3237315Ssklower #include <netiso/iso.h> 3337315Ssklower #include <netiso/iso_var.h> 3437479Ssklower #include <sys/protosw.h> 3537315Ssklower 3646782Sbostic #include <unistd.h> 3714869Ssam #include <stdio.h> 3814869Ssam #include <errno.h> 3914869Ssam #include <ctype.h> 4046782Sbostic #include <stdlib.h> 4146782Sbostic #include <string.h> 4214869Ssam 4337315Ssklower struct ifreq ifr, ridreq; 4437315Ssklower struct ifaliasreq addreq; 4537315Ssklower struct iso_ifreq iso_ridreq; 4643089Ssklower struct iso_aliasreq iso_addreq; 4737315Ssklower struct sockaddr_in netmask; 4837315Ssklower 4914869Ssam char name[30]; 5021811Skarels int flags; 5126185Skarels int metric; 5243089Ssklower int nsellength = 1; 5316329Skarels int setaddr; 5422485Ssklower int setipdst; 5537315Ssklower int doalias; 5637479Ssklower int clearaddr; 5737315Ssklower int newaddr = 1; 5814869Ssam int s; 5921811Skarels extern int errno; 6014869Ssam 6121811Skarels int setifflags(), setifaddr(), setifdstaddr(), setifnetmask(); 6226185Skarels int setifmetric(), setifbroadaddr(), setifipdst(); 63*54813Ssklower int notealias(), setsnpaoffset(), setnsellength(), notrailers(); 6414869Ssam 6521811Skarels #define NEXTARG 0xffffff 6621811Skarels 6714869Ssam struct cmd { 6814869Ssam char *c_name; 6921811Skarels int c_parameter; /* NEXTARG means next argv */ 7014869Ssam int (*c_func)(); 7114869Ssam } cmds[] = { 7214869Ssam { "up", IFF_UP, setifflags } , 7314869Ssam { "down", -IFF_UP, setifflags }, 74*54813Ssklower { "trailers", -1, notrailers }, 75*54813Ssklower { "-trailers", 1, notrailers }, 7615359Skarels { "arp", -IFF_NOARP, setifflags }, 7715359Skarels { "-arp", IFF_NOARP, setifflags }, 7815286Sleres { "debug", IFF_DEBUG, setifflags }, 7915286Sleres { "-debug", -IFF_DEBUG, setifflags }, 8037315Ssklower { "alias", IFF_UP, notealias }, 8137315Ssklower { "-alias", -IFF_UP, notealias }, 8237315Ssklower { "delete", -IFF_UP, notealias }, 8315004Ssam #ifdef notdef 8421811Skarels #define EN_SWABIPS 0x1000 8515004Ssam { "swabips", EN_SWABIPS, setifflags }, 8615004Ssam { "-swabips", -EN_SWABIPS, setifflags }, 8715004Ssam #endif 8821811Skarels { "netmask", NEXTARG, setifnetmask }, 8926185Skarels { "metric", NEXTARG, setifmetric }, 9021811Skarels { "broadcast", NEXTARG, setifbroadaddr }, 9122485Ssklower { "ipdst", NEXTARG, setifipdst }, 9242965Ssklower { "snpaoffset", NEXTARG, setsnpaoffset }, 9342965Ssklower { "nsellength", NEXTARG, setnsellength }, 9452468Ssklower { "link0", IFF_LINK0, setifflags } , 9552468Ssklower { "-link0", -IFF_LINK0, setifflags } , 9652468Ssklower { "link1", IFF_LINK1, setifflags } , 9752468Ssklower { "-link1", -IFF_LINK1, setifflags } , 9852468Ssklower { "link2", IFF_LINK2, setifflags } , 9952468Ssklower { "-link2", -IFF_LINK2, setifflags } , 10014869Ssam { 0, 0, setifaddr }, 10117218Stef { 0, 0, setifdstaddr }, 10214869Ssam }; 10314869Ssam 10422485Ssklower /* 10522485Ssklower * XNS support liberally adapted from 10622485Ssklower * code written at the University of Maryland 10722485Ssklower * principally by James O'Toole and Chris Torek. 10822485Ssklower */ 10922485Ssklower int in_status(), in_getaddr(); 11022485Ssklower int xns_status(), xns_getaddr(); 11137315Ssklower int iso_status(), iso_getaddr(); 11222485Ssklower 11322485Ssklower /* Known address families */ 11422485Ssklower struct afswtch { 11522485Ssklower char *af_name; 11622485Ssklower short af_af; 11722485Ssklower int (*af_status)(); 11822485Ssklower int (*af_getaddr)(); 11937315Ssklower int af_difaddr; 12037315Ssklower int af_aifaddr; 12137315Ssklower caddr_t af_ridreq; 12237315Ssklower caddr_t af_addreq; 12322485Ssklower } afs[] = { 12437315Ssklower #define C(x) ((caddr_t) &x) 12537315Ssklower { "inet", AF_INET, in_status, in_getaddr, 12637315Ssklower SIOCDIFADDR, SIOCAIFADDR, C(ridreq), C(addreq) }, 12737315Ssklower { "ns", AF_NS, xns_status, xns_getaddr, 12837315Ssklower SIOCDIFADDR, SIOCAIFADDR, C(ridreq), C(addreq) }, 12937315Ssklower { "iso", AF_ISO, iso_status, iso_getaddr, 13037315Ssklower SIOCDIFADDR_ISO, SIOCAIFADDR_ISO, C(iso_ridreq), C(iso_addreq) }, 13137315Ssklower { 0, 0, 0, 0 } 13222485Ssklower }; 13322485Ssklower 13422485Ssklower struct afswtch *afp; /*the address family being set or asked about*/ 13522485Ssklower 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) { 144*54813Ssklower 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", 14851366Swilliam "\t[ arp | -arp ]\n", 14952490Skarels "\t[ link0 | -link0 ] [ link1 | -link1 ] [ link2 | -link2 ] \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 } 20143089Ssklower if (af == AF_ISO) 20243089Ssklower adjust_nsellength(); 20337479Ssklower if (setipdst && af==AF_NS) { 20437479Ssklower struct nsip_req rq; 20537479Ssklower int size = sizeof(rq); 20637479Ssklower 20737479Ssklower rq.rq_ns = addreq.ifra_addr; 20837479Ssklower rq.rq_ip = addreq.ifra_dstaddr; 20937479Ssklower 21037479Ssklower if (setsockopt(s, 0, SO_NSIP_ROUTE, &rq, size) < 0) 21137479Ssklower Perror("Encapsulation Routing"); 21237479Ssklower } 21337315Ssklower if (clearaddr) { 21437315Ssklower int ret; 21537315Ssklower strncpy(rafp->af_ridreq, name, sizeof ifr.ifr_name); 21637315Ssklower if ((ret = ioctl(s, rafp->af_difaddr, rafp->af_ridreq)) < 0) { 21737315Ssklower if (errno == EADDRNOTAVAIL && (doalias >= 0)) { 21837315Ssklower /* means no previous address for interface */ 21937315Ssklower } else 22037315Ssklower Perror("ioctl (SIOCDIFADDR)"); 22137315Ssklower } 22221811Skarels } 22337315Ssklower if (newaddr) { 22437315Ssklower strncpy(rafp->af_addreq, name, sizeof ifr.ifr_name); 22537315Ssklower if (ioctl(s, rafp->af_aifaddr, rafp->af_addreq) < 0) 22637315Ssklower Perror("ioctl (SIOCAIFADDR)"); 22716329Skarels } 22814869Ssam exit(0); 22914869Ssam } 23037315Ssklower #define RIDADDR 0 23137315Ssklower #define ADDR 1 23237315Ssklower #define MASK 2 23337315Ssklower #define DSTADDR 3 23414869Ssam 23514869Ssam /*ARGSUSED*/ 23614869Ssam setifaddr(addr, param) 23714869Ssam char *addr; 23822485Ssklower short param; 23914869Ssam { 24016329Skarels /* 24116329Skarels * Delay the ioctl to set the interface addr until flags are all set. 24216329Skarels * The address interpretation may depend on the flags, 24316329Skarels * and the flags may change when the address is set. 24415390Skarels */ 24516329Skarels setaddr++; 24640830Ssklower if (doalias == 0) 24737479Ssklower clearaddr = 1; 24837315Ssklower (*afp->af_getaddr)(addr, (doalias >= 0 ? ADDR : RIDADDR)); 24914869Ssam } 25014869Ssam 25121811Skarels setifnetmask(addr) 25221811Skarels char *addr; 25321811Skarels { 25437315Ssklower (*afp->af_getaddr)(addr, MASK); 25521811Skarels } 25621811Skarels 25721811Skarels setifbroadaddr(addr) 25821811Skarels char *addr; 25921811Skarels { 26037315Ssklower (*afp->af_getaddr)(addr, DSTADDR); 26121811Skarels } 26221811Skarels 26322485Ssklower setifipdst(addr) 26422485Ssklower char *addr; 26522485Ssklower { 26637315Ssklower in_getaddr(addr, DSTADDR); 26722485Ssklower setipdst++; 26837479Ssklower clearaddr = 0; 26937479Ssklower newaddr = 0; 27022485Ssklower } 27137479Ssklower #define rqtosa(x) (&(((struct ifreq *)(afp->x))->ifr_addr)) 27217218Stef /*ARGSUSED*/ 27337315Ssklower notealias(addr, param) 27437315Ssklower char *addr; 27537315Ssklower { 27637479Ssklower if (setaddr && doalias == 0 && param < 0) 27737479Ssklower bcopy((caddr_t)rqtosa(af_addreq), 27837479Ssklower (caddr_t)rqtosa(af_ridreq), 27937479Ssklower rqtosa(af_addreq)->sa_len); 28037315Ssklower doalias = param; 28137479Ssklower if (param < 0) { 28237479Ssklower clearaddr = 1; 28337479Ssklower newaddr = 0; 28437479Ssklower } else 28537315Ssklower clearaddr = 0; 28637315Ssklower } 28737315Ssklower 28837315Ssklower /*ARGSUSED*/ 289*54813Ssklower notrailers(vname, value) 290*54813Ssklower char *vname; 291*54813Ssklower int value; 292*54813Ssklower { 293*54813Ssklower printf("Note: trailers are no longer sent, but always received\n"); 294*54813Ssklower } 295*54813Ssklower 296*54813Ssklower /*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 \ 34151366Swilliam "\020\1UP\2BROADCAST\3DEBUG\4LOOPBACK\5POINTOPOINT\6NOTRAILERS\7RUNNING\10NOARP\ 342*54813Ssklower \11PROMISC\12ALLMULTI\13OACTIVE\14SIMPLEX\15LINK0\16LINK1\17LINK2\20MULTICAST" 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 } 47142965Ssklower bzero((caddr_t)&ifr, sizeof(ifr)); 47242965Ssklower strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name)); 47342965Ssklower if (ioctl(s, SIOCGIFADDR_ISO, (caddr_t)&ifr) < 0) { 47437315Ssklower if (errno == EADDRNOTAVAIL || errno == EAFNOSUPPORT) { 47537315Ssklower if (!force) 47637315Ssklower return; 47737315Ssklower bzero((char *)&ifr.ifr_Addr, sizeof(ifr.ifr_Addr)); 47842965Ssklower } else { 47942965Ssklower perror("ioctl (SIOCGIFADDR_ISO)"); 48042965Ssklower exit(1); 48142965Ssklower } 48237315Ssklower } 48337315Ssklower strncpy(ifr.ifr_name, name, sizeof ifr.ifr_name); 48437315Ssklower siso = &ifr.ifr_Addr; 48542965Ssklower printf("\tiso %s ", iso_ntoa(&siso->siso_addr)); 48642965Ssklower if (ioctl(s, SIOCGIFNETMASK_ISO, (caddr_t)&ifr) < 0) { 48737315Ssklower if (errno != EADDRNOTAVAIL) 48842965Ssklower perror("ioctl (SIOCGIFNETMASK_ISO)"); 48937315Ssklower } else { 49042965Ssklower printf(" netmask %s ", iso_ntoa(&siso->siso_addr)); 49137315Ssklower } 49237315Ssklower if (flags & IFF_POINTOPOINT) { 49342965Ssklower if (ioctl(s, SIOCGIFDSTADDR_ISO, (caddr_t)&ifr) < 0) { 49437315Ssklower if (errno == EADDRNOTAVAIL) 49537315Ssklower bzero((char *)&ifr.ifr_Addr, sizeof(ifr.ifr_Addr)); 49637315Ssklower else 49742965Ssklower Perror("ioctl (SIOCGIFDSTADDR_ISO)"); 49837315Ssklower } 49937315Ssklower strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); 50037315Ssklower siso = &ifr.ifr_Addr; 50142965Ssklower printf("--> %s ", iso_ntoa(&siso->siso_addr)); 50237315Ssklower } 50337315Ssklower putchar('\n'); 50437315Ssklower } 50537315Ssklower 50614869Ssam Perror(cmd) 50714869Ssam char *cmd; 50814869Ssam { 50914869Ssam extern int errno; 51014869Ssam 51114869Ssam fprintf(stderr, "ifconfig: "); 51214869Ssam switch (errno) { 51314869Ssam 51414869Ssam case ENXIO: 51522485Ssklower fprintf(stderr, "%s: no such interface\n", cmd); 51614869Ssam break; 51714869Ssam 51814869Ssam case EPERM: 51916822Slepreau fprintf(stderr, "%s: permission denied\n", cmd); 52014869Ssam break; 52114869Ssam 52214869Ssam default: 52314869Ssam perror(cmd); 52414869Ssam } 52514869Ssam exit(1); 52614869Ssam } 52714869Ssam 52814869Ssam struct in_addr inet_makeaddr(); 52914869Ssam 53037315Ssklower #define SIN(x) ((struct sockaddr_in *) &(x)) 53137315Ssklower struct sockaddr_in *sintab[] = { 53237315Ssklower SIN(ridreq.ifr_addr), SIN(addreq.ifra_addr), 53337315Ssklower SIN(addreq.ifra_mask), SIN(addreq.ifra_broadaddr)}; 53437315Ssklower 53537315Ssklower in_getaddr(s, which) 53614869Ssam char *s; 53714869Ssam { 53837315Ssklower register struct sockaddr_in *sin = sintab[which]; 53914869Ssam struct hostent *hp; 54014869Ssam struct netent *np; 54114869Ssam int val; 54214869Ssam 54339210Ssklower sin->sin_len = sizeof(*sin); 54439210Ssklower if (which != MASK) 54537315Ssklower sin->sin_family = AF_INET; 54639210Ssklower 54739210Ssklower if ((val = inet_addr(s)) != -1) 54821811Skarels sin->sin_addr.s_addr = val; 54939210Ssklower else if (hp = gethostbyname(s)) 55014869Ssam bcopy(hp->h_addr, (char *)&sin->sin_addr, hp->h_length); 55139210Ssklower else if (np = getnetbyname(s)) 55214869Ssam sin->sin_addr = inet_makeaddr(np->n_net, INADDR_ANY); 55339210Ssklower else { 55439210Ssklower fprintf(stderr, "%s: bad value\n", s); 55539210Ssklower exit(1); 55614869Ssam } 55714869Ssam } 55814869Ssam 55914869Ssam /* 56014869Ssam * Print a value a la the %b format of the kernel's printf 56114869Ssam */ 56214869Ssam printb(s, v, bits) 56314869Ssam char *s; 56414869Ssam register char *bits; 56514869Ssam register unsigned short v; 56614869Ssam { 56714869Ssam register int i, any = 0; 56814869Ssam register char c; 56914869Ssam 57014869Ssam if (bits && *bits == 8) 57114869Ssam printf("%s=%o", s, v); 57214869Ssam else 57314869Ssam printf("%s=%x", s, v); 57414869Ssam bits++; 57514869Ssam if (bits) { 57614869Ssam putchar('<'); 57714869Ssam while (i = *bits++) { 57814869Ssam if (v & (1 << (i-1))) { 57914869Ssam if (any) 58014869Ssam putchar(','); 58114869Ssam any = 1; 58214869Ssam for (; (c = *bits) > 32; bits++) 58314869Ssam putchar(c); 58414869Ssam } else 58514869Ssam for (; *bits > 32; bits++) 58614869Ssam ; 58714869Ssam } 58814869Ssam putchar('>'); 58914869Ssam } 59014869Ssam } 59122485Ssklower 59237315Ssklower #define SNS(x) ((struct sockaddr_ns *) &(x)) 59337315Ssklower struct sockaddr_ns *snstab[] = { 59437315Ssklower SNS(ridreq.ifr_addr), SNS(addreq.ifra_addr), 59537315Ssklower SNS(addreq.ifra_mask), SNS(addreq.ifra_broadaddr)}; 59637315Ssklower 59737315Ssklower xns_getaddr(addr, which) 59822485Ssklower char *addr; 59922485Ssklower { 60037315Ssklower struct sockaddr_ns *sns = snstab[which]; 60126101Ssklower struct ns_addr ns_addr(); 60237315Ssklower 60322485Ssklower sns->sns_family = AF_NS; 60437227Ssklower sns->sns_len = sizeof(*sns); 60526101Ssklower sns->sns_addr = ns_addr(addr); 60637315Ssklower if (which == MASK) 60737315Ssklower printf("Attempt to set XNS netmask will be ineffectual\n"); 60822485Ssklower } 60937315Ssklower 61037315Ssklower #define SISO(x) ((struct sockaddr_iso *) &(x)) 61137315Ssklower struct sockaddr_iso *sisotab[] = { 61237315Ssklower SISO(iso_ridreq.ifr_Addr), SISO(iso_addreq.ifra_addr), 61337315Ssklower SISO(iso_addreq.ifra_mask), SISO(iso_addreq.ifra_dstaddr)}; 61437315Ssklower 61537315Ssklower iso_getaddr(addr, which) 61637315Ssklower char *addr; 61737315Ssklower { 61843089Ssklower register struct sockaddr_iso *siso = sisotab[which]; 61937315Ssklower struct iso_addr *iso_addr(); 62037315Ssklower siso->siso_addr = *iso_addr(addr); 62143089Ssklower 62237315Ssklower if (which == MASK) { 62339210Ssklower siso->siso_len = TSEL(siso) - (caddr_t)(siso); 62437315Ssklower siso->siso_nlen = 0; 62537315Ssklower } else { 62643089Ssklower siso->siso_len = sizeof(*siso); 62743089Ssklower siso->siso_family = AF_ISO; 62837315Ssklower } 62937315Ssklower } 63042965Ssklower 63142965Ssklower setnsellength(val) 63242965Ssklower char *val; 63342965Ssklower { 63443089Ssklower nsellength = atoi(val); 63543089Ssklower if (nsellength < 0) { 63643089Ssklower fprintf(stderr, "Negative NSEL length is absurd\n"); 63743089Ssklower exit (1); 63843089Ssklower } 63942965Ssklower if (afp == 0 || afp->af_af != AF_ISO) { 64042965Ssklower fprintf(stderr, "Setting NSEL length valid only for iso\n"); 64142965Ssklower exit (1); 64242965Ssklower } 64342965Ssklower } 64443089Ssklower 64543089Ssklower fixnsel(s) 64643089Ssklower register struct sockaddr_iso *s; 64743089Ssklower { 64843089Ssklower if (s->siso_family == 0) 64943089Ssklower return; 65043089Ssklower s->siso_tlen = nsellength; 65143089Ssklower } 65243089Ssklower 65343089Ssklower adjust_nsellength() 65443089Ssklower { 65543089Ssklower fixnsel(sisotab[RIDADDR]); 65643089Ssklower fixnsel(sisotab[ADDR]); 65743089Ssklower fixnsel(sisotab[DSTADDR]); 65843089Ssklower } 659