aboutsummaryrefslogtreecommitdiff
path: root/networking/libiproute
diff options
context:
space:
mode:
authorDenis Vlasenko <vda.linux@googlemail.com>2007-07-14 22:07:14 +0000
committerDenis Vlasenko <vda.linux@googlemail.com>2007-07-14 22:07:14 +0000
commitfb79a2e2cfe33002398f1898c26d8e4f341db006 (patch)
treef5b3ee27db5bc8c9b181fbec171f8fa430a75ba5 /networking/libiproute
parentfcfaf2e18aba06dd90b16958ecfbfcfbf59ceb02 (diff)
downloadbusybox-w32-fb79a2e2cfe33002398f1898c26d8e4f341db006.tar.gz
busybox-w32-fb79a2e2cfe33002398f1898c26d8e4f341db006.tar.bz2
busybox-w32-fb79a2e2cfe33002398f1898c26d8e4f341db006.zip
xioctl and friends by Tito <farmatito@tiscali.it>
function old new delta do_iptunnel 203 977 +774 process_dev 5328 5494 +166 ioctl_or_perror - 54 +54 ioctl_or_perror_and_die - 51 +51 ioctl_alt_func - 49 +49 bb_ioctl_or_warn - 47 +47 do_add_ioctl 102 145 +43 bb_xioctl - 39 +39 print_value_on_off - 31 +31 get_lcm 105 123 +18 arp_main 2155 2167 +12 .................. zcip_main 1576 1566 -10 setlogcons_main 92 82 -10 dumpkmap_main 263 253 -10 do_get_ioctl 85 75 -10 setkeycodes_main 165 154 -11 write_table 244 232 -12 vconfig_main 318 306 -12 do_del_ioctl 93 81 -12 set_address 75 62 -13 maybe_set_utc 30 16 -14 loadfont_main 495 479 -16 slattach_main 712 695 -17 do_loadfont 191 174 -17 do_iplink 1155 1136 -19 getty_main 2583 2562 -21 fbset_main 2058 2035 -23 do_time 588 565 -23 xioctl 25 - -25 read_rtc 186 160 -26 parse_conf 1299 1270 -29 udhcp_read_interface 269 239 -30 bb_ioctl 45 - -45 bb_ioctl_alt 70 - -70 bb_ioctl_on_off 78 - -78 .rodata 129370 129018 -352 do_show 799 - -799 ------------------------------------------------------------------------------ (add/remove: 6/5 grow/shrink: 13/49 up/down: 1316/-1864) Total: -548 bytes text data bss dec hex filename 675352 2740 13968 692060 a8f5c busybox_old 674804 2740 13968 691512 a8d38 busybox_unstripped
Diffstat (limited to 'networking/libiproute')
-rw-r--r--networking/libiproute/ipaddress.c3
-rw-r--r--networking/libiproute/iplink.c32
-rw-r--r--networking/libiproute/iptunnel.c80
3 files changed, 45 insertions, 70 deletions
diff --git a/networking/libiproute/ipaddress.c b/networking/libiproute/ipaddress.c
index a4add6a47..fc10ba37c 100644
--- a/networking/libiproute/ipaddress.c
+++ b/networking/libiproute/ipaddress.c
@@ -84,8 +84,7 @@ static void print_queuelen(char *name)
84 84
85 memset(&ifr, 0, sizeof(ifr)); 85 memset(&ifr, 0, sizeof(ifr));
86 strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name)); 86 strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
87 if (ioctl(s, SIOCGIFTXQLEN, &ifr) < 0) { 87 if (ioctl_or_warn(s, SIOCGIFTXQLEN, &ifr) < 0) {
88 bb_perror_msg("SIOCGIFXQLEN");
89 close(s); 88 close(s);
90 return; 89 return;
91 } 90 }
diff --git a/networking/libiproute/iplink.c b/networking/libiproute/iplink.c
index 7db4d7e15..3d3ea2a23 100644
--- a/networking/libiproute/iplink.c
+++ b/networking/libiproute/iplink.c
@@ -49,14 +49,11 @@ static void do_chflags(char *dev, uint32_t flags, uint32_t mask)
49 49
50 strncpy(ifr.ifr_name, dev, sizeof(ifr.ifr_name)); 50 strncpy(ifr.ifr_name, dev, sizeof(ifr.ifr_name));
51 fd = get_ctl_fd(); 51 fd = get_ctl_fd();
52 if (ioctl(fd, SIOCGIFFLAGS, &ifr)) { 52 xioctl(fd, SIOCGIFFLAGS, &ifr);
53 bb_perror_msg_and_die("SIOCGIFFLAGS");
54 }
55 if ((ifr.ifr_flags ^ flags) & mask) { 53 if ((ifr.ifr_flags ^ flags) & mask) {
56 ifr.ifr_flags &= ~mask; 54 ifr.ifr_flags &= ~mask;
57 ifr.ifr_flags |= mask & flags; 55 ifr.ifr_flags |= mask & flags;
58 if (ioctl(fd, SIOCSIFFLAGS, &ifr)) 56 xioctl(fd, SIOCSIFFLAGS, &ifr);
59 bb_perror_msg_and_die("SIOCSIFFLAGS");
60 } 57 }
61 close(fd); 58 close(fd);
62} 59}
@@ -66,15 +63,11 @@ static void do_changename(char *dev, char *newdev)
66{ 63{
67 struct ifreq ifr; 64 struct ifreq ifr;
68 int fd; 65 int fd;
69 int err;
70 66
71 strncpy(ifr.ifr_name, dev, sizeof(ifr.ifr_name)); 67 strncpy(ifr.ifr_name, dev, sizeof(ifr.ifr_name));
72 strncpy(ifr.ifr_newname, newdev, sizeof(ifr.ifr_newname)); 68 strncpy(ifr.ifr_newname, newdev, sizeof(ifr.ifr_newname));
73 fd = get_ctl_fd(); 69 fd = get_ctl_fd();
74 err = ioctl(fd, SIOCSIFNAME, &ifr); 70 xioctl(fd, SIOCSIFNAME, &ifr);
75 if (err) {
76 bb_perror_msg_and_die("SIOCSIFNAME");
77 }
78 close(fd); 71 close(fd);
79} 72}
80 73
@@ -88,9 +81,7 @@ static void set_qlen(char *dev, int qlen)
88 memset(&ifr, 0, sizeof(ifr)); 81 memset(&ifr, 0, sizeof(ifr));
89 strncpy(ifr.ifr_name, dev, sizeof(ifr.ifr_name)); 82 strncpy(ifr.ifr_name, dev, sizeof(ifr.ifr_name));
90 ifr.ifr_qlen = qlen; 83 ifr.ifr_qlen = qlen;
91 if (ioctl(s, SIOCSIFTXQLEN, &ifr) < 0) { 84 xioctl(s, SIOCSIFTXQLEN, &ifr);
92 bb_perror_msg_and_die("SIOCSIFXQLEN");
93 }
94 close(s); 85 close(s);
95} 86}
96 87
@@ -104,9 +95,7 @@ static void set_mtu(char *dev, int mtu)
104 memset(&ifr, 0, sizeof(ifr)); 95 memset(&ifr, 0, sizeof(ifr));
105 strncpy(ifr.ifr_name, dev, sizeof(ifr.ifr_name)); 96 strncpy(ifr.ifr_name, dev, sizeof(ifr.ifr_name));
106 ifr.ifr_mtu = mtu; 97 ifr.ifr_mtu = mtu;
107 if (ioctl(s, SIOCSIFMTU, &ifr) < 0) { 98 xioctl(s, SIOCSIFMTU, &ifr);
108 bb_perror_msg_and_die("SIOCSIFMTU");
109 }
110 close(s); 99 close(s);
111} 100}
112 101
@@ -122,9 +111,7 @@ static int get_address(char *dev, int *htype)
122 111
123 memset(&ifr, 0, sizeof(ifr)); 112 memset(&ifr, 0, sizeof(ifr));
124 strncpy(ifr.ifr_name, dev, sizeof(ifr.ifr_name)); 113 strncpy(ifr.ifr_name, dev, sizeof(ifr.ifr_name));
125 if (ioctl(s, SIOCGIFINDEX, &ifr) < 0) { 114 xioctl(s, SIOCGIFINDEX, &ifr);
126 bb_perror_msg_and_die("SIOCGIFINDEX");
127 }
128 115
129 memset(&me, 0, sizeof(me)); 116 memset(&me, 0, sizeof(me));
130 me.sll_family = AF_PACKET; 117 me.sll_family = AF_PACKET;
@@ -163,9 +150,10 @@ static void set_address(struct ifreq *ifr, int brd)
163 int s; 150 int s;
164 151
165 s = get_ctl_fd(); 152 s = get_ctl_fd();
166 if (ioctl(s, brd ? SIOCSIFHWBROADCAST :SIOCSIFHWADDR, ifr) < 0) { 153 if (brd)
167 bb_perror_msg_and_die(brd ? "SIOCSIFHWBROADCAST" : "SIOCSIFHWADDR"); 154 xioctl(s, SIOCSIFHWBROADCAST, ifr);
168 } 155 else
156 xioctl(s, SIOCSIFHWADDR, ifr);
169 close(s); 157 close(s);
170} 158}
171 159
diff --git a/networking/libiproute/iptunnel.c b/networking/libiproute/iptunnel.c
index b12bceb45..90d0e1186 100644
--- a/networking/libiproute/iptunnel.c
+++ b/networking/libiproute/iptunnel.c
@@ -14,8 +14,6 @@
14 * Phil Karn <karn@ka9q.ampr.org> 990408: "pmtudisc" flag 14 * Phil Karn <karn@ka9q.ampr.org> 990408: "pmtudisc" flag
15 */ 15 */
16 16
17//#include <sys/socket.h>
18//#include <sys/ioctl.h>
19#include <netinet/ip.h> 17#include <netinet/ip.h>
20#include <net/if.h> 18#include <net/if.h>
21#include <net/if_arp.h> 19#include <net/if_arp.h>
@@ -38,9 +36,7 @@ static int do_ioctl_get_ifindex(char *dev)
38 36
39 strncpy(ifr.ifr_name, dev, sizeof(ifr.ifr_name)); 37 strncpy(ifr.ifr_name, dev, sizeof(ifr.ifr_name));
40 fd = xsocket(AF_INET, SOCK_DGRAM, 0); 38 fd = xsocket(AF_INET, SOCK_DGRAM, 0);
41 if (ioctl(fd, SIOCGIFINDEX, &ifr)) { 39 xioctl(fd, SIOCGIFINDEX, &ifr);
42 bb_perror_msg_and_die("SIOCGIFINDEX");
43 }
44 close(fd); 40 close(fd);
45 return ifr.ifr_ifindex; 41 return ifr.ifr_ifindex;
46} 42}
@@ -49,30 +45,26 @@ static int do_ioctl_get_iftype(char *dev)
49{ 45{
50 struct ifreq ifr; 46 struct ifreq ifr;
51 int fd; 47 int fd;
48 int err;
52 49
53 strncpy(ifr.ifr_name, dev, sizeof(ifr.ifr_name)); 50 strncpy(ifr.ifr_name, dev, sizeof(ifr.ifr_name));
54 fd = xsocket(AF_INET, SOCK_DGRAM, 0); 51 fd = xsocket(AF_INET, SOCK_DGRAM, 0);
55 if (ioctl(fd, SIOCGIFHWADDR, &ifr)) { 52 err = ioctl_or_warn(fd, SIOCGIFHWADDR, &ifr);
56 bb_perror_msg("SIOCGIFHWADDR");
57 return -1;
58 }
59 close(fd); 53 close(fd);
60 return ifr.ifr_addr.sa_family; 54 return err ? -1 : ifr.ifr_addr.sa_family;
61} 55}
62 56
63static char *do_ioctl_get_ifname(int idx) 57static char *do_ioctl_get_ifname(int idx)
64{ 58{
65 struct ifreq ifr; 59 struct ifreq ifr;
66 int fd; 60 int fd;
61 int err;
67 62
68 ifr.ifr_ifindex = idx; 63 ifr.ifr_ifindex = idx;
69 fd = xsocket(AF_INET, SOCK_DGRAM, 0); 64 fd = xsocket(AF_INET, SOCK_DGRAM, 0);
70 if (ioctl(fd, SIOCGIFNAME, &ifr)) { 65 err = ioctl_or_warn(fd, SIOCGIFNAME, &ifr);
71 bb_perror_msg("SIOCGIFNAME");
72 return NULL;
73 }
74 close(fd); 66 close(fd);
75 return xstrndup(ifr.ifr_name, sizeof(ifr.ifr_name)); 67 return err ? NULL : xstrndup(ifr.ifr_name, sizeof(ifr.ifr_name));
76} 68}
77 69
78static int do_get_ioctl(const char *basedev, struct ip_tunnel_parm *p) 70static int do_get_ioctl(const char *basedev, struct ip_tunnel_parm *p)
@@ -84,10 +76,7 @@ static int do_get_ioctl(const char *basedev, struct ip_tunnel_parm *p)
84 strncpy(ifr.ifr_name, basedev, sizeof(ifr.ifr_name)); 76 strncpy(ifr.ifr_name, basedev, sizeof(ifr.ifr_name));
85 ifr.ifr_ifru.ifru_data = (void*)p; 77 ifr.ifr_ifru.ifru_data = (void*)p;
86 fd = xsocket(AF_INET, SOCK_DGRAM, 0); 78 fd = xsocket(AF_INET, SOCK_DGRAM, 0);
87 err = ioctl(fd, SIOCGETTUNNEL, &ifr); 79 err = ioctl_or_warn(fd, SIOCGETTUNNEL, &ifr);
88 if (err) {
89 bb_perror_msg("SIOCGETTUNNEL");
90 }
91 close(fd); 80 close(fd);
92 return err; 81 return err;
93} 82}
@@ -105,9 +94,15 @@ static int do_add_ioctl(int cmd, const char *basedev, struct ip_tunnel_parm *p)
105 } 94 }
106 ifr.ifr_ifru.ifru_data = (void*)p; 95 ifr.ifr_ifru.ifru_data = (void*)p;
107 fd = xsocket(AF_INET, SOCK_DGRAM, 0); 96 fd = xsocket(AF_INET, SOCK_DGRAM, 0);
108 if (ioctl(fd, cmd, &ifr)) { 97#if ENABLE_IOCTL_HEX2STR_ERROR
109 bb_perror_msg_and_die("ioctl"); 98 /* #define magic will turn ioctl# into string */
110 } 99 if (cmd == SIOCCHGTUNNEL)
100 xioctl(fd, SIOCCHGTUNNEL, &ifr);
101 else
102 xioctl(fd, SIOCADDTUNNEL, &ifr);
103#else
104 xioctl(fd, cmd, &ifr);
105#endif
111 close(fd); 106 close(fd);
112 return 0; 107 return 0;
113} 108}
@@ -125,9 +120,7 @@ static int do_del_ioctl(const char *basedev, struct ip_tunnel_parm *p)
125 } 120 }
126 ifr.ifr_ifru.ifru_data = (void*)p; 121 ifr.ifr_ifru.ifru_data = (void*)p;
127 fd = xsocket(AF_INET, SOCK_DGRAM, 0); 122 fd = xsocket(AF_INET, SOCK_DGRAM, 0);
128 if (ioctl(fd, SIOCDELTUNNEL, &ifr)) { 123 xioctl(fd, SIOCDELTUNNEL, &ifr);
129 bb_perror_msg_and_die("SIOCDELTUNNEL");
130 }
131 close(fd); 124 close(fd);
132 return 0; 125 return 0;
133} 126}
@@ -526,29 +519,24 @@ static int do_show(int argc, char **argv)
526/* Return value becomes exitcode. It's okay to not return at all */ 519/* Return value becomes exitcode. It's okay to not return at all */
527int do_iptunnel(int argc, char **argv) 520int do_iptunnel(int argc, char **argv)
528{ 521{
529 static const char * const keywords[] = { 522 static const char *const keywords[] = {
530 "add", "change", "delete", "show", "list", "lst", NULL 523 "add", "change", "delete", "show", "list", "lst", NULL
531 }; 524 };
532 enum {ARG_add = 1, ARG_change, ARG_del, ARG_show, ARG_list, ARG_lst}; 525 enum { ARG_add = 0, ARG_change, ARG_del, ARG_show, ARG_list, ARG_lst };
533 smalluint key = 4; /* show */ 526 int key;
534 if (argc > 0) { 527
535 key = index_in_substr_array(keywords, *argv) +1; 528 if (argc) {
529 key = index_in_substr_array(keywords, *argv);
530 if (key < 0)
531 bb_error_msg_and_die(bb_msg_invalid_arg, *argv, applet_name);
536 --argc; 532 --argc;
537 ++argv; 533 ++argv;
538 } else 534 if (key == ARG_add)
539 return do_show(0, NULL); 535 return do_add(SIOCADDTUNNEL, argc, argv);
540 if (key < ARG_add) 536 if (key == ARG_change)
541 bail: 537 return do_add(SIOCCHGTUNNEL, argc, argv);
542 bb_error_msg_and_die(bb_msg_invalid_arg, *argv, applet_name); 538 if (key == ARG_del)
543 539 return do_del(argc, argv);
544 if (key == ARG_add) 540 }
545 return do_add(SIOCADDTUNNEL, argc, argv); 541 return do_show(argc, argv);
546 if (key == ARG_change)
547 return do_add(SIOCCHGTUNNEL, argc, argv);
548 if (key == ARG_del)
549 return do_del(argc, argv);
550 if (key == ARG_show || key == ARG_list || key == ARG_lst)
551 return do_show(argc, argv);
552 /* be gentle to gcc; avoid warning about non returning */
553 goto bail; /* never reached */
554} 542}