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*37315Ssklower static char sccsid[] = "@(#)ifconfig.c 4.23 (Berkeley) 04/07/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 39*37315Ssklower #include <netiso/iso.h> 40*37315Ssklower #include <netiso/iso_var.h> 41*37315Ssklower 4214869Ssam #include <stdio.h> 4314869Ssam #include <errno.h> 4414869Ssam #include <ctype.h> 4514869Ssam #include <netdb.h> 4614869Ssam 4722485Ssklower extern int errno; 48*37315Ssklower struct ifreq ifr, ridreq; 49*37315Ssklower struct ifaliasreq addreq; 50*37315Ssklower struct iso_ifreq iso_ridreq; 51*37315Ssklower struct iso_aliasreq iso_addreq; 52*37315Ssklower struct sockaddr_in netmask; 53*37315Ssklower 5414869Ssam char name[30]; 5521811Skarels int flags; 5626185Skarels int metric; 5716329Skarels int setaddr; 5822485Ssklower int setipdst; 59*37315Ssklower int doalias; 60*37315Ssklower int clearaddr = 1; 61*37315Ssklower int newaddr = 1; 6214869Ssam int s; 6321811Skarels extern int errno; 6414869Ssam 6521811Skarels int setifflags(), setifaddr(), setifdstaddr(), setifnetmask(); 6626185Skarels int setifmetric(), setifbroadaddr(), setifipdst(); 67*37315Ssklower int notealias(), setsnpaoffset(); 6814869Ssam 6921811Skarels #define NEXTARG 0xffffff 7021811Skarels 7114869Ssam struct cmd { 7214869Ssam char *c_name; 7321811Skarels int c_parameter; /* NEXTARG means next argv */ 7414869Ssam int (*c_func)(); 7514869Ssam } cmds[] = { 7614869Ssam { "up", IFF_UP, setifflags } , 7714869Ssam { "down", -IFF_UP, setifflags }, 7814869Ssam { "trailers", -IFF_NOTRAILERS,setifflags }, 7914869Ssam { "-trailers", IFF_NOTRAILERS, setifflags }, 8015359Skarels { "arp", -IFF_NOARP, setifflags }, 8115359Skarels { "-arp", IFF_NOARP, setifflags }, 8215286Sleres { "debug", IFF_DEBUG, setifflags }, 8315286Sleres { "-debug", -IFF_DEBUG, setifflags }, 84*37315Ssklower { "alias", IFF_UP, notealias }, 85*37315Ssklower { "-alias", -IFF_UP, notealias }, 86*37315Ssklower { "delete", -IFF_UP, notealias }, 8715004Ssam #ifdef notdef 8821811Skarels #define EN_SWABIPS 0x1000 8915004Ssam { "swabips", EN_SWABIPS, setifflags }, 9015004Ssam { "-swabips", -EN_SWABIPS, setifflags }, 9115004Ssam #endif 9221811Skarels { "netmask", NEXTARG, setifnetmask }, 9326185Skarels { "metric", NEXTARG, setifmetric }, 94*37315Ssklower { "snpaoffset", NEXTARG, setsnpaoffset }, 9521811Skarels { "broadcast", NEXTARG, setifbroadaddr }, 9622485Ssklower { "ipdst", NEXTARG, setifipdst }, 9714869Ssam { 0, 0, setifaddr }, 9817218Stef { 0, 0, setifdstaddr }, 9914869Ssam }; 10014869Ssam 10122485Ssklower /* 10222485Ssklower * XNS support liberally adapted from 10322485Ssklower * code written at the University of Maryland 10422485Ssklower * principally by James O'Toole and Chris Torek. 10522485Ssklower */ 10622485Ssklower int in_status(), in_getaddr(); 10722485Ssklower int xns_status(), xns_getaddr(); 108*37315Ssklower int iso_status(), iso_getaddr(); 10922485Ssklower 11022485Ssklower /* Known address families */ 11122485Ssklower struct afswtch { 11222485Ssklower char *af_name; 11322485Ssklower short af_af; 11422485Ssklower int (*af_status)(); 11522485Ssklower int (*af_getaddr)(); 116*37315Ssklower int af_difaddr; 117*37315Ssklower int af_aifaddr; 118*37315Ssklower caddr_t af_ridreq; 119*37315Ssklower caddr_t af_addreq; 12022485Ssklower } afs[] = { 121*37315Ssklower #define C(x) ((caddr_t) &x) 122*37315Ssklower { "inet", AF_INET, in_status, in_getaddr, 123*37315Ssklower SIOCDIFADDR, SIOCAIFADDR, C(ridreq), C(addreq) }, 124*37315Ssklower { "ns", AF_NS, xns_status, xns_getaddr, 125*37315Ssklower SIOCDIFADDR, SIOCAIFADDR, C(ridreq), C(addreq) }, 126*37315Ssklower { "iso", AF_ISO, iso_status, iso_getaddr, 127*37315Ssklower SIOCDIFADDR_ISO, SIOCAIFADDR_ISO, C(iso_ridreq), C(iso_addreq) }, 128*37315Ssklower { 0, 0, 0, 0 } 12922485Ssklower }; 13022485Ssklower 13122485Ssklower struct afswtch *afp; /*the address family being set or asked about*/ 13222485Ssklower 133*37315Ssklower int testing = 0; 134*37315Ssklower Ioctl(a,b,c) { 135*37315Ssklower int error = 0; 136*37315Ssklower if (testing) 137*37315Ssklower printf("would call ioctl with %x, %x, %x\n", a, b, c); 138*37315Ssklower else 139*37315Ssklower error = ioctl(a, b, c); 140*37315Ssklower return error; 141*37315Ssklower } 142*37315Ssklower #define ioctl(a, b, c) Ioctl(a,b,c) 143*37315Ssklower 14414869Ssam main(argc, argv) 14514869Ssam int argc; 14614869Ssam char *argv[]; 14714869Ssam { 14822485Ssklower int af = AF_INET; 149*37315Ssklower register struct afswtch *rafp; 15027061Skarels 15114869Ssam if (argc < 2) { 15230789Sbostic fprintf(stderr, "usage: ifconfig interface\n%s%s%s%s%s", 15326185Skarels "\t[ af [ address [ dest_addr ] ] [ up ] [ down ]", 15426185Skarels "[ netmask mask ] ]\n", 15526185Skarels "\t[ metric n ]\n", 15626185Skarels "\t[ trailers | -trailers ]\n", 15726185Skarels "\t[ arp | -arp ]\n"); 15814869Ssam exit(1); 15914869Ssam } 16022485Ssklower argc--, argv++; 16124248Ssklower strncpy(name, *argv, sizeof(name)); 16222485Ssklower strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name)); 16322485Ssklower argc--, argv++; 16422485Ssklower if (argc > 0) { 165*37315Ssklower for (afp = rafp = afs; rafp->af_name; rafp++) 166*37315Ssklower if (strcmp(rafp->af_name, *argv) == 0) { 167*37315Ssklower afp = rafp; argc--; argv++; 16822485Ssklower break; 16922485Ssklower } 170*37315Ssklower rafp = afp; 171*37315Ssklower af = ifr.ifr_addr.sa_family = rafp->af_af; 17222485Ssklower } 17322485Ssklower s = socket(af, SOCK_DGRAM, 0); 17414869Ssam if (s < 0) { 17514869Ssam perror("ifconfig: socket"); 17614869Ssam exit(1); 17714869Ssam } 17814869Ssam if (ioctl(s, SIOCGIFFLAGS, (caddr_t)&ifr) < 0) { 17914869Ssam Perror("ioctl (SIOCGIFFLAGS)"); 18014869Ssam exit(1); 18114869Ssam } 18222485Ssklower strncpy(ifr.ifr_name, name, sizeof ifr.ifr_name); 18321811Skarels flags = ifr.ifr_flags; 18426185Skarels if (ioctl(s, SIOCGIFMETRIC, (caddr_t)&ifr) < 0) 18526185Skarels perror("ioctl (SIOCGIFMETRIC)"); 18626185Skarels else 18726185Skarels metric = ifr.ifr_metric; 18814869Ssam if (argc == 0) { 18914869Ssam status(); 19014869Ssam exit(0); 19114869Ssam } 19214869Ssam while (argc > 0) { 19314869Ssam register struct cmd *p; 19414869Ssam 19514869Ssam for (p = cmds; p->c_name; p++) 19614869Ssam if (strcmp(*argv, p->c_name) == 0) 19714869Ssam break; 19817218Stef if (p->c_name == 0 && setaddr) 19917218Stef p++; /* got src, do dst */ 20021811Skarels if (p->c_func) { 20121811Skarels if (p->c_parameter == NEXTARG) { 20221811Skarels (*p->c_func)(argv[1]); 20321811Skarels argc--, argv++; 20421811Skarels } else 20521811Skarels (*p->c_func)(*argv, p->c_parameter); 20621811Skarels } 20714869Ssam argc--, argv++; 20814869Ssam } 209*37315Ssklower if (clearaddr) { 210*37315Ssklower int ret; 211*37315Ssklower strncpy(rafp->af_ridreq, name, sizeof ifr.ifr_name); 212*37315Ssklower if ((ret = ioctl(s, rafp->af_difaddr, rafp->af_ridreq)) < 0) { 213*37315Ssklower if (errno == EADDRNOTAVAIL && (doalias >= 0)) { 214*37315Ssklower /* means no previous address for interface */ 215*37315Ssklower } else 216*37315Ssklower Perror("ioctl (SIOCDIFADDR)"); 217*37315Ssklower } 21821811Skarels } 21922485Ssklower if (setipdst && af==AF_NS) { 22022485Ssklower struct nsip_req rq; 22122485Ssklower int size = sizeof(rq); 22222485Ssklower 223*37315Ssklower rq.rq_ns = addreq.ifra_addr; 224*37315Ssklower rq.rq_ip = addreq.ifra_dstaddr; 22522485Ssklower 22622485Ssklower if (setsockopt(s, 0, SO_NSIP_ROUTE, &rq, size) < 0) 22722485Ssklower Perror("Encapsulation Routing"); 228*37315Ssklower newaddr = 0; 22922485Ssklower } 230*37315Ssklower if (newaddr) { 231*37315Ssklower strncpy(rafp->af_addreq, name, sizeof ifr.ifr_name); 232*37315Ssklower if (ioctl(s, rafp->af_aifaddr, rafp->af_addreq) < 0) 233*37315Ssklower Perror("ioctl (SIOCAIFADDR)"); 23416329Skarels } 23514869Ssam exit(0); 23614869Ssam } 237*37315Ssklower #define RIDADDR 0 238*37315Ssklower #define ADDR 1 239*37315Ssklower #define MASK 2 240*37315Ssklower #define DSTADDR 3 24114869Ssam 24214869Ssam /*ARGSUSED*/ 24314869Ssam setifaddr(addr, param) 24414869Ssam char *addr; 24522485Ssklower short param; 24614869Ssam { 24716329Skarels /* 24816329Skarels * Delay the ioctl to set the interface addr until flags are all set. 24916329Skarels * The address interpretation may depend on the flags, 25016329Skarels * and the flags may change when the address is set. 25115390Skarels */ 25216329Skarels setaddr++; 253*37315Ssklower (*afp->af_getaddr)(addr, (doalias >= 0 ? ADDR : RIDADDR)); 25414869Ssam } 25514869Ssam 25621811Skarels setifnetmask(addr) 25721811Skarels char *addr; 25821811Skarels { 259*37315Ssklower (*afp->af_getaddr)(addr, MASK); 26021811Skarels } 26121811Skarels 26221811Skarels setifbroadaddr(addr) 26321811Skarels char *addr; 26421811Skarels { 265*37315Ssklower (*afp->af_getaddr)(addr, DSTADDR); 26621811Skarels } 26721811Skarels 26822485Ssklower setifipdst(addr) 26922485Ssklower char *addr; 27022485Ssklower { 271*37315Ssklower in_getaddr(addr, DSTADDR); 27222485Ssklower setipdst++; 27322485Ssklower } 27422485Ssklower 27517218Stef /*ARGSUSED*/ 276*37315Ssklower notealias(addr, param) 277*37315Ssklower char *addr; 278*37315Ssklower { 279*37315Ssklower doalias = param; 280*37315Ssklower if (param > 0) 281*37315Ssklower clearaddr = 0; 282*37315Ssklower else 283*37315Ssklower newaddr = 0; 284*37315Ssklower } 285*37315Ssklower 286*37315Ssklower /*ARGSUSED*/ 28717218Stef setifdstaddr(addr, param) 28817218Stef char *addr; 28917218Stef int param; 29017218Stef { 29117218Stef 292*37315Ssklower (*afp->af_getaddr)(addr, DSTADDR); 29317218Stef } 29417218Stef 29514870Ssam setifflags(vname, value) 29614870Ssam char *vname; 29722485Ssklower short value; 29814869Ssam { 29922485Ssklower if (ioctl(s, SIOCGIFFLAGS, (caddr_t)&ifr) < 0) { 30022485Ssklower Perror("ioctl (SIOCGIFFLAGS)"); 30122485Ssklower exit(1); 30222485Ssklower } 30322485Ssklower strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); 30422485Ssklower flags = ifr.ifr_flags; 30514869Ssam 30614869Ssam if (value < 0) { 30714869Ssam value = -value; 30821811Skarels flags &= ~value; 30914869Ssam } else 31021811Skarels flags |= value; 31121811Skarels ifr.ifr_flags = flags; 31214869Ssam if (ioctl(s, SIOCSIFFLAGS, (caddr_t)&ifr) < 0) 31314870Ssam Perror(vname); 31414869Ssam } 31514869Ssam 31626185Skarels setifmetric(val) 31726185Skarels char *val; 31826185Skarels { 31926185Skarels strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); 32026185Skarels ifr.ifr_metric = atoi(val); 32126185Skarels if (ioctl(s, SIOCSIFMETRIC, (caddr_t)&ifr) < 0) 32226185Skarels perror("ioctl (set metric)"); 32326185Skarels } 32426185Skarels 325*37315Ssklower setsnpaoffset(val) 326*37315Ssklower char *val; 327*37315Ssklower { 328*37315Ssklower iso_addreq.ifra_snpaoffset = atoi(val); 329*37315Ssklower } 330*37315Ssklower 33126185Skarels #define IFFBITS \ 33226185Skarels "\020\1UP\2BROADCAST\3DEBUG\4LOOPBACK\5POINTOPOINT\6NOTRAILERS\7RUNNING\10NOARP\ 33326185Skarels " 33426185Skarels 33522485Ssklower /* 33622485Ssklower * Print the status of the interface. If an address family was 33722485Ssklower * specified, show it and it only; otherwise, show them all. 33822485Ssklower */ 33914869Ssam status() 34014869Ssam { 34122485Ssklower register struct afswtch *p = afp; 34222485Ssklower short af = ifr.ifr_addr.sa_family; 34322485Ssklower 34426185Skarels printf("%s: ", name); 34526185Skarels printb("flags", flags, IFFBITS); 34626185Skarels if (metric) 34726185Skarels printf(" metric %d", metric); 34826185Skarels putchar('\n'); 34922485Ssklower if ((p = afp) != NULL) { 35028468Skarels (*p->af_status)(1); 35128468Skarels } else for (p = afs; p->af_name; p++) { 35222485Ssklower ifr.ifr_addr.sa_family = p->af_af; 35328468Skarels (*p->af_status)(0); 35422485Ssklower } 35522485Ssklower } 35622485Ssklower 35728468Skarels in_status(force) 35828468Skarels int force; 35922485Ssklower { 36014869Ssam struct sockaddr_in *sin; 36122485Ssklower char *inet_ntoa(); 36214869Ssam 36327061Skarels strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); 36421811Skarels if (ioctl(s, SIOCGIFADDR, (caddr_t)&ifr) < 0) { 36528468Skarels if (errno == EADDRNOTAVAIL || errno == EAFNOSUPPORT) { 36628468Skarels if (!force) 36728468Skarels return; 36821811Skarels bzero((char *)&ifr.ifr_addr, sizeof(ifr.ifr_addr)); 36928468Skarels } else 37028468Skarels perror("ioctl (SIOCGIFADDR)"); 37121811Skarels } 37214869Ssam sin = (struct sockaddr_in *)&ifr.ifr_addr; 37326429Skarels printf("\tinet %s ", inet_ntoa(sin->sin_addr)); 37428468Skarels strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); 37528468Skarels if (ioctl(s, SIOCGIFNETMASK, (caddr_t)&ifr) < 0) { 37628468Skarels if (errno != EADDRNOTAVAIL) 37728468Skarels perror("ioctl (SIOCGIFNETMASK)"); 37828468Skarels bzero((char *)&ifr.ifr_addr, sizeof(ifr.ifr_addr)); 37928468Skarels } else 38028468Skarels netmask.sin_addr = 38128468Skarels ((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr; 38217218Stef if (flags & IFF_POINTOPOINT) { 38321811Skarels if (ioctl(s, SIOCGIFDSTADDR, (caddr_t)&ifr) < 0) { 38421811Skarels if (errno == EADDRNOTAVAIL) 38521811Skarels bzero((char *)&ifr.ifr_addr, sizeof(ifr.ifr_addr)); 38621811Skarels else 38728468Skarels perror("ioctl (SIOCGIFDSTADDR)"); 38821811Skarels } 38922485Ssklower strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); 39017218Stef sin = (struct sockaddr_in *)&ifr.ifr_dstaddr; 39117218Stef printf("--> %s ", inet_ntoa(sin->sin_addr)); 39217218Stef } 39321811Skarels printf("netmask %x ", ntohl(netmask.sin_addr.s_addr)); 39421811Skarels if (flags & IFF_BROADCAST) { 39521811Skarels if (ioctl(s, SIOCGIFBRDADDR, (caddr_t)&ifr) < 0) { 39621811Skarels if (errno == EADDRNOTAVAIL) 39728468Skarels bzero((char *)&ifr.ifr_addr, sizeof(ifr.ifr_addr)); 39828468Skarels else 39928468Skarels perror("ioctl (SIOCGIFADDR)"); 40021811Skarels } 40122485Ssklower strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); 40221811Skarels sin = (struct sockaddr_in *)&ifr.ifr_addr; 40328468Skarels if (sin->sin_addr.s_addr != 0) 40428468Skarels printf("broadcast %s", inet_ntoa(sin->sin_addr)); 40521811Skarels } 40626185Skarels putchar('\n'); 40714869Ssam } 40814869Ssam 40922485Ssklower 41028468Skarels xns_status(force) 41128468Skarels int force; 41222485Ssklower { 41322485Ssklower struct sockaddr_ns *sns; 41422485Ssklower 41522485Ssklower close(s); 41622485Ssklower s = socket(AF_NS, SOCK_DGRAM, 0); 41722485Ssklower if (s < 0) { 41830692Smckusick if (errno == EPROTONOSUPPORT) 41924248Ssklower return; 42022485Ssklower perror("ifconfig: socket"); 42122485Ssklower exit(1); 42222485Ssklower } 42322485Ssklower if (ioctl(s, SIOCGIFADDR, (caddr_t)&ifr) < 0) { 42428468Skarels if (errno == EADDRNOTAVAIL || errno == EAFNOSUPPORT) { 42528468Skarels if (!force) 42628468Skarels return; 42728468Skarels bzero((char *)&ifr.ifr_addr, sizeof(ifr.ifr_addr)); 42828468Skarels } else 42928468Skarels perror("ioctl (SIOCGIFADDR)"); 43022485Ssklower } 43122485Ssklower strncpy(ifr.ifr_name, name, sizeof ifr.ifr_name); 43222485Ssklower sns = (struct sockaddr_ns *)&ifr.ifr_addr; 43326185Skarels printf("\tns %s ", ns_ntoa(sns->sns_addr)); 43426101Ssklower if (flags & IFF_POINTOPOINT) { /* by W. Nesheim@Cornell */ 43526101Ssklower if (ioctl(s, SIOCGIFDSTADDR, (caddr_t)&ifr) < 0) { 43626101Ssklower if (errno == EADDRNOTAVAIL) 43726101Ssklower bzero((char *)&ifr.ifr_addr, sizeof(ifr.ifr_addr)); 43826101Ssklower else 43926101Ssklower Perror("ioctl (SIOCGIFDSTADDR)"); 44026101Ssklower } 44126101Ssklower strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); 44226101Ssklower sns = (struct sockaddr_ns *)&ifr.ifr_dstaddr; 44326101Ssklower printf("--> %s ", ns_ntoa(sns->sns_addr)); 44426101Ssklower } 44522485Ssklower putchar('\n'); 44622485Ssklower } 44722485Ssklower 448*37315Ssklower iso_status(force) 449*37315Ssklower int force; 450*37315Ssklower { 451*37315Ssklower struct sockaddr_iso *siso; 452*37315Ssklower struct iso_ifreq ifr; 453*37315Ssklower 454*37315Ssklower close(s); 455*37315Ssklower s = socket(AF_ISO, SOCK_DGRAM, 0); 456*37315Ssklower if (s < 0) { 457*37315Ssklower if (errno == EPROTONOSUPPORT) 458*37315Ssklower return; 459*37315Ssklower perror("ifconfig: socket"); 460*37315Ssklower exit(1); 461*37315Ssklower } 462*37315Ssklower if (ioctl(s, SIOCGIFADDR, (caddr_t)&ifr) < 0) { 463*37315Ssklower if (errno == EADDRNOTAVAIL || errno == EAFNOSUPPORT) { 464*37315Ssklower if (!force) 465*37315Ssklower return; 466*37315Ssklower bzero((char *)&ifr.ifr_Addr, sizeof(ifr.ifr_Addr)); 467*37315Ssklower } else 468*37315Ssklower perror("ioctl (SIOCGIFADDR)"); 469*37315Ssklower } 470*37315Ssklower strncpy(ifr.ifr_name, name, sizeof ifr.ifr_name); 471*37315Ssklower siso = &ifr.ifr_Addr; 472*37315Ssklower printf("\tiso %s ", iso_ntoa(siso->siso_addr)); 473*37315Ssklower if (ioctl(s, SIOCGIFNETMASK, (caddr_t)&ifr) < 0) { 474*37315Ssklower if (errno != EADDRNOTAVAIL) 475*37315Ssklower perror("ioctl (SIOCGIFNETMASK)"); 476*37315Ssklower } else { 477*37315Ssklower printf("\n netmask %s ", iso_ntoa(siso->siso_addr)); 478*37315Ssklower } 479*37315Ssklower if (flags & IFF_POINTOPOINT) { 480*37315Ssklower if (ioctl(s, SIOCGIFDSTADDR, (caddr_t)&ifr) < 0) { 481*37315Ssklower if (errno == EADDRNOTAVAIL) 482*37315Ssklower bzero((char *)&ifr.ifr_Addr, sizeof(ifr.ifr_Addr)); 483*37315Ssklower else 484*37315Ssklower Perror("ioctl (SIOCGIFDSTADDR)"); 485*37315Ssklower } 486*37315Ssklower strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name)); 487*37315Ssklower siso = &ifr.ifr_Addr; 488*37315Ssklower printf("--> %s ", iso_ntoa(siso->siso_addr)); 489*37315Ssklower } 490*37315Ssklower putchar('\n'); 491*37315Ssklower } 492*37315Ssklower 49314869Ssam Perror(cmd) 49414869Ssam char *cmd; 49514869Ssam { 49614869Ssam extern int errno; 49714869Ssam 49814869Ssam fprintf(stderr, "ifconfig: "); 49914869Ssam switch (errno) { 50014869Ssam 50114869Ssam case ENXIO: 50222485Ssklower fprintf(stderr, "%s: no such interface\n", cmd); 50314869Ssam break; 50414869Ssam 50514869Ssam case EPERM: 50616822Slepreau fprintf(stderr, "%s: permission denied\n", cmd); 50714869Ssam break; 50814869Ssam 50914869Ssam default: 51014869Ssam perror(cmd); 51114869Ssam } 51214869Ssam exit(1); 51314869Ssam } 51414869Ssam 51514869Ssam struct in_addr inet_makeaddr(); 51614869Ssam 517*37315Ssklower #define SIN(x) ((struct sockaddr_in *) &(x)) 518*37315Ssklower struct sockaddr_in *sintab[] = { 519*37315Ssklower SIN(ridreq.ifr_addr), SIN(addreq.ifra_addr), 520*37315Ssklower SIN(addreq.ifra_mask), SIN(addreq.ifra_broadaddr)}; 521*37315Ssklower 522*37315Ssklower in_getaddr(s, which) 52314869Ssam char *s; 52414869Ssam { 525*37315Ssklower register struct sockaddr_in *sin = sintab[which]; 52614869Ssam struct hostent *hp; 52714869Ssam struct netent *np; 52814869Ssam int val; 52914869Ssam 530*37315Ssklower if (which == MASK) 531*37315Ssklower sin->sin_len = 8; 532*37315Ssklower else { 533*37315Ssklower sin->sin_family = AF_INET; 534*37315Ssklower sin->sin_len = sizeof(*sin); 535*37315Ssklower } 53621811Skarels val = inet_addr(s); 53721811Skarels if (val != -1) { 53821811Skarels sin->sin_addr.s_addr = val; 53921811Skarels return; 54021811Skarels } 54114869Ssam hp = gethostbyname(s); 54214869Ssam if (hp) { 54314869Ssam sin->sin_family = hp->h_addrtype; 54414869Ssam bcopy(hp->h_addr, (char *)&sin->sin_addr, hp->h_length); 54514869Ssam return; 54614869Ssam } 54714869Ssam np = getnetbyname(s); 54814869Ssam if (np) { 54914869Ssam sin->sin_family = np->n_addrtype; 55014869Ssam sin->sin_addr = inet_makeaddr(np->n_net, INADDR_ANY); 55114869Ssam return; 55214869Ssam } 55314869Ssam fprintf(stderr, "%s: bad value\n", s); 55414869Ssam exit(1); 55514869Ssam } 55614869Ssam 55714869Ssam /* 55814869Ssam * Print a value a la the %b format of the kernel's printf 55914869Ssam */ 56014869Ssam printb(s, v, bits) 56114869Ssam char *s; 56214869Ssam register char *bits; 56314869Ssam register unsigned short v; 56414869Ssam { 56514869Ssam register int i, any = 0; 56614869Ssam register char c; 56714869Ssam 56814869Ssam if (bits && *bits == 8) 56914869Ssam printf("%s=%o", s, v); 57014869Ssam else 57114869Ssam printf("%s=%x", s, v); 57214869Ssam bits++; 57314869Ssam if (bits) { 57414869Ssam putchar('<'); 57514869Ssam while (i = *bits++) { 57614869Ssam if (v & (1 << (i-1))) { 57714869Ssam if (any) 57814869Ssam putchar(','); 57914869Ssam any = 1; 58014869Ssam for (; (c = *bits) > 32; bits++) 58114869Ssam putchar(c); 58214869Ssam } else 58314869Ssam for (; *bits > 32; bits++) 58414869Ssam ; 58514869Ssam } 58614869Ssam putchar('>'); 58714869Ssam } 58814869Ssam } 58922485Ssklower 590*37315Ssklower #define SNS(x) ((struct sockaddr_ns *) &(x)) 591*37315Ssklower struct sockaddr_ns *snstab[] = { 592*37315Ssklower SNS(ridreq.ifr_addr), SNS(addreq.ifra_addr), 593*37315Ssklower SNS(addreq.ifra_mask), SNS(addreq.ifra_broadaddr)}; 594*37315Ssklower 595*37315Ssklower xns_getaddr(addr, which) 59622485Ssklower char *addr; 59722485Ssklower { 598*37315Ssklower struct sockaddr_ns *sns = snstab[which]; 59926101Ssklower struct ns_addr ns_addr(); 600*37315Ssklower 60122485Ssklower sns->sns_family = AF_NS; 60237227Ssklower sns->sns_len = sizeof(*sns); 60326101Ssklower sns->sns_addr = ns_addr(addr); 604*37315Ssklower if (which == MASK) 605*37315Ssklower printf("Attempt to set XNS netmask will be ineffectual\n"); 60622485Ssklower } 607*37315Ssklower 608*37315Ssklower #define SISO(x) ((struct sockaddr_iso *) &(x)) 609*37315Ssklower struct sockaddr_iso *sisotab[] = { 610*37315Ssklower SISO(iso_ridreq.ifr_Addr), SISO(iso_addreq.ifra_addr), 611*37315Ssklower SISO(iso_addreq.ifra_mask), SISO(iso_addreq.ifra_dstaddr)}; 612*37315Ssklower 613*37315Ssklower iso_getaddr(addr, which) 614*37315Ssklower char *addr; 615*37315Ssklower { 616*37315Ssklower struct sockaddr_iso *siso = sisotab[which]; 617*37315Ssklower struct iso_addr *iso_addr(); 618*37315Ssklower siso->siso_addr = *iso_addr(addr); 619*37315Ssklower if (which == MASK) { 620*37315Ssklower siso->siso_len = siso->siso_nlen + 5; 621*37315Ssklower siso->siso_nlen = 0; 622*37315Ssklower } else { 623*37315Ssklower siso->siso_family = AF_ISO; 624*37315Ssklower siso->siso_len = sizeof(*siso); 625*37315Ssklower } 626*37315Ssklower } 627