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

📄 ifconfig.c

📁 一个基于linux的TCP/IP协议栈的实现
💻 C
📖 第 1 页 / 共 2 页
字号:
/* ifconfig.c copied from net-tools * linqianghe@163.com * 2006-10-19 */ #define DFLT_AF "myinet"#include "config.h"#include "af_inet.h"#include "log.h"#include <features.h>#include <sys/types.h>#include <sys/socket.h>#include <sys/ioctl.h>#include <netinet/in.h>#include <stdio.h>#include <errno.h>#include <fcntl.h>#include <ctype.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <netdb.h>#include <stdio.h>/* Ugh.  But libc5 doesn't provide POSIX types.  */#include <asm/types.h>#ifdef HAVE_HWSLIP#include <linux/if_slip.h>#endif#include "interface.h"#include "sockets.h"#include "net-support.h"#include "util.h"extern struct aftype myinet_aftype;char *Release = "ipv4-module 2.0", *Version = "ifconfig 1.42 (2006-10-19)";int opt_a = 0;			/* show all interfaces          */int opt_i = 0;			/* show the statistics          */int opt_v = 0;			/* debugging output flag        */int addr_family = 0;		/* currently selected AF        */static int if_print(char *ifname){	int res;	if( ife_short )		printf( "Iface   MTU Met    RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg\n" );	if( !ifname ){		res = for_all_interfaces( do_if_print, &opt_a );	}else{		struct interface *ife;		ife = lookup_interface(ifname);		res = do_if_fetch(ife); 		if (res >= 0) 			ife_print(ife);	}	return res; }static void version(void){	fprintf(stderr, "%s\n%s\n", Release, Version);	exit(0);}static void usage(void){	fprintf(stderr, "Usage:\n  ifconfig [-a] [-i] [-v] [-s] <interface> [[<AF>] <address>]\n");	fprintf(stderr, "  [add <address>[/<prefixlen>]]\n");	fprintf(stderr, "  [del <address>[/<prefixlen>]]\n");	fprintf(stderr, "  [[-]broadcast [<address>]]  [[-]pointopoint [<address>]]\n");	fprintf(stderr, "  [netmask <address>]  [dstaddr <address>]  [tunnel <address>]\n");	fprintf(stderr, "  [hw <HW> <address>]  [metric <NN>]  [mtu <NN>]\n");	fprintf(stderr, "  [[-]trailers]  [[-]arp]  [[-]allmulti]\n");	fprintf(stderr, "  [multicast]  [[-]promisc]\n");	fprintf(stderr, "  [mem_start <NN>]  [io_addr <NN>]  [irq <NN>]  [media <type>]\n");	fprintf(stderr, "  [txqueuelen <NN>]\n");	fprintf(stderr, "  [[-]dynamic]\n");	fprintf(stderr, "  [up|down] ...\n\n");	fprintf(stderr, "  <HW>=Hardware Type.\n");	fprintf(stderr, "  List of possible hardware types:\n");	print_hwlist(0); /* 1 = ARPable */	fprintf(stderr, "  <AF>=Address family. Default: %s\n", DFLT_AF);	fprintf(stderr, "  List of possible address families:\n");	print_aflist(0); /* 1 = routeable */	exit(E_USAGE);}static int set_flag(char *ifname, short flag){	struct ifreq ifr;	safe_strncpy(ifr.ifr_name, ifname, IFNAMSIZ);	if( ioctl(skfd, SIOCGIFFLAGS, &ifr) < 0 ){		PR_ERR( "%s: unknown interface: %s\n", ifname, strerror(errno) );		return (-1);	}	safe_strncpy(ifr.ifr_name, ifname, IFNAMSIZ);	ifr.ifr_flags |= flag;	if( ioctl(skfd, SIOCSIFFLAGS, &ifr) < 0 ){		PR_ERR( "SIOCSIFFLAGS: %s", strerror(errno) );		return -1;	}	return (0);}static int clr_flag(char *ifname, short flag){	struct ifreq ifr;	int fd;	if( strchr(ifname, ':') ){		fd = get_socket_for_af( MY_AF_INET);		if (fd < 0) {			PR_ERR( "No support for MYINET on this system.\n" );			return -1;		}	}else		fd = skfd;	safe_strncpy(ifr.ifr_name, ifname, IFNAMSIZ);	if (ioctl(fd, SIOCGIFFLAGS, &ifr) < 0) {		PR_ERR( "%s: unknown interface: %s\n", ifname, strerror(errno) );		return -1;	}	safe_strncpy(ifr.ifr_name, ifname, IFNAMSIZ);	ifr.ifr_flags &= ~flag;	if( ioctl(fd, SIOCSIFFLAGS, &ifr) < 0 ){		PR_ERR( "SIOCSIFFLAGS: %s", strerror(errno) );		return -1;	}	return (0);}static int set_netmask(int skfd, struct ifreq *ifr, struct sockaddr *sa){	int err = 0;	memcpy((char *) &ifr->ifr_netmask, (char *) sa, sizeof(struct sockaddr));	if( ioctl(skfd, SIOCSIFNETMASK, ifr) < 0 ){		fprintf(stderr, "SIOCSIFNETMASK: %s\n", strerror(errno));		err = 1;	}	return 0;}static int get_nmbc_parent(char *parent, unsigned long *nm, unsigned long *bc){	struct interface *i;	struct sockaddr_in *sin;	i = lookup_interface( parent );	if( !i )		return -1;	if( do_if_fetch(i) < 0 )		return 0;	sin = (struct sockaddr_in *)&i->netmask;	memcpy( nm, &sin->sin_addr.s_addr, sizeof(unsigned long) );	sin = (struct sockaddr_in *)&i->broadaddr;	memcpy( bc, &sin->sin_addr.s_addr, sizeof(unsigned long) );	return 0;}struct ifcmd {	int flag;	unsigned long addr;	char *base;	int baselen;};static unsigned char searcher[256];static int set_ip_using(const char *name, int c, unsigned long ip){	struct ifreq ifr;	struct sockaddr_in sin;	safe_strncpy( ifr.ifr_name, name, IFNAMSIZ );	memset(&sin, 0, sizeof(struct sockaddr));	sin.sin_family = MY_AF_INET;	sin.sin_addr.s_addr = ip;	memcpy(&ifr.ifr_addr, &sin, sizeof(struct sockaddr));	if( ioctl(skfd, c, &ifr) < 0 )		return -1;	return 0;}static int do_ifcmd(struct interface *x, struct ifcmd *ptr){	char *z, *e;	struct sockaddr_in *sin;	int i;	if (do_if_fetch(x) < 0)		return 0;	if( strncmp(x->name, ptr->base, ptr->baselen) != 0 )		return 0;	z = strchr(x->name, ':');	if( !z || !*z )		return 0;	z++;	for( e = z; *e; e++ )		if( *e == '-' )			return 0;	i = atoi(z);	if (i < 0 || i > 255)		abort();	searcher[i] = 1;	sin = (struct sockaddr_in *)&x->dstaddr;	if( sin->sin_addr.s_addr != ptr->addr ){		return 0;	}	if( ptr->flag ){		if (set_flag(x->name, IFF_UP | IFF_RUNNING) == -1)			return -1;	}else{		if( clr_flag(x->name, IFF_UP) == -1 )			return -1;	}	return 1;}static int set_ifstate(char *parent, unsigned long ip,				unsigned long nm, unsigned long bc,				int flag){	char buf[IFNAMSIZ];	struct ifcmd pt;	int i;	pt.base = parent;	pt.baselen = strlen(parent);	pt.addr = ip;	pt.flag = flag;	memset(searcher, 0, sizeof(searcher));	i = for_all_interfaces((int (*)(struct interface *,void *))do_ifcmd,					&pt);	if( i == -1 )		return -1;	if( i == 1 )		return 0;	for( i = 0; i < 256; i++ )		if( searcher[i] == 0 )			break;	if( i == 256 )		return -1;	if( snprintf(buf, IFNAMSIZ, "%s:%d", parent, i) > IFNAMSIZ )		return -1;	if( set_ip_using(buf, SIOCSIFADDR, ip) == -1 )		return -1;	if( set_ip_using(buf, SIOCSIFNETMASK, nm) == -1 )		return -1;	if( set_ip_using(buf, SIOCSIFBRDADDR, bc) == -1 )		return -1;	if( set_flag(buf, IFF_BROADCAST) == -1 )		return -1;	return 0;}int main( int argc, char **argv ){	struct sockaddr sa;	struct sockaddr_in sin;	char **spp;	struct ifreq ifr;	struct aftype *ap;	struct hwtype *hw;	int goterr = 0, didnetmask = 0;	char host[128];	int fd;	argc--;	argv++;	while( argc && *argv[0] == '-' ){		if( !strcmp(*argv, "-a") )			opt_a = 1;		else if( !strcmp(*argv, "-s") )			ife_short = 1;		else if (!strcmp(*argv, "-v"))        	opt_v = 1;		else if( !strcmp(*argv, "-V") || !strcmp(*argv, "-version") ||						!strcmp(*argv, "--version"))			version();		else if( !strcmp(*argv, "-?") || !strcmp(*argv, "-h") ||						!strcmp(*argv, "-help") || !strcmp(*argv, "--help") )			usage();		else{			fprintf(stderr, "ifconfig: option `%s' not recognised.\n", argv[0]);			fprintf(stderr, "ifconfig: `--help' gives usage information.\n");			exit(1);		}		argv++;		argc--;	}	if( (skfd = sockets_open(0)) < 0 ){		PR_ERR( "socket: %s\n", strerror(errno) );		exit(1);	}	if( argc == 0 ){		int err = if_print( (char *) NULL );		(void)close(skfd);		exit(err < 0);	}	spp = argv;	safe_strncpy(ifr.ifr_name, *spp++, IFNAMSIZ);	if( *spp == (char *) NULL ){		int err = if_print( ifr.ifr_name );		(void) close(skfd);		exit(err < 0);	}	if( (ap = get_aftype(*spp)) != NULL )		spp++;	else		ap = get_aftype(DFLT_AF);	if( ap ){		addr_family = ap->af;		skfd = ap->fd;	}	while( *spp != (char *) NULL ){		if( !strcmp(*spp, "arp") ){			goterr |= clr_flag(ifr.ifr_name, IFF_NOARP);			spp++;			continue;		}		if( !strcmp(*spp, "-arp") ){			goterr |= set_flag(ifr.ifr_name, IFF_NOARP);			spp++;			continue;		}		if (!strcmp(*spp, "trailers")) {			goterr |= clr_flag(ifr.ifr_name, IFF_NOTRAILERS);			spp++;			continue;		}		if (!strcmp(*spp, "-trailers")) {			goterr |= set_flag(ifr.ifr_name, IFF_NOTRAILERS);			spp++;			continue;		}		if( !strcmp(*spp, "promisc") ){

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -