一个类似ifconfig功能的程序代码--C语言(ZZ)
一个类似ifconfig功能的程序代码--C语言(ZZ)
2010年07月30日
001 #include
002 #include
003 #include
004 #include
005 #include
006 #include
007 #include
008 #include
009
010 int info_list(int all);
011
012 int get_interface_info(char *interface_name);
013 int set_interface(char *interface_name);
014 int get_ipaddr(char *interface_name);
015 int get_mac(char *interface_name);
016 int get_netmask(char *interface_name);
017 int get_broadcast(char *interface_name);
018 int set_ipaddr(char *interface_name, char *ip);
019 int set_mac(char *interface_name, char *mac);
020 int set_netmask(char *interface_name, char *netmask);
021 int set_broadcast(char *interface_name, char *broadcast);
022
023 int interface_up(char *interface_name);
024 int interface_down(char *interface_name);
025
026 int usage();
027
028 int main(int argc, char *argv[])
029 {
030 if (argc == 1)
031 {
032 info_list(0);
033 return 0;
034 }
035
036 if (argc == 2)
037 {
038 if (strcmp(argv[1], "all") == 0)
039 {
040 info_list(1);
041 return 0;
042 }
043
044 get_interface_info(argv[1]);
045
046 return 0;
047 }
048
049 if (argc == 3)
050 {
051 if (strcmp(argv[2], "set") == 0)
052 {
053 set_interface(argv[1]);
054 return 0;
055 }
056 if (strcmp(argv[2], "up") == 0)
057 {
058 interface_up(argv[1]);
059 return 0;
060 }
061 if (strcmp(argv[2], "down") == 0)
062 {
063 interface_down(argv[1]);
064 return 0;
065 }
066
067 usage();
068
069 return 0;
070 }
071
072 usage();
073
074 return 0;
075 }
076
077 int info_list(int all)
078 {
079 int len;
080 char *ifreq_pointer;
081 len = 10 * sizeof(struct ifreq);
082 ifreq_pointer = (char *) malloc(len);
083
084 struct ifconf get_info;
085 get_info.ifc_len = len;
086 get_info.ifc_ifcu.ifcu_buf = ifreq_pointer;
087
088 int sockfd;
089 sockfd = socket(PF_INET, SOCK_STREAM, 0);
090 ioctl(sockfd, SIOCGIFCONF, &get_info);
091
092 int count;
093 count = get_info.ifc_len / sizeof(struct ifreq);
094
095 struct sockaddr_in *return_sockaddr;
096
097 struct ifreq *result = (struct ifreq *) ifreq_pointer;
098 int i = 0;
099 if (all == 1)
100 {
101 for (i; i ifr_name);
104 get_ipaddr(result->ifr_name);
105 get_mac(result->ifr_name);
106 get_netmask(result->ifr_name);
107 get_broadcast(result->ifr_name);
108 }
109 } else
110 {
111 struct ifreq tmp;
112 int s;
113 if ((s = socket(PF_INET, SOCK_STREAM, 0)) ifr_name);
122 if (ioctl(s, SIOCGIFFLAGS, &tmp) socket(PF_INET, SOCK_STREAM, 0)) sin_addr));
162
163 return 0;
164 }
165
166 int get_mac(char *interface_name)
167 {
168 if (strcmp(interface_name, "lo") == 0)
169 {
170 return 0;
171 }
172
173 int s;
174
175 if ((s = socket(PF_INET, SOCK_STREAM, 0)) socket(PF_INET, SOCK_STREAM, 0)) sin_addr));
222
223 return 0;
224 }
225
226 int get_broadcast(char *interface_name)
227 {
228 int s;
229
230 if ((s = socket(PF_INET, SOCK_STREAM, 0)) sin_addr));
249
250 return 0;
251
252 }
253
254 int get_interface_info(char *interface_name)
255 {
256 get_ipaddr(interface_name);
257 get_mac(interface_name);
258 get_netmask(interface_name);
259 get_broadcast(interface_name);
260
261 return 0;
262 }
263
264 int set_interface(char *interface_name)
265 {
266 char ip[18];
267 char mac_addr[20];
268 char netmask[18];
269 char broadcast[18];
270
271 printf("Change ");
272 get_ipaddr(interface_name);
273 printf("To: ");
274 fgets(ip, 17, stdin);
275 if (strcmp(ip, "\n") == 0)
276 goto set_mac;
277 set_ipaddr(interface_name, ip);
278
279 set_mac:
280 printf("Change ");
281 get_mac(interface_name);
282 printf("To: ");
283 fgets(mac_addr, 19, stdin);
284 if (strcmp(mac_addr, "\n") == 0)
285 goto set_netmask;
286 set_mac(interface_name, mac_addr);
287
288 set_netmask:
289 printf("Change ");
290 get_netmask(interface_name);
291 printf("To: ");
292 fgets(netmask, 17, stdin);
293 if (strcmp(netmask, "\n") == 0)
294 goto set_broadcast;
295 set_netmask(interface_name, netmask);
296
297 set_broadcast:
298 printf("Change ");
299 get_broadcast(interface_name);
300 printf("To: ");
301 fgets(broadcast, 17, stdin);
302 if (strcmp(broadcast, "\n") == 0)
303 return 0;
304 set_broadcast(interface_name, broadcast);
305
306 return 0;
307 }
308
309 int interface_up(char *interface_name)
310 {
311 int s;
312
313 if ((s = socket(PF_INET, SOCK_STREAM, 0)) socket(PF_INET, SOCK_STREAM, 0)) socket(PF_INET, SOCK_STREAM, 0)) socket(PF_INET, SOCK_STREAM, 0)) 47)
442 tmp = mac_addr - 48;
443 if (mac_addr 64)
444 tmp = mac_addr - 55;
445 if (mac_addr 96)
446 tmp = mac_addr - 87;
447 tmp = tmp 47)
449 tmp |= (mac_addr[i + 1] - 48);
450 if (mac_addr[i + 1] 64)
451 tmp |= (mac_addr[i + 1] - 55);
452 if (mac_addr[i + 1] 96)
453 tmp |= (mac_addr[i + 1] - 87);
454 memcpy(&ifr.ifr_ifru.ifru_hwaddr.sa_data[j++], &tmp, 1);
455 }
456
457 if (ioctl(s, SIOCSIFHWADDR, &ifr) socket(PF_INET, SOCK_STREAM, 0)) socket(PF_INET, SOCK_STREAM, 0)) < 0)
504 {
505 perror("Socket");
506 return -1;
507 }
508
509 struct ifreq ifr;
510 strcpy(ifr.ifr_name, interface_name);
511
512 struct sockaddr_in broadcast_addr;
513 bzero(&broadcast_addr, sizeof(struct sockaddr_in));
514 broadcast_addr.sin_family = PF_INET;
515 inet_aton(broadcast, &broadcast_addr.sin_addr);
516
517 memcpy(&ifr.ifr_ifru.ifru_broadaddr, &broadcast_addr,
518 sizeof(struct sockaddr_in));
519
520 if (ioctl(s, SIOCSIFBRDADDR, &ifr) < 0)
521 {
522 perror("ioctl");
523 return -1;
524 }
525
526 return 0;
527 }
528
529 int usage(void)
530 {
531 printf("Usage: myifconfig [all]|[interface [set|up|down]]\n");
532 return 0;
533 }
把每行开头的空格换成0
:%s/^\ /0/
去掉每行开头的行号(数字)
:%s/^[0-9]*//