一个类似ifconfig功能的程序代码--C语言

一个类似ifconfig功能的程序代码--C语言(ZZ)

001 #include <sys/ioctl.h>
002 #include <net/if.h>
003 #include <sys/socket.h>
004 #include <sys/types.h>
005 #include <stdio.h>
006 #include <netinet/in.h>
007 #include <string.h>
008 #include <stdlib.h>
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 < count; i++)
102         {
103             printf("%s\n", result->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)) < 0)
114         {
115             perror("Socket");
116             exit(-1);
117         }
118
119         for (i; i < count; i++)
120         {
121             strcpy(tmp.ifr_name, result->ifr_name);
122             if (ioctl(s, SIOCGIFFLAGS, &tmp) < 0)
123             {
124                 perror("ioctl");
125                 exit(-1);
126             }
127             if ((tmp.ifr_ifru.ifru_flags & IFF_UP) == 0)
128                 continue;
129             printf("%s\n", tmp.ifr_name);
130             get_ipaddr(tmp.ifr_name);
131             get_mac(tmp.ifr_name);
132             get_netmask(tmp.ifr_name);
133             get_broadcast(tmp.ifr_name);
134         }
135     }
136
137     exit(0);
138 }
139
140 int get_ipaddr(char *interface_name)
141 {
142     int s;
143     if ((s = socket(PF_INET, SOCK_STREAM, 0)) < 0)
144     {
145         perror("Socket");
146         return -1;
147     }
148
149     struct ifreq ifr;
150     strcpy(ifr.ifr_name, interface_name);
151
152     if (ioctl(s, SIOCGIFADDR, &ifr) < 0)
153     {
154         perror("ioctl");
155         return -1;
156     }
157
158     struct sockaddr_in *ptr;
159     ptr = (struct sockaddr_in *) &ifr.ifr_ifru.ifru_addr;
160
161     printf("        IP:%s\n", inet_ntoa(ptr->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)) < 0)
176     {
177         perror("Socket");
178         return -1;
179     }
180
181     struct ifreq ifr;
182
183     strcpy(ifr.ifr_name, interface_name);
184
185     if (ioctl(s, SIOCGIFHWADDR, &ifr) != 0)
186     {
187         perror("ioctl");
188         return -1;
189     }
190
191     u_char *ptr;
192     ptr = (u_char *) & ifr.ifr_ifru.ifru_hwaddr.sa_data[0];
193     printf("        MAC:%02x-%02x-%02x-%02x-%02x-%02x\n", *ptr, *(ptr + 1),
194            *(ptr + 2), *(ptr + 3), *(ptr + 4), *(ptr + 5));
195
196     return 0;
197 }
198
199 int get_netmask(char *interface_name)
200 {
201     int s;
202
203     if ((s = socket(PF_INET, SOCK_STREAM, 0)) < 0)
204     {
205         perror("Socket");
206         return -1;
207     }
208
209     struct ifreq ifr;
210     strcpy(ifr.ifr_name, interface_name);
211
212     if (ioctl(s, SIOCGIFNETMASK, &ifr) < 0)
213     {
214         perror("ioctl");
215         return -1;
216     }
217
218     struct sockaddr_in *ptr;
219     ptr = (struct sockaddr_in *) &ifr.ifr_ifru.ifru_netmask;
220
221     printf("        Netmask:%s\n", inet_ntoa(ptr->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)) < 0)
231     {
232         perror("Socket");
233         return -1;
234     }
235
236     struct ifreq ifr;
237     strcpy(ifr.ifr_name, interface_name);
238
239     if (ioctl(s, SIOCGIFBRDADDR, &ifr) < 0)
240     {
241         perror("ioctl");
242         return -1;
243     }
244
245     struct sockaddr_in *ptr;
246     ptr = (struct sockaddr_in *) &ifr.ifr_ifru.ifru_broadaddr;
247
248     printf("        Broadcast:%s\n", inet_ntoa(ptr->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)) < 0)
314     {
315         perror("Socket");
316         return -1;
317     }
318
319     struct ifreq ifr;
320     strcpy(ifr.ifr_name, interface_name);
321
322     short flag;
323     flag = IFF_UP;
324     if (ioctl(s, SIOCGIFFLAGS, &ifr) < 0)
325     {
326         perror("ioctl");
327         return -1;
328     }
329
330     ifr.ifr_ifru.ifru_flags |= flag;
331
332     if (ioctl(s, SIOCSIFFLAGS, &ifr) < 0)
333     {
334         perror("ioctl");
335         return -1;
336     }
337
338     return 0;
339
340 }
341
342 int interface_down(char *interface_name)
343 {
344     if (strcmp(interface_name, "lo") == 0)
345     {
346         printf("You can't pull down interface lo\n");
347         return 0;
348     }
349
350     int s;
351
352     if ((s = socket(PF_INET, SOCK_STREAM, 0)) < 0)
353     {
354         perror("Socket");
355         return -1;
356     }
357
358     struct ifreq ifr;
359     strcpy(ifr.ifr_name, interface_name);
360
361     short flag;
362     flag = ~IFF_UP;
363     if (ioctl(s, SIOCGIFFLAGS, &ifr) < 0)
364     {
365         perror("ioctl");
366         return -1;
367     }
368
369     ifr.ifr_ifru.ifru_flags &= flag;
370
371     if (ioctl(s, SIOCSIFFLAGS, &ifr) < 0)
372     {
373         perror("ioctl");
374         return -1;
375     }
376
377     return 0;
378 }
379
380 int set_ipaddr(char *interface_name, char *ip)
381 {
382     int s;
383
384     if ((s = socket(PF_INET, SOCK_STREAM, 0)) < 0)
385     {
386         perror("Socket");
387         return -1;
388     }
389
390     struct ifreq ifr;
391     strcpy(ifr.ifr_name, interface_name);
392
393     struct sockaddr_in addr;
394     bzero(&addr, sizeof(struct sockaddr_in));
395     addr.sin_family = PF_INET;
396     inet_aton(ip, &addr.sin_addr);
397
398     memcpy(&ifr.ifr_ifru.ifru_addr, &addr, sizeof(struct sockaddr_in));
399
400     if (ioctl(s, SIOCSIFADDR, &ifr) < 0)
401     {
402         perror("ioctl");
403         return -1;
404     }
405
406     return 0;
407 }
408
409 int set_mac(char *interface_name, char *mac_addr)
410 {
411     int s;
412     if ((s = socket(PF_INET, SOCK_STREAM, 0)) < 0)
413     {
414         perror("Socket");
415         return -1;
416     }
417
418     struct ifreq ifr;
419     strcpy(ifr.ifr_name, interface_name);
420
421     if (ioctl(s, SIOCGIFHWADDR, &ifr) < 0)
422     {
423         perror("ioctl");
424         return -1;
425     }
426
427     sa_family_t get_family;
428     get_family = ifr.ifr_ifru.ifru_hwaddr.sa_family;
429
430     interface_down(interface_name);
431
432     bzero(&ifr, sizeof(struct ifreq));
433     strcpy(ifr.ifr_name, interface_name);
434     ifr.ifr_ifru.ifru_hwaddr.sa_family = get_family;
435
436     short tmp;
437     int i, j;
438     j = 0;
439     for (i = 0; i < 17; i += 3)
440     {
441         if (mac_addr < 58 && mac_addr > 47)
442             tmp = mac_addr - 48;
443         if (mac_addr < 71 && mac_addr > 64)
444             tmp = mac_addr - 55;
445         if (mac_addr < 103 && mac_addr > 96)
446             tmp = mac_addr - 87;
447         tmp = tmp << 4;
448         if (mac_addr[i + 1] < 58 && mac_addr[i + 1] > 47)
449             tmp |= (mac_addr[i + 1] - 48);
450         if (mac_addr[i + 1] < 71 && mac_addr[i + 1] > 64)
451             tmp |= (mac_addr[i + 1] - 55);
452         if (mac_addr[i + 1] < 103 && 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) < 0)
458     {
459         perror("ioctl");
460         return -1;
461     }
462
463     interface_up(interface_name);
464
465     return 0;
466 }
467
468 int set_netmask(char *interface_name, char *netmask)
469 {
470     int s;
471
472     if ((s = socket(PF_INET, SOCK_STREAM, 0)) < 0)
473     {
474         perror("Socket");
475         return -1;
476     }
477
478     struct ifreq ifr;
479     strcpy(ifr.ifr_name, interface_name);
480
481     struct sockaddr_in netmask_addr;
482     bzero(&netmask_addr, sizeof(struct sockaddr_in));
483     netmask_addr.sin_family = PF_INET;
484     inet_aton(netmask, &netmask_addr.sin_addr);
485
486     memcpy(&ifr.ifr_ifru.ifru_netmask, &netmask_addr,
487            sizeof(struct sockaddr_in));
488
489     if (ioctl(s, SIOCSIFNETMASK, &ifr) < 0)
490     {
491         perror("ioctl");
492         return -1;
493     }
494
495     return 0;
496
497 }
498
499 int set_broadcast(char *interface_name, char *broadcast)
500 {
501     int s;
502
503     if ((s = 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]*//
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值