⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gifconfig.c

📁 支持IPv4和IPv6的网卡管理程序
💻 C
📖 第 1 页 / 共 2 页
字号:
}#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 = &ifr;		srccmd = SIOCGIFPSRCADDR;		dstcmd = SIOCGIFPDSTADDR;	} else {		close(s6);		srccmd = SIOCGIFPSRCADDR_IN6;		dstcmd = SIOCGIFPDSTADDR_IN6;		ifrp = (struct ifreq *)&in6_ifr;	}#else /* INET6 */	ifrp = &ifr;	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 + -