121811Skarels /* 221811Skarels * Copyright (c) 1983 Regents of the University of California. 334941Sbostic * All rights reserved. 434941Sbostic * 534941Sbostic * Redistribution and use in source and binary forms are permitted 634941Sbostic * provided that the above copyright notice and this paragraph are 734941Sbostic * duplicated in all such forms and that any documentation, 834941Sbostic * advertising materials, and other materials related to such 934941Sbostic * distribution and use acknowledge that the software was developed 1034941Sbostic * by the University of California, Berkeley. The name of the 1134941Sbostic * University may not be used to endorse or promote products derived 1234941Sbostic * from this software without specific prior written permission. 1334941Sbostic * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR 1434941Sbostic * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED 1534941Sbostic * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. 1621811Skarels */ 1721811Skarels 1814869Ssam #ifndef lint 1921811Skarels char copyright[] = 2021811Skarels "@(#) Copyright (c) 1983 Regents of the University of California.\n\ 2121811Skarels All rights reserved.\n"; 2234941Sbostic #endif /* not lint */ 2314869Ssam 2421811Skarels #ifndef lint 25*39210Ssklower static char sccsid[] = "@(#)ifconfig.c 4.25 (Berkeley) 09/25/89"; 2634941Sbostic #endif /* not lint */ 2721811Skarels 2814869Ssam #include <sys/types.h> 2914869Ssam #include <sys/socket.h> 3014869Ssam #include <sys/ioctl.h> 3114869Ssam 3222485Ssklower #include <net/if.h> 3314869Ssam #include <netinet/in.h> 3414869Ssam 3522485Ssklower #define NSIP 3622485Ssklower #include <netns/ns.h> 3722485Ssklower #include <netns/ns_if.h> 3822485Ssklower 3937479Ssklower #define EON 4037315Ssklower #include <netiso/iso.h> 4137315Ssklower #include <netiso/iso_var.h> 4237479Ssklower #include <sys/protosw.h> 4337479Ssklower #include <netiso/eonvar.h> 4437315Ssklower 4514869Ssam #include <stdio.h> 4614869Ssam #include <errno.h> 4714869Ssam #include <ctype.h> 4814869Ssam #include <netdb.h> 4914869Ssam 5022485Ssklower extern int errno; 5137315Ssklower struct ifreq ifr, ridreq; 5237315Ssklower struct ifaliasreq addreq; 5337315Ssklower struct iso_ifreq iso_ridreq; 5437315Ssklower struct iso_aliasreq iso_addreq; 5537315Ssklower struct sockaddr_in netmask; 5637315Ssklower 5714869Ssam char name[30]; 5821811Skarels int flags; 5926185Skarels int metric; 6016329Skarels int setaddr; 6122485Ssklower int setipdst; 6237315Ssklower int doalias; 6337479Ssklower int clearaddr; 6437315Ssklower int newaddr = 1; 6514869Ssam int s; 6621811Skarels extern int errno; 6714869Ssam 6821811Skarels int setifflags(), setifaddr(), setifdstaddr(), setifnetmask(); 6926185Skarels int setifmetric(), setifbroadaddr(), setifipdst(); 7037315Ssklower int notealias(), setsnpaoffset(); 7114869Ssam 7221811Skarels #define NEXTARG 0xffffff 7321811Skarels 7414869Ssam struct cmd { 7514869Ssam char *c_name; 7621811Skarels int c_parameter; /* NEXTARG means next argv */ 7714869Ssam int (*c_func)(); 7814869Ssam } cmds[] = { 7914869Ssam { "up", IFF_UP, setifflags } , 8014869Ssam { "down", -IFF_UP, setifflags }, 8114869Ssam { "trailers", -IFF_NOTRAILERS,setifflags }, 8214869Ssam { "-trailers", IFF_NOTRAILERS, setifflags }, 8315359Skarels { "arp", -IFF_NOARP, setifflags }, 8415359Skarels { "-arp", IFF_NOARP, setifflags }, 8515286Sleres { "debug", IFF_DEBUG, setifflags }, 8615286Sleres { "-debug", -IFF_DEBUG, setifflags }, 8737315Ssklower { "alias", IFF_UP, notealias }, 8837315Ssklower { "-alias", -IFF_UP, notealias }, 8937315Ssklower { "delete", -IFF_UP, notealias }, 9015004Ssam #ifdef notdef 9121811Skarels #define EN_SWABIPS 0x1000 9215004Ssam { "swabips", EN_SWABIPS, setifflags }, 9315004Ssam { "-swabips", -EN_SWABIPS, setifflags }, 9415004Ssam #endif 9521811Skarels { "netmask", NEXTARG, setifnetmask }, 9626185Skarels { "metric", NEXTARG, setifmetric }, 9737315Ssklower { "snpaoffset", NEXTARG, setsnpaoffset }, 9821811Skarels { "broadcast", NEXTARG, setifbroadaddr }, 9922485Ssklower { "ipdst", NEXTARG, setifipdst }, 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 13637315Ssklower int testing = 0; 13737315Ssklower Ioctl(a,b,c) { 13837315Ssklower int error = 0; 13937315Ssklower if (testing) 14037315Ssklower printf("would call ioctl with %x, %x, %x\n", a, b, c); 14137315Ssklower else 14237315Ssklower error = ioctl(a, b, c); 14337315Ssklower return error; 14437315Ssklower } 14537315Ssklower #define ioctl(a, b, c) Ioctl(a,b,c) 14637315Ssklower 14714869Ssam main(argc, argv) 14814869Ssam int argc; 14914869Ssam char *argv[]; 15014869Ssam { 15122485Ssklower int af = AF_INET; 15237315Ssklower register struct afswtch *rafp; 15327061Skarels 15414869Ssam if (argc < 2) { 15530789Sbostic fprintf(stderr, "usage: ifconfig interface\n%s%s%s%s%s", 15626185Skarels "\t[ af [ address [ dest_addr ] ] [ up ] [ down ]", 15726185Skarels "[ netmask mask ] ]\n", 15826185Skarels "\t[ metric n ]\n", 15926185Skarels "\t[ trailers | -trailers ]\n", 16026185Skarels "\t[ arp | -arp ]\n"); 16114869Ssam exit(1); 16214869Ssam } 16322485Ssklower argc--, argv++; 16424248Ssklower strncpy(name, *argv, sizeof(name)); 16522485Ssklower strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name)); 16622485Ssklower argc--, argv++; 16722485Ssklower if (argc > 0) { 16837315Ssklower for (afp = rafp = afs; rafp->af_name; rafp++) 16937315Ssklower if (strcmp(rafp->af_name, *argv) == 0) { 17037315Ssklower afp = rafp; argc--; argv++; 17122485Ssklower break; 17222485Ssklower } 17337315Ssklower rafp = afp; 17437315Ssklower af = ifr.ifr_addr.sa_family = rafp->af_af; 17522485Ssklower } 17622485Ssklower s = socket(af, SOCK_DGRAM, 0); 17714869Ssam if (s < 0) { 17814869Ssam perror("ifconfig: socket"); 17914869Ssam exit(1); 18014869Ssam } 18114869Ssam if (ioctl(s, SIOCGIFFLAGS, (caddr_t)&ifr) < 0) { 18214869Ssam Perror("ioctl (SIOCGIFFLAGS)"); 18314869Ssam exit(1); 18414869Ssam } 18522485Ssklower strncpy(ifr.ifr_name, name, sizeof ifr.ifr_name); 18621811Skarels flags = ifr.ifr_flags; 18726185Skarels if (ioctl(s, SIOCGIFMETRIC, (caddr_t)&ifr) < 0) 18826185Skarels perror("ioctl (SIOCGIFMETRIC)"); 18926185Skarels else 19026185Skarels metric = ifr.ifr_metric; 19114869Ssam if (argc == 0) { 19214869Ssam status(); 19314869Ssam exit(0); 19414869Ssam } 19514869Ssam while (argc > 0) { 19614869Ssam register struct cmd *p; 19714869Ssam 19814869Ssam for (p = cmds; p->c_name; p++) 19914869Ssam if (strcmp(*argv, p->c_name) == 0) 20014869Ssam break; 20117218Stef if (p->c_name == 0 && setaddr) 20217218Stef p++; /* got src, do dst */ 20321811Skarels if (p->c_func) { 20421811Skarels if (p->c_parameter == NEXTARG) { 20521811Skarels (*p->c_func)(argv[1]); 20621811Skarels argc--, argv++; 20721811Skarels } else 20821811Skarels (*p->c_func)(*argv, p->c_parameter); 20921811Skarels } 21014869Ssam argc--, argv++; 21114869Ssam } 21237479Ssklower if (setipdst && af==AF_NS) { 21337479Ssklower struct nsip_req rq; 21437479Ssklower int size = sizeof(rq); 21537479Ssklower 21637479Ssklower rq.rq_ns = addreq.ifra_addr; 21737479Ssklower rq.rq_ip = addreq.ifra_dstaddr; 21837479Ssklower 21937479Ssklower if (setsockopt(s, 0, SO_NSIP_ROUTE, &rq, size) < 0) 22037479Ssklower Perror("Encapsulation Routing"); 22137479Ssklower } 22237479Ssklower if (setipdst && af == AF_ISO) { 22337479Ssklower iso_ridreq.ifr_Addr = iso_addreq.ifra_addr; 224*39210Ssklower iso_ridreq.ifr_Addr.siso_slen = 22537479Ssklower ((struct sockaddr_in *)&addreq.ifra_dstaddr)-> 22637479Ssklower sin_addr.s_addr; 22737479Ssklower strncpy(rafp->af_ridreq, name, sizeof ifr.ifr_name); 22837479Ssklower if (ioctl(s, SIOCSEONCORE, &iso_ridreq) < 0) 22937479Ssklower Perror("Iso Encapsulation Routing"); 23037479Ssklower } 23137315Ssklower if (clearaddr) { 23237315Ssklower int ret; 23337315Ssklower strncpy(rafp->af_ridreq, name, sizeof ifr.ifr_name); 23437315Ssklower if ((ret = ioctl(s, rafp->af_difaddr, rafp->af_ridreq)) < 0) { 23537315Ssklower if (errno == EADDRNOTAVAIL && (doalias >= 0)) { 23637315Ssklower /* means no previous address for interface */ 23737315Ssklower } else 23837315Ssklower Perror("ioctl (SIOCDIFADDR)"); 23937315Ssklower } 24021811Skarels } 24137315Ssklower if (newaddr) { 24237315Ssklower strncpy(rafp->af_addreq, name, sizeof ifr.ifr_name); 24337315Ssklower if (ioctl(s, rafp->af_aifaddr, rafp->af_addreq) < 0) 24437315Ssklower Perror("ioctl (SIOCAIFADDR)"); 24516329Skarels } 24614869Ssam exit(0); 24714869Ssam } 24837315Ssklower #define RIDADDR 0 24937315Ssklower #define ADDR 1 25037315Ssklower #define MASK 2 25137315Ssklower #define DSTADDR 3 25214869Ssam 25314869Ssam /*ARGSUSED*/ 25414869Ssam setifaddr(addr, param) 25514869Ssam char *addr; 25622485Ssklower short param; 25714869Ssam { 25816329Skarels /* 25916329Skarels * Delay the ioctl to set the interface addr until flags are all set. 26016329Skarels * The address interpretation may depend on the flags, 26116329Skarels * and the flags may change when the address is set. 26215390Skarels */ 26316329Skarels setaddr++; 26437479Ssklower if (doalias = 0) 26537479Ssklower clearaddr = 1; 26637315Ssklower (*afp->af_getaddr)(addr, (doalias >= 0 ? ADDR : RIDADDR)); 26714869Ssam } 26814869Ssam 26921811Skarels setifnetmask(addr) 27021811Skarels char *addr; 27121811Skarels { 27237315Ssklower (*afp->af_getaddr)(addr, MASK); 27321811Skarels } 27421811Skarels 27521811Skarels setifbroadaddr(addr) 27621811Skarels char *addr; 27721811Skarels { 27837315Ssklower (*afp->af_getaddr)(addr, DSTADDR); 27921811Skarels } 28021811Skarels 28122485Ssklower setifipdst(addr) 28222485Ssklower char *addr; 28322485Ssklower { 28437315Ssklower in_getaddr(addr, DSTADDR); 28522485Ssklower setipdst++; 28637479Ssklower clearaddr = 0; 28737479Ssklower newaddr = 0; 28822485Ssklower } 28937479Ssklower #define rqtosa(x) (&(((struct ifreq *)(afp->x))->ifr_addr)) 29017218Stef /*ARGSUSED*/ 29137315Ssklower notealias(addr, param) 29237315Ssklower char *addr; 29337315Ssklower { 29437479Ssklower if (setaddr && doalias == 0 && param < 0) 29537479Ssklower bcopy((caddr_t)rqtosa(af_addreq), 29637479Ssklower (caddr_t)rqtosa(af_ridreq), 29737479Ssklower rqtosa(af_addreq)->sa_len); 29837315Ssklower doalias = param; 29937479Ssklower if (param < 0) { 30037479Ssklower clearaddr = 1; 30137479Ssklower newaddr = 0; 30237479Ssklower } else 30337315Ssklower clearaddr = 0; 30437315Ssklower } 30537315Ssklower 30637315Ssklower /*ARGSUSED*/ 30717218Stef setifdstaddr(addr, param) 30817218Stef char *addr; 30917218Stef int param; 31017218Stef { 31137315Ssklower (*afp->af_getaddr)(addr, DSTADDR); 31217218Stef } 31317218Stef 31414870Ssam setifflags(vname, value) 31514870Ssam char *vname; 31622485Ssklower short value; 31714869Ssam { 31822485Ssklower if (ioctl(s, SIOCGIFFLAGS, (caddr_t)&ifr) < 0) { 31922485Ssklower Perror("ioctl (SIOCGIFFLAGS)"); 32022485Ssklower exit(1); 32122485Ssklower } 32222485Ssklower strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); 32322485Ssklower flags = ifr.ifr_flags; 32414869Ssam 32514869Ssam if (value < 0) { 32614869Ssam value = -value; 32721811Skarels flags &= ~value; 32814869Ssam } else 32921811Skarels flags |= value; 33021811Skarels ifr.ifr_flags = flags; 33114869Ssam if (ioctl(s, SIOCSIFFLAGS, (caddr_t)&ifr) < 0) 33214870Ssam Perror(vname); 33314869Ssam } 33414869Ssam 33526185Skarels setifmetric(val) 33626185Skarels char *val; 33726185Skarels { 33826185Skarels strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); 33926185Skarels ifr.ifr_metric = atoi(val); 34026185Skarels if (ioctl(s, SIOCSIFMETRIC, (caddr_t)&ifr) < 0) 34126185Skarels perror("ioctl (set metric)"); 34226185Skarels } 34326185Skarels 34437315Ssklower setsnpaoffset(val) 34537315Ssklower char *val; 34637315Ssklower { 34737315Ssklower iso_addreq.ifra_snpaoffset = atoi(val); 34837315Ssklower } 34937315Ssklower 35026185Skarels #define IFFBITS \ 35126185Skarels "\020\1UP\2BROADCAST\3DEBUG\4LOOPBACK\5POINTOPOINT\6NOTRAILERS\7RUNNING\10NOARP\ 35226185Skarels " 35326185Skarels 35422485Ssklower /* 35522485Ssklower * Print the status of the interface. If an address family was 35622485Ssklower * specified, show it and it only; otherwise, show them all. 35722485Ssklower */ 35814869Ssam status() 35914869Ssam { 36022485Ssklower register struct afswtch *p = afp; 36122485Ssklower short af = ifr.ifr_addr.sa_family; 36222485Ssklower 36326185Skarels printf("%s: ", name); 36426185Skarels printb("flags", flags, IFFBITS); 36526185Skarels if (metric) 36626185Skarels printf(" metric %d", metric); 36726185Skarels putchar('\n'); 36822485Ssklower if ((p = afp) != NULL) { 36928468Skarels (*p->af_status)(1); 37028468Skarels } else for (p = afs; p->af_name; p++) { 37122485Ssklower ifr.ifr_addr.sa_family = p->af_af; 37228468Skarels (*p->af_status)(0); 37322485Ssklower } 37422485Ssklower } 37522485Ssklower 37628468Skarels in_status(force) 37728468Skarels int force; 37822485Ssklower { 37914869Ssam struct sockaddr_in *sin; 38022485Ssklower char *inet_ntoa(); 38114869Ssam 38227061Skarels strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); 38321811Skarels if (ioctl(s, SIOCGIFADDR, (caddr_t)&ifr) < 0) { 38428468Skarels if (errno == EADDRNOTAVAIL || errno == EAFNOSUPPORT) { 38528468Skarels if (!force) 38628468Skarels return; 38721811Skarels bzero((char *)&ifr.ifr_addr, sizeof(ifr.ifr_addr)); 38828468Skarels } else 38928468Skarels perror("ioctl (SIOCGIFADDR)"); 39021811Skarels } 39114869Ssam sin = (struct sockaddr_in *)&ifr.ifr_addr; 39226429Skarels printf("\tinet %s ", inet_ntoa(sin->sin_addr)); 39328468Skarels strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); 39428468Skarels if (ioctl(s, SIOCGIFNETMASK, (caddr_t)&ifr) < 0) { 39528468Skarels if (errno != EADDRNOTAVAIL) 39628468Skarels perror("ioctl (SIOCGIFNETMASK)"); 39728468Skarels bzero((char *)&ifr.ifr_addr, sizeof(ifr.ifr_addr)); 39828468Skarels } else 39928468Skarels netmask.sin_addr = 40028468Skarels ((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr; 40117218Stef if (flags & IFF_POINTOPOINT) { 40221811Skarels if (ioctl(s, SIOCGIFDSTADDR, (caddr_t)&ifr) < 0) { 40321811Skarels if (errno == EADDRNOTAVAIL) 40421811Skarels bzero((char *)&ifr.ifr_addr, sizeof(ifr.ifr_addr)); 40521811Skarels else 40628468Skarels perror("ioctl (SIOCGIFDSTADDR)"); 40721811Skarels } 40822485Ssklower strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); 40917218Stef sin = (struct sockaddr_in *)&ifr.ifr_dstaddr; 41017218Stef printf("--> %s ", inet_ntoa(sin->sin_addr)); 41117218Stef } 41221811Skarels printf("netmask %x ", ntohl(netmask.sin_addr.s_addr)); 41321811Skarels if (flags & IFF_BROADCAST) { 41421811Skarels if (ioctl(s, SIOCGIFBRDADDR, (caddr_t)&ifr) < 0) { 41521811Skarels if (errno == EADDRNOTAVAIL) 41628468Skarels bzero((char *)&ifr.ifr_addr, sizeof(ifr.ifr_addr)); 41728468Skarels else 41828468Skarels perror("ioctl (SIOCGIFADDR)"); 41921811Skarels } 42022485Ssklower strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); 42121811Skarels sin = (struct sockaddr_in *)&ifr.ifr_addr; 42228468Skarels if (sin->sin_addr.s_addr != 0) 42328468Skarels printf("broadcast %s", inet_ntoa(sin->sin_addr)); 42421811Skarels } 42526185Skarels putchar('\n'); 42614869Ssam } 42714869Ssam 42822485Ssklower 42928468Skarels xns_status(force) 43028468Skarels int force; 43122485Ssklower { 43222485Ssklower struct sockaddr_ns *sns; 43322485Ssklower 43422485Ssklower close(s); 43522485Ssklower s = socket(AF_NS, SOCK_DGRAM, 0); 43622485Ssklower if (s < 0) { 43730692Smckusick if (errno == EPROTONOSUPPORT) 43824248Ssklower return; 43922485Ssklower perror("ifconfig: socket"); 44022485Ssklower exit(1); 44122485Ssklower } 44222485Ssklower if (ioctl(s, SIOCGIFADDR, (caddr_t)&ifr) < 0) { 44328468Skarels if (errno == EADDRNOTAVAIL || errno == EAFNOSUPPORT) { 44428468Skarels if (!force) 44528468Skarels return; 44628468Skarels bzero((char *)&ifr.ifr_addr, sizeof(ifr.ifr_addr)); 44728468Skarels } else 44828468Skarels perror("ioctl (SIOCGIFADDR)"); 44922485Ssklower } 45022485Ssklower strncpy(ifr.ifr_name, name, sizeof ifr.ifr_name); 45122485Ssklower sns = (struct sockaddr_ns *)&ifr.ifr_addr; 45226185Skarels printf("\tns %s ", ns_ntoa(sns->sns_addr)); 45326101Ssklower if (flags & IFF_POINTOPOINT) { /* by W. Nesheim@Cornell */ 45426101Ssklower if (ioctl(s, SIOCGIFDSTADDR, (caddr_t)&ifr) < 0) { 45526101Ssklower if (errno == EADDRNOTAVAIL) 45626101Ssklower bzero((char *)&ifr.ifr_addr, sizeof(ifr.ifr_addr)); 45726101Ssklower else 45826101Ssklower Perror("ioctl (SIOCGIFDSTADDR)"); 45926101Ssklower } 46026101Ssklower strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); 46126101Ssklower sns = (struct sockaddr_ns *)&ifr.ifr_dstaddr; 46226101Ssklower printf("--> %s ", ns_ntoa(sns->sns_addr)); 46326101Ssklower } 46422485Ssklower putchar('\n'); 46522485Ssklower } 46622485Ssklower 46737315Ssklower iso_status(force) 46837315Ssklower int force; 46937315Ssklower { 47037315Ssklower struct sockaddr_iso *siso; 47137315Ssklower struct iso_ifreq ifr; 47237315Ssklower 47337315Ssklower close(s); 47437315Ssklower s = socket(AF_ISO, SOCK_DGRAM, 0); 47537315Ssklower if (s < 0) { 47637315Ssklower if (errno == EPROTONOSUPPORT) 47737315Ssklower return; 47837315Ssklower perror("ifconfig: socket"); 47937315Ssklower exit(1); 48037315Ssklower } 48137315Ssklower if (ioctl(s, SIOCGIFADDR, (caddr_t)&ifr) < 0) { 48237315Ssklower if (errno == EADDRNOTAVAIL || errno == EAFNOSUPPORT) { 48337315Ssklower if (!force) 48437315Ssklower return; 48537315Ssklower bzero((char *)&ifr.ifr_Addr, sizeof(ifr.ifr_Addr)); 48637315Ssklower } else 48737315Ssklower perror("ioctl (SIOCGIFADDR)"); 48837315Ssklower } 48937315Ssklower strncpy(ifr.ifr_name, name, sizeof ifr.ifr_name); 49037315Ssklower siso = &ifr.ifr_Addr; 49137315Ssklower printf("\tiso %s ", iso_ntoa(siso->siso_addr)); 49237315Ssklower if (ioctl(s, SIOCGIFNETMASK, (caddr_t)&ifr) < 0) { 49337315Ssklower if (errno != EADDRNOTAVAIL) 49437315Ssklower perror("ioctl (SIOCGIFNETMASK)"); 49537315Ssklower } else { 49637315Ssklower printf("\n netmask %s ", iso_ntoa(siso->siso_addr)); 49737315Ssklower } 49837315Ssklower if (flags & IFF_POINTOPOINT) { 49937315Ssklower if (ioctl(s, SIOCGIFDSTADDR, (caddr_t)&ifr) < 0) { 50037315Ssklower if (errno == EADDRNOTAVAIL) 50137315Ssklower bzero((char *)&ifr.ifr_Addr, sizeof(ifr.ifr_Addr)); 50237315Ssklower else 50337315Ssklower Perror("ioctl (SIOCGIFDSTADDR)"); 50437315Ssklower } 50537315Ssklower strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); 50637315Ssklower siso = &ifr.ifr_Addr; 50737315Ssklower printf("--> %s ", iso_ntoa(siso->siso_addr)); 50837315Ssklower } 50937315Ssklower putchar('\n'); 51037315Ssklower } 51137315Ssklower 51214869Ssam Perror(cmd) 51314869Ssam char *cmd; 51414869Ssam { 51514869Ssam extern int errno; 51614869Ssam 51714869Ssam fprintf(stderr, "ifconfig: "); 51814869Ssam switch (errno) { 51914869Ssam 52014869Ssam case ENXIO: 52122485Ssklower fprintf(stderr, "%s: no such interface\n", cmd); 52214869Ssam break; 52314869Ssam 52414869Ssam case EPERM: 52516822Slepreau fprintf(stderr, "%s: permission denied\n", cmd); 52614869Ssam break; 52714869Ssam 52814869Ssam default: 52914869Ssam perror(cmd); 53014869Ssam } 53114869Ssam exit(1); 53214869Ssam } 53314869Ssam 53414869Ssam struct in_addr inet_makeaddr(); 53514869Ssam 53637315Ssklower #define SIN(x) ((struct sockaddr_in *) &(x)) 53737315Ssklower struct sockaddr_in *sintab[] = { 53837315Ssklower SIN(ridreq.ifr_addr), SIN(addreq.ifra_addr), 53937315Ssklower SIN(addreq.ifra_mask), SIN(addreq.ifra_broadaddr)}; 54037315Ssklower 54137315Ssklower in_getaddr(s, which) 54214869Ssam char *s; 54314869Ssam { 54437315Ssklower register struct sockaddr_in *sin = sintab[which]; 54514869Ssam struct hostent *hp; 54614869Ssam struct netent *np; 54714869Ssam int val; 54814869Ssam 549*39210Ssklower sin->sin_len = sizeof(*sin); 550*39210Ssklower if (which != MASK) 55137315Ssklower sin->sin_family = AF_INET; 552*39210Ssklower 553*39210Ssklower if ((val = inet_addr(s)) != -1) 55421811Skarels sin->sin_addr.s_addr = val; 555*39210Ssklower else if (hp = gethostbyname(s)) 55614869Ssam bcopy(hp->h_addr, (char *)&sin->sin_addr, hp->h_length); 557*39210Ssklower else if (np = getnetbyname(s)) 55814869Ssam sin->sin_addr = inet_makeaddr(np->n_net, INADDR_ANY); 559*39210Ssklower else { 560*39210Ssklower fprintf(stderr, "%s: bad value\n", s); 561*39210Ssklower exit(1); 56214869Ssam } 56314869Ssam } 56414869Ssam 56514869Ssam /* 56614869Ssam * Print a value a la the %b format of the kernel's printf 56714869Ssam */ 56814869Ssam printb(s, v, bits) 56914869Ssam char *s; 57014869Ssam register char *bits; 57114869Ssam register unsigned short v; 57214869Ssam { 57314869Ssam register int i, any = 0; 57414869Ssam register char c; 57514869Ssam 57614869Ssam if (bits && *bits == 8) 57714869Ssam printf("%s=%o", s, v); 57814869Ssam else 57914869Ssam printf("%s=%x", s, v); 58014869Ssam bits++; 58114869Ssam if (bits) { 58214869Ssam putchar('<'); 58314869Ssam while (i = *bits++) { 58414869Ssam if (v & (1 << (i-1))) { 58514869Ssam if (any) 58614869Ssam putchar(','); 58714869Ssam any = 1; 58814869Ssam for (; (c = *bits) > 32; bits++) 58914869Ssam putchar(c); 59014869Ssam } else 59114869Ssam for (; *bits > 32; bits++) 59214869Ssam ; 59314869Ssam } 59414869Ssam putchar('>'); 59514869Ssam } 59614869Ssam } 59722485Ssklower 59837315Ssklower #define SNS(x) ((struct sockaddr_ns *) &(x)) 59937315Ssklower struct sockaddr_ns *snstab[] = { 60037315Ssklower SNS(ridreq.ifr_addr), SNS(addreq.ifra_addr), 60137315Ssklower SNS(addreq.ifra_mask), SNS(addreq.ifra_broadaddr)}; 60237315Ssklower 60337315Ssklower xns_getaddr(addr, which) 60422485Ssklower char *addr; 60522485Ssklower { 60637315Ssklower struct sockaddr_ns *sns = snstab[which]; 60726101Ssklower struct ns_addr ns_addr(); 60837315Ssklower 60922485Ssklower sns->sns_family = AF_NS; 61037227Ssklower sns->sns_len = sizeof(*sns); 61126101Ssklower sns->sns_addr = ns_addr(addr); 61237315Ssklower if (which == MASK) 61337315Ssklower printf("Attempt to set XNS netmask will be ineffectual\n"); 61422485Ssklower } 61537315Ssklower 61637315Ssklower #define SISO(x) ((struct sockaddr_iso *) &(x)) 61737315Ssklower struct sockaddr_iso *sisotab[] = { 61837315Ssklower SISO(iso_ridreq.ifr_Addr), SISO(iso_addreq.ifra_addr), 61937315Ssklower SISO(iso_addreq.ifra_mask), SISO(iso_addreq.ifra_dstaddr)}; 62037315Ssklower 62137315Ssklower iso_getaddr(addr, which) 62237315Ssklower char *addr; 62337315Ssklower { 62437315Ssklower struct sockaddr_iso *siso = sisotab[which]; 62537315Ssklower struct iso_addr *iso_addr(); 62637315Ssklower siso->siso_addr = *iso_addr(addr); 62737315Ssklower if (which == MASK) { 628*39210Ssklower siso->siso_len = TSEL(siso) - (caddr_t)(siso); 62937315Ssklower siso->siso_nlen = 0; 63037315Ssklower } else { 63137315Ssklower siso->siso_family = AF_ISO; 63237315Ssklower siso->siso_len = sizeof(*siso); 63337315Ssklower } 63437315Ssklower } 635