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*43089Ssklower static char sccsid[] = "@(#)ifconfig.c 4.29 (Berkeley) 06/12/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; 43*43089Ssklower struct iso_aliasreq iso_addreq; 4437315Ssklower struct sockaddr_in netmask; 4537315Ssklower 4614869Ssam char name[30]; 4721811Skarels int flags; 4826185Skarels int metric; 49*43089Ssklower int nsellength = 1; 5016329Skarels int setaddr; 5122485Ssklower int setipdst; 5237315Ssklower int doalias; 5337479Ssklower int clearaddr; 5437315Ssklower int newaddr = 1; 5514869Ssam int s; 5621811Skarels extern int errno; 5714869Ssam 5821811Skarels int setifflags(), setifaddr(), setifdstaddr(), setifnetmask(); 5926185Skarels int setifmetric(), setifbroadaddr(), setifipdst(); 6042965Ssklower int notealias(), setsnpaoffset(), setnsellength(); 6114869Ssam 6221811Skarels #define NEXTARG 0xffffff 6321811Skarels 6414869Ssam struct cmd { 6514869Ssam char *c_name; 6621811Skarels int c_parameter; /* NEXTARG means next argv */ 6714869Ssam int (*c_func)(); 6814869Ssam } cmds[] = { 6914869Ssam { "up", IFF_UP, setifflags } , 7014869Ssam { "down", -IFF_UP, setifflags }, 7114869Ssam { "trailers", -IFF_NOTRAILERS,setifflags }, 7214869Ssam { "-trailers", IFF_NOTRAILERS, setifflags }, 7315359Skarels { "arp", -IFF_NOARP, setifflags }, 7415359Skarels { "-arp", IFF_NOARP, setifflags }, 7515286Sleres { "debug", IFF_DEBUG, setifflags }, 7615286Sleres { "-debug", -IFF_DEBUG, setifflags }, 7737315Ssklower { "alias", IFF_UP, notealias }, 7837315Ssklower { "-alias", -IFF_UP, notealias }, 7937315Ssklower { "delete", -IFF_UP, notealias }, 8015004Ssam #ifdef notdef 8121811Skarels #define EN_SWABIPS 0x1000 8215004Ssam { "swabips", EN_SWABIPS, setifflags }, 8315004Ssam { "-swabips", -EN_SWABIPS, setifflags }, 8415004Ssam #endif 8521811Skarels { "netmask", NEXTARG, setifnetmask }, 8626185Skarels { "metric", NEXTARG, setifmetric }, 8721811Skarels { "broadcast", NEXTARG, setifbroadaddr }, 8822485Ssklower { "ipdst", NEXTARG, setifipdst }, 8942965Ssklower { "snpaoffset", NEXTARG, setsnpaoffset }, 9042965Ssklower { "nsellength", NEXTARG, setnsellength }, 9114869Ssam { 0, 0, setifaddr }, 9217218Stef { 0, 0, setifdstaddr }, 9314869Ssam }; 9414869Ssam 9522485Ssklower /* 9622485Ssklower * XNS support liberally adapted from 9722485Ssklower * code written at the University of Maryland 9822485Ssklower * principally by James O'Toole and Chris Torek. 9922485Ssklower */ 10022485Ssklower int in_status(), in_getaddr(); 10122485Ssklower int xns_status(), xns_getaddr(); 10237315Ssklower int iso_status(), iso_getaddr(); 10322485Ssklower 10422485Ssklower /* Known address families */ 10522485Ssklower struct afswtch { 10622485Ssklower char *af_name; 10722485Ssklower short af_af; 10822485Ssklower int (*af_status)(); 10922485Ssklower int (*af_getaddr)(); 11037315Ssklower int af_difaddr; 11137315Ssklower int af_aifaddr; 11237315Ssklower caddr_t af_ridreq; 11337315Ssklower caddr_t af_addreq; 11422485Ssklower } afs[] = { 11537315Ssklower #define C(x) ((caddr_t) &x) 11637315Ssklower { "inet", AF_INET, in_status, in_getaddr, 11737315Ssklower SIOCDIFADDR, SIOCAIFADDR, C(ridreq), C(addreq) }, 11837315Ssklower { "ns", AF_NS, xns_status, xns_getaddr, 11937315Ssklower SIOCDIFADDR, SIOCAIFADDR, C(ridreq), C(addreq) }, 12037315Ssklower { "iso", AF_ISO, iso_status, iso_getaddr, 12137315Ssklower SIOCDIFADDR_ISO, SIOCAIFADDR_ISO, C(iso_ridreq), C(iso_addreq) }, 12237315Ssklower { 0, 0, 0, 0 } 12322485Ssklower }; 12422485Ssklower 12522485Ssklower struct afswtch *afp; /*the address family being set or asked about*/ 12622485Ssklower 12714869Ssam main(argc, argv) 12814869Ssam int argc; 12914869Ssam char *argv[]; 13014869Ssam { 13122485Ssklower int af = AF_INET; 13237315Ssklower register struct afswtch *rafp; 13327061Skarels 13414869Ssam if (argc < 2) { 13530789Sbostic fprintf(stderr, "usage: ifconfig interface\n%s%s%s%s%s", 13626185Skarels "\t[ af [ address [ dest_addr ] ] [ up ] [ down ]", 13726185Skarels "[ netmask mask ] ]\n", 13826185Skarels "\t[ metric n ]\n", 13926185Skarels "\t[ trailers | -trailers ]\n", 14026185Skarels "\t[ arp | -arp ]\n"); 14114869Ssam exit(1); 14214869Ssam } 14322485Ssklower argc--, argv++; 14424248Ssklower strncpy(name, *argv, sizeof(name)); 14522485Ssklower strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name)); 14622485Ssklower argc--, argv++; 14722485Ssklower if (argc > 0) { 14837315Ssklower for (afp = rafp = afs; rafp->af_name; rafp++) 14937315Ssklower if (strcmp(rafp->af_name, *argv) == 0) { 15037315Ssklower afp = rafp; argc--; argv++; 15122485Ssklower break; 15222485Ssklower } 15337315Ssklower rafp = afp; 15437315Ssklower af = ifr.ifr_addr.sa_family = rafp->af_af; 15522485Ssklower } 15622485Ssklower s = socket(af, SOCK_DGRAM, 0); 15714869Ssam if (s < 0) { 15814869Ssam perror("ifconfig: socket"); 15914869Ssam exit(1); 16014869Ssam } 16114869Ssam if (ioctl(s, SIOCGIFFLAGS, (caddr_t)&ifr) < 0) { 16214869Ssam Perror("ioctl (SIOCGIFFLAGS)"); 16314869Ssam exit(1); 16414869Ssam } 16522485Ssklower strncpy(ifr.ifr_name, name, sizeof ifr.ifr_name); 16621811Skarels flags = ifr.ifr_flags; 16726185Skarels if (ioctl(s, SIOCGIFMETRIC, (caddr_t)&ifr) < 0) 16826185Skarels perror("ioctl (SIOCGIFMETRIC)"); 16926185Skarels else 17026185Skarels metric = ifr.ifr_metric; 17114869Ssam if (argc == 0) { 17214869Ssam status(); 17314869Ssam exit(0); 17414869Ssam } 17514869Ssam while (argc > 0) { 17614869Ssam register struct cmd *p; 17714869Ssam 17814869Ssam for (p = cmds; p->c_name; p++) 17914869Ssam if (strcmp(*argv, p->c_name) == 0) 18014869Ssam break; 18117218Stef if (p->c_name == 0 && setaddr) 18217218Stef p++; /* got src, do dst */ 18321811Skarels if (p->c_func) { 18421811Skarels if (p->c_parameter == NEXTARG) { 18521811Skarels (*p->c_func)(argv[1]); 18621811Skarels argc--, argv++; 18721811Skarels } else 18821811Skarels (*p->c_func)(*argv, p->c_parameter); 18921811Skarels } 19014869Ssam argc--, argv++; 19114869Ssam } 192*43089Ssklower if (af == AF_ISO) 193*43089Ssklower adjust_nsellength(); 19437479Ssklower if (setipdst && af==AF_NS) { 19537479Ssklower struct nsip_req rq; 19637479Ssklower int size = sizeof(rq); 19737479Ssklower 19837479Ssklower rq.rq_ns = addreq.ifra_addr; 19937479Ssklower rq.rq_ip = addreq.ifra_dstaddr; 20037479Ssklower 20137479Ssklower if (setsockopt(s, 0, SO_NSIP_ROUTE, &rq, size) < 0) 20237479Ssklower Perror("Encapsulation Routing"); 20337479Ssklower } 20437315Ssklower if (clearaddr) { 20537315Ssklower int ret; 20637315Ssklower strncpy(rafp->af_ridreq, name, sizeof ifr.ifr_name); 20737315Ssklower if ((ret = ioctl(s, rafp->af_difaddr, rafp->af_ridreq)) < 0) { 20837315Ssklower if (errno == EADDRNOTAVAIL && (doalias >= 0)) { 20937315Ssklower /* means no previous address for interface */ 21037315Ssklower } else 21137315Ssklower Perror("ioctl (SIOCDIFADDR)"); 21237315Ssklower } 21321811Skarels } 21437315Ssklower if (newaddr) { 21537315Ssklower strncpy(rafp->af_addreq, name, sizeof ifr.ifr_name); 21637315Ssklower if (ioctl(s, rafp->af_aifaddr, rafp->af_addreq) < 0) 21737315Ssklower Perror("ioctl (SIOCAIFADDR)"); 21816329Skarels } 21914869Ssam exit(0); 22014869Ssam } 22137315Ssklower #define RIDADDR 0 22237315Ssklower #define ADDR 1 22337315Ssklower #define MASK 2 22437315Ssklower #define DSTADDR 3 22514869Ssam 22614869Ssam /*ARGSUSED*/ 22714869Ssam setifaddr(addr, param) 22814869Ssam char *addr; 22922485Ssklower short param; 23014869Ssam { 23116329Skarels /* 23216329Skarels * Delay the ioctl to set the interface addr until flags are all set. 23316329Skarels * The address interpretation may depend on the flags, 23416329Skarels * and the flags may change when the address is set. 23515390Skarels */ 23616329Skarels setaddr++; 23740830Ssklower if (doalias == 0) 23837479Ssklower clearaddr = 1; 23937315Ssklower (*afp->af_getaddr)(addr, (doalias >= 0 ? ADDR : RIDADDR)); 24014869Ssam } 24114869Ssam 24221811Skarels setifnetmask(addr) 24321811Skarels char *addr; 24421811Skarels { 24537315Ssklower (*afp->af_getaddr)(addr, MASK); 24621811Skarels } 24721811Skarels 24821811Skarels setifbroadaddr(addr) 24921811Skarels char *addr; 25021811Skarels { 25137315Ssklower (*afp->af_getaddr)(addr, DSTADDR); 25221811Skarels } 25321811Skarels 25422485Ssklower setifipdst(addr) 25522485Ssklower char *addr; 25622485Ssklower { 25737315Ssklower in_getaddr(addr, DSTADDR); 25822485Ssklower setipdst++; 25937479Ssklower clearaddr = 0; 26037479Ssklower newaddr = 0; 26122485Ssklower } 26237479Ssklower #define rqtosa(x) (&(((struct ifreq *)(afp->x))->ifr_addr)) 26317218Stef /*ARGSUSED*/ 26437315Ssklower notealias(addr, param) 26537315Ssklower char *addr; 26637315Ssklower { 26737479Ssklower if (setaddr && doalias == 0 && param < 0) 26837479Ssklower bcopy((caddr_t)rqtosa(af_addreq), 26937479Ssklower (caddr_t)rqtosa(af_ridreq), 27037479Ssklower rqtosa(af_addreq)->sa_len); 27137315Ssklower doalias = param; 27237479Ssklower if (param < 0) { 27337479Ssklower clearaddr = 1; 27437479Ssklower newaddr = 0; 27537479Ssklower } else 27637315Ssklower clearaddr = 0; 27737315Ssklower } 27837315Ssklower 27937315Ssklower /*ARGSUSED*/ 28017218Stef setifdstaddr(addr, param) 28117218Stef char *addr; 28217218Stef int param; 28317218Stef { 28437315Ssklower (*afp->af_getaddr)(addr, DSTADDR); 28517218Stef } 28617218Stef 28714870Ssam setifflags(vname, value) 28814870Ssam char *vname; 28922485Ssklower short value; 29014869Ssam { 29122485Ssklower if (ioctl(s, SIOCGIFFLAGS, (caddr_t)&ifr) < 0) { 29222485Ssklower Perror("ioctl (SIOCGIFFLAGS)"); 29322485Ssklower exit(1); 29422485Ssklower } 29522485Ssklower strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); 29622485Ssklower flags = ifr.ifr_flags; 29714869Ssam 29814869Ssam if (value < 0) { 29914869Ssam value = -value; 30021811Skarels flags &= ~value; 30114869Ssam } else 30221811Skarels flags |= value; 30321811Skarels ifr.ifr_flags = flags; 30414869Ssam if (ioctl(s, SIOCSIFFLAGS, (caddr_t)&ifr) < 0) 30514870Ssam Perror(vname); 30614869Ssam } 30714869Ssam 30826185Skarels setifmetric(val) 30926185Skarels char *val; 31026185Skarels { 31126185Skarels strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); 31226185Skarels ifr.ifr_metric = atoi(val); 31326185Skarels if (ioctl(s, SIOCSIFMETRIC, (caddr_t)&ifr) < 0) 31426185Skarels perror("ioctl (set metric)"); 31526185Skarels } 31626185Skarels 31737315Ssklower setsnpaoffset(val) 31837315Ssklower char *val; 31937315Ssklower { 32037315Ssklower iso_addreq.ifra_snpaoffset = atoi(val); 32137315Ssklower } 32237315Ssklower 32326185Skarels #define IFFBITS \ 32426185Skarels "\020\1UP\2BROADCAST\3DEBUG\4LOOPBACK\5POINTOPOINT\6NOTRAILERS\7RUNNING\10NOARP\ 32526185Skarels " 32626185Skarels 32722485Ssklower /* 32822485Ssklower * Print the status of the interface. If an address family was 32922485Ssklower * specified, show it and it only; otherwise, show them all. 33022485Ssklower */ 33114869Ssam status() 33214869Ssam { 33322485Ssklower register struct afswtch *p = afp; 33422485Ssklower short af = ifr.ifr_addr.sa_family; 33522485Ssklower 33626185Skarels printf("%s: ", name); 33726185Skarels printb("flags", flags, IFFBITS); 33826185Skarels if (metric) 33926185Skarels printf(" metric %d", metric); 34026185Skarels putchar('\n'); 34122485Ssklower if ((p = afp) != NULL) { 34228468Skarels (*p->af_status)(1); 34328468Skarels } else for (p = afs; p->af_name; p++) { 34422485Ssklower ifr.ifr_addr.sa_family = p->af_af; 34528468Skarels (*p->af_status)(0); 34622485Ssklower } 34722485Ssklower } 34822485Ssklower 34928468Skarels in_status(force) 35028468Skarels int force; 35122485Ssklower { 35214869Ssam struct sockaddr_in *sin; 35322485Ssklower char *inet_ntoa(); 35414869Ssam 35527061Skarels strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); 35621811Skarels if (ioctl(s, SIOCGIFADDR, (caddr_t)&ifr) < 0) { 35728468Skarels if (errno == EADDRNOTAVAIL || errno == EAFNOSUPPORT) { 35828468Skarels if (!force) 35928468Skarels return; 36021811Skarels bzero((char *)&ifr.ifr_addr, sizeof(ifr.ifr_addr)); 36128468Skarels } else 36228468Skarels perror("ioctl (SIOCGIFADDR)"); 36321811Skarels } 36414869Ssam sin = (struct sockaddr_in *)&ifr.ifr_addr; 36526429Skarels printf("\tinet %s ", inet_ntoa(sin->sin_addr)); 36628468Skarels strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); 36728468Skarels if (ioctl(s, SIOCGIFNETMASK, (caddr_t)&ifr) < 0) { 36828468Skarels if (errno != EADDRNOTAVAIL) 36928468Skarels perror("ioctl (SIOCGIFNETMASK)"); 37028468Skarels bzero((char *)&ifr.ifr_addr, sizeof(ifr.ifr_addr)); 37128468Skarels } else 37228468Skarels netmask.sin_addr = 37328468Skarels ((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr; 37417218Stef if (flags & IFF_POINTOPOINT) { 37521811Skarels if (ioctl(s, SIOCGIFDSTADDR, (caddr_t)&ifr) < 0) { 37621811Skarels if (errno == EADDRNOTAVAIL) 37721811Skarels bzero((char *)&ifr.ifr_addr, sizeof(ifr.ifr_addr)); 37821811Skarels else 37928468Skarels perror("ioctl (SIOCGIFDSTADDR)"); 38021811Skarels } 38122485Ssklower strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); 38217218Stef sin = (struct sockaddr_in *)&ifr.ifr_dstaddr; 38317218Stef printf("--> %s ", inet_ntoa(sin->sin_addr)); 38417218Stef } 38521811Skarels printf("netmask %x ", ntohl(netmask.sin_addr.s_addr)); 38621811Skarels if (flags & IFF_BROADCAST) { 38721811Skarels if (ioctl(s, SIOCGIFBRDADDR, (caddr_t)&ifr) < 0) { 38821811Skarels if (errno == EADDRNOTAVAIL) 38928468Skarels bzero((char *)&ifr.ifr_addr, sizeof(ifr.ifr_addr)); 39028468Skarels else 39128468Skarels perror("ioctl (SIOCGIFADDR)"); 39221811Skarels } 39322485Ssklower strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); 39421811Skarels sin = (struct sockaddr_in *)&ifr.ifr_addr; 39528468Skarels if (sin->sin_addr.s_addr != 0) 39628468Skarels printf("broadcast %s", inet_ntoa(sin->sin_addr)); 39721811Skarels } 39826185Skarels putchar('\n'); 39914869Ssam } 40014869Ssam 40122485Ssklower 40228468Skarels xns_status(force) 40328468Skarels int force; 40422485Ssklower { 40522485Ssklower struct sockaddr_ns *sns; 40622485Ssklower 40722485Ssklower close(s); 40822485Ssklower s = socket(AF_NS, SOCK_DGRAM, 0); 40922485Ssklower if (s < 0) { 41030692Smckusick if (errno == EPROTONOSUPPORT) 41124248Ssklower return; 41222485Ssklower perror("ifconfig: socket"); 41322485Ssklower exit(1); 41422485Ssklower } 41522485Ssklower if (ioctl(s, SIOCGIFADDR, (caddr_t)&ifr) < 0) { 41628468Skarels if (errno == EADDRNOTAVAIL || errno == EAFNOSUPPORT) { 41728468Skarels if (!force) 41828468Skarels return; 41928468Skarels bzero((char *)&ifr.ifr_addr, sizeof(ifr.ifr_addr)); 42028468Skarels } else 42128468Skarels perror("ioctl (SIOCGIFADDR)"); 42222485Ssklower } 42322485Ssklower strncpy(ifr.ifr_name, name, sizeof ifr.ifr_name); 42422485Ssklower sns = (struct sockaddr_ns *)&ifr.ifr_addr; 42526185Skarels printf("\tns %s ", ns_ntoa(sns->sns_addr)); 42626101Ssklower if (flags & IFF_POINTOPOINT) { /* by W. Nesheim@Cornell */ 42726101Ssklower if (ioctl(s, SIOCGIFDSTADDR, (caddr_t)&ifr) < 0) { 42826101Ssklower if (errno == EADDRNOTAVAIL) 42926101Ssklower bzero((char *)&ifr.ifr_addr, sizeof(ifr.ifr_addr)); 43026101Ssklower else 43126101Ssklower Perror("ioctl (SIOCGIFDSTADDR)"); 43226101Ssklower } 43326101Ssklower strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); 43426101Ssklower sns = (struct sockaddr_ns *)&ifr.ifr_dstaddr; 43526101Ssklower printf("--> %s ", ns_ntoa(sns->sns_addr)); 43626101Ssklower } 43722485Ssklower putchar('\n'); 43822485Ssklower } 43922485Ssklower 44037315Ssklower iso_status(force) 44137315Ssklower int force; 44237315Ssklower { 44337315Ssklower struct sockaddr_iso *siso; 44437315Ssklower struct iso_ifreq ifr; 44537315Ssklower 44637315Ssklower close(s); 44737315Ssklower s = socket(AF_ISO, SOCK_DGRAM, 0); 44837315Ssklower if (s < 0) { 44937315Ssklower if (errno == EPROTONOSUPPORT) 45037315Ssklower return; 45137315Ssklower perror("ifconfig: socket"); 45237315Ssklower exit(1); 45337315Ssklower } 45442965Ssklower bzero((caddr_t)&ifr, sizeof(ifr)); 45542965Ssklower strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name)); 45642965Ssklower if (ioctl(s, SIOCGIFADDR_ISO, (caddr_t)&ifr) < 0) { 45737315Ssklower if (errno == EADDRNOTAVAIL || errno == EAFNOSUPPORT) { 45837315Ssklower if (!force) 45937315Ssklower return; 46037315Ssklower bzero((char *)&ifr.ifr_Addr, sizeof(ifr.ifr_Addr)); 46142965Ssklower } else { 46242965Ssklower perror("ioctl (SIOCGIFADDR_ISO)"); 46342965Ssklower exit(1); 46442965Ssklower } 46537315Ssklower } 46637315Ssklower strncpy(ifr.ifr_name, name, sizeof ifr.ifr_name); 46737315Ssklower siso = &ifr.ifr_Addr; 46842965Ssklower printf("\tiso %s ", iso_ntoa(&siso->siso_addr)); 46942965Ssklower if (ioctl(s, SIOCGIFNETMASK_ISO, (caddr_t)&ifr) < 0) { 47037315Ssklower if (errno != EADDRNOTAVAIL) 47142965Ssklower perror("ioctl (SIOCGIFNETMASK_ISO)"); 47237315Ssklower } else { 47342965Ssklower printf(" netmask %s ", iso_ntoa(&siso->siso_addr)); 47437315Ssklower } 47537315Ssklower if (flags & IFF_POINTOPOINT) { 47642965Ssklower if (ioctl(s, SIOCGIFDSTADDR_ISO, (caddr_t)&ifr) < 0) { 47737315Ssklower if (errno == EADDRNOTAVAIL) 47837315Ssklower bzero((char *)&ifr.ifr_Addr, sizeof(ifr.ifr_Addr)); 47937315Ssklower else 48042965Ssklower Perror("ioctl (SIOCGIFDSTADDR_ISO)"); 48137315Ssklower } 48237315Ssklower strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); 48337315Ssklower siso = &ifr.ifr_Addr; 48442965Ssklower printf("--> %s ", iso_ntoa(&siso->siso_addr)); 48537315Ssklower } 48637315Ssklower putchar('\n'); 48737315Ssklower } 48837315Ssklower 48914869Ssam Perror(cmd) 49014869Ssam char *cmd; 49114869Ssam { 49214869Ssam extern int errno; 49314869Ssam 49414869Ssam fprintf(stderr, "ifconfig: "); 49514869Ssam switch (errno) { 49614869Ssam 49714869Ssam case ENXIO: 49822485Ssklower fprintf(stderr, "%s: no such interface\n", cmd); 49914869Ssam break; 50014869Ssam 50114869Ssam case EPERM: 50216822Slepreau fprintf(stderr, "%s: permission denied\n", cmd); 50314869Ssam break; 50414869Ssam 50514869Ssam default: 50614869Ssam perror(cmd); 50714869Ssam } 50814869Ssam exit(1); 50914869Ssam } 51014869Ssam 51114869Ssam struct in_addr inet_makeaddr(); 51214869Ssam 51337315Ssklower #define SIN(x) ((struct sockaddr_in *) &(x)) 51437315Ssklower struct sockaddr_in *sintab[] = { 51537315Ssklower SIN(ridreq.ifr_addr), SIN(addreq.ifra_addr), 51637315Ssklower SIN(addreq.ifra_mask), SIN(addreq.ifra_broadaddr)}; 51737315Ssklower 51837315Ssklower in_getaddr(s, which) 51914869Ssam char *s; 52014869Ssam { 52137315Ssklower register struct sockaddr_in *sin = sintab[which]; 52214869Ssam struct hostent *hp; 52314869Ssam struct netent *np; 52414869Ssam int val; 52514869Ssam 52639210Ssklower sin->sin_len = sizeof(*sin); 52739210Ssklower if (which != MASK) 52837315Ssklower sin->sin_family = AF_INET; 52939210Ssklower 53039210Ssklower if ((val = inet_addr(s)) != -1) 53121811Skarels sin->sin_addr.s_addr = val; 53239210Ssklower else if (hp = gethostbyname(s)) 53314869Ssam bcopy(hp->h_addr, (char *)&sin->sin_addr, hp->h_length); 53439210Ssklower else if (np = getnetbyname(s)) 53514869Ssam sin->sin_addr = inet_makeaddr(np->n_net, INADDR_ANY); 53639210Ssklower else { 53739210Ssklower fprintf(stderr, "%s: bad value\n", s); 53839210Ssklower exit(1); 53914869Ssam } 54014869Ssam } 54114869Ssam 54214869Ssam /* 54314869Ssam * Print a value a la the %b format of the kernel's printf 54414869Ssam */ 54514869Ssam printb(s, v, bits) 54614869Ssam char *s; 54714869Ssam register char *bits; 54814869Ssam register unsigned short v; 54914869Ssam { 55014869Ssam register int i, any = 0; 55114869Ssam register char c; 55214869Ssam 55314869Ssam if (bits && *bits == 8) 55414869Ssam printf("%s=%o", s, v); 55514869Ssam else 55614869Ssam printf("%s=%x", s, v); 55714869Ssam bits++; 55814869Ssam if (bits) { 55914869Ssam putchar('<'); 56014869Ssam while (i = *bits++) { 56114869Ssam if (v & (1 << (i-1))) { 56214869Ssam if (any) 56314869Ssam putchar(','); 56414869Ssam any = 1; 56514869Ssam for (; (c = *bits) > 32; bits++) 56614869Ssam putchar(c); 56714869Ssam } else 56814869Ssam for (; *bits > 32; bits++) 56914869Ssam ; 57014869Ssam } 57114869Ssam putchar('>'); 57214869Ssam } 57314869Ssam } 57422485Ssklower 57537315Ssklower #define SNS(x) ((struct sockaddr_ns *) &(x)) 57637315Ssklower struct sockaddr_ns *snstab[] = { 57737315Ssklower SNS(ridreq.ifr_addr), SNS(addreq.ifra_addr), 57837315Ssklower SNS(addreq.ifra_mask), SNS(addreq.ifra_broadaddr)}; 57937315Ssklower 58037315Ssklower xns_getaddr(addr, which) 58122485Ssklower char *addr; 58222485Ssklower { 58337315Ssklower struct sockaddr_ns *sns = snstab[which]; 58426101Ssklower struct ns_addr ns_addr(); 58537315Ssklower 58622485Ssklower sns->sns_family = AF_NS; 58737227Ssklower sns->sns_len = sizeof(*sns); 58826101Ssklower sns->sns_addr = ns_addr(addr); 58937315Ssklower if (which == MASK) 59037315Ssklower printf("Attempt to set XNS netmask will be ineffectual\n"); 59122485Ssklower } 59237315Ssklower 59337315Ssklower #define SISO(x) ((struct sockaddr_iso *) &(x)) 59437315Ssklower struct sockaddr_iso *sisotab[] = { 59537315Ssklower SISO(iso_ridreq.ifr_Addr), SISO(iso_addreq.ifra_addr), 59637315Ssklower SISO(iso_addreq.ifra_mask), SISO(iso_addreq.ifra_dstaddr)}; 59737315Ssklower 59837315Ssklower iso_getaddr(addr, which) 59937315Ssklower char *addr; 60037315Ssklower { 601*43089Ssklower register struct sockaddr_iso *siso = sisotab[which]; 60237315Ssklower struct iso_addr *iso_addr(); 60337315Ssklower siso->siso_addr = *iso_addr(addr); 604*43089Ssklower 60537315Ssklower if (which == MASK) { 60639210Ssklower siso->siso_len = TSEL(siso) - (caddr_t)(siso); 60737315Ssklower siso->siso_nlen = 0; 60837315Ssklower } else { 609*43089Ssklower siso->siso_len = sizeof(*siso); 610*43089Ssklower siso->siso_family = AF_ISO; 61137315Ssklower } 61237315Ssklower } 61342965Ssklower 61442965Ssklower setnsellength(val) 61542965Ssklower char *val; 61642965Ssklower { 617*43089Ssklower nsellength = atoi(val); 618*43089Ssklower if (nsellength < 0) { 619*43089Ssklower fprintf(stderr, "Negative NSEL length is absurd\n"); 620*43089Ssklower exit (1); 621*43089Ssklower } 62242965Ssklower if (afp == 0 || afp->af_af != AF_ISO) { 62342965Ssklower fprintf(stderr, "Setting NSEL length valid only for iso\n"); 62442965Ssklower exit (1); 62542965Ssklower } 62642965Ssklower } 627*43089Ssklower 628*43089Ssklower fixnsel(s) 629*43089Ssklower register struct sockaddr_iso *s; 630*43089Ssklower { 631*43089Ssklower if (s->siso_family == 0) 632*43089Ssklower return; 633*43089Ssklower s->siso_nlen -= nsellength; 634*43089Ssklower s->siso_tlen = nsellength; 635*43089Ssklower } 636*43089Ssklower 637*43089Ssklower adjust_nsellength() 638*43089Ssklower { 639*43089Ssklower fixnsel(sisotab[RIDADDR]); 640*43089Ssklower fixnsel(sisotab[ADDR]); 641*43089Ssklower fixnsel(sisotab[DSTADDR]); 642*43089Ssklower } 643