diff options
author | Bernhard Reutner-Fischer <rep.dot.nop@gmail.com> | 2007-04-12 11:36:56 +0000 |
---|---|---|
committer | Bernhard Reutner-Fischer <rep.dot.nop@gmail.com> | 2007-04-12 11:36:56 +0000 |
commit | c98c31783c062377d14b80735b056cf4c53c66e9 (patch) | |
tree | 900f4dbd061b9f27ba58f1ab7be478a9ce170093 /networking | |
parent | b290889f0265e1278e8a868aa82a65bcc9099b0f (diff) | |
download | busybox-w32-c98c31783c062377d14b80735b056cf4c53c66e9.tar.gz busybox-w32-c98c31783c062377d14b80735b056cf4c53c66e9.tar.bz2 busybox-w32-c98c31783c062377d14b80735b056cf4c53c66e9.zip |
- shrink iproute a bit (-200 bytes). Untested
Diffstat (limited to 'networking')
-rw-r--r-- | networking/libiproute/iproute.c | 143 | ||||
-rw-r--r-- | networking/libiproute/utils.c | 2 | ||||
-rw-r--r-- | networking/libiproute/utils.h | 2 |
3 files changed, 84 insertions, 63 deletions
diff --git a/networking/libiproute/iproute.c b/networking/libiproute/iproute.c index e7ad7d9c4..d5d9c1cfc 100644 --- a/networking/libiproute/iproute.c +++ b/networking/libiproute/iproute.c | |||
@@ -306,10 +306,23 @@ static int iproute_modify(int cmd, unsigned flags, int argc, char **argv) | |||
306 | struct rtattr * mxrta = (void*)mxbuf; | 306 | struct rtattr * mxrta = (void*)mxbuf; |
307 | unsigned mxlock = 0; | 307 | unsigned mxlock = 0; |
308 | char *d = NULL; | 308 | char *d = NULL; |
309 | int gw_ok = 0; | 309 | enum { gw_ok = 1<<0, dst_ok = 1<<1, proto_ok = 1<<2, type_ok = 1<<3}; |
310 | int dst_ok = 0; | 310 | smalluint ok = 0; |
311 | int proto_ok = 0; | 311 | static const char * const keywords[] = { |
312 | int type_ok = 0; | 312 | "src", "via", "mtu", "lock", "protocol", "table", "dev", "oif", "to", |
313 | NULL | ||
314 | }; | ||
315 | enum { | ||
316 | ARG_src, | ||
317 | ARG_via, | ||
318 | ARG_mtu, PARM_lock, | ||
319 | ARG_protocol, | ||
320 | ARG_table, | ||
321 | ARG_dev, | ||
322 | ARG_oif, | ||
323 | ARG_to | ||
324 | }; | ||
325 | int arg; | ||
313 | 326 | ||
314 | memset(&req, 0, sizeof(req)); | 327 | memset(&req, 0, sizeof(req)); |
315 | 328 | ||
@@ -330,69 +343,64 @@ static int iproute_modify(int cmd, unsigned flags, int argc, char **argv) | |||
330 | mxrta->rta_len = RTA_LENGTH(0); | 343 | mxrta->rta_len = RTA_LENGTH(0); |
331 | 344 | ||
332 | while (argc > 0) { | 345 | while (argc > 0) { |
333 | if (strcmp(*argv, "src") == 0) { | 346 | arg = index_in_substr_array(keywords, *argv); |
347 | if (arg == ARG_src) { | ||
334 | inet_prefix addr; | 348 | inet_prefix addr; |
335 | NEXT_ARG(); | 349 | NEXT_ARG(); |
336 | get_addr(&addr, *argv, req.r.rtm_family); | 350 | get_addr(&addr, *argv, req.r.rtm_family); |
337 | if (req.r.rtm_family == AF_UNSPEC) { | 351 | if (req.r.rtm_family == AF_UNSPEC) |
338 | req.r.rtm_family = addr.family; | 352 | req.r.rtm_family = addr.family; |
339 | } | ||
340 | addattr_l(&req.n, sizeof(req), RTA_PREFSRC, &addr.data, addr.bytelen); | 353 | addattr_l(&req.n, sizeof(req), RTA_PREFSRC, &addr.data, addr.bytelen); |
341 | } else if (strcmp(*argv, "via") == 0) { | 354 | } else if (arg == ARG_via) { |
342 | inet_prefix addr; | 355 | inet_prefix addr; |
343 | gw_ok = 1; | 356 | ok |= gw_ok; |
344 | NEXT_ARG(); | 357 | NEXT_ARG(); |
345 | get_addr(&addr, *argv, req.r.rtm_family); | 358 | get_addr(&addr, *argv, req.r.rtm_family); |
346 | if (req.r.rtm_family == AF_UNSPEC) { | 359 | if (req.r.rtm_family == AF_UNSPEC) { |
347 | req.r.rtm_family = addr.family; | 360 | req.r.rtm_family = addr.family; |
348 | } | 361 | } |
349 | addattr_l(&req.n, sizeof(req), RTA_GATEWAY, &addr.data, addr.bytelen); | 362 | addattr_l(&req.n, sizeof(req), RTA_GATEWAY, &addr.data, addr.bytelen); |
350 | } else if (strcmp(*argv, "mtu") == 0) { | 363 | } else if (arg == ARG_mtu) { |
351 | unsigned mtu; | 364 | unsigned mtu; |
352 | NEXT_ARG(); | 365 | NEXT_ARG(); |
353 | if (strcmp(*argv, "lock") == 0) { | 366 | if (index_in_str_array(keywords, *argv) == PARM_lock) { |
354 | mxlock |= (1<<RTAX_MTU); | 367 | mxlock |= (1<<RTAX_MTU); |
355 | NEXT_ARG(); | 368 | NEXT_ARG(); |
356 | } | 369 | } |
357 | if (get_unsigned(&mtu, *argv, 0)) { | 370 | if (get_unsigned(&mtu, *argv, 0)) |
358 | invarg(*argv, "mtu"); | 371 | invarg(*argv, "mtu"); |
359 | } | ||
360 | rta_addattr32(mxrta, sizeof(mxbuf), RTAX_MTU, mtu); | 372 | rta_addattr32(mxrta, sizeof(mxbuf), RTAX_MTU, mtu); |
361 | } else if (matches(*argv, "protocol") == 0) { | 373 | } else if (arg == ARG_protocol) { |
362 | uint32_t prot; | 374 | uint32_t prot; |
363 | NEXT_ARG(); | 375 | NEXT_ARG(); |
364 | if (rtnl_rtprot_a2n(&prot, *argv)) | 376 | if (rtnl_rtprot_a2n(&prot, *argv)) |
365 | invarg(*argv, "protocol"); | 377 | invarg(*argv, "protocol"); |
366 | req.r.rtm_protocol = prot; | 378 | req.r.rtm_protocol = prot; |
367 | proto_ok =1; | 379 | ok |= proto_ok; |
368 | #if ENABLE_FEATURE_IP_RULE | 380 | } else if (arg == ARG_table) { |
369 | } else if (matches(*argv, "table") == 0) { | ||
370 | uint32_t tid; | 381 | uint32_t tid; |
371 | NEXT_ARG(); | 382 | NEXT_ARG(); |
372 | if (rtnl_rttable_a2n(&tid, *argv)) | 383 | if (rtnl_rttable_a2n(&tid, *argv)) |
373 | invarg(*argv, "table"); | 384 | invarg(*argv, "table"); |
374 | req.r.rtm_table = tid; | 385 | req.r.rtm_table = tid; |
375 | #endif | 386 | } else if (arg == ARG_dev || arg == ARG_oif) { |
376 | } else if (strcmp(*argv, "dev") == 0 || | ||
377 | strcmp(*argv, "oif") == 0) { | ||
378 | NEXT_ARG(); | 387 | NEXT_ARG(); |
379 | d = *argv; | 388 | d = *argv; |
380 | } else { | 389 | } else { |
381 | int type; | 390 | int type; |
382 | inet_prefix dst; | 391 | inet_prefix dst; |
383 | 392 | ||
384 | if (strcmp(*argv, "to") == 0) { | 393 | if (arg == ARG_to) { |
385 | NEXT_ARG(); | 394 | NEXT_ARG(); |
386 | } | 395 | } |
387 | if ((**argv < '0' || **argv > '9') | 396 | if ((**argv < '0' || **argv > '9') |
388 | && rtnl_rtntype_a2n(&type, *argv) == 0 | 397 | && rtnl_rtntype_a2n(&type, *argv) == 0) { |
389 | ) { | ||
390 | NEXT_ARG(); | 398 | NEXT_ARG(); |
391 | req.r.rtm_type = type; | 399 | req.r.rtm_type = type; |
392 | type_ok = 1; | 400 | ok |= type_ok; |
393 | } | 401 | } |
394 | 402 | ||
395 | if (dst_ok) { | 403 | if (ok & dst_ok) { |
396 | duparg2("to", *argv); | 404 | duparg2("to", *argv); |
397 | } | 405 | } |
398 | get_prefix(&dst, *argv, req.r.rtm_family); | 406 | get_prefix(&dst, *argv, req.r.rtm_family); |
@@ -400,7 +408,7 @@ static int iproute_modify(int cmd, unsigned flags, int argc, char **argv) | |||
400 | req.r.rtm_family = dst.family; | 408 | req.r.rtm_family = dst.family; |
401 | } | 409 | } |
402 | req.r.rtm_dst_len = dst.bitlen; | 410 | req.r.rtm_dst_len = dst.bitlen; |
403 | dst_ok = 1; | 411 | ok |= dst_ok; |
404 | if (dst.bytelen) { | 412 | if (dst.bytelen) { |
405 | addattr_l(&req.n, sizeof(req), RTA_DST, &dst.data, dst.bytelen); | 413 | addattr_l(&req.n, sizeof(req), RTA_DST, &dst.data, dst.bytelen); |
406 | } | 414 | } |
@@ -427,6 +435,7 @@ static int iproute_modify(int cmd, unsigned flags, int argc, char **argv) | |||
427 | } | 435 | } |
428 | addattr_l(&req.n, sizeof(req), RTA_METRICS, RTA_DATA(mxrta), RTA_PAYLOAD(mxrta)); | 436 | addattr_l(&req.n, sizeof(req), RTA_METRICS, RTA_DATA(mxrta), RTA_PAYLOAD(mxrta)); |
429 | } | 437 | } |
438 | |||
430 | if (req.r.rtm_type == RTN_LOCAL || req.r.rtm_type == RTN_NAT) | 439 | if (req.r.rtm_type == RTN_LOCAL || req.r.rtm_type == RTN_NAT) |
431 | req.r.rtm_scope = RT_SCOPE_HOST; | 440 | req.r.rtm_scope = RT_SCOPE_HOST; |
432 | else if (req.r.rtm_type == RTN_BROADCAST || | 441 | else if (req.r.rtm_type == RTN_BROADCAST || |
@@ -436,7 +445,7 @@ static int iproute_modify(int cmd, unsigned flags, int argc, char **argv) | |||
436 | else if (req.r.rtm_type == RTN_UNICAST || req.r.rtm_type == RTN_UNSPEC) { | 445 | else if (req.r.rtm_type == RTN_UNICAST || req.r.rtm_type == RTN_UNSPEC) { |
437 | if (cmd == RTM_DELROUTE) | 446 | if (cmd == RTM_DELROUTE) |
438 | req.r.rtm_scope = RT_SCOPE_NOWHERE; | 447 | req.r.rtm_scope = RT_SCOPE_NOWHERE; |
439 | else if (!gw_ok) | 448 | else if (!(ok & gw_ok)) |
440 | req.r.rtm_scope = RT_SCOPE_LINK; | 449 | req.r.rtm_scope = RT_SCOPE_LINK; |
441 | } | 450 | } |
442 | 451 | ||
@@ -504,7 +513,21 @@ static int iproute_list_or_flush(int argc, char **argv, int flush) | |||
504 | struct rtnl_handle rth; | 513 | struct rtnl_handle rth; |
505 | char *id = NULL; | 514 | char *id = NULL; |
506 | char *od = NULL; | 515 | char *od = NULL; |
507 | 516 | static const char * const keywords[] = { | |
517 | "protocol", "all", "dev", "oif", "iif", "via", "table", "cache",/*all,*/ | ||
518 | "from", "root", "match", "exact", "to", /*root,match,exact*/ NULL | ||
519 | }; | ||
520 | enum { | ||
521 | ARG_proto, PARM_all, | ||
522 | ARG_dev, | ||
523 | ARG_oif, | ||
524 | ARG_iif, | ||
525 | ARG_via, | ||
526 | ARG_table, PARM_cache, /*PARM_all,*/ | ||
527 | ARG_from, PARM_root, PARM_match, PARM_exact, | ||
528 | ARG_to /*PARM_root, PARM_match, PARM_exact*/ | ||
529 | }; | ||
530 | int arg, parm; | ||
508 | iproute_reset_filter(); | 531 | iproute_reset_filter(); |
509 | filter.tb = RT_TABLE_MAIN; | 532 | filter.tb = RT_TABLE_MAIN; |
510 | 533 | ||
@@ -512,67 +535,66 @@ static int iproute_list_or_flush(int argc, char **argv, int flush) | |||
512 | bb_error_msg_and_die(bb_msg_requires_arg, "\"ip route flush\""); | 535 | bb_error_msg_and_die(bb_msg_requires_arg, "\"ip route flush\""); |
513 | 536 | ||
514 | while (argc > 0) { | 537 | while (argc > 0) { |
515 | if (matches(*argv, "protocol") == 0) { | 538 | arg = index_in_substr_array(keywords, *argv); |
539 | if (arg == ARG_proto) { | ||
516 | uint32_t prot = 0; | 540 | uint32_t prot = 0; |
517 | NEXT_ARG(); | 541 | NEXT_ARG(); |
518 | filter.protocolmask = -1; | 542 | filter.protocolmask = -1; |
519 | if (rtnl_rtprot_a2n(&prot, *argv)) { | 543 | if (rtnl_rtprot_a2n(&prot, *argv)) { |
520 | if (strcmp(*argv, "all") != 0) { | 544 | if (index_in_str_array(keywords, *argv) != PARM_all) |
521 | invarg(*argv, "protocol"); | 545 | invarg(*argv, "protocol"); |
522 | } | ||
523 | prot = 0; | 546 | prot = 0; |
524 | filter.protocolmask = 0; | 547 | filter.protocolmask = 0; |
525 | } | 548 | } |
526 | filter.protocol = prot; | 549 | filter.protocol = prot; |
527 | } else if (strcmp(*argv, "dev") == 0 || | 550 | } else if (arg == ARG_dev || arg == ARG_oif) { |
528 | strcmp(*argv, "oif") == 0) { | ||
529 | NEXT_ARG(); | 551 | NEXT_ARG(); |
530 | od = *argv; | 552 | od = *argv; |
531 | } else if (strcmp(*argv, "iif") == 0) { | 553 | } else if (arg == ARG_iif) { |
532 | NEXT_ARG(); | 554 | NEXT_ARG(); |
533 | id = *argv; | 555 | id = *argv; |
534 | } else if (matches(*argv, "from") == 0) { | 556 | } else if (arg == ARG_via) { |
535 | NEXT_ARG(); | 557 | NEXT_ARG(); |
536 | if (matches(*argv, "root") == 0) { | 558 | get_prefix(&filter.rvia, *argv, do_ipv6); |
559 | } else if (arg == ARG_table) { | ||
560 | NEXT_ARG(); | ||
561 | parm = index_in_substr_array(keywords, *argv); | ||
562 | if (parm == PARM_cache) | ||
563 | filter.tb = -1; | ||
564 | else if (parm == PARM_all) | ||
565 | filter.tb = 0; | ||
566 | else | ||
567 | invarg(*argv, "table"); | ||
568 | } else if (arg == ARG_from) { | ||
569 | NEXT_ARG(); | ||
570 | parm = index_in_substr_array(keywords, *argv); | ||
571 | if (parm == PARM_root) { | ||
537 | NEXT_ARG(); | 572 | NEXT_ARG(); |
538 | get_prefix(&filter.rsrc, *argv, do_ipv6); | 573 | get_prefix(&filter.rsrc, *argv, do_ipv6); |
539 | } else if (matches(*argv, "match") == 0) { | 574 | } else if (parm == PARM_match) { |
540 | NEXT_ARG(); | 575 | NEXT_ARG(); |
541 | get_prefix(&filter.msrc, *argv, do_ipv6); | 576 | get_prefix(&filter.msrc, *argv, do_ipv6); |
542 | } else { | 577 | } else { |
543 | if (matches(*argv, "exact") == 0) { | 578 | if (parm == PARM_exact) |
544 | NEXT_ARG(); | 579 | NEXT_ARG(); |
545 | } | ||
546 | get_prefix(&filter.msrc, *argv, do_ipv6); | 580 | get_prefix(&filter.msrc, *argv, do_ipv6); |
547 | filter.rsrc = filter.msrc; | 581 | filter.rsrc = filter.msrc; |
548 | } | 582 | } |
549 | } else { | 583 | } else { |
550 | if (matches(*argv, "to") == 0) { | 584 | /* parm = arg; // would be more plausible, we reuse arg here */ |
585 | if (arg == ARG_to) { | ||
551 | NEXT_ARG(); | 586 | NEXT_ARG(); |
587 | arg = index_in_substr_array(keywords, *argv); | ||
552 | } | 588 | } |
553 | if (matches(*argv, "root") == 0) { | 589 | if (arg == PARM_root) { |
554 | NEXT_ARG(); | 590 | NEXT_ARG(); |
555 | get_prefix(&filter.rdst, *argv, do_ipv6); | 591 | get_prefix(&filter.rdst, *argv, do_ipv6); |
556 | } else if (matches(*argv, "match") == 0) { | 592 | } else if (arg == PARM_match) { |
557 | NEXT_ARG(); | 593 | NEXT_ARG(); |
558 | get_prefix(&filter.mdst, *argv, do_ipv6); | 594 | get_prefix(&filter.mdst, *argv, do_ipv6); |
559 | } else if (matches(*argv, "table") == 0) { | ||
560 | NEXT_ARG(); | ||
561 | if (matches(*argv, "cache") == 0) { | ||
562 | filter.tb = -1; | ||
563 | #if 0 && ENABLE_FEATURE_IP_RULE | ||
564 | |||
565 | #else | ||
566 | } else if (matches(*argv, "main") != 0) { | ||
567 | invarg(*argv, "table"); | ||
568 | } | ||
569 | #endif | ||
570 | } else if (matches(*argv, "cache") == 0) { | ||
571 | filter.tb = -1; | ||
572 | } else { | 595 | } else { |
573 | if (matches(*argv, "exact") == 0) { | 596 | if (arg == PARM_exact) |
574 | NEXT_ARG(); | 597 | NEXT_ARG(); |
575 | } | ||
576 | get_prefix(&filter.mdst, *argv, do_ipv6); | 598 | get_prefix(&filter.mdst, *argv, do_ipv6); |
577 | filter.rdst = filter.mdst; | 599 | filter.rdst = filter.mdst; |
578 | } | 600 | } |
@@ -655,8 +677,8 @@ static int iproute_get(int argc, char **argv) | |||
655 | } req; | 677 | } req; |
656 | char *idev = NULL; | 678 | char *idev = NULL; |
657 | char *odev = NULL; | 679 | char *odev = NULL; |
658 | int connected = 0; | 680 | bool connected = 0; |
659 | int from_ok = 0; | 681 | bool from_ok = 0; |
660 | static const char * const options[] = | 682 | static const char * const options[] = |
661 | { "from", "iif", "oif", "dev", "notify", "connected", "to", 0 }; | 683 | { "from", "iif", "oif", "dev", "notify", "connected", "to", 0 }; |
662 | 684 | ||
@@ -722,8 +744,7 @@ static int iproute_get(int argc, char **argv) | |||
722 | } | 744 | } |
723 | req.r.rtm_dst_len = addr.bitlen; | 745 | req.r.rtm_dst_len = addr.bitlen; |
724 | } | 746 | } |
725 | argc--; | 747 | argc--; argv++; |
726 | argv++; | ||
727 | } | 748 | } |
728 | } | 749 | } |
729 | 750 | ||
diff --git a/networking/libiproute/utils.c b/networking/libiproute/utils.c index 601e45bb4..9605c39db 100644 --- a/networking/libiproute/utils.c +++ b/networking/libiproute/utils.c | |||
@@ -29,7 +29,7 @@ int get_integer(int *val, char *arg, int base) | |||
29 | *val = res; | 29 | *val = res; |
30 | return 0; | 30 | return 0; |
31 | } | 31 | } |
32 | 32 | //XXX: FIXME: use some libbb function instead | |
33 | int get_unsigned(unsigned *val, char *arg, int base) | 33 | int get_unsigned(unsigned *val, char *arg, int base) |
34 | { | 34 | { |
35 | unsigned long res; | 35 | unsigned long res; |
diff --git a/networking/libiproute/utils.h b/networking/libiproute/utils.h index f76ad124d..3b6fef1e3 100644 --- a/networking/libiproute/utils.h +++ b/networking/libiproute/utils.h | |||
@@ -78,7 +78,7 @@ extern const char *rt_addr_n2a(int af, int len, void *addr, char *buf, int bufle | |||
78 | void invarg(const char *, const char *) ATTRIBUTE_NORETURN; | 78 | void invarg(const char *, const char *) ATTRIBUTE_NORETURN; |
79 | void duparg(const char *, const char *) ATTRIBUTE_NORETURN; | 79 | void duparg(const char *, const char *) ATTRIBUTE_NORETURN; |
80 | void duparg2(const char *, const char *) ATTRIBUTE_NORETURN; | 80 | void duparg2(const char *, const char *) ATTRIBUTE_NORETURN; |
81 | int /*ATTRIBUTE_DEPRECATED*/ matches(const char *arg, const char *pattern); | 81 | int ATTRIBUTE_DEPRECATED matches(const char *arg, const char *pattern); |
82 | int inet_addr_match(inet_prefix *a, inet_prefix *b, int bits); | 82 | int inet_addr_match(inet_prefix *a, inet_prefix *b, int bits); |
83 | 83 | ||
84 | const char *dnet_ntop(int af, const void *addr, char *str, size_t len); | 84 | const char *dnet_ntop(int af, const void *addr, char *str, size_t len); |