?? gifconfig.c
字號:
}#endif#define IFFBITS \"\020\1UP\2BROADCAST\3DEBUG\4LOOPBACK\5POINTOPOINT\6NOTRAILERS\7RUNNING\10NOARP\\11PROMISC\12ALLMULTI\13OACTIVE\14SIMPLEX\15LINK0\16LINK1\17LINK2\20MULTICAST"/* * Print the status of the interface. If an address family was * specified, show it and it only; otherwise, show them all. */voidstatus(){ struct afswtch *p = NULL; char *mynext; struct if_msghdr *myifm; printf("%s: ", name); printb("flags", flags, IFFBITS); if (metric) printf(" metric %d", metric); if (mtu) printf(" mtu %d", mtu); putchar('\n'); /* * XXX: Sigh. This is bad, I know. At this point, we may have * *zero* RTM_NEWADDR's, so we have to "feel the water" before * incrementing the loop. One day, I might feel inspired enough * to get the top level loop to pass a count down here so we * dont have to mess with this. -Peter */ myifm = ifm; while (1) { mynext = next + ifm->ifm_msglen; if (mynext >= lim) break; myifm = (struct if_msghdr *)mynext; if (myifm->ifm_type != RTM_NEWADDR) break; next = mynext; ifm = (struct if_msghdr *)next; ifam = (struct ifa_msghdr *)myifm; info.rti_addrs = ifam->ifam_addrs; /* Expand the compacted addresses */ rt_xaddrs((char *)(ifam + 1), ifam->ifam_msglen + (char *)ifam, &info); if (afp) { if (afp->af_af == info.rti_info[RTAX_IFA]->sa_family && afp->af_status != ether_status) { p = afp; if (p->af_status != ether_status) (*p->af_status)(1); } } else for (p = afs; p->af_name; p++) { if (p->af_af == info.rti_info[RTAX_IFA]->sa_family && p->af_status != ether_status) (*p->af_status)(0); } } if (afp == NULL || afp->af_status == ether_status) ether_status(0); else if (afp && !p) { warnx("%s has no %s IFA address!", name, afp->af_name); } phys_status(0);}voidphys_status(force) int force;{ char psrcaddr[256]; char pdstaddr[256]; char hostname[NI_MAXHOST]; int flags = NI_NUMERICHOST; char *af = "";#ifndef SIOCGLIFPHYADDR u_long srccmd, dstcmd; struct ifreq *ifrp;#ifdef INET6 int s6;#endif force = 0; /*fool gcc*/ psrcaddr[0] = pdstaddr[0] = '\0';#ifdef INET6 s6 = socket(AF_INET6, SOCK_DGRAM, 0); if (s6 < 0) { ifrp = 𝔦 srccmd = SIOCGIFPSRCADDR; dstcmd = SIOCGIFPDSTADDR; } else { close(s6); srccmd = SIOCGIFPSRCADDR_IN6; dstcmd = SIOCGIFPDSTADDR_IN6; ifrp = (struct ifreq *)&in6_ifr; }#else /* INET6 */ ifrp = 𝔦 srccmd = SIOCGIFPSRCADDR; dstcmd = SIOCGIFPDSTADDR;#endif /* INET6 */ if (0 <= ioctl(s, srccmd, (caddr_t)ifrp)) { switch (ifrp->ifr_addr.sa_family) { case AF_INET: af = "inet"; break;#ifdef INET6 case AF_INET6: af = "inet6"; break;#endif default: af = ""; break; } if (getnameinfo(&ifrp->ifr_addr, ifrp->ifr_addr.sa_len, psrcaddr, sizeof(psrcaddr), 0, 0, flags) != 0) psrcaddr[0] = '\0'; } if (0 <= ioctl(s, dstcmd, (caddr_t)ifrp)) { if (getnameinfo(&ifrp->ifr_addr, ifrp->ifr_addr.sa_len, pdstaddr, sizeof(pdstaddr), 0, 0, flags) != 0) pdstaddr[0] = '\0'; } printf("\tphysical address %s %s --> %s\n", af, psrcaddr, pdstaddr);#else struct if_laddrreq iflr; force = 0; /*fool gcc*/ psrcaddr[0] = pdstaddr[0] = '\0'; memset(&iflr, 0, sizeof(iflr)); memcpy(iflr.iflr_name, ifr.ifr_name, sizeof(iflr.iflr_name)); if (0 <= ioctl(s, SIOCGLIFPHYADDR, (caddr_t)&iflr)) { switch (iflr.addr.ss_family) { case AF_INET: af = "inet"; break;#ifdef INET6 case AF_INET6: af = "inet6"; break;#endif /* INET6 */ default: af = ""; break; } if (getnameinfo((struct sockaddr *)&iflr.addr, iflr.addr.ss_len, psrcaddr, sizeof(psrcaddr), 0, 0, flags) != 0) psrcaddr[0] = '\0'; if (getnameinfo((struct sockaddr *)&iflr.dstaddr, iflr.dstaddr.ss_len, pdstaddr, sizeof(pdstaddr), 0, 0, flags) != 0) pdstaddr[0] = '\0'; } printf("\tphysical address %s %s --> %s\n", af, psrcaddr, pdstaddr);#endif}voidin_status(force) int force;{ struct sockaddr_in *sin, null_sin;#if 0 char *inet_ntoa();#endif memset(&null_sin, 0, sizeof(null_sin)); sin = (struct sockaddr_in *)info.rti_info[RTAX_IFA]; if (!sin || sin->sin_family != AF_INET) { if (!force) return; /* warnx("%s has no AF_INET IFA address!", name); */ sin = &null_sin; } printf("\tinet %s ", inet_ntoa(sin->sin_addr)); if (flags & IFF_POINTOPOINT) { /* note RTAX_BRD overlap with IFF_BROADCAST */ sin = (struct sockaddr_in *)info.rti_info[RTAX_BRD]; if (!sin) sin = &null_sin; printf("--> %s ", inet_ntoa(sin->sin_addr)); } sin = (struct sockaddr_in *)info.rti_info[RTAX_NETMASK]; if (!sin) sin = &null_sin; printf("netmask 0x%x ", (u_int32_t)ntohl(sin->sin_addr.s_addr)); if (flags & IFF_BROADCAST) { /* note RTAX_BRD overlap with IFF_POINTOPOINT */ sin = (struct sockaddr_in *)info.rti_info[RTAX_BRD]; if (sin && sin->sin_addr.s_addr != 0) printf("broadcast %s", inet_ntoa(sin->sin_addr)); } putchar('\n');}#ifdef INET6voidin6_status(force) int force;{ struct sockaddr_in6 *sin, null_sin; char hostname[NI_MAXHOST]; int niflags = NI_NUMERICHOST; memset(&null_sin, 0, sizeof(null_sin)); sin = (struct sockaddr_in6 *)info.rti_info[RTAX_IFA]; if (!sin || sin->sin6_family != AF_INET6) { if (!force) return; /* warnx("%s has no AF_INET6 IFA address!", name); */ sin = &null_sin; }#ifdef __KAME__ if (IN6_IS_ADDR_LINKLOCAL(&sin->sin6_addr)) { sin->sin6_scope_id = ntohs(*(u_int16_t *)&sin->sin6_addr.s6_addr[2]); sin->sin6_addr.s6_addr[2] = 0; sin->sin6_addr.s6_addr[3] = 0; }#endif getnameinfo((struct sockaddr *)sin, sin->sin6_len, hostname, sizeof(hostname), 0, 0, niflags); printf("\tinet6 %s ", hostname); if (flags & IFF_POINTOPOINT) { /* note RTAX_BRD overlap with IFF_BROADCAST */ sin = (struct sockaddr_in6 *)info.rti_info[RTAX_BRD]; /* * some of ther interfaces do not have valid destination * address. */ if (sin->sin6_family == AF_INET6) {#ifdef __KAME__ if (IN6_IS_ADDR_LINKLOCAL(&sin->sin6_addr)) { sin->sin6_scope_id = ntohs(*(u_int16_t *)&sin->sin6_addr.s6_addr[2]); sin->sin6_addr.s6_addr[2] = 0; sin->sin6_addr.s6_addr[3] = 0; }#endif getnameinfo((struct sockaddr *)sin, sin->sin6_len, hostname, sizeof(hostname), 0, 0, niflags); printf("--> %s ", hostname); } } sin = (struct sockaddr_in6 *)info.rti_info[RTAX_NETMASK]; if (!sin) sin = &null_sin; printf(" prefixlen %d ", prefix(&sin->sin6_addr, sizeof(struct in6_addr))); putchar('\n');}#endif /*INET6*//*ARGSUSED*/voidether_status(dummy) int dummy;{ char *cp; int n; dummy = 0; /*fool gcc*/ cp = (char *)LLADDR(sdl); if ((n = sdl->sdl_alen) > 0) { if (sdl->sdl_type == IFT_ETHER) printf ("\tether "); else printf ("\tlladdr "); while (--n >= 0) printf("%02x%c",*cp++ & 0xff, n>0? ':' : ' '); putchar('\n'); }}voidPerror(cmd) char *cmd;{ switch (errno) { case ENXIO: errx(1, "%s: no such interface", cmd); break; case EPERM: errx(1, "%s: permission denied", cmd); break; default: err(1, "%s", cmd); }}#define SIN(x) ((struct sockaddr_in *) &(x))struct sockaddr_in *sintab[] = {SIN(addreq.ifra_addr), SIN(addreq.ifra_dstaddr)};voidin_getaddr(s, which) char *s; int which;{ register struct sockaddr_in *sin = sintab[which]; struct hostent *hp; struct netent *np; sin->sin_len = sizeof(*sin); sin->sin_family = AF_INET; if (inet_aton(s, &sin->sin_addr)) ; else if ((hp = gethostbyname(s)) != NULL) bcopy(hp->h_addr, (char *)&sin->sin_addr, hp->h_length); else if ((np = getnetbyname(s)) != NULL) sin->sin_addr = inet_makeaddr(np->n_net, INADDR_ANY); else errx(1, "%s: bad value", s);}#ifdef INET6#define SIN6(x) ((struct sockaddr_in6 *) &(x))struct sockaddr_in6 *sin6tab[] = {SIN6(in6_addreq.ifra_addr), SIN6(in6_addreq.ifra_dstaddr)};voidin6_getaddr(s, which) char *s; int which;{ register struct sockaddr_in6 *sin = sin6tab[which]; struct addrinfo hints, *res; int ecode; memset(&hints, 0, sizeof(hints)); hints.ai_family = AF_INET6; if ((ecode = getaddrinfo(s, NULL, NULL, &res)) != 0) errx(1, "error in parsing address string: %s", gai_strerror(ecode)); if (res->ai_addrlen != sizeof(*sin)) errx(1, "%s: bad value", s); memcpy(sin, res->ai_addr, res->ai_addrlen); freeaddrinfo(res);#ifdef __KAME__ /* embed scopeid */ if (sin->sin6_scope_id && (IN6_IS_ADDR_LINKLOCAL(&sin->sin6_addr) || IN6_IS_ADDR_MC_LINKLOCAL(&sin->sin6_addr))) { *(u_int16_t *)&sin->sin6_addr.s6_addr[2] = htons(sin->sin6_scope_id); }#endif}voidin6_getprefix(plen, which) char *plen; int which;{ register struct sockaddr_in6 *sin = sin6tab[which]; register u_char *cp; int len = atoi(plen); if ((len < 0) || (len > 128)) errx(1, "%s: bad value", plen); sin->sin6_len = sizeof(*sin); sin->sin6_family = AF_INET6; if ((len == 0) || (len == 128)) { memset(&sin->sin6_addr, -1, sizeof(struct in6_addr)); return; } for (cp = (u_char *)&sin->sin6_addr; len > 7; len -= 8) *cp++ = -1; *cp = (-1) << (8 - len);}#endif/* * Print a value a la the %b format of the kernel's printf */voidprintb(s, v, bits) char *s; register unsigned int v; register char *bits;{ register int i, any = 0; register char c; if (bits && *bits == 8) printf("%s=%o", s, v & 0xffff); else printf("%s=%x", s, v & 0xffff); bits++; if (bits) { putchar('<'); while ((i = *bits++) != 0) { if ((v & (1 << (i-1))) != 0) { if (any) putchar(','); any = 1; for (; (c = *bits) > 32; bits++) putchar(c); } else for (; *bits > 32; bits++) ; } putchar('>'); }}#ifdef INET6intprefix(val, size) void *val; int size;{ register u_char *name = (u_char *)val; register int byte, bit, plen = 0; for (byte = 0; byte < size; byte++, plen += 8) if (name[byte] != 0xff) break; if (byte == size) return (plen); for (bit = 7; bit != 0; bit--, plen++) if (!(name[byte] & (1 << bit))) break; for (; bit != 0; bit--) if (name[byte] & (1 << bit)) return(0); byte++; for (; byte < size; byte++) if (name[byte]) return(0); return (plen);}#endif /*INET6*/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -