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

📄 ifconfig.c

📁 操作系统源代码
💻 C
字号:
/*ifconfig.c*/#include <sys/types.h>#include <assert.h>#include <errno.h>#include <fcntl.h>#include <signal.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <sys/ioctl.h>#include <net/gen/in.h>#include <net/gen/ip_io.h>#include <net/gen/inet.h>#if __STDC__#define PROTO(x,y) x y#else#define PROTO(x,y) x()#endifstatic PROTO (void usage, (void) );static PROTO (void set_hostaddr, (int ip_fd, char *host_s, int ins) );static PROTO (void set_netmask, (int ip_fd, char *net_s, int ins) );static PROTO (int check_ipaddrset, (int ip_fd) );static PROTO (int check_netmaskset, (int ip_fd) );static PROTO (int get_ipconf, (int ip_fd,	struct nwio_ipconf *ref_ipconf) );static PROTO (void sig_hand, (int signal) );PROTO (int main, (int argc, char *argv[]) );#define DEV_IP "/dev/ip"#define GET_IPCONF_TO 10char *prog_name;main(argc, argv)int argc;char *argv[];{	char *device_s, *hostaddr_s, *netmask_s, **arg_s;	int ins;	int c, ip_fd;	struct nwio_ipconf ipconf;	int i_flag, v_flag;	char *d_arg, *h_arg, *n_arg;	prog_name= argv[0];	d_arg= NULL;	h_arg= NULL;	n_arg= NULL;	i_flag= 0;	v_flag= 0;	while ((c= getopt(argc, argv, "?I:h:n:iv")) != -1)	{		switch(c)		{		case '?':			usage();		case 'I':			if (d_arg)				usage();			d_arg= optarg;			break;		case 'h':			if (h_arg)				usage();			h_arg= optarg;			break;		case 'n':			if (n_arg)				usage();			n_arg= optarg;			break;		case 'i':			if (i_flag)				usage();			i_flag= 1;			break;		case 'v':			if (v_flag)				usage();			v_flag= 1;			break;		default:			fprintf(stderr, "%s: getopt failed: '%c'\n", 				prog_name, c);			exit(1);		}	}	if (h_arg == NULL && n_arg == NULL) v_flag= 1;	if (optind != argc)		usage();	device_s= d_arg;	if (device_s == NULL)		device_s= getenv("IP_DEVICE");	if (device_s == NULL)		device_s= DEV_IP;	hostaddr_s= h_arg;	netmask_s= n_arg;	ins= i_flag;	ip_fd= open (device_s, O_RDWR);	if (ip_fd<0)	{		fprintf(stderr, "%s: unable to open '%s': %s\n", 			prog_name, device_s, strerror(errno));		exit(1);	}	if (hostaddr_s)		set_hostaddr(ip_fd, hostaddr_s, ins);	if (netmask_s)		set_netmask (ip_fd, netmask_s, ins);	if (v_flag) {		if (!get_ipconf(ip_fd, &ipconf))		{			fprintf(stderr, "host address not set\n");			exit(1);		}		puts(inet_ntoa(ipconf.nwic_ipaddr));		if (ipconf.nwic_flags & NWIC_NETMASK_SET)			puts(inet_ntoa(ipconf.nwic_netmask));	}	exit(0);}static void set_hostaddr (ip_fd, hostaddr_s, ins)int ip_fd;char *hostaddr_s;int ins;{	ipaddr_t ipaddr;	struct nwio_ipconf ipconf;	int result;	ipaddr= inet_addr (hostaddr_s);	if (ipaddr == (ipaddr_t)(-1))	{		fprintf(stderr, "%s: invalid host address (%s)\n",			prog_name, hostaddr_s);		exit(1);	}	if (ins && check_ipaddrset(ip_fd))		return;	ipconf.nwic_flags= NWIC_IPADDR_SET;	ipconf.nwic_ipaddr= ipaddr;	result= ioctl(ip_fd, NWIOSIPCONF, &ipconf);	if (result<0)	{		perror("unable to ioctl(.., NWIOSIPCONF, ..)");		exit(1);	}}static int check_ipaddrset (ip_fd)int ip_fd;{	struct nwio_ipconf ipconf;	if (!get_ipconf(ip_fd, &ipconf))		return 0;assert (ipconf.nwic_flags & NWIC_IPADDR_SET);	return 1;}static int get_ipconf (ip_fd, ref_ipaddr)int ip_fd;struct nwio_ipconf *ref_ipaddr;{	void PROTO ((*old_sighand), (int) );	int old_alarm;	int error, result;	old_sighand= signal (SIGALRM, sig_hand);	old_alarm= alarm (GET_IPCONF_TO);	result= ioctl (ip_fd, NWIOGIPCONF, ref_ipaddr);	error= errno;	alarm(0);	signal(SIGALRM, old_sighand);	alarm(old_alarm);	if (result <0 && error != EINTR)	{		errno= error;		perror ("ioctl (.., NWIOGIPCONF, ..)");		exit(1);	}	return result>=0;}static void sig_hand(signal)int signal;{	/* No nothing, just cause an EINTR */}static void usage(){	fprintf(stderr,		"Usage: %s [-I ip-device] [-h ipaddr] [-n netmask] [-iv]\n",		prog_name);	exit(1);}static void set_netmask (ip_fd, netmask_s, ins)int ip_fd;char *netmask_s;int ins;{	ipaddr_t netmask;	struct nwio_ipconf ipconf;	int result;	netmask= inet_addr (netmask_s);	if (netmask == (ipaddr_t)(-1))	{		fprintf(stderr, "%s: invalid netmask (%s)\n",			prog_name, netmask_s);		exit(1);	}	if (ins && check_netmaskset(ip_fd))		return;	ipconf.nwic_flags= NWIC_NETMASK_SET;	ipconf.nwic_netmask= netmask;	result= ioctl(ip_fd, NWIOSIPCONF, &ipconf);	if (result<0)	{		perror("unable to ioctl(.., NWIOSIPCONF, ..)");		exit(1);	}}static int check_netmaskset (ip_fd)int ip_fd;{	struct nwio_ipconf ipconf;	if (!get_ipconf(ip_fd, &ipconf))	{		fprintf(stderr, "unable to determine whether netmask set or not, please set host addr first\n");		exit(1);	}	return (ipconf.nwic_flags & NWIC_NETMASK_SET);}

⌨️ 快捷键说明

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