📄 ifconfig_main.c
字号:
//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 + -