diff options
author | Denis Vlasenko <vda.linux@googlemail.com> | 2007-11-18 22:56:25 +0000 |
---|---|---|
committer | Denis Vlasenko <vda.linux@googlemail.com> | 2007-11-18 22:56:25 +0000 |
commit | ed6a49c657ae204f6ba8ad84315fa04c09297a7c (patch) | |
tree | 5f47e19e16582dfcdefb99bc1edea693e86c258d /networking/libiproute/iplink.c | |
parent | 2a587df80a148e497d10344c79f2b94d3bce6aaf (diff) | |
download | busybox-w32-ed6a49c657ae204f6ba8ad84315fa04c09297a7c.tar.gz busybox-w32-ed6a49c657ae204f6ba8ad84315fa04c09297a7c.tar.bz2 busybox-w32-ed6a49c657ae204f6ba8ad84315fa04c09297a7c.zip |
ip: stop propagating argc; optimize ip_parse_common_args
function old new delta
find_pair 167 187 +20
static.families - 17 +17
die_must_be_on_off - 11 +11
...
on_off 33 22 -11
do_ipaddr 103 90 -13
do_iptunnel 1001 986 -15
iproute_list_or_flush 1237 1217 -20
static.ip_common_commands 43 22 -21
do_iproute 2217 2193 -24
parse_args 1444 1414 -30
ip_do 47 16 -31
do_iprule 994 963 -31
ip_main 153 113 -40
ipaddr_modify 1357 1305 -52
ipaddr_list_or_flush 2543 2490 -53
ip_parse_common_args 294 159 -135
------------------------------------------------------------------------------
(add/remove: 4/1 grow/shrink: 4/24 up/down: 85/-563) Total: -478 bytes
text data bss dec hex filename
775561 966 9236 785763 bfd63 busybox_old
775073 962 9236 785271 bfb77 busybox_unstripped
Diffstat (limited to 'networking/libiproute/iplink.c')
-rw-r--r-- | networking/libiproute/iplink.c | 98 |
1 files changed, 54 insertions, 44 deletions
diff --git a/networking/libiproute/iplink.c b/networking/libiproute/iplink.c index e1c9c6043..494b223bf 100644 --- a/networking/libiproute/iplink.c +++ b/networking/libiproute/iplink.c | |||
@@ -21,12 +21,6 @@ | |||
21 | /* taken from linux/sockios.h */ | 21 | /* taken from linux/sockios.h */ |
22 | #define SIOCSIFNAME 0x8923 /* set interface name */ | 22 | #define SIOCSIFNAME 0x8923 /* set interface name */ |
23 | 23 | ||
24 | static void on_off(const char *msg) ATTRIBUTE_NORETURN; | ||
25 | static void on_off(const char *msg) | ||
26 | { | ||
27 | bb_error_msg_and_die("error: argument of \"%s\" must be \"on\" or \"off\"", msg); | ||
28 | } | ||
29 | |||
30 | /* Exits on error */ | 24 | /* Exits on error */ |
31 | static int get_ctl_fd(void) | 25 | static int get_ctl_fd(void) |
32 | { | 26 | { |
@@ -158,8 +152,14 @@ static void set_address(struct ifreq *ifr, int brd) | |||
158 | } | 152 | } |
159 | 153 | ||
160 | 154 | ||
155 | static void die_must_be_on_off(const char *msg) ATTRIBUTE_NORETURN; | ||
156 | static void die_must_be_on_off(const char *msg) | ||
157 | { | ||
158 | bb_error_msg_and_die("argument of \"%s\" must be \"on\" or \"off\"", msg); | ||
159 | } | ||
160 | |||
161 | /* Return value becomes exitcode. It's okay to not return at all */ | 161 | /* Return value becomes exitcode. It's okay to not return at all */ |
162 | static int do_set(int argc, char **argv) | 162 | static int do_set(char **argv) |
163 | { | 163 | { |
164 | char *dev = NULL; | 164 | char *dev = NULL; |
165 | uint32_t mask = 0; | 165 | uint32_t mask = 0; |
@@ -172,53 +172,63 @@ static int do_set(int argc, char **argv) | |||
172 | char *newname = NULL; | 172 | char *newname = NULL; |
173 | int htype, halen; | 173 | int htype, halen; |
174 | static const char keywords[] ALIGN1 = | 174 | static const char keywords[] ALIGN1 = |
175 | "up\0""down\0""name\0""mtu\0""multicast\0""arp\0""addr\0""dev\0" | 175 | "up\0""down\0""name\0""mtu\0""multicast\0""arp\0""addr\0""dev\0"; |
176 | "on\0""off\0"; | 176 | enum { ARG_up = 0, ARG_down, ARG_name, ARG_mtu, ARG_multicast, ARG_arp, |
177 | enum { ARG_up = 1, ARG_down, ARG_name, ARG_mtu, ARG_multicast, ARG_arp, | 177 | ARG_addr, ARG_dev }; |
178 | ARG_addr, ARG_dev, PARM_on, PARM_off }; | 178 | static const char str_on_off[] ALIGN1 = "on\0""off\0"; |
179 | enum { PARM_on = 0, PARM_off }; | ||
179 | smalluint key; | 180 | smalluint key; |
180 | 181 | ||
181 | while (argc > 0) { | 182 | while (*argv) { |
182 | key = index_in_strings(keywords, *argv) + 1; | 183 | key = index_in_strings(keywords, *argv); |
183 | if (key == ARG_up) { | 184 | if (key == ARG_up) { |
184 | mask |= IFF_UP; | 185 | mask |= IFF_UP; |
185 | flags |= IFF_UP; | 186 | flags |= IFF_UP; |
186 | } else if (key == ARG_down) { | 187 | } |
188 | if (key == ARG_down) { | ||
187 | mask |= IFF_UP; | 189 | mask |= IFF_UP; |
188 | flags &= ~IFF_UP; | 190 | flags &= ~IFF_UP; |
189 | } else if (key == ARG_name) { | 191 | } |
192 | if (key == ARG_name) { | ||
190 | NEXT_ARG(); | 193 | NEXT_ARG(); |
191 | newname = *argv; | 194 | newname = *argv; |
192 | } else if (key == ARG_mtu) { | 195 | } |
196 | if (key == ARG_mtu) { | ||
193 | NEXT_ARG(); | 197 | NEXT_ARG(); |
194 | if (mtu != -1) | 198 | if (mtu != -1) |
195 | duparg("mtu", *argv); | 199 | duparg("mtu", *argv); |
196 | if (get_integer(&mtu, *argv, 0)) | 200 | if (get_integer(&mtu, *argv, 0)) |
197 | invarg(*argv, "mtu"); | 201 | invarg(*argv, "mtu"); |
198 | } else if (key == ARG_multicast) { | 202 | } |
203 | if (key == ARG_multicast) { | ||
204 | int param; | ||
199 | NEXT_ARG(); | 205 | NEXT_ARG(); |
200 | mask |= IFF_MULTICAST; | 206 | mask |= IFF_MULTICAST; |
201 | key = index_in_strings(keywords, *argv) + 1; | 207 | param = index_in_strings(str_on_off, *argv); |
202 | if (key == PARM_on) { | 208 | if (param < 0) |
209 | die_must_be_on_off("multicast"); | ||
210 | if (param == PARM_on) | ||
203 | flags |= IFF_MULTICAST; | 211 | flags |= IFF_MULTICAST; |
204 | } else if (key == PARM_off) { | 212 | else |
205 | flags &= ~IFF_MULTICAST; | 213 | flags &= ~IFF_MULTICAST; |
206 | } else | 214 | } |
207 | on_off("multicast"); | 215 | if (key == ARG_arp) { |
208 | } else if (key == ARG_arp) { | 216 | int param; |
209 | NEXT_ARG(); | 217 | NEXT_ARG(); |
210 | mask |= IFF_NOARP; | 218 | mask |= IFF_NOARP; |
211 | key = index_in_strings(keywords, *argv) + 1; | 219 | param = index_in_strings(str_on_off, *argv); |
212 | if (key == PARM_on) { | 220 | if (param < 0) |
221 | die_must_be_on_off("arp"); | ||
222 | if (param == PARM_on) | ||
213 | flags &= ~IFF_NOARP; | 223 | flags &= ~IFF_NOARP; |
214 | } else if (key == PARM_off) { | 224 | else |
215 | flags |= IFF_NOARP; | 225 | flags |= IFF_NOARP; |
216 | } else | 226 | } |
217 | on_off("arp"); | 227 | if (key == ARG_addr) { |
218 | } else if (key == ARG_addr) { | ||
219 | NEXT_ARG(); | 228 | NEXT_ARG(); |
220 | newaddr = *argv; | 229 | newaddr = *argv; |
221 | } else { | 230 | } |
231 | if (key >= ARG_dev) { | ||
222 | if (key == ARG_dev) { | 232 | if (key == ARG_dev) { |
223 | NEXT_ARG(); | 233 | NEXT_ARG(); |
224 | } | 234 | } |
@@ -226,7 +236,7 @@ static int do_set(int argc, char **argv) | |||
226 | duparg2("dev", *argv); | 236 | duparg2("dev", *argv); |
227 | dev = *argv; | 237 | dev = *argv; |
228 | } | 238 | } |
229 | argc--; argv++; | 239 | argv++; |
230 | } | 240 | } |
231 | 241 | ||
232 | if (!dev) { | 242 | if (!dev) { |
@@ -266,26 +276,26 @@ static int do_set(int argc, char **argv) | |||
266 | return 0; | 276 | return 0; |
267 | } | 277 | } |
268 | 278 | ||
269 | static int ipaddr_list_link(int argc, char **argv) | 279 | static int ipaddr_list_link(char **argv) |
270 | { | 280 | { |
271 | preferred_family = AF_PACKET; | 281 | preferred_family = AF_PACKET; |
272 | return ipaddr_list_or_flush(argc, argv, 0); | 282 | return ipaddr_list_or_flush(argv, 0); |
273 | } | 283 | } |
274 | 284 | ||
275 | /* Return value becomes exitcode. It's okay to not return at all */ | 285 | /* Return value becomes exitcode. It's okay to not return at all */ |
276 | int do_iplink(int argc, char **argv) | 286 | int do_iplink(char **argv) |
277 | { | 287 | { |
278 | static const char keywords[] ALIGN1 = | 288 | static const char keywords[] ALIGN1 = |
279 | "set\0""show\0""lst\0""list\0"; | 289 | "set\0""show\0""lst\0""list\0"; |
280 | smalluint key; | 290 | int key; |
281 | if (argc <= 0) | 291 | if (!*argv) |
282 | return ipaddr_list_link(0, NULL); | 292 | return ipaddr_list_link(argv); |
283 | key = index_in_substrings(keywords, *argv) + 1; | 293 | key = index_in_substrings(keywords, *argv); |
284 | if (key == 0) | 294 | if (key < 0) |
285 | bb_error_msg_and_die(bb_msg_invalid_arg, *argv, applet_name); | 295 | bb_error_msg_and_die(bb_msg_invalid_arg, *argv, applet_name); |
286 | argc--; argv++; | 296 | argv++; |
287 | if (key == 1) /* set */ | 297 | if (key == 0) /* set */ |
288 | return do_set(argc, argv); | 298 | return do_set(argv); |
289 | else /* show, lst, list */ | 299 | /* show, lst, list */ |
290 | return ipaddr_list_link(argc, argv); | 300 | return ipaddr_list_link(argv); |
291 | } | 301 | } |