diff options
author | Bernhard Reutner-Fischer <rep.dot.nop@gmail.com> | 2010-05-25 18:46:09 +0200 |
---|---|---|
committer | Bernhard Reutner-Fischer <rep.dot.nop@gmail.com> | 2010-05-25 18:48:33 +0200 |
commit | c5f30c0df8f0ce5e94ca22a5100496233067708a (patch) | |
tree | 593d5ef0b5e57ac67e1aabd6b729c4fde038e1ca | |
parent | cc4493a95c877354ee267e29629b72cd9d010262 (diff) | |
download | busybox-w32-c5f30c0df8f0ce5e94ca22a5100496233067708a.tar.gz busybox-w32-c5f30c0df8f0ce5e94ca22a5100496233067708a.tar.bz2 busybox-w32-c5f30c0df8f0ce5e94ca22a5100496233067708a.zip |
ip addr: shrink
function old new delta
ipaddr_list_or_flush 1254 1248 -6
ipaddr_modify 1299 1279 -20
.rodata 135249 135193 -56
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/3 up/down: 0/-82) Total: -82 bytes
Signed-off-by: Bernhard Reutner-Fischer <rep.dot.nop@gmail.com>
-rw-r--r-- | networking/libiproute/ipaddress.c | 177 |
1 files changed, 78 insertions, 99 deletions
diff --git a/networking/libiproute/ipaddress.c b/networking/libiproute/ipaddress.c index 8a5edb968..601b34816 100644 --- a/networking/libiproute/ipaddress.c +++ b/networking/libiproute/ipaddress.c | |||
@@ -442,16 +442,14 @@ int ipaddr_list_or_flush(char **argv, int flush) | |||
442 | } | 442 | } |
443 | 443 | ||
444 | while (*argv) { | 444 | while (*argv) { |
445 | const int option_num = index_in_strings(option, *argv); | 445 | const smalluint key = index_in_strings(option, *argv); |
446 | switch (option_num) { | 446 | if (key == 0) { /* to */ |
447 | case 0: /* to */ | ||
448 | NEXT_ARG(); | 447 | NEXT_ARG(); |
449 | get_prefix(&G_filter.pfx, *argv, G_filter.family); | 448 | get_prefix(&G_filter.pfx, *argv, G_filter.family); |
450 | if (G_filter.family == AF_UNSPEC) { | 449 | if (G_filter.family == AF_UNSPEC) { |
451 | G_filter.family = G_filter.pfx.family; | 450 | G_filter.family = G_filter.pfx.family; |
452 | } | 451 | } |
453 | break; | 452 | } else if (key == 1) { /* scope */ |
454 | case 1: { /* scope */ | ||
455 | uint32_t scope = 0; | 453 | uint32_t scope = 0; |
456 | NEXT_ARG(); | 454 | NEXT_ARG(); |
457 | G_filter.scopemask = -1; | 455 | G_filter.scopemask = -1; |
@@ -463,22 +461,17 @@ int ipaddr_list_or_flush(char **argv, int flush) | |||
463 | G_filter.scopemask = 0; | 461 | G_filter.scopemask = 0; |
464 | } | 462 | } |
465 | G_filter.scope = scope; | 463 | G_filter.scope = scope; |
466 | break; | 464 | } else if (key == 2) { /* up */ |
467 | } | ||
468 | case 2: /* up */ | ||
469 | G_filter.up = 1; | 465 | G_filter.up = 1; |
470 | break; | 466 | } else if (key == 3) { /* label */ |
471 | case 3: /* label */ | ||
472 | NEXT_ARG(); | 467 | NEXT_ARG(); |
473 | G_filter.label = *argv; | 468 | G_filter.label = *argv; |
474 | break; | 469 | } else { |
475 | case 4: /* dev */ | 470 | if (key == 4) /* dev */ |
476 | NEXT_ARG(); | 471 | NEXT_ARG(); |
477 | default: | 472 | if (filter_dev) |
478 | if (filter_dev) { | 473 | duparg2("dev", *argv); |
479 | duparg2("dev", *argv); | 474 | filter_dev = *argv; |
480 | } | ||
481 | filter_dev = *argv; | ||
482 | } | 475 | } |
483 | argv++; | 476 | argv++; |
484 | } | 477 | } |
@@ -631,99 +624,85 @@ static int ipaddr_modify(int cmd, char **argv) | |||
631 | req.ifa.ifa_family = preferred_family; | 624 | req.ifa.ifa_family = preferred_family; |
632 | 625 | ||
633 | while (*argv) { | 626 | while (*argv) { |
634 | const int option_num = index_in_strings(option, *argv); | 627 | const smalluint arg = index_in_strings(option, *argv); |
635 | switch (option_num) { | 628 | if (arg <= 1) { /* peer, remote */ |
636 | case 0: /* peer */ | 629 | NEXT_ARG(); |
637 | case 1: /* remote */ | ||
638 | NEXT_ARG(); | ||
639 | 630 | ||
640 | if (peer_len) { | 631 | if (peer_len) { |
641 | duparg("peer", *argv); | 632 | duparg("peer", *argv); |
642 | } | ||
643 | get_prefix(&peer, *argv, req.ifa.ifa_family); | ||
644 | peer_len = peer.bytelen; | ||
645 | if (req.ifa.ifa_family == AF_UNSPEC) { | ||
646 | req.ifa.ifa_family = peer.family; | ||
647 | } | ||
648 | addattr_l(&req.n, sizeof(req), IFA_ADDRESS, &peer.data, peer.bytelen); | ||
649 | req.ifa.ifa_prefixlen = peer.bitlen; | ||
650 | break; | ||
651 | case 2: /* broadcast */ | ||
652 | case 3: /* brd */ | ||
653 | { | ||
654 | inet_prefix addr; | ||
655 | NEXT_ARG(); | ||
656 | if (brd_len) { | ||
657 | duparg("broadcast", *argv); | ||
658 | } | ||
659 | if (LONE_CHAR(*argv, '+')) { | ||
660 | brd_len = -1; | ||
661 | } else if (LONE_DASH(*argv)) { | ||
662 | brd_len = -2; | ||
663 | } else { | ||
664 | get_addr(&addr, *argv, req.ifa.ifa_family); | ||
665 | if (req.ifa.ifa_family == AF_UNSPEC) | ||
666 | req.ifa.ifa_family = addr.family; | ||
667 | addattr_l(&req.n, sizeof(req), IFA_BROADCAST, &addr.data, addr.bytelen); | ||
668 | brd_len = addr.bytelen; | ||
669 | } | ||
670 | break; | ||
671 | } | 633 | } |
672 | case 4: /* anycast */ | 634 | get_prefix(&peer, *argv, req.ifa.ifa_family); |
673 | { | 635 | peer_len = peer.bytelen; |
674 | inet_prefix addr; | 636 | if (req.ifa.ifa_family == AF_UNSPEC) { |
675 | NEXT_ARG(); | 637 | req.ifa.ifa_family = peer.family; |
676 | if (any_len) { | 638 | } |
677 | duparg("anycast", *argv); | 639 | addattr_l(&req.n, sizeof(req), IFA_ADDRESS, &peer.data, peer.bytelen); |
678 | } | 640 | req.ifa.ifa_prefixlen = peer.bitlen; |
641 | } else if (arg <= 3) { /* broadcast, brd */ | ||
642 | inet_prefix addr; | ||
643 | NEXT_ARG(); | ||
644 | if (brd_len) { | ||
645 | duparg("broadcast", *argv); | ||
646 | } | ||
647 | if (LONE_CHAR(*argv, '+')) { | ||
648 | brd_len = -1; | ||
649 | } else if (LONE_DASH(*argv)) { | ||
650 | brd_len = -2; | ||
651 | } else { | ||
679 | get_addr(&addr, *argv, req.ifa.ifa_family); | 652 | get_addr(&addr, *argv, req.ifa.ifa_family); |
680 | if (req.ifa.ifa_family == AF_UNSPEC) { | 653 | if (req.ifa.ifa_family == AF_UNSPEC) |
681 | req.ifa.ifa_family = addr.family; | 654 | req.ifa.ifa_family = addr.family; |
682 | } | 655 | addattr_l(&req.n, sizeof(req), IFA_BROADCAST, &addr.data, addr.bytelen); |
683 | addattr_l(&req.n, sizeof(req), IFA_ANYCAST, &addr.data, addr.bytelen); | 656 | brd_len = addr.bytelen; |
684 | any_len = addr.bytelen; | ||
685 | break; | ||
686 | } | 657 | } |
687 | case 5: /* scope */ | 658 | } else if (arg == 4) { /* anycast */ |
688 | { | 659 | inet_prefix addr; |
689 | uint32_t scope = 0; | 660 | NEXT_ARG(); |
690 | NEXT_ARG(); | 661 | if (any_len) { |
691 | if (rtnl_rtscope_a2n(&scope, *argv)) { | 662 | duparg("anycast", *argv); |
692 | invarg(*argv, "scope"); | ||
693 | } | ||
694 | req.ifa.ifa_scope = scope; | ||
695 | scoped = 1; | ||
696 | break; | ||
697 | } | 663 | } |
698 | case 6: /* dev */ | 664 | get_addr(&addr, *argv, req.ifa.ifa_family); |
699 | NEXT_ARG(); | 665 | if (req.ifa.ifa_family == AF_UNSPEC) { |
700 | d = *argv; | 666 | req.ifa.ifa_family = addr.family; |
701 | break; | 667 | } |
702 | case 7: /* label */ | 668 | addattr_l(&req.n, sizeof(req), IFA_ANYCAST, &addr.data, addr.bytelen); |
703 | NEXT_ARG(); | 669 | any_len = addr.bytelen; |
704 | l = *argv; | 670 | } else if (arg == 5) { /* scope */ |
705 | addattr_l(&req.n, sizeof(req), IFA_LABEL, l, strlen(l)+1); | 671 | uint32_t scope = 0; |
706 | break; | 672 | NEXT_ARG(); |
707 | case 8: /* local */ | 673 | if (rtnl_rtscope_a2n(&scope, *argv)) { |
674 | invarg(*argv, "scope"); | ||
675 | } | ||
676 | req.ifa.ifa_scope = scope; | ||
677 | scoped = 1; | ||
678 | } else if (arg == 6) { /* dev */ | ||
679 | NEXT_ARG(); | ||
680 | d = *argv; | ||
681 | } else if (arg == 7) { /* label */ | ||
682 | NEXT_ARG(); | ||
683 | l = *argv; | ||
684 | addattr_l(&req.n, sizeof(req), IFA_LABEL, l, strlen(l)+1); | ||
685 | } else { | ||
686 | if (arg == 8) /* local */ | ||
708 | NEXT_ARG(); | 687 | NEXT_ARG(); |
709 | default: | 688 | if (local_len) { |
710 | if (local_len) { | 689 | duparg2("local", *argv); |
711 | duparg2("local", *argv); | 690 | } |
712 | } | 691 | get_prefix(&lcl, *argv, req.ifa.ifa_family); |
713 | get_prefix(&lcl, *argv, req.ifa.ifa_family); | 692 | if (req.ifa.ifa_family == AF_UNSPEC) { |
714 | if (req.ifa.ifa_family == AF_UNSPEC) { | 693 | req.ifa.ifa_family = lcl.family; |
715 | req.ifa.ifa_family = lcl.family; | 694 | } |
716 | } | 695 | addattr_l(&req.n, sizeof(req), IFA_LOCAL, &lcl.data, lcl.bytelen); |
717 | addattr_l(&req.n, sizeof(req), IFA_LOCAL, &lcl.data, lcl.bytelen); | 696 | local_len = lcl.bytelen; |
718 | local_len = lcl.bytelen; | ||
719 | } | 697 | } |
720 | argv++; | 698 | argv++; |
721 | } | 699 | } |
722 | 700 | ||
723 | if (d == NULL) { | 701 | // d cannot be null here, NEXT_ARG() of "dev" ensures that |
724 | bb_error_msg(bb_msg_requires_arg, "\"dev\""); | 702 | //if (d == NULL) { |
725 | return -1; | 703 | // bb_error_msg(bb_msg_requires_arg, "\"dev\""); |
726 | } | 704 | // return -1; |
705 | //} | ||
727 | if (l && strncmp(d, l, strlen(d)) != 0) { | 706 | if (l && strncmp(d, l, strlen(d)) != 0) { |
728 | bb_error_msg_and_die("\"dev\" (%s) must match \"label\" (%s)", d, l); | 707 | bb_error_msg_and_die("\"dev\" (%s) must match \"label\" (%s)", d, l); |
729 | } | 708 | } |