diff options
| -rw-r--r-- | networking/libiproute/ip_common.h | 2 | ||||
| -rw-r--r-- | networking/libiproute/iproute.c | 100 |
2 files changed, 49 insertions, 53 deletions
diff --git a/networking/libiproute/ip_common.h b/networking/libiproute/ip_common.h index 771ca48bd..0686136c7 100644 --- a/networking/libiproute/ip_common.h +++ b/networking/libiproute/ip_common.h | |||
| @@ -9,10 +9,8 @@ extern int ipaddr_list(int argc, char **argv); | |||
| 9 | extern int ipaddr_list_link(int argc, char **argv); | 9 | extern int ipaddr_list_link(int argc, char **argv); |
| 10 | extern int iproute_monitor(int argc, char **argv); | 10 | extern int iproute_monitor(int argc, char **argv); |
| 11 | extern void iplink_usage(void) __attribute__((noreturn)); | 11 | extern void iplink_usage(void) __attribute__((noreturn)); |
| 12 | extern void iproute_reset_filter(void); | ||
| 13 | extern void ipaddr_reset_filter(int); | 12 | extern void ipaddr_reset_filter(int); |
| 14 | extern void ipneigh_reset_filter(void); | 13 | extern void ipneigh_reset_filter(void); |
| 15 | extern int print_route(struct sockaddr_nl *who, struct nlmsghdr *n, void *arg); | ||
| 16 | extern int do_ipaddr(int argc, char **argv); | 14 | extern int do_ipaddr(int argc, char **argv); |
| 17 | extern int do_iproute(int argc, char **argv); | 15 | extern int do_iproute(int argc, char **argv); |
| 18 | extern int do_iprule(int argc, char **argv); | 16 | extern int do_iprule(int argc, char **argv); |
diff --git a/networking/libiproute/iproute.c b/networking/libiproute/iproute.c index b5833d7cc..cef67c34f 100644 --- a/networking/libiproute/iproute.c +++ b/networking/libiproute/iproute.c | |||
| @@ -30,7 +30,6 @@ | |||
| 30 | 30 | ||
| 31 | #include "rt_names.h" | 31 | #include "rt_names.h" |
| 32 | #include "utils.h" | 32 | #include "utils.h" |
| 33 | #include "ip_common.h" | ||
| 34 | 33 | ||
| 35 | #include "busybox.h" | 34 | #include "busybox.h" |
| 36 | 35 | ||
| @@ -60,7 +59,7 @@ static struct | |||
| 60 | inet_prefix msrc; | 59 | inet_prefix msrc; |
| 61 | } filter; | 60 | } filter; |
| 62 | 61 | ||
| 63 | int print_route(struct sockaddr_nl *who, struct nlmsghdr *n, void *arg) | 62 | static int print_route(struct sockaddr_nl *who, struct nlmsghdr *n, void *arg) |
| 64 | { | 63 | { |
| 65 | FILE *fp = (FILE*)arg; | 64 | FILE *fp = (FILE*)arg; |
| 66 | struct rtmsg *r = NLMSG_DATA(n); | 65 | struct rtmsg *r = NLMSG_DATA(n); |
| @@ -238,7 +237,7 @@ int print_route(struct sockaddr_nl *who, struct nlmsghdr *n, void *arg) | |||
| 238 | return 0; | 237 | return 0; |
| 239 | } | 238 | } |
| 240 | 239 | ||
| 241 | int iproute_modify(int cmd, unsigned flags, int argc, char **argv) | 240 | static int iproute_modify(int cmd, unsigned flags, int argc, char **argv) |
| 242 | { | 241 | { |
| 243 | struct rtnl_handle rth; | 242 | struct rtnl_handle rth; |
| 244 | struct { | 243 | struct { |
| @@ -402,6 +401,13 @@ static int rtnl_rtcache_request(struct rtnl_handle *rth, int family) | |||
| 402 | return sendto(rth->fd, (void*)&req, sizeof(req), 0, (struct sockaddr*)&nladdr, sizeof(nladdr)); | 401 | return sendto(rth->fd, (void*)&req, sizeof(req), 0, (struct sockaddr*)&nladdr, sizeof(nladdr)); |
| 403 | } | 402 | } |
| 404 | 403 | ||
| 404 | static void iproute_reset_filter(void) | ||
| 405 | { | ||
| 406 | memset(&filter, 0, sizeof(filter)); | ||
| 407 | filter.mdst.bitlen = -1; | ||
| 408 | filter.msrc.bitlen = -1; | ||
| 409 | } | ||
| 410 | |||
| 405 | static int iproute_list(int argc, char **argv) | 411 | static int iproute_list(int argc, char **argv) |
| 406 | { | 412 | { |
| 407 | int do_ipv6 = preferred_family; | 413 | int do_ipv6 = preferred_family; |
| @@ -516,7 +522,7 @@ static int iproute_list(int argc, char **argv) | |||
| 516 | } | 522 | } |
| 517 | 523 | ||
| 518 | 524 | ||
| 519 | int iproute_get(int argc, char **argv) | 525 | static int iproute_get(int argc, char **argv) |
| 520 | { | 526 | { |
| 521 | struct rtnl_handle rth; | 527 | struct rtnl_handle rth; |
| 522 | struct { | 528 | struct { |
| @@ -671,54 +677,46 @@ int iproute_get(int argc, char **argv) | |||
| 671 | exit(0); | 677 | exit(0); |
| 672 | } | 678 | } |
| 673 | 679 | ||
| 674 | void iproute_reset_filter() | ||
| 675 | { | ||
| 676 | memset(&filter, 0, sizeof(filter)); | ||
| 677 | filter.mdst.bitlen = -1; | ||
| 678 | filter.msrc.bitlen = -1; | ||
| 679 | } | ||
| 680 | |||
| 681 | int do_iproute(int argc, char **argv) | 680 | int do_iproute(int argc, char **argv) |
| 682 | { | 681 | { |
| 683 | if (argc < 1) { | 682 | const char *ip_route_commands[] = { "add", "append", "change", "chg", |
| 684 | return iproute_list(0, NULL); | 683 | "delete", "get", "list", "show", "prepend", "replace", "test", 0 }; |
| 685 | } | 684 | unsigned short command_num = 6; |
| 686 | 685 | unsigned int flags = 0; | |
| 687 | if (matches(*argv, "add") == 0) { | 686 | int cmd = RTM_NEWROUTE; |
| 688 | return iproute_modify(RTM_NEWROUTE, NLM_F_CREATE|NLM_F_EXCL, | 687 | |
| 689 | argc-1, argv+1); | 688 | if (*argv) { |
| 690 | } | 689 | command_num = compare_string_array(ip_route_commands, *argv); |
| 691 | if (matches(*argv, "change") == 0 || strcmp(*argv, "chg") == 0) { | 690 | } |
| 692 | return iproute_modify(RTM_NEWROUTE, NLM_F_REPLACE, | 691 | switch(command_num) { |
| 693 | argc-1, argv+1); | 692 | case 0: /* add*/ |
| 694 | } | 693 | flags = NLM_F_CREATE|NLM_F_EXCL; |
| 695 | if (matches(*argv, "replace") == 0) { | 694 | break; |
| 696 | return iproute_modify(RTM_NEWROUTE, NLM_F_CREATE|NLM_F_REPLACE, | 695 | case 1: /* append */ |
| 697 | argc-1, argv+1); | 696 | flags = NLM_F_CREATE|NLM_F_APPEND; |
| 698 | } | 697 | break; |
| 699 | if (matches(*argv, "prepend") == 0) { | 698 | case 2: /* change */ |
| 700 | return iproute_modify(RTM_NEWROUTE, NLM_F_CREATE, | 699 | case 3: /* chg */ |
| 701 | argc-1, argv+1); | 700 | flags = NLM_F_REPLACE; |
| 702 | } | 701 | break; |
| 703 | if (matches(*argv, "append") == 0) { | 702 | case 4: /* delete */ |
| 704 | return iproute_modify(RTM_NEWROUTE, NLM_F_CREATE|NLM_F_APPEND, | 703 | cmd = RTM_DELROUTE; |
| 705 | argc-1, argv+1); | 704 | break; |
| 706 | } | 705 | case 5: /* get */ |
| 707 | if (matches(*argv, "test") == 0) { | 706 | return iproute_get(argc-1, argv+1); |
| 708 | return iproute_modify(RTM_NEWROUTE, NLM_F_EXCL, | 707 | case 6: /* list */ |
| 709 | argc-1, argv+1); | 708 | case 7: /* show */ |
| 710 | } | 709 | return iproute_list(argc-1, argv+1); |
| 711 | if (matches(*argv, "delete") == 0) { | 710 | case 8: /* prepend */ |
| 712 | return iproute_modify(RTM_DELROUTE, 0, | 711 | flags = NLM_F_CREATE; |
| 713 | argc-1, argv+1); | 712 | case 9: /* replace */ |
| 714 | } | 713 | flags = NLM_F_CREATE|NLM_F_REPLACE; |
| 715 | if (matches(*argv, "list") == 0 || matches(*argv, "show") == 0 | 714 | case 10: /* test */ |
| 716 | || matches(*argv, "lst") == 0) { | 715 | flags = NLM_F_EXCL; |
| 717 | return iproute_list(argc-1, argv+1); | 716 | default: |
| 718 | } | 717 | error_msg_and_die("Unknown command %s", *argv); |
| 719 | if (matches(*argv, "get") == 0) { | 718 | } |
| 720 | return iproute_get(argc-1, argv+1); | 719 | |
| 721 | } | 720 | return iproute_modify(cmd, flags, argc-1, argv+1); |
| 722 | error_msg_and_die("Command \"%s\" is unknown, try \"ip route help\".", *argv); | ||
| 723 | } | 721 | } |
| 724 | 722 | ||
