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*52468Ssklower static char sccsid[] = "@(#)ifconfig.c 5.5 (Berkeley) 02/12/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(); 6342965Ssklower int notealias(), setsnpaoffset(), setnsellength(); 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 }, 7414869Ssam { "trailers", -IFF_NOTRAILERS,setifflags }, 7514869Ssam { "-trailers", IFF_NOTRAILERS, setifflags }, 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 }, 94*52468Ssklower { "link0", IFF_LINK0, setifflags } , 95*52468Ssklower { "-link0", -IFF_LINK0, setifflags } , 96*52468Ssklower { "link1", IFF_LINK1, setifflags } , 97*52468Ssklower { "-link1", -IFF_LINK1, setifflags } , 98*52468Ssklower { "link2", IFF_LINK2, setifflags } , 99*52468Ssklower { "-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) { 14451366Swilliam fprintf(stderr, "usage: ifconfig interface\n%s%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", 14951366Swilliam "\t[ arp | -arp ]\n", 15051366Swilliam "\t[ llc0 | -llc0 ] [ llc1 | -llc1 ] [ llc2 | -llc2 ] \n"); 15114869Ssam exit(1); 15214869Ssam } 15322485Ssklower argc--, argv++; 15424248Ssklower strncpy(name, *argv, sizeof(name)); 15522485Ssklower strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name)); 15622485Ssklower argc--, argv++; 15722485Ssklower if (argc > 0) { 15837315Ssklower for (afp = rafp = afs; rafp->af_name; rafp++) 15937315Ssklower if (strcmp(rafp->af_name, *argv) == 0) { 16037315Ssklower afp = rafp; argc--; argv++; 16122485Ssklower break; 16222485Ssklower } 16337315Ssklower rafp = afp; 16437315Ssklower af = ifr.ifr_addr.sa_family = rafp->af_af; 16522485Ssklower } 16622485Ssklower s = socket(af, SOCK_DGRAM, 0); 16714869Ssam if (s < 0) { 16814869Ssam perror("ifconfig: socket"); 16914869Ssam exit(1); 17014869Ssam } 17114869Ssam if (ioctl(s, SIOCGIFFLAGS, (caddr_t)&ifr) < 0) { 17214869Ssam Perror("ioctl (SIOCGIFFLAGS)"); 17314869Ssam exit(1); 17414869Ssam } 17522485Ssklower strncpy(ifr.ifr_name, name, sizeof ifr.ifr_name); 17621811Skarels flags = ifr.ifr_flags; 17726185Skarels if (ioctl(s, SIOCGIFMETRIC, (caddr_t)&ifr) < 0) 17826185Skarels perror("ioctl (SIOCGIFMETRIC)"); 17926185Skarels else 18026185Skarels metric = ifr.ifr_metric; 18114869Ssam if (argc == 0) { 18214869Ssam status(); 18314869Ssam exit(0); 18414869Ssam } 18514869Ssam while (argc > 0) { 18614869Ssam register struct cmd *p; 18714869Ssam 18814869Ssam for (p = cmds; p->c_name; p++) 18914869Ssam if (strcmp(*argv, p->c_name) == 0) 19014869Ssam break; 19117218Stef if (p->c_name == 0 && setaddr) 19217218Stef p++; /* got src, do dst */ 19321811Skarels if (p->c_func) { 19421811Skarels if (p->c_parameter == NEXTARG) { 19521811Skarels (*p->c_func)(argv[1]); 19621811Skarels argc--, argv++; 19721811Skarels } else 19821811Skarels (*p->c_func)(*argv, p->c_parameter); 19921811Skarels } 20014869Ssam argc--, argv++; 20114869Ssam } 20243089Ssklower if (af == AF_ISO) 20343089Ssklower adjust_nsellength(); 20437479Ssklower if (setipdst && af==AF_NS) { 20537479Ssklower struct nsip_req rq; 20637479Ssklower int size = sizeof(rq); 20737479Ssklower 20837479Ssklower rq.rq_ns = addreq.ifra_addr; 20937479Ssklower rq.rq_ip = addreq.ifra_dstaddr; 21037479Ssklower 21137479Ssklower if (setsockopt(s, 0, SO_NSIP_ROUTE, &rq, size) < 0) 21237479Ssklower Perror("Encapsulation Routing"); 21337479Ssklower } 21437315Ssklower if (clearaddr) { 21537315Ssklower int ret; 21637315Ssklower strncpy(rafp->af_ridreq, name, sizeof ifr.ifr_name); 21737315Ssklower if ((ret = ioctl(s, rafp->af_difaddr, rafp->af_ridreq)) < 0) { 21837315Ssklower if (errno == EADDRNOTAVAIL && (doalias >= 0)) { 21937315Ssklower /* means no previous address for interface */ 22037315Ssklower } else 22137315Ssklower Perror("ioctl (SIOCDIFADDR)"); 22237315Ssklower } 22321811Skarels } 22437315Ssklower if (newaddr) { 22537315Ssklower strncpy(rafp->af_addreq, name, sizeof ifr.ifr_name); 22637315Ssklower if (ioctl(s, rafp->af_aifaddr, rafp->af_addreq) < 0) 22737315Ssklower Perror("ioctl (SIOCAIFADDR)"); 22816329Skarels } 22914869Ssam exit(0); 23014869Ssam } 23137315Ssklower #define RIDADDR 0 23237315Ssklower #define ADDR 1 23337315Ssklower #define MASK 2 23437315Ssklower #define DSTADDR 3 23514869Ssam 23614869Ssam /*ARGSUSED*/ 23714869Ssam setifaddr(addr, param) 23814869Ssam char *addr; 23922485Ssklower short param; 24014869Ssam { 24116329Skarels /* 24216329Skarels * Delay the ioctl to set the interface addr until flags are all set. 24316329Skarels * The address interpretation may depend on the flags, 24416329Skarels * and the flags may change when the address is set. 24515390Skarels */ 24616329Skarels setaddr++; 24740830Ssklower if (doalias == 0) 24837479Ssklower clearaddr = 1; 24937315Ssklower (*afp->af_getaddr)(addr, (doalias >= 0 ? ADDR : RIDADDR)); 25014869Ssam } 25114869Ssam 25221811Skarels setifnetmask(addr) 25321811Skarels char *addr; 25421811Skarels { 25537315Ssklower (*afp->af_getaddr)(addr, MASK); 25621811Skarels } 25721811Skarels 25821811Skarels setifbroadaddr(addr) 25921811Skarels char *addr; 26021811Skarels { 26137315Ssklower (*afp->af_getaddr)(addr, DSTADDR); 26221811Skarels } 26321811Skarels 26422485Ssklower setifipdst(addr) 26522485Ssklower char *addr; 26622485Ssklower { 26737315Ssklower in_getaddr(addr, DSTADDR); 26822485Ssklower setipdst++; 26937479Ssklower clearaddr = 0; 27037479Ssklower newaddr = 0; 27122485Ssklower } 27237479Ssklower #define rqtosa(x) (&(((struct ifreq *)(afp->x))->ifr_addr)) 27317218Stef /*ARGSUSED*/ 27437315Ssklower notealias(addr, param) 27537315Ssklower char *addr; 27637315Ssklower { 27737479Ssklower if (setaddr && doalias == 0 && param < 0) 27837479Ssklower bcopy((caddr_t)rqtosa(af_addreq), 27937479Ssklower (caddr_t)rqtosa(af_ridreq), 28037479Ssklower rqtosa(af_addreq)->sa_len); 28137315Ssklower doalias = param; 28237479Ssklower if (param < 0) { 28337479Ssklower clearaddr = 1; 28437479Ssklower newaddr = 0; 28537479Ssklower } else 28637315Ssklower clearaddr = 0; 28737315Ssklower } 28837315Ssklower 28937315Ssklower /*ARGSUSED*/ 29017218Stef setifdstaddr(addr, param) 29117218Stef char *addr; 29217218Stef int param; 29317218Stef { 29437315Ssklower (*afp->af_getaddr)(addr, DSTADDR); 29517218Stef } 29617218Stef 29714870Ssam setifflags(vname, value) 29814870Ssam char *vname; 29922485Ssklower short value; 30014869Ssam { 30122485Ssklower if (ioctl(s, SIOCGIFFLAGS, (caddr_t)&ifr) < 0) { 30222485Ssklower Perror("ioctl (SIOCGIFFLAGS)"); 30322485Ssklower exit(1); 30422485Ssklower } 30522485Ssklower strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); 30622485Ssklower flags = ifr.ifr_flags; 30714869Ssam 30814869Ssam if (value < 0) { 30914869Ssam value = -value; 31021811Skarels flags &= ~value; 31114869Ssam } else 31221811Skarels flags |= value; 31321811Skarels ifr.ifr_flags = flags; 31414869Ssam if (ioctl(s, SIOCSIFFLAGS, (caddr_t)&ifr) < 0) 31514870Ssam Perror(vname); 31614869Ssam } 31714869Ssam 31826185Skarels setifmetric(val) 31926185Skarels char *val; 32026185Skarels { 32126185Skarels strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); 32226185Skarels ifr.ifr_metric = atoi(val); 32326185Skarels if (ioctl(s, SIOCSIFMETRIC, (caddr_t)&ifr) < 0) 32426185Skarels perror("ioctl (set metric)"); 32526185Skarels } 32626185Skarels 32737315Ssklower setsnpaoffset(val) 32837315Ssklower char *val; 32937315Ssklower { 33037315Ssklower iso_addreq.ifra_snpaoffset = atoi(val); 33137315Ssklower } 33237315Ssklower 33326185Skarels #define IFFBITS \ 33451366Swilliam "\020\1UP\2BROADCAST\3DEBUG\4LOOPBACK\5POINTOPOINT\6NOTRAILERS\7RUNNING\10NOARP\ 335*52468Ssklower \11PROMISC\12ALLMULTI\13OACTIVE\14SIMPLEX\15LINK0\16LINK1\16LINK2" 33626185Skarels 33722485Ssklower /* 33822485Ssklower * Print the status of the interface. If an address family was 33922485Ssklower * specified, show it and it only; otherwise, show them all. 34022485Ssklower */ 34114869Ssam status() 34214869Ssam { 34322485Ssklower register struct afswtch *p = afp; 34422485Ssklower short af = ifr.ifr_addr.sa_family; 34522485Ssklower 34626185Skarels printf("%s: ", name); 34726185Skarels printb("flags", flags, IFFBITS); 34826185Skarels if (metric) 34926185Skarels printf(" metric %d", metric); 35026185Skarels putchar('\n'); 35122485Ssklower if ((p = afp) != NULL) { 35228468Skarels (*p->af_status)(1); 35328468Skarels } else for (p = afs; p->af_name; p++) { 35422485Ssklower ifr.ifr_addr.sa_family = p->af_af; 35528468Skarels (*p->af_status)(0); 35622485Ssklower } 35722485Ssklower } 35822485Ssklower 35928468Skarels in_status(force) 36028468Skarels int force; 36122485Ssklower { 36214869Ssam struct sockaddr_in *sin; 36322485Ssklower char *inet_ntoa(); 36414869Ssam 36527061Skarels strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); 36621811Skarels if (ioctl(s, SIOCGIFADDR, (caddr_t)&ifr) < 0) { 36728468Skarels if (errno == EADDRNOTAVAIL || errno == EAFNOSUPPORT) { 36828468Skarels if (!force) 36928468Skarels return; 37021811Skarels bzero((char *)&ifr.ifr_addr, sizeof(ifr.ifr_addr)); 37128468Skarels } else 37228468Skarels perror("ioctl (SIOCGIFADDR)"); 37321811Skarels } 37414869Ssam sin = (struct sockaddr_in *)&ifr.ifr_addr; 37526429Skarels printf("\tinet %s ", inet_ntoa(sin->sin_addr)); 37628468Skarels strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); 37728468Skarels if (ioctl(s, SIOCGIFNETMASK, (caddr_t)&ifr) < 0) { 37828468Skarels if (errno != EADDRNOTAVAIL) 37928468Skarels perror("ioctl (SIOCGIFNETMASK)"); 38028468Skarels bzero((char *)&ifr.ifr_addr, sizeof(ifr.ifr_addr)); 38128468Skarels } else 38228468Skarels netmask.sin_addr = 38328468Skarels ((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr; 38417218Stef if (flags & IFF_POINTOPOINT) { 38521811Skarels if (ioctl(s, SIOCGIFDSTADDR, (caddr_t)&ifr) < 0) { 38621811Skarels if (errno == EADDRNOTAVAIL) 38721811Skarels bzero((char *)&ifr.ifr_addr, sizeof(ifr.ifr_addr)); 38821811Skarels else 38928468Skarels perror("ioctl (SIOCGIFDSTADDR)"); 39021811Skarels } 39122485Ssklower strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); 39217218Stef sin = (struct sockaddr_in *)&ifr.ifr_dstaddr; 39317218Stef printf("--> %s ", inet_ntoa(sin->sin_addr)); 39417218Stef } 39521811Skarels printf("netmask %x ", ntohl(netmask.sin_addr.s_addr)); 39621811Skarels if (flags & IFF_BROADCAST) { 39721811Skarels if (ioctl(s, SIOCGIFBRDADDR, (caddr_t)&ifr) < 0) { 39821811Skarels if (errno == EADDRNOTAVAIL) 39928468Skarels bzero((char *)&ifr.ifr_addr, sizeof(ifr.ifr_addr)); 40028468Skarels else 40128468Skarels perror("ioctl (SIOCGIFADDR)"); 40221811Skarels } 40322485Ssklower strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); 40421811Skarels sin = (struct sockaddr_in *)&ifr.ifr_addr; 40528468Skarels if (sin->sin_addr.s_addr != 0) 40628468Skarels printf("broadcast %s", inet_ntoa(sin->sin_addr)); 40721811Skarels } 40826185Skarels putchar('\n'); 40914869Ssam } 41014869Ssam 41122485Ssklower 41228468Skarels xns_status(force) 41328468Skarels int force; 41422485Ssklower { 41522485Ssklower struct sockaddr_ns *sns; 41622485Ssklower 41722485Ssklower close(s); 41822485Ssklower s = socket(AF_NS, SOCK_DGRAM, 0); 41922485Ssklower if (s < 0) { 42030692Smckusick if (errno == EPROTONOSUPPORT) 42124248Ssklower return; 42222485Ssklower perror("ifconfig: socket"); 42322485Ssklower exit(1); 42422485Ssklower } 42522485Ssklower if (ioctl(s, SIOCGIFADDR, (caddr_t)&ifr) < 0) { 42628468Skarels if (errno == EADDRNOTAVAIL || errno == EAFNOSUPPORT) { 42728468Skarels if (!force) 42828468Skarels return; 42928468Skarels bzero((char *)&ifr.ifr_addr, sizeof(ifr.ifr_addr)); 43028468Skarels } else 43128468Skarels perror("ioctl (SIOCGIFADDR)"); 43222485Ssklower } 43322485Ssklower strncpy(ifr.ifr_name, name, sizeof ifr.ifr_name); 43422485Ssklower sns = (struct sockaddr_ns *)&ifr.ifr_addr; 43526185Skarels printf("\tns %s ", ns_ntoa(sns->sns_addr)); 43626101Ssklower if (flags & IFF_POINTOPOINT) { /* by W. Nesheim@Cornell */ 43726101Ssklower if (ioctl(s, SIOCGIFDSTADDR, (caddr_t)&ifr) < 0) { 43826101Ssklower if (errno == EADDRNOTAVAIL) 43926101Ssklower bzero((char *)&ifr.ifr_addr, sizeof(ifr.ifr_addr)); 44026101Ssklower else 44126101Ssklower Perror("ioctl (SIOCGIFDSTADDR)"); 44226101Ssklower } 44326101Ssklower strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); 44426101Ssklower sns = (struct sockaddr_ns *)&ifr.ifr_dstaddr; 44526101Ssklower printf("--> %s ", ns_ntoa(sns->sns_addr)); 44626101Ssklower } 44722485Ssklower putchar('\n'); 44822485Ssklower } 44922485Ssklower 45037315Ssklower iso_status(force) 45137315Ssklower int force; 45237315Ssklower { 45337315Ssklower struct sockaddr_iso *siso; 45437315Ssklower struct iso_ifreq ifr; 45537315Ssklower 45637315Ssklower close(s); 45737315Ssklower s = socket(AF_ISO, SOCK_DGRAM, 0); 45837315Ssklower if (s < 0) { 45937315Ssklower if (errno == EPROTONOSUPPORT) 46037315Ssklower return; 46137315Ssklower perror("ifconfig: socket"); 46237315Ssklower exit(1); 46337315Ssklower } 46442965Ssklower bzero((caddr_t)&ifr, sizeof(ifr)); 46542965Ssklower strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name)); 46642965Ssklower if (ioctl(s, SIOCGIFADDR_ISO, (caddr_t)&ifr) < 0) { 46737315Ssklower if (errno == EADDRNOTAVAIL || errno == EAFNOSUPPORT) { 46837315Ssklower if (!force) 46937315Ssklower return; 47037315Ssklower bzero((char *)&ifr.ifr_Addr, sizeof(ifr.ifr_Addr)); 47142965Ssklower } else { 47242965Ssklower perror("ioctl (SIOCGIFADDR_ISO)"); 47342965Ssklower exit(1); 47442965Ssklower } 47537315Ssklower } 47637315Ssklower strncpy(ifr.ifr_name, name, sizeof ifr.ifr_name); 47737315Ssklower siso = &ifr.ifr_Addr; 47842965Ssklower printf("\tiso %s ", iso_ntoa(&siso->siso_addr)); 47942965Ssklower if (ioctl(s, SIOCGIFNETMASK_ISO, (caddr_t)&ifr) < 0) { 48037315Ssklower if (errno != EADDRNOTAVAIL) 48142965Ssklower perror("ioctl (SIOCGIFNETMASK_ISO)"); 48237315Ssklower } else { 48342965Ssklower printf(" netmask %s ", iso_ntoa(&siso->siso_addr)); 48437315Ssklower } 48537315Ssklower if (flags & IFF_POINTOPOINT) { 48642965Ssklower if (ioctl(s, SIOCGIFDSTADDR_ISO, (caddr_t)&ifr) < 0) { 48737315Ssklower if (errno == EADDRNOTAVAIL) 48837315Ssklower bzero((char *)&ifr.ifr_Addr, sizeof(ifr.ifr_Addr)); 48937315Ssklower else 49042965Ssklower Perror("ioctl (SIOCGIFDSTADDR_ISO)"); 49137315Ssklower } 49237315Ssklower strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); 49337315Ssklower siso = &ifr.ifr_Addr; 49442965Ssklower printf("--> %s ", iso_ntoa(&siso->siso_addr)); 49537315Ssklower } 49637315Ssklower putchar('\n'); 49737315Ssklower } 49837315Ssklower 49914869Ssam Perror(cmd) 50014869Ssam char *cmd; 50114869Ssam { 50214869Ssam extern int errno; 50314869Ssam 50414869Ssam fprintf(stderr, "ifconfig: "); 50514869Ssam switch (errno) { 50614869Ssam 50714869Ssam case ENXIO: 50822485Ssklower fprintf(stderr, "%s: no such interface\n", cmd); 50914869Ssam break; 51014869Ssam 51114869Ssam case EPERM: 51216822Slepreau fprintf(stderr, "%s: permission denied\n", cmd); 51314869Ssam break; 51414869Ssam 51514869Ssam default: 51614869Ssam perror(cmd); 51714869Ssam } 51814869Ssam exit(1); 51914869Ssam } 52014869Ssam 52114869Ssam struct in_addr inet_makeaddr(); 52214869Ssam 52337315Ssklower #define SIN(x) ((struct sockaddr_in *) &(x)) 52437315Ssklower struct sockaddr_in *sintab[] = { 52537315Ssklower SIN(ridreq.ifr_addr), SIN(addreq.ifra_addr), 52637315Ssklower SIN(addreq.ifra_mask), SIN(addreq.ifra_broadaddr)}; 52737315Ssklower 52837315Ssklower in_getaddr(s, which) 52914869Ssam char *s; 53014869Ssam { 53137315Ssklower register struct sockaddr_in *sin = sintab[which]; 53214869Ssam struct hostent *hp; 53314869Ssam struct netent *np; 53414869Ssam int val; 53514869Ssam 53639210Ssklower sin->sin_len = sizeof(*sin); 53739210Ssklower if (which != MASK) 53837315Ssklower sin->sin_family = AF_INET; 53939210Ssklower 54039210Ssklower if ((val = inet_addr(s)) != -1) 54121811Skarels sin->sin_addr.s_addr = val; 54239210Ssklower else if (hp = gethostbyname(s)) 54314869Ssam bcopy(hp->h_addr, (char *)&sin->sin_addr, hp->h_length); 54439210Ssklower else if (np = getnetbyname(s)) 54514869Ssam sin->sin_addr = inet_makeaddr(np->n_net, INADDR_ANY); 54639210Ssklower else { 54739210Ssklower fprintf(stderr, "%s: bad value\n", s); 54839210Ssklower exit(1); 54914869Ssam } 55014869Ssam } 55114869Ssam 55214869Ssam /* 55314869Ssam * Print a value a la the %b format of the kernel's printf 55414869Ssam */ 55514869Ssam printb(s, v, bits) 55614869Ssam char *s; 55714869Ssam register char *bits; 55814869Ssam register unsigned short v; 55914869Ssam { 56014869Ssam register int i, any = 0; 56114869Ssam register char c; 56214869Ssam 56314869Ssam if (bits && *bits == 8) 56414869Ssam printf("%s=%o", s, v); 56514869Ssam else 56614869Ssam printf("%s=%x", s, v); 56714869Ssam bits++; 56814869Ssam if (bits) { 56914869Ssam putchar('<'); 57014869Ssam while (i = *bits++) { 57114869Ssam if (v & (1 << (i-1))) { 57214869Ssam if (any) 57314869Ssam putchar(','); 57414869Ssam any = 1; 57514869Ssam for (; (c = *bits) > 32; bits++) 57614869Ssam putchar(c); 57714869Ssam } else 57814869Ssam for (; *bits > 32; bits++) 57914869Ssam ; 58014869Ssam } 58114869Ssam putchar('>'); 58214869Ssam } 58314869Ssam } 58422485Ssklower 58537315Ssklower #define SNS(x) ((struct sockaddr_ns *) &(x)) 58637315Ssklower struct sockaddr_ns *snstab[] = { 58737315Ssklower SNS(ridreq.ifr_addr), SNS(addreq.ifra_addr), 58837315Ssklower SNS(addreq.ifra_mask), SNS(addreq.ifra_broadaddr)}; 58937315Ssklower 59037315Ssklower xns_getaddr(addr, which) 59122485Ssklower char *addr; 59222485Ssklower { 59337315Ssklower struct sockaddr_ns *sns = snstab[which]; 59426101Ssklower struct ns_addr ns_addr(); 59537315Ssklower 59622485Ssklower sns->sns_family = AF_NS; 59737227Ssklower sns->sns_len = sizeof(*sns); 59826101Ssklower sns->sns_addr = ns_addr(addr); 59937315Ssklower if (which == MASK) 60037315Ssklower printf("Attempt to set XNS netmask will be ineffectual\n"); 60122485Ssklower } 60237315Ssklower 60337315Ssklower #define SISO(x) ((struct sockaddr_iso *) &(x)) 60437315Ssklower struct sockaddr_iso *sisotab[] = { 60537315Ssklower SISO(iso_ridreq.ifr_Addr), SISO(iso_addreq.ifra_addr), 60637315Ssklower SISO(iso_addreq.ifra_mask), SISO(iso_addreq.ifra_dstaddr)}; 60737315Ssklower 60837315Ssklower iso_getaddr(addr, which) 60937315Ssklower char *addr; 61037315Ssklower { 61143089Ssklower register struct sockaddr_iso *siso = sisotab[which]; 61237315Ssklower struct iso_addr *iso_addr(); 61337315Ssklower siso->siso_addr = *iso_addr(addr); 61443089Ssklower 61537315Ssklower if (which == MASK) { 61639210Ssklower siso->siso_len = TSEL(siso) - (caddr_t)(siso); 61737315Ssklower siso->siso_nlen = 0; 61837315Ssklower } else { 61943089Ssklower siso->siso_len = sizeof(*siso); 62043089Ssklower siso->siso_family = AF_ISO; 62137315Ssklower } 62237315Ssklower } 62342965Ssklower 62442965Ssklower setnsellength(val) 62542965Ssklower char *val; 62642965Ssklower { 62743089Ssklower nsellength = atoi(val); 62843089Ssklower if (nsellength < 0) { 62943089Ssklower fprintf(stderr, "Negative NSEL length is absurd\n"); 63043089Ssklower exit (1); 63143089Ssklower } 63242965Ssklower if (afp == 0 || afp->af_af != AF_ISO) { 63342965Ssklower fprintf(stderr, "Setting NSEL length valid only for iso\n"); 63442965Ssklower exit (1); 63542965Ssklower } 63642965Ssklower } 63743089Ssklower 63843089Ssklower fixnsel(s) 63943089Ssklower register struct sockaddr_iso *s; 64043089Ssklower { 64143089Ssklower if (s->siso_family == 0) 64243089Ssklower return; 64343089Ssklower s->siso_tlen = nsellength; 64443089Ssklower } 64543089Ssklower 64643089Ssklower adjust_nsellength() 64743089Ssklower { 64843089Ssklower fixnsel(sisotab[RIDADDR]); 64943089Ssklower fixnsel(sisotab[ADDR]); 65043089Ssklower fixnsel(sisotab[DSTADDR]); 65143089Ssklower } 652