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

📄 ifconfig_main.c

📁 自己改写的ifconfig代码程序
💻 C
📖 第 1 页 / 共 2 页
字号:
	//unsigned char mask;	//unsigned char did_flags;//#endif	char interface[10]={0};							//add	char addr[20];										//add	char *p;	char host[128];		printf("input your IP address:\n");	scanf("%s",&addr);	strcpy(interface,"eth0   ");	strcpy(*argv,strcat(interface,addr));							//add	goterr = 0;	did_flags = 0;//#ifdef CONFIG_FEATURE_IFCONFIG_BROADCAST_PLUS	sai_hostname = 0;	sai_netmask = 0;//#endif	/* skip argv[0] */	++argv;	--argc;/*#ifdef CONFIG_FEATURE_IFCONFIG_STATUS	if ((argc > 0) && (((*argv)[0] == '-') && ((*argv)[1] == 'a') && !(*argv)[2])) {// ifconfig -a		interface_opt_a = 1;		--argc;		++argv;	}#endif*/	if (argc <= 1) {/*#ifdef CONFIG_FEATURE_IFCONFIG_STATUS		return display_interfaces(argc ? *argv : NULL);#else	//bb_error_msg_and_die			("ifconfig was not compiled with interface status display support.");#endif*/	}	/* Create a channel to the NET kernel. */	sockfd = bb_xsocket(AF_INET, SOCK_DGRAM, 0);	/* get interface name */	//safe_strncpy(ifr.ifr_name, *argv, IFNAMSIZ);	safe_strncpy(ifr.ifr_name, "eth0", IFNAMSIZ);	/* Process the remaining arguments. */	while (*++argv != (char *) NULL) {		p = *argv;		mask = N_MASK;		if (*p == '-') {	/* If the arg starts with '-'... */			++p;		/*    advance past it and */			mask = M_MASK;	/*    set the appropriate mask. */		}		for (op = OptArray; op->name; op++) {	/* Find table entry. */			if (strcmp(p, op->name) == 0) {	/* If name matches... */				if ((mask &= op->flags)) {	/* set the mask and go. */					goto FOUND_ARG;				}				/* If we get here, there was a valid arg with an */				/* invalid '-' prefix. */				++goterr;				goto LOOP;			}		}		/* We fell through, so treat as possible hostname. */		a1op = Arg1Opt + (sizeof(Arg1Opt) / sizeof(Arg1Opt[0])) - 1;		mask = op->arg_flags;		goto HOSTNAME;	  FOUND_ARG:		if (mask & ARG_MASK) {			mask = op->arg_flags;			a1op = Arg1Opt + (op - OptArray);			if (mask & A_NETMASK & did_flags) {				//bb_show_usage();			}			if (*++argv == NULL) {				if (mask & A_ARG_REQ) {					//bb_show_usage();				} else {					--argv;					mask &= A_SET_AFTER;	/* just for broadcast */				}			} else {	/* got an arg so process it */			  HOSTNAME:				did_flags |= (mask & (A_NETMASK|A_HOSTNAME));				if (mask & A_CAST_HOST_COPY) {//#ifdef CONFIG_FEATURE_IFCONFIG_HW					if (mask & A_CAST_RESOLVE) {//#endif						safe_strncpy(host, *argv, (sizeof host));						sai.sin_family = AF_INET;						sai.sin_port = 0;						if (!strcmp(host, "default")) {							/* Default is special, meaning 0.0.0.0. */							sai.sin_addr.s_addr = INADDR_ANY;//#ifdef CONFIG_FEATURE_IFCONFIG_BROADCAST_PLUS						} else if (((host[0] == '+') && !host[1]) && (mask & A_BROADCAST) &&								   (did_flags & (A_NETMASK|A_HOSTNAME)) == (A_NETMASK|A_HOSTNAME)) {							/* + is special, meaning broadcast is derived. */							sai.sin_addr.s_addr = (~sai_netmask) | (sai_hostname & sai_netmask);//#endif						} else if (inet_aton(host, &sai.sin_addr) == 0) {							/* It's not a dotted quad. */							struct hostent *hp;							if ((hp = gethostbyname(host)) == (struct hostent *)NULL) {								++goterr;								continue;							}							memcpy((char *) &sai.sin_addr, (char *) hp->h_addr_list[0],							sizeof(struct in_addr));						}//#ifdef CONFIG_FEATURE_IFCONFIG_BROADCAST_PLUS						if (mask & A_HOSTNAME) {							sai_hostname = sai.sin_addr.s_addr;						}						if (mask & A_NETMASK) {							sai_netmask = sai.sin_addr.s_addr;						}//#endif						p = (char *) &sai;//#ifdef CONFIG_FEATURE_IFCONFIG_HW					} else {	/* A_CAST_HOST_COPY_IN_ETHER */						/* This is the "hw" arg case. */						if (strcmp("ether", *argv) || (*++argv == NULL)) {						//	bb_show_usage();						}						safe_strncpy(host, *argv, (sizeof host));						if (in_ether(host, &sa)) {							//bb_error_msg("invalid hw-addr %s", host);							++goterr;							continue;						}						p = (char *) &sa;					}//#endif					memcpy((((char *) (&ifr)) + a1op->ifr_offset),						   p, sizeof(struct sockaddr));				} else {					unsigned long i = strtoul(*argv, NULL, 0);					p = ((char *) (&ifr)) + a1op->ifr_offset;//#ifdef CONFIG_FEATURE_IFCONFIG_MEMSTART_IOADDR_IRQ					if (mask & A_MAP_TYPE) {						if (ioctl(sockfd, SIOCSIFMAP, &ifr) < 0) {							++goterr;							continue;						}						if ((mask & A_MAP_UCHAR) == A_MAP_UCHAR) {							*((unsigned char *) p) = i;						} else if (mask & A_MAP_USHORT) {							*((unsigned short *) p) = i;						} else {							*((unsigned long *) p) = i;						}					} else//#endif					if (mask & A_CAST_CHAR_PTR) {						*((caddr_t *) p) = (caddr_t) i;					} else {	/* A_CAST_INT */						*((int *) p) = i;					}				}				if (ioctl(sockfd, a1op->selector, &ifr) < 0) {					perror(a1op->name);					++goterr;					continue;				}//#ifdef QUESTIONABLE_ALIAS_CASE				if (mask & A_COLON_CHK) {					/*					 * Don't do the set_flag() if the address is an alias with					 * a - at the end, since it's deleted already! - Roman					 *					 * Should really use regex.h here, not sure though how well					 * it'll go with the cross-platform support etc.					 */					char *ptr;					short int found_colon = 0;					for (ptr = ifr.ifr_name; *ptr; ptr++) {						if (*ptr == ':') {							found_colon++;						}					}					if (found_colon && *(ptr - 1) == '-') {						continue;					}				}//#endif			}			if (!(mask & A_SET_AFTER)) {				continue;			}			mask = N_SET;		}		if (ioctl(sockfd, SIOCGIFFLAGS, &ifr) < 0) {			perror("SIOCGIFFLAGS");			++goterr;		} else {			selector = op->selector;			if (mask & SET_MASK) {				ifr.ifr_flags |= selector;			} else {				ifr.ifr_flags &= ~selector;			}			if (ioctl(sockfd, SIOCSIFFLAGS, &ifr) < 0) {				perror("SIOCSIFFLAGS");				++goterr;			}		}	  LOOP:		continue;	}					/* end of while-loop */	if(ENABLE_FEATURE_CLEAN_UP) close(sockfd);	return goterr;}//#ifdef CONFIG_FEATURE_IFCONFIG_HW/* Input an Ethernet address and convert to binary. */static int in_ether(char *bufp, struct sockaddr *sap){	char *ptr;	int i, j;	unsigned char val;	unsigned char c;	sap->sa_family = ARPHRD_ETHER;	ptr = sap->sa_data;	i = 0;	do {		j = val = 0;		/* We might get a semicolon here - not required. */		if (i && (*bufp == ':')) {			bufp++;		}		do {			c = *bufp;			if (((unsigned char)(c - '0')) <= 9) {				c -= '0';			} else if (((unsigned char)((c|0x20) - 'a')) <= 5) {				c = (c|0x20) - ('a'-10);			} else if (j && (c == ':' || c == 0)) {				break;			} else {				return -1;			}			++bufp;			val <<= 4;			val += c;		} while (++j < 2);		*ptr++ = val;	} while (++i < ETH_ALEN);	return (int) (*bufp);	/* Error if we don't end at end of string. */}//#endifchar * safe_strncpy(char *dst, const char *src, size_t size){	dst[size-1] = '\0';	return strncpy(dst, src, size-1);}int bb_xsocket(int domain, int type, int protocol){	int r = socket(domain, type, protocol);	if (r < 0)			return r;}

⌨️ 快捷键说明

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