diff options
author | Denis Vlasenko <vda.linux@googlemail.com> | 2008-03-17 09:33:45 +0000 |
---|---|---|
committer | Denis Vlasenko <vda.linux@googlemail.com> | 2008-03-17 09:33:45 +0000 |
commit | d0a071a5281f8ba4b291f0c3beb74bee1f8df6a3 (patch) | |
tree | 37e443b155eb66fed37e889828fa60023c84010f /networking | |
parent | b44c790e41e281965955a83408f35ea53ecdb3d2 (diff) | |
download | busybox-w32-d0a071a5281f8ba4b291f0c3beb74bee1f8df6a3.tar.gz busybox-w32-d0a071a5281f8ba4b291f0c3beb74bee1f8df6a3.tar.bz2 busybox-w32-d0a071a5281f8ba4b291f0c3beb74bee1f8df6a3.zip |
brctl: eliminate stray data object
brctl: use constant fd to reduce parameter passing
runsvdir: do not use data/bss
od: reuse bb_argv_dash
last: do not go into endless loop on read error
mount: make it not fail scripts/find_bad_common_bufsiz check
dc: add INIT_G() (no-op for dc, but we want uniform usage of "G trick")
function old new delta
runsvdir_main 1646 1672 +26
set_pgrp 1 - -1
exitsoon 1 - -1
check 679 678 -1
svnum 4 - -4
svdir 4 - -4
sv 4 - -4
stamplog 4 - -4
rploglen 4 - -4
rplog 4 - -4
mount_main 995 988 -7
static.default_file_list 8 - -8
pfd 8 - -8
logpipe 8 - -8
static.info 20 - -20
brctl_main 767 739 -28
------------------------------------------------------------------------------
(add/remove: 0/12 grow/shrink: 1/3 up/down: 26/-106) Total: -80 bytes
text data bss dec hex filename
793327 662 7412 801401 c3a79 busybox_old
793329 641 7372 801342 c3a3e busybox_unstripped
Diffstat (limited to 'networking')
-rw-r--r-- | networking/brctl.c | 69 |
1 files changed, 38 insertions, 31 deletions
diff --git a/networking/brctl.c b/networking/brctl.c index bbd14c471..2bb03dd82 100644 --- a/networking/brctl.c +++ b/networking/brctl.c | |||
@@ -33,13 +33,15 @@ | |||
33 | 33 | ||
34 | #if ENABLE_FEATURE_BRCTL_FANCY | 34 | #if ENABLE_FEATURE_BRCTL_FANCY |
35 | #include <linux/if_bridge.h> | 35 | #include <linux/if_bridge.h> |
36 | |||
36 | /* FIXME: These 4 funcs are not really clean and could be improved */ | 37 | /* FIXME: These 4 funcs are not really clean and could be improved */ |
37 | static inline ALWAYS_INLINE void strtotimeval(struct timeval *tv, | 38 | static ALWAYS_INLINE void strtotimeval(struct timeval *tv, |
38 | const char *time_str) | 39 | const char *time_str) |
39 | { | 40 | { |
40 | double secs; | 41 | double secs; |
41 | #if BRCTL_USE_INTERNAL | 42 | #if BRCTL_USE_INTERNAL |
42 | if (!(secs = /*bb_*/strtod(time_str, NULL))) | 43 | secs = /*bb_*/strtod(time_str, NULL); |
44 | if (!secs) | ||
43 | #else | 45 | #else |
44 | if (sscanf(time_str, "%lf", &secs) != 1) | 46 | if (sscanf(time_str, "%lf", &secs) != 1) |
45 | #endif | 47 | #endif |
@@ -48,7 +50,7 @@ static inline ALWAYS_INLINE void strtotimeval(struct timeval *tv, | |||
48 | tv->tv_usec = 1000000 * (secs - tv->tv_sec); | 50 | tv->tv_usec = 1000000 * (secs - tv->tv_sec); |
49 | } | 51 | } |
50 | 52 | ||
51 | static inline ALWAYS_INLINE unsigned long __tv_to_jiffies(const struct timeval *tv) | 53 | static ALWAYS_INLINE unsigned long __tv_to_jiffies(const struct timeval *tv) |
52 | { | 54 | { |
53 | unsigned long long jif; | 55 | unsigned long long jif; |
54 | 56 | ||
@@ -56,7 +58,7 @@ static inline ALWAYS_INLINE unsigned long __tv_to_jiffies(const struct timeval * | |||
56 | 58 | ||
57 | return jif/10000; | 59 | return jif/10000; |
58 | } | 60 | } |
59 | # if 00 | 61 | # if 0 |
60 | static void __jiffies_to_tv(struct timeval *tv, unsigned long jiffies) | 62 | static void __jiffies_to_tv(struct timeval *tv, unsigned long jiffies) |
61 | { | 63 | { |
62 | unsigned long long tvusec; | 64 | unsigned long long tvusec; |
@@ -74,7 +76,7 @@ static unsigned long str_to_jiffies(const char *time_str) | |||
74 | } | 76 | } |
75 | 77 | ||
76 | static void arm_ioctl(unsigned long *args, | 78 | static void arm_ioctl(unsigned long *args, |
77 | unsigned long arg0, unsigned long arg1, unsigned long arg2) | 79 | unsigned long arg0, unsigned long arg1, unsigned long arg2) |
78 | { | 80 | { |
79 | args[0] = arg0; | 81 | args[0] = arg0; |
80 | args[1] = arg1; | 82 | args[1] = arg1; |
@@ -84,10 +86,9 @@ static void arm_ioctl(unsigned long *args, | |||
84 | #endif | 86 | #endif |
85 | 87 | ||
86 | 88 | ||
87 | int brctl_main(int argc ATTRIBUTE_UNUSED, char **argv) MAIN_EXTERNALLY_VISIBLE; | 89 | int brctl_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; |
88 | int brctl_main(int argc ATTRIBUTE_UNUSED, char **argv) | 90 | int brctl_main(int argc ATTRIBUTE_UNUSED, char **argv) |
89 | { | 91 | { |
90 | int fd; | ||
91 | static const char keywords[] ALIGN1 = | 92 | static const char keywords[] ALIGN1 = |
92 | "addbr\0" "delbr\0" "addif\0" "delif\0" | 93 | "addbr\0" "delbr\0" "addif\0" "delif\0" |
93 | USE_FEATURE_BRCTL_FANCY( | 94 | USE_FEATURE_BRCTL_FANCY( |
@@ -96,16 +97,19 @@ int brctl_main(int argc ATTRIBUTE_UNUSED, char **argv) | |||
96 | "setpathcost\0" "setportprio\0" "setbridgeprio\0" | 97 | "setpathcost\0" "setportprio\0" "setbridgeprio\0" |
97 | ) | 98 | ) |
98 | USE_FEATURE_BRCTL_SHOW("showmacs\0" "show\0"); | 99 | USE_FEATURE_BRCTL_SHOW("showmacs\0" "show\0"); |
100 | |||
99 | enum { ARG_addbr = 0, ARG_delbr, ARG_addif, ARG_delif | 101 | enum { ARG_addbr = 0, ARG_delbr, ARG_addif, ARG_delif |
100 | USE_FEATURE_BRCTL_FANCY(, | 102 | USE_FEATURE_BRCTL_FANCY(, |
101 | ARG_stp, | 103 | ARG_stp, |
102 | ARG_setageing, ARG_setfd, ARG_sethello, ARG_setmaxage, | 104 | ARG_setageing, ARG_setfd, ARG_sethello, ARG_setmaxage, |
103 | ARG_setpathcost, ARG_setportprio, ARG_setbridgeprio | 105 | ARG_setpathcost, ARG_setportprio, ARG_setbridgeprio |
104 | ) | 106 | ) |
105 | USE_FEATURE_BRCTL_SHOW(, ARG_showmacs, ARG_show) }; | 107 | USE_FEATURE_BRCTL_SHOW(, ARG_showmacs, ARG_show) |
108 | }; | ||
109 | |||
110 | int fd; | ||
106 | smallint key; | 111 | smallint key; |
107 | struct ifreq ifr; | 112 | struct ifreq ifr; |
108 | static char info[] = "bridge %s\0 iface %s"; | ||
109 | char *br, *brif; | 113 | char *br, *brif; |
110 | #if ENABLE_FEATURE_BRCTL_FANCY | 114 | #if ENABLE_FEATURE_BRCTL_FANCY |
111 | unsigned long args[4] = {0, 0, 0, 0}; | 115 | unsigned long args[4] = {0, 0, 0, 0}; |
@@ -125,25 +129,26 @@ int brctl_main(int argc ATTRIBUTE_UNUSED, char **argv) | |||
125 | } | 129 | } |
126 | #endif | 130 | #endif |
127 | fd = xsocket(AF_INET, SOCK_STREAM, 0); | 131 | fd = xsocket(AF_INET, SOCK_STREAM, 0); |
128 | br = *(argv++); | 132 | br = *argv++; |
129 | 133 | ||
130 | if (key == ARG_addbr || key == ARG_delbr) { /* addbr or delbr */ | 134 | if (key == ARG_addbr || key == ARG_delbr) { /* addbr or delbr */ |
131 | ioctl_or_perror_and_die(fd, | 135 | ioctl_or_perror_and_die(fd, |
132 | key == ARG_addbr ? SIOCBRADDBR : SIOCBRDELBR, | 136 | key == ARG_addbr ? SIOCBRADDBR : SIOCBRDELBR, |
133 | br, info, br); | 137 | br, "bridge %s", br); |
134 | goto done; | 138 | goto done; |
135 | } | 139 | } |
136 | if (!*argv) /* all but 'show' need at least one argument */ | 140 | if (!*argv) /* all but 'show' need at least one argument */ |
137 | bb_show_usage(); | 141 | bb_show_usage(); |
138 | safe_strncpy(ifr.ifr_name, br, IFNAMSIZ); | 142 | safe_strncpy(ifr.ifr_name, br, IFNAMSIZ); |
139 | if (key == ARG_addif || key == ARG_delif) { /* addif or delif */ | 143 | if (key == ARG_addif || key == ARG_delif) { /* addif or delif */ |
140 | brif = *(argv++); | 144 | brif = *argv++; |
141 | if (!(ifr.ifr_ifindex = if_nametoindex(brif))) { | 145 | ifr.ifr_ifindex = if_nametoindex(brif); |
142 | bb_perror_msg_and_die(info+11, brif); | 146 | if (!ifr.ifr_ifindex) { |
147 | bb_perror_msg_and_die("iface %s", brif); | ||
143 | } | 148 | } |
144 | ioctl_or_perror_and_die(fd, | 149 | ioctl_or_perror_and_die(fd, |
145 | key == ARG_addif ? SIOCBRADDIF : SIOCBRDELIF, | 150 | key == ARG_addif ? SIOCBRADDIF : SIOCBRDELIF, |
146 | &ifr, info, br); | 151 | &ifr, "bridge %s", br); |
147 | goto done; | 152 | goto done; |
148 | } | 153 | } |
149 | #if ENABLE_FEATURE_BRCTL_FANCY | 154 | #if ENABLE_FEATURE_BRCTL_FANCY |
@@ -156,11 +161,10 @@ int brctl_main(int argc ATTRIBUTE_UNUSED, char **argv) | |||
156 | } | 161 | } |
157 | if ((unsigned)(key - ARG_stp) < 5) { /* time related ops */ | 162 | if ((unsigned)(key - ARG_stp) < 5) { /* time related ops */ |
158 | unsigned long op = (key == ARG_setageing) ? BRCTL_SET_AGEING_TIME : | 163 | unsigned long op = (key == ARG_setageing) ? BRCTL_SET_AGEING_TIME : |
159 | (key == ARG_setfd) ? BRCTL_SET_BRIDGE_FORWARD_DELAY: | 164 | (key == ARG_setfd) ? BRCTL_SET_BRIDGE_FORWARD_DELAY : |
160 | (key == ARG_sethello) ? BRCTL_SET_BRIDGE_HELLO_TIME: | 165 | (key == ARG_sethello) ? BRCTL_SET_BRIDGE_HELLO_TIME : |
161 | (key == ARG_setmaxage) ? BRCTL_SET_BRIDGE_MAX_AGE : | 166 | /*key == ARG_setmaxage*/ BRCTL_SET_BRIDGE_MAX_AGE; |
162 | -1/* will never be used */; | 167 | arm_ioctl(args, op, str_to_jiffies(*argv), 0); |
163 | arm_ioctl(args, op, str_to_jiffies (*argv), 0); | ||
164 | goto fire; | 168 | goto fire; |
165 | } | 169 | } |
166 | port = -1; | 170 | port = -1; |
@@ -168,25 +172,28 @@ int brctl_main(int argc ATTRIBUTE_UNUSED, char **argv) | |||
168 | int ifidx[MAX_PORTS]; | 172 | int ifidx[MAX_PORTS]; |
169 | unsigned i; | 173 | unsigned i; |
170 | 174 | ||
171 | if (!(port = if_nametoindex(*argv))) | 175 | port = if_nametoindex(*argv); |
176 | if (!port) | ||
172 | bb_error_msg_and_die(bb_msg_invalid_arg, *argv, "port"); | 177 | bb_error_msg_and_die(bb_msg_invalid_arg, *argv, "port"); |
173 | argv++; | 178 | argv++; |
174 | memset(ifidx, 0, sizeof ifidx); | 179 | memset(ifidx, 0, sizeof ifidx); |
175 | arm_ioctl(args, BRCTL_GET_PORT_LIST, (unsigned long)ifidx, | 180 | arm_ioctl(args, BRCTL_GET_PORT_LIST, (unsigned long)ifidx, |
176 | MAX_PORTS); | 181 | MAX_PORTS); |
177 | xioctl(fd, SIOCDEVPRIVATE, &ifr); | 182 | xioctl(fd, SIOCDEVPRIVATE, &ifr); |
178 | for (i = 0; i < MAX_PORTS; i++) | 183 | for (i = 0; i < MAX_PORTS; i++) { |
179 | if (ifidx[i] == port) { | 184 | if (ifidx[i] == port) { |
180 | port = i; | 185 | port = i; |
181 | break; | 186 | break; |
182 | } | 187 | } |
188 | } | ||
183 | } | 189 | } |
184 | if (key == ARG_setpathcost | 190 | if (key == ARG_setpathcost |
185 | || key == ARG_setportprio || key == ARG_setbridgeprio) { | 191 | || key == ARG_setportprio |
192 | || key == ARG_setbridgeprio | ||
193 | ) { | ||
186 | unsigned long op = (key == ARG_setpathcost) ? BRCTL_SET_PATH_COST : | 194 | unsigned long op = (key == ARG_setpathcost) ? BRCTL_SET_PATH_COST : |
187 | (key == ARG_setportprio) ? BRCTL_SET_PORT_PRIORITY : | 195 | (key == ARG_setportprio) ? BRCTL_SET_PORT_PRIORITY : |
188 | (key == ARG_setbridgeprio) ? BRCTL_SET_BRIDGE_PRIORITY : | 196 | /*key == ARG_setbridgeprio*/ BRCTL_SET_BRIDGE_PRIORITY; |
189 | -1/* will never be used */; | ||
190 | unsigned long arg1 = port; | 197 | unsigned long arg1 = port; |
191 | unsigned long arg2; | 198 | unsigned long arg2; |
192 | # if BRCTL_USE_INTERNAL | 199 | # if BRCTL_USE_INTERNAL |
@@ -194,7 +201,7 @@ int brctl_main(int argc ATTRIBUTE_UNUSED, char **argv) | |||
194 | # else | 201 | # else |
195 | if (sscanf(*argv, "%i", &tmp) != 1) | 202 | if (sscanf(*argv, "%i", &tmp) != 1) |
196 | bb_error_msg_and_die(bb_msg_invalid_arg, *argv, | 203 | bb_error_msg_and_die(bb_msg_invalid_arg, *argv, |
197 | key == ARG_setpathcost ? "cost" : "prio"); | 204 | key == ARG_setpathcost ? "cost" : "prio"); |
198 | # endif | 205 | # endif |
199 | if (key == ARG_setbridgeprio) { | 206 | if (key == ARG_setbridgeprio) { |
200 | arg1 = tmp; | 207 | arg1 = tmp; |
@@ -212,6 +219,6 @@ int brctl_main(int argc ATTRIBUTE_UNUSED, char **argv) | |||
212 | if (ENABLE_FEATURE_CLEAN_UP) | 219 | if (ENABLE_FEATURE_CLEAN_UP) |
213 | close(fd); | 220 | close(fd); |
214 | } | 221 | } |
215 | USE_FEATURE_BRCTL_SHOW(out:) | 222 | USE_FEATURE_BRCTL_SHOW(out:) |
216 | return EXIT_SUCCESS; | 223 | return EXIT_SUCCESS; |
217 | } | 224 | } |