121811Skarels /* 221811Skarels * Copyright (c) 1983 Regents of the University of California. 334941Sbostic * All rights reserved. 434941Sbostic * 542702Sbostic * %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*46782Sbostic static char sccsid[] = "@(#)ifconfig.c 5.1 (Berkeley) 02/28/91"; 1634941Sbostic #endif /* not lint */ 1721811Skarels 18*46782Sbostic #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> 24*46782Sbostic #include <arpa/inet.h> 2514869Ssam 2622485Ssklower #define NSIP 2722485Ssklower #include <netns/ns.h> 2822485Ssklower #include <netns/ns_if.h> 29*46782Sbostic #include <netdb.h> 3022485Ssklower 3137479Ssklower #define EON 3237315Ssklower #include <netiso/iso.h> 3337315Ssklower #include <netiso/iso_var.h> 3437479Ssklower #include <sys/protosw.h> 3537315Ssklower 36*46782Sbostic #include <unistd.h> 3714869Ssam #include <stdio.h> 3814869Ssam #include <errno.h> 3914869Ssam #include <ctype.h> 40*46782Sbostic #include <stdlib.h> 41*46782Sbostic #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 }, 9414869Ssam { 0, 0, setifaddr }, 9517218Stef { 0, 0, setifdstaddr }, 9614869Ssam }; 9714869Ssam 9822485Ssklower /* 9922485Ssklower * XNS support liberally adapted from 10022485Ssklower * code written at the University of Maryland 10122485Ssklower * principally by James O'Toole and Chris Torek. 10222485Ssklower */ 10322485Ssklower int in_status(), in_getaddr(); 10422485Ssklower int xns_status(), xns_getaddr(); 10537315Ssklower int iso_status(), iso_getaddr(); 10622485Ssklower 10722485Ssklower /* Known address families */ 10822485Ssklower struct afswtch { 10922485Ssklower char *af_name; 11022485Ssklower short af_af; 11122485Ssklower int (*af_status)(); 11222485Ssklower int (*af_getaddr)(); 11337315Ssklower int af_difaddr; 11437315Ssklower int af_aifaddr; 11537315Ssklower caddr_t af_ridreq; 11637315Ssklower caddr_t af_addreq; 11722485Ssklower } afs[] = { 11837315Ssklower #define C(x) ((caddr_t) &x) 11937315Ssklower { "inet", AF_INET, in_status, in_getaddr, 12037315Ssklower SIOCDIFADDR, SIOCAIFADDR, C(ridreq), C(addreq) }, 12137315Ssklower { "ns", AF_NS, xns_status, xns_getaddr, 12237315Ssklower SIOCDIFADDR, SIOCAIFADDR, C(ridreq), C(addreq) }, 12337315Ssklower { "iso", AF_ISO, iso_status, iso_getaddr, 12437315Ssklower SIOCDIFADDR_ISO, SIOCAIFADDR_ISO, C(iso_ridreq), C(iso_addreq) }, 12537315Ssklower { 0, 0, 0, 0 } 12622485Ssklower }; 12722485Ssklower 12822485Ssklower struct afswtch *afp; /*the address family being set or asked about*/ 12922485Ssklower 13014869Ssam main(argc, argv) 13114869Ssam int argc; 13214869Ssam char *argv[]; 13314869Ssam { 13422485Ssklower int af = AF_INET; 13537315Ssklower register struct afswtch *rafp; 13627061Skarels 13714869Ssam if (argc < 2) { 13830789Sbostic fprintf(stderr, "usage: ifconfig interface\n%s%s%s%s%s", 13926185Skarels "\t[ af [ address [ dest_addr ] ] [ up ] [ down ]", 14026185Skarels "[ netmask mask ] ]\n", 14126185Skarels "\t[ metric n ]\n", 14226185Skarels "\t[ trailers | -trailers ]\n", 14326185Skarels "\t[ arp | -arp ]\n"); 14414869Ssam exit(1); 14514869Ssam } 14622485Ssklower argc--, argv++; 14724248Ssklower strncpy(name, *argv, sizeof(name)); 14822485Ssklower strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name)); 14922485Ssklower argc--, argv++; 15022485Ssklower if (argc > 0) { 15137315Ssklower for (afp = rafp = afs; rafp->af_name; rafp++) 15237315Ssklower if (strcmp(rafp->af_name, *argv) == 0) { 15337315Ssklower afp = rafp; argc--; argv++; 15422485Ssklower break; 15522485Ssklower } 15637315Ssklower rafp = afp; 15737315Ssklower af = ifr.ifr_addr.sa_family = rafp->af_af; 15822485Ssklower } 15922485Ssklower s = socket(af, SOCK_DGRAM, 0); 16014869Ssam if (s < 0) { 16114869Ssam perror("ifconfig: socket"); 16214869Ssam exit(1); 16314869Ssam } 16414869Ssam if (ioctl(s, SIOCGIFFLAGS, (caddr_t)&ifr) < 0) { 16514869Ssam Perror("ioctl (SIOCGIFFLAGS)"); 16614869Ssam exit(1); 16714869Ssam } 16822485Ssklower strncpy(ifr.ifr_name, name, sizeof ifr.ifr_name); 16921811Skarels flags = ifr.ifr_flags; 17026185Skarels if (ioctl(s, SIOCGIFMETRIC, (caddr_t)&ifr) < 0) 17126185Skarels perror("ioctl (SIOCGIFMETRIC)"); 17226185Skarels else 17326185Skarels metric = ifr.ifr_metric; 17414869Ssam if (argc == 0) { 17514869Ssam status(); 17614869Ssam exit(0); 17714869Ssam } 17814869Ssam while (argc > 0) { 17914869Ssam register struct cmd *p; 18014869Ssam 18114869Ssam for (p = cmds; p->c_name; p++) 18214869Ssam if (strcmp(*argv, p->c_name) == 0) 18314869Ssam break; 18417218Stef if (p->c_name == 0 && setaddr) 18517218Stef p++; /* got src, do dst */ 18621811Skarels if (p->c_func) { 18721811Skarels if (p->c_parameter == NEXTARG) { 18821811Skarels (*p->c_func)(argv[1]); 18921811Skarels argc--, argv++; 19021811Skarels } else 19121811Skarels (*p->c_func)(*argv, p->c_parameter); 19221811Skarels } 19314869Ssam argc--, argv++; 19414869Ssam } 19543089Ssklower if (af == AF_ISO) 19643089Ssklower adjust_nsellength(); 19737479Ssklower if (setipdst && af==AF_NS) { 19837479Ssklower struct nsip_req rq; 19937479Ssklower int size = sizeof(rq); 20037479Ssklower 20137479Ssklower rq.rq_ns = addreq.ifra_addr; 20237479Ssklower rq.rq_ip = addreq.ifra_dstaddr; 20337479Ssklower 20437479Ssklower if (setsockopt(s, 0, SO_NSIP_ROUTE, &rq, size) < 0) 20537479Ssklower Perror("Encapsulation Routing"); 20637479Ssklower } 20737315Ssklower if (clearaddr) { 20837315Ssklower int ret; 20937315Ssklower strncpy(rafp->af_ridreq, name, sizeof ifr.ifr_name); 21037315Ssklower if ((ret = ioctl(s, rafp->af_difaddr, rafp->af_ridreq)) < 0) { 21137315Ssklower if (errno == EADDRNOTAVAIL && (doalias >= 0)) { 21237315Ssklower /* means no previous address for interface */ 21337315Ssklower } else 21437315Ssklower Perror("ioctl (SIOCDIFADDR)"); 21537315Ssklower } 21621811Skarels } 21737315Ssklower if (newaddr) { 21837315Ssklower strncpy(rafp->af_addreq, name, sizeof ifr.ifr_name); 21937315Ssklower if (ioctl(s, rafp->af_aifaddr, rafp->af_addreq) < 0) 22037315Ssklower Perror("ioctl (SIOCAIFADDR)"); 22116329Skarels } 22214869Ssam exit(0); 22314869Ssam } 22437315Ssklower #define RIDADDR 0 22537315Ssklower #define ADDR 1 22637315Ssklower #define MASK 2 22737315Ssklower #define DSTADDR 3 22814869Ssam 22914869Ssam /*ARGSUSED*/ 23014869Ssam setifaddr(addr, param) 23114869Ssam char *addr; 23222485Ssklower short param; 23314869Ssam { 23416329Skarels /* 23516329Skarels * Delay the ioctl to set the interface addr until flags are all set. 23616329Skarels * The address interpretation may depend on the flags, 23716329Skarels * and the flags may change when the address is set. 23815390Skarels */ 23916329Skarels setaddr++; 24040830Ssklower if (doalias == 0) 24137479Ssklower clearaddr = 1; 24237315Ssklower (*afp->af_getaddr)(addr, (doalias >= 0 ? ADDR : RIDADDR)); 24314869Ssam } 24414869Ssam 24521811Skarels setifnetmask(addr) 24621811Skarels char *addr; 24721811Skarels { 24837315Ssklower (*afp->af_getaddr)(addr, MASK); 24921811Skarels } 25021811Skarels 25121811Skarels setifbroadaddr(addr) 25221811Skarels char *addr; 25321811Skarels { 25437315Ssklower (*afp->af_getaddr)(addr, DSTADDR); 25521811Skarels } 25621811Skarels 25722485Ssklower setifipdst(addr) 25822485Ssklower char *addr; 25922485Ssklower { 26037315Ssklower in_getaddr(addr, DSTADDR); 26122485Ssklower setipdst++; 26237479Ssklower clearaddr = 0; 26337479Ssklower newaddr = 0; 26422485Ssklower } 26537479Ssklower #define rqtosa(x) (&(((struct ifreq *)(afp->x))->ifr_addr)) 26617218Stef /*ARGSUSED*/ 26737315Ssklower notealias(addr, param) 26837315Ssklower char *addr; 26937315Ssklower { 27037479Ssklower if (setaddr && doalias == 0 && param < 0) 27137479Ssklower bcopy((caddr_t)rqtosa(af_addreq), 27237479Ssklower (caddr_t)rqtosa(af_ridreq), 27337479Ssklower rqtosa(af_addreq)->sa_len); 27437315Ssklower doalias = param; 27537479Ssklower if (param < 0) { 27637479Ssklower clearaddr = 1; 27737479Ssklower newaddr = 0; 27837479Ssklower } else 27937315Ssklower clearaddr = 0; 28037315Ssklower } 28137315Ssklower 28237315Ssklower /*ARGSUSED*/ 28317218Stef setifdstaddr(addr, param) 28417218Stef char *addr; 28517218Stef int param; 28617218Stef { 28737315Ssklower (*afp->af_getaddr)(addr, DSTADDR); 28817218Stef } 28917218Stef 29014870Ssam setifflags(vname, value) 29114870Ssam char *vname; 29222485Ssklower short value; 29314869Ssam { 29422485Ssklower if (ioctl(s, SIOCGIFFLAGS, (caddr_t)&ifr) < 0) { 29522485Ssklower Perror("ioctl (SIOCGIFFLAGS)"); 29622485Ssklower exit(1); 29722485Ssklower } 29822485Ssklower strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); 29922485Ssklower flags = ifr.ifr_flags; 30014869Ssam 30114869Ssam if (value < 0) { 30214869Ssam value = -value; 30321811Skarels flags &= ~value; 30414869Ssam } else 30521811Skarels flags |= value; 30621811Skarels ifr.ifr_flags = flags; 30714869Ssam if (ioctl(s, SIOCSIFFLAGS, (caddr_t)&ifr) < 0) 30814870Ssam Perror(vname); 30914869Ssam } 31014869Ssam 31126185Skarels setifmetric(val) 31226185Skarels char *val; 31326185Skarels { 31426185Skarels strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); 31526185Skarels ifr.ifr_metric = atoi(val); 31626185Skarels if (ioctl(s, SIOCSIFMETRIC, (caddr_t)&ifr) < 0) 31726185Skarels perror("ioctl (set metric)"); 31826185Skarels } 31926185Skarels 32037315Ssklower setsnpaoffset(val) 32137315Ssklower char *val; 32237315Ssklower { 32337315Ssklower iso_addreq.ifra_snpaoffset = atoi(val); 32437315Ssklower } 32537315Ssklower 32626185Skarels #define IFFBITS \ 32726185Skarels "\020\1UP\2BROADCAST\3DEBUG\4LOOPBACK\5POINTOPOINT\6NOTRAILERS\7RUNNING\10NOARP\ 32826185Skarels " 32926185Skarels 33022485Ssklower /* 33122485Ssklower * Print the status of the interface. If an address family was 33222485Ssklower * specified, show it and it only; otherwise, show them all. 33322485Ssklower */ 33414869Ssam status() 33514869Ssam { 33622485Ssklower register struct afswtch *p = afp; 33722485Ssklower short af = ifr.ifr_addr.sa_family; 33822485Ssklower 33926185Skarels printf("%s: ", name); 34026185Skarels printb("flags", flags, IFFBITS); 34126185Skarels if (metric) 34226185Skarels printf(" metric %d", metric); 34326185Skarels putchar('\n'); 34422485Ssklower if ((p = afp) != NULL) { 34528468Skarels (*p->af_status)(1); 34628468Skarels } else for (p = afs; p->af_name; p++) { 34722485Ssklower ifr.ifr_addr.sa_family = p->af_af; 34828468Skarels (*p->af_status)(0); 34922485Ssklower } 35022485Ssklower } 35122485Ssklower 35228468Skarels in_status(force) 35328468Skarels int force; 35422485Ssklower { 35514869Ssam struct sockaddr_in *sin; 35622485Ssklower char *inet_ntoa(); 35714869Ssam 35827061Skarels strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); 35921811Skarels if (ioctl(s, SIOCGIFADDR, (caddr_t)&ifr) < 0) { 36028468Skarels if (errno == EADDRNOTAVAIL || errno == EAFNOSUPPORT) { 36128468Skarels if (!force) 36228468Skarels return; 36321811Skarels bzero((char *)&ifr.ifr_addr, sizeof(ifr.ifr_addr)); 36428468Skarels } else 36528468Skarels perror("ioctl (SIOCGIFADDR)"); 36621811Skarels } 36714869Ssam sin = (struct sockaddr_in *)&ifr.ifr_addr; 36826429Skarels printf("\tinet %s ", inet_ntoa(sin->sin_addr)); 36928468Skarels strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); 37028468Skarels if (ioctl(s, SIOCGIFNETMASK, (caddr_t)&ifr) < 0) { 37128468Skarels if (errno != EADDRNOTAVAIL) 37228468Skarels perror("ioctl (SIOCGIFNETMASK)"); 37328468Skarels bzero((char *)&ifr.ifr_addr, sizeof(ifr.ifr_addr)); 37428468Skarels } else 37528468Skarels netmask.sin_addr = 37628468Skarels ((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr; 37717218Stef if (flags & IFF_POINTOPOINT) { 37821811Skarels if (ioctl(s, SIOCGIFDSTADDR, (caddr_t)&ifr) < 0) { 37921811Skarels if (errno == EADDRNOTAVAIL) 38021811Skarels bzero((char *)&ifr.ifr_addr, sizeof(ifr.ifr_addr)); 38121811Skarels else 38228468Skarels perror("ioctl (SIOCGIFDSTADDR)"); 38321811Skarels } 38422485Ssklower strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); 38517218Stef sin = (struct sockaddr_in *)&ifr.ifr_dstaddr; 38617218Stef printf("--> %s ", inet_ntoa(sin->sin_addr)); 38717218Stef } 38821811Skarels printf("netmask %x ", ntohl(netmask.sin_addr.s_addr)); 38921811Skarels if (flags & IFF_BROADCAST) { 39021811Skarels if (ioctl(s, SIOCGIFBRDADDR, (caddr_t)&ifr) < 0) { 39121811Skarels if (errno == EADDRNOTAVAIL) 39228468Skarels bzero((char *)&ifr.ifr_addr, sizeof(ifr.ifr_addr)); 39328468Skarels else 39428468Skarels perror("ioctl (SIOCGIFADDR)"); 39521811Skarels } 39622485Ssklower strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); 39721811Skarels sin = (struct sockaddr_in *)&ifr.ifr_addr; 39828468Skarels if (sin->sin_addr.s_addr != 0) 39928468Skarels printf("broadcast %s", inet_ntoa(sin->sin_addr)); 40021811Skarels } 40126185Skarels putchar('\n'); 40214869Ssam } 40314869Ssam 40422485Ssklower 40528468Skarels xns_status(force) 40628468Skarels int force; 40722485Ssklower { 40822485Ssklower struct sockaddr_ns *sns; 40922485Ssklower 41022485Ssklower close(s); 41122485Ssklower s = socket(AF_NS, SOCK_DGRAM, 0); 41222485Ssklower if (s < 0) { 41330692Smckusick if (errno == EPROTONOSUPPORT) 41424248Ssklower return; 41522485Ssklower perror("ifconfig: socket"); 41622485Ssklower exit(1); 41722485Ssklower } 41822485Ssklower if (ioctl(s, SIOCGIFADDR, (caddr_t)&ifr) < 0) { 41928468Skarels if (errno == EADDRNOTAVAIL || errno == EAFNOSUPPORT) { 42028468Skarels if (!force) 42128468Skarels return; 42228468Skarels bzero((char *)&ifr.ifr_addr, sizeof(ifr.ifr_addr)); 42328468Skarels } else 42428468Skarels perror("ioctl (SIOCGIFADDR)"); 42522485Ssklower } 42622485Ssklower strncpy(ifr.ifr_name, name, sizeof ifr.ifr_name); 42722485Ssklower sns = (struct sockaddr_ns *)&ifr.ifr_addr; 42826185Skarels printf("\tns %s ", ns_ntoa(sns->sns_addr)); 42926101Ssklower if (flags & IFF_POINTOPOINT) { /* by W. Nesheim@Cornell */ 43026101Ssklower if (ioctl(s, SIOCGIFDSTADDR, (caddr_t)&ifr) < 0) { 43126101Ssklower if (errno == EADDRNOTAVAIL) 43226101Ssklower bzero((char *)&ifr.ifr_addr, sizeof(ifr.ifr_addr)); 43326101Ssklower else 43426101Ssklower Perror("ioctl (SIOCGIFDSTADDR)"); 43526101Ssklower } 43626101Ssklower strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); 43726101Ssklower sns = (struct sockaddr_ns *)&ifr.ifr_dstaddr; 43826101Ssklower printf("--> %s ", ns_ntoa(sns->sns_addr)); 43926101Ssklower } 44022485Ssklower putchar('\n'); 44122485Ssklower } 44222485Ssklower 44337315Ssklower iso_status(force) 44437315Ssklower int force; 44537315Ssklower { 44637315Ssklower struct sockaddr_iso *siso; 44737315Ssklower struct iso_ifreq ifr; 44837315Ssklower 44937315Ssklower close(s); 45037315Ssklower s = socket(AF_ISO, SOCK_DGRAM, 0); 45137315Ssklower if (s < 0) { 45237315Ssklower if (errno == EPROTONOSUPPORT) 45337315Ssklower return; 45437315Ssklower perror("ifconfig: socket"); 45537315Ssklower exit(1); 45637315Ssklower } 45742965Ssklower bzero((caddr_t)&ifr, sizeof(ifr)); 45842965Ssklower strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name)); 45942965Ssklower if (ioctl(s, SIOCGIFADDR_ISO, (caddr_t)&ifr) < 0) { 46037315Ssklower if (errno == EADDRNOTAVAIL || errno == EAFNOSUPPORT) { 46137315Ssklower if (!force) 46237315Ssklower return; 46337315Ssklower bzero((char *)&ifr.ifr_Addr, sizeof(ifr.ifr_Addr)); 46442965Ssklower } else { 46542965Ssklower perror("ioctl (SIOCGIFADDR_ISO)"); 46642965Ssklower exit(1); 46742965Ssklower } 46837315Ssklower } 46937315Ssklower strncpy(ifr.ifr_name, name, sizeof ifr.ifr_name); 47037315Ssklower siso = &ifr.ifr_Addr; 47142965Ssklower printf("\tiso %s ", iso_ntoa(&siso->siso_addr)); 47242965Ssklower if (ioctl(s, SIOCGIFNETMASK_ISO, (caddr_t)&ifr) < 0) { 47337315Ssklower if (errno != EADDRNOTAVAIL) 47442965Ssklower perror("ioctl (SIOCGIFNETMASK_ISO)"); 47537315Ssklower } else { 47642965Ssklower printf(" netmask %s ", iso_ntoa(&siso->siso_addr)); 47737315Ssklower } 47837315Ssklower if (flags & IFF_POINTOPOINT) { 47942965Ssklower if (ioctl(s, SIOCGIFDSTADDR_ISO, (caddr_t)&ifr) < 0) { 48037315Ssklower if (errno == EADDRNOTAVAIL) 48137315Ssklower bzero((char *)&ifr.ifr_Addr, sizeof(ifr.ifr_Addr)); 48237315Ssklower else 48342965Ssklower Perror("ioctl (SIOCGIFDSTADDR_ISO)"); 48437315Ssklower } 48537315Ssklower strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); 48637315Ssklower siso = &ifr.ifr_Addr; 48742965Ssklower 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 { 60443089Ssklower register struct sockaddr_iso *siso = sisotab[which]; 60537315Ssklower struct iso_addr *iso_addr(); 60637315Ssklower siso->siso_addr = *iso_addr(addr); 60743089Ssklower 60837315Ssklower if (which == MASK) { 60939210Ssklower siso->siso_len = TSEL(siso) - (caddr_t)(siso); 61037315Ssklower siso->siso_nlen = 0; 61137315Ssklower } else { 61243089Ssklower siso->siso_len = sizeof(*siso); 61343089Ssklower siso->siso_family = AF_ISO; 61437315Ssklower } 61537315Ssklower } 61642965Ssklower 61742965Ssklower setnsellength(val) 61842965Ssklower char *val; 61942965Ssklower { 62043089Ssklower nsellength = atoi(val); 62143089Ssklower if (nsellength < 0) { 62243089Ssklower fprintf(stderr, "Negative NSEL length is absurd\n"); 62343089Ssklower exit (1); 62443089Ssklower } 62542965Ssklower if (afp == 0 || afp->af_af != AF_ISO) { 62642965Ssklower fprintf(stderr, "Setting NSEL length valid only for iso\n"); 62742965Ssklower exit (1); 62842965Ssklower } 62942965Ssklower } 63043089Ssklower 63143089Ssklower fixnsel(s) 63243089Ssklower register struct sockaddr_iso *s; 63343089Ssklower { 63443089Ssklower if (s->siso_family == 0) 63543089Ssklower return; 63643089Ssklower s->siso_tlen = nsellength; 63743089Ssklower } 63843089Ssklower 63943089Ssklower adjust_nsellength() 64043089Ssklower { 64143089Ssklower fixnsel(sisotab[RIDADDR]); 64243089Ssklower fixnsel(sisotab[ADDR]); 64343089Ssklower fixnsel(sisotab[DSTADDR]); 64443089Ssklower } 645