diff options
author | Denis Vlasenko <vda.linux@googlemail.com> | 2007-11-26 18:29:52 +0000 |
---|---|---|
committer | Denis Vlasenko <vda.linux@googlemail.com> | 2007-11-26 18:29:52 +0000 |
commit | 186c2b3d0e5b248bc20d62d0f49f536c8ebf2461 (patch) | |
tree | d118546b37b4f347b15230d5941586449972e49a | |
parent | 30297a5b833da6ece98ee46a47411a938f75b78e (diff) | |
download | busybox-w32-186c2b3d0e5b248bc20d62d0f49f536c8ebf2461.tar.gz busybox-w32-186c2b3d0e5b248bc20d62d0f49f536c8ebf2461.tar.bz2 busybox-w32-186c2b3d0e5b248bc20d62d0f49f536c8ebf2461.zip |
iproute: fix a bug where "ip r flush table main" was rejected,
add "ip r flush cache" (however I'm unsure it is really valid syntax)
Add a few comments and stop mixing params and params' keywords.
-rw-r--r-- | networking/libiproute/iproute.c | 84 | ||||
-rw-r--r-- | networking/libiproute/iprule.c | 1 |
2 files changed, 48 insertions, 37 deletions
diff --git a/networking/libiproute/iproute.c b/networking/libiproute/iproute.c index ec0952668..d4437b923 100644 --- a/networking/libiproute/iproute.c +++ b/networking/libiproute/iproute.c | |||
@@ -111,11 +111,11 @@ static int print_route(struct sockaddr_nl *who ATTRIBUTE_UNUSED, | |||
111 | if (r->rtm_family == AF_INET6) { | 111 | if (r->rtm_family == AF_INET6) { |
112 | if (filter.tb) { | 112 | if (filter.tb) { |
113 | if (filter.tb < 0) { | 113 | if (filter.tb < 0) { |
114 | if (!(r->rtm_flags&RTM_F_CLONED)) { | 114 | if (!(r->rtm_flags & RTM_F_CLONED)) { |
115 | return 0; | 115 | return 0; |
116 | } | 116 | } |
117 | } else { | 117 | } else { |
118 | if (r->rtm_flags&RTM_F_CLONED) { | 118 | if (r->rtm_flags & RTM_F_CLONED) { |
119 | return 0; | 119 | return 0; |
120 | } | 120 | } |
121 | if (filter.tb == RT_TABLE_LOCAL) { | 121 | if (filter.tb == RT_TABLE_LOCAL) { |
@@ -366,7 +366,7 @@ USE_FEATURE_IP_RULE(ARG_table,) | |||
366 | unsigned mtu; | 366 | unsigned mtu; |
367 | NEXT_ARG(); | 367 | NEXT_ARG(); |
368 | if (index_in_strings(keywords, *argv) == PARM_lock) { | 368 | if (index_in_strings(keywords, *argv) == PARM_lock) { |
369 | mxlock |= (1<<RTAX_MTU); | 369 | mxlock |= (1 << RTAX_MTU); |
370 | NEXT_ARG(); | 370 | NEXT_ARG(); |
371 | } | 371 | } |
372 | if (get_unsigned(&mtu, *argv, 0)) | 372 | if (get_unsigned(&mtu, *argv, 0)) |
@@ -398,7 +398,7 @@ USE_FEATURE_IP_RULE(ARG_table,) | |||
398 | NEXT_ARG(); | 398 | NEXT_ARG(); |
399 | } | 399 | } |
400 | if ((**argv < '0' || **argv > '9') | 400 | if ((**argv < '0' || **argv > '9') |
401 | && rtnl_rtntype_a2n(&type, *argv) == 0) { | 401 | && rtnl_rtntype_a2n(&type, *argv) == 0) { |
402 | NEXT_ARG(); | 402 | NEXT_ARG(); |
403 | req.r.rtm_type = type; | 403 | req.r.rtm_type = type; |
404 | ok |= type_ok; | 404 | ok |= type_ok; |
@@ -518,19 +518,30 @@ static int iproute_list_or_flush(char **argv, int flush) | |||
518 | char *id = NULL; | 518 | char *id = NULL; |
519 | char *od = NULL; | 519 | char *od = NULL; |
520 | static const char keywords[] ALIGN1 = | 520 | static const char keywords[] ALIGN1 = |
521 | "protocol\0""all\0""dev\0""oif\0""iif\0""via\0""table\0""cache\0" /*all*/ | 521 | /* "ip route list/flush" parameters: */ |
522 | "from\0""root\0""match\0""exact\0""to\0"/*root match exact*/; | 522 | "protocol\0" "dev\0" "oif\0" "iif\0" |
523 | "via\0" "table\0" "cache\0" | ||
524 | "from\0" "to\0" | ||
525 | /* and possible further keywords */ | ||
526 | "all\0" | ||
527 | "root\0" | ||
528 | "match\0" | ||
529 | "exact\0" | ||
530 | "main\0" | ||
531 | ; | ||
523 | enum { | 532 | enum { |
524 | ARG_proto, PARM_all, | 533 | KW_proto, KW_dev, KW_oif, KW_iif, |
525 | ARG_dev, | 534 | KW_via, KW_table, KW_cache, |
526 | ARG_oif, | 535 | KW_from, KW_to, |
527 | ARG_iif, | 536 | /* */ |
528 | ARG_via, | 537 | KW_all, |
529 | ARG_table, PARM_cache, /*PARM_all,*/ | 538 | KW_root, |
530 | ARG_from, PARM_root, PARM_match, PARM_exact, | 539 | KW_match, |
531 | ARG_to /*PARM_root, PARM_match, PARM_exact*/ | 540 | KW_exact, |
541 | KW_main, | ||
532 | }; | 542 | }; |
533 | int arg, parm; | 543 | int arg, parm; |
544 | |||
534 | iproute_reset_filter(); | 545 | iproute_reset_filter(); |
535 | filter.tb = RT_TABLE_MAIN; | 546 | filter.tb = RT_TABLE_MAIN; |
536 | 547 | ||
@@ -539,64 +550,66 @@ static int iproute_list_or_flush(char **argv, int flush) | |||
539 | 550 | ||
540 | while (*argv) { | 551 | while (*argv) { |
541 | arg = index_in_substrings(keywords, *argv); | 552 | arg = index_in_substrings(keywords, *argv); |
542 | if (arg == ARG_proto) { | 553 | if (arg == KW_proto) { |
543 | uint32_t prot = 0; | 554 | uint32_t prot = 0; |
544 | NEXT_ARG(); | 555 | NEXT_ARG(); |
545 | filter.protocolmask = -1; | 556 | filter.protocolmask = -1; |
546 | if (rtnl_rtprot_a2n(&prot, *argv)) { | 557 | if (rtnl_rtprot_a2n(&prot, *argv)) { |
547 | if (index_in_strings(keywords, *argv) != PARM_all) | 558 | if (index_in_strings(keywords, *argv) != KW_all) |
548 | invarg(*argv, "protocol"); | 559 | invarg(*argv, "protocol"); |
549 | prot = 0; | 560 | prot = 0; |
550 | filter.protocolmask = 0; | 561 | filter.protocolmask = 0; |
551 | } | 562 | } |
552 | filter.protocol = prot; | 563 | filter.protocol = prot; |
553 | } else if (arg == ARG_dev || arg == ARG_oif) { | 564 | } else if (arg == KW_dev || arg == KW_oif) { |
554 | NEXT_ARG(); | 565 | NEXT_ARG(); |
555 | od = *argv; | 566 | od = *argv; |
556 | } else if (arg == ARG_iif) { | 567 | } else if (arg == KW_iif) { |
557 | NEXT_ARG(); | 568 | NEXT_ARG(); |
558 | id = *argv; | 569 | id = *argv; |
559 | } else if (arg == ARG_via) { | 570 | } else if (arg == KW_via) { |
560 | NEXT_ARG(); | 571 | NEXT_ARG(); |
561 | get_prefix(&filter.rvia, *argv, do_ipv6); | 572 | get_prefix(&filter.rvia, *argv, do_ipv6); |
562 | } else if (arg == ARG_table) { | 573 | } else if (arg == KW_table) { /* table all/cache/main */ |
563 | NEXT_ARG(); | 574 | NEXT_ARG(); |
564 | parm = index_in_substrings(keywords, *argv); | 575 | parm = index_in_substrings(keywords, *argv); |
565 | if (parm == PARM_cache) | 576 | if (parm == KW_cache) |
566 | filter.tb = -1; | 577 | filter.tb = -1; |
567 | else if (parm == PARM_all) | 578 | else if (parm == KW_all) |
568 | filter.tb = 0; | 579 | filter.tb = 0; |
569 | else | 580 | else if (parm != KW_main) |
570 | invarg(*argv, "table"); | 581 | invarg(*argv, "table"); |
571 | } else if (arg == ARG_from) { | 582 | } else if (arg == KW_cache) { // hmm is it valid - "ip r flush cache"? |
583 | filter.tb = -1; | ||
584 | } else if (arg == KW_from) { | ||
572 | NEXT_ARG(); | 585 | NEXT_ARG(); |
573 | parm = index_in_substrings(keywords, *argv); | 586 | parm = index_in_substrings(keywords, *argv); |
574 | if (parm == PARM_root) { | 587 | if (parm == KW_root) { |
575 | NEXT_ARG(); | 588 | NEXT_ARG(); |
576 | get_prefix(&filter.rsrc, *argv, do_ipv6); | 589 | get_prefix(&filter.rsrc, *argv, do_ipv6); |
577 | } else if (parm == PARM_match) { | 590 | } else if (parm == KW_match) { |
578 | NEXT_ARG(); | 591 | NEXT_ARG(); |
579 | get_prefix(&filter.msrc, *argv, do_ipv6); | 592 | get_prefix(&filter.msrc, *argv, do_ipv6); |
580 | } else { | 593 | } else { |
581 | if (parm == PARM_exact) | 594 | if (parm == KW_exact) |
582 | NEXT_ARG(); | 595 | NEXT_ARG(); |
583 | get_prefix(&filter.msrc, *argv, do_ipv6); | 596 | get_prefix(&filter.msrc, *argv, do_ipv6); |
584 | filter.rsrc = filter.msrc; | 597 | filter.rsrc = filter.msrc; |
585 | } | 598 | } |
586 | } else { | 599 | } else { /* "to" is the default parameter */ |
587 | /* parm = arg; // would be more plausible, we reuse arg here */ | 600 | if (arg == KW_to) { |
588 | if (arg == ARG_to) { | ||
589 | NEXT_ARG(); | 601 | NEXT_ARG(); |
590 | arg = index_in_substrings(keywords, *argv); | 602 | arg = index_in_substrings(keywords, *argv); |
591 | } | 603 | } |
592 | if (arg == PARM_root) { | 604 | /* parm = arg; - would be more plausible, but we reuse 'arg' here */ |
605 | if (arg == KW_root) { | ||
593 | NEXT_ARG(); | 606 | NEXT_ARG(); |
594 | get_prefix(&filter.rdst, *argv, do_ipv6); | 607 | get_prefix(&filter.rdst, *argv, do_ipv6); |
595 | } else if (arg == PARM_match) { | 608 | } else if (arg == KW_match) { |
596 | NEXT_ARG(); | 609 | NEXT_ARG(); |
597 | get_prefix(&filter.mdst, *argv, do_ipv6); | 610 | get_prefix(&filter.mdst, *argv, do_ipv6); |
598 | } else { | 611 | } else { /* "to exact" is the default */ |
599 | if (arg == PARM_exact) | 612 | if (arg == KW_exact) |
600 | NEXT_ARG(); | 613 | NEXT_ARG(); |
601 | get_prefix(&filter.mdst, *argv, do_ipv6); | 614 | get_prefix(&filter.mdst, *argv, do_ipv6); |
602 | filter.rdst = filter.mdst; | 615 | filter.rdst = filter.mdst; |
@@ -610,7 +623,6 @@ static int iproute_list_or_flush(char **argv, int flush) | |||
610 | } | 623 | } |
611 | 624 | ||
612 | xrtnl_open(&rth); | 625 | xrtnl_open(&rth); |
613 | |||
614 | ll_init_map(&rth); | 626 | ll_init_map(&rth); |
615 | 627 | ||
616 | if (id || od) { | 628 | if (id || od) { |
@@ -631,7 +643,7 @@ static int iproute_list_or_flush(char **argv, int flush) | |||
631 | if (flush) { | 643 | if (flush) { |
632 | char flushb[4096-512]; | 644 | char flushb[4096-512]; |
633 | 645 | ||
634 | if (filter.tb == -1) { | 646 | if (filter.tb == -1) { /* "flush table cache" */ |
635 | if (do_ipv6 != AF_INET6) | 647 | if (do_ipv6 != AF_INET6) |
636 | iproute_flush_cache(); | 648 | iproute_flush_cache(); |
637 | if (do_ipv6 == AF_INET) | 649 | if (do_ipv6 == AF_INET) |
diff --git a/networking/libiproute/iprule.c b/networking/libiproute/iprule.c index 6442992b4..6b22061a7 100644 --- a/networking/libiproute/iprule.c +++ b/networking/libiproute/iprule.c | |||
@@ -17,7 +17,6 @@ | |||
17 | */ | 17 | */ |
18 | 18 | ||
19 | #include <syslog.h> | 19 | #include <syslog.h> |
20 | //#include <sys/socket.h> | ||
21 | #include <netinet/in.h> | 20 | #include <netinet/in.h> |
22 | #include <netinet/ip.h> | 21 | #include <netinet/ip.h> |
23 | #include <arpa/inet.h> | 22 | #include <arpa/inet.h> |