diff options
author | Bernhard Reutner-Fischer <rep.dot.nop@gmail.com> | 2008-01-13 18:43:50 +0000 |
---|---|---|
committer | Bernhard Reutner-Fischer <rep.dot.nop@gmail.com> | 2008-01-13 18:43:50 +0000 |
commit | 1aac3ab49f8d1de8d7a66adb57cbd7df4a1f2020 (patch) | |
tree | 37986fc0fbda3d5de0c432b6048833e435420755 | |
parent | 78e1d58d3a320637cbe78fa5c86081931392875b (diff) | |
download | busybox-w32-1aac3ab49f8d1de8d7a66adb57cbd7df4a1f2020.tar.gz busybox-w32-1aac3ab49f8d1de8d7a66adb57cbd7df4a1f2020.tar.bz2 busybox-w32-1aac3ab49f8d1de8d7a66adb57cbd7df4a1f2020.zip |
- shrink a bit and implement time related fancy features. Improve help texts.
text data bss dec hex filename
253 20 0 273 111 networking/brctl.o.bare
613 20 0 633 279 networking/brctl.o.fancy-time
-rw-r--r-- | include/usage.h | 9 | ||||
-rw-r--r-- | networking/Config.in | 19 | ||||
-rw-r--r-- | networking/brctl.c | 132 |
3 files changed, 122 insertions, 38 deletions
diff --git a/include/usage.h b/include/usage.h index cb8bd2a8d..304899d18 100644 --- a/include/usage.h +++ b/include/usage.h | |||
@@ -127,8 +127,13 @@ | |||
127 | " addbr <bridge> Create <bridge>\n" \ | 127 | " addbr <bridge> Create <bridge>\n" \ |
128 | " delbr <bridge> Delete <bridge>\n" \ | 128 | " delbr <bridge> Delete <bridge>\n" \ |
129 | " addif <bridge> <iface> Add <iface> to <bridge>\n" \ | 129 | " addif <bridge> <iface> Add <iface> to <bridge>\n" \ |
130 | " delif <bridge> <iface> Delete <iface> from <bridge>" | 130 | " delif <bridge> <iface> Delete <iface> from <bridge>" \ |
131 | 131 | USE_FEATURE_BRCTL_FANCY("\n" \ | |
132 | " setageing <bridge <time> set ageing time\n" \ | ||
133 | " setfd <bridge <time> set bridge forward delay\n" \ | ||
134 | " sethello <bridge <time> set hello time\n" \ | ||
135 | " setmaxage <bridge <time> set max message age\n" \ | ||
136 | ) | ||
132 | #define bunzip2_trivial_usage \ | 137 | #define bunzip2_trivial_usage \ |
133 | "[OPTION]... [FILE]" | 138 | "[OPTION]... [FILE]" |
134 | #define bunzip2_full_usage \ | 139 | #define bunzip2_full_usage \ |
diff --git a/networking/Config.in b/networking/Config.in index 83579bc4f..f4d4e7ebf 100644 --- a/networking/Config.in +++ b/networking/Config.in | |||
@@ -52,6 +52,25 @@ config BRCTL | |||
52 | default n | 52 | default n |
53 | help | 53 | help |
54 | Manage ethernet bridges. | 54 | Manage ethernet bridges. |
55 | Supports addbr/delbr and addif/delif. | ||
56 | |||
57 | #config FEATURE_BRCTL_SHOW | ||
58 | # bool "support show, showmac and showstp" | ||
59 | # default n | ||
60 | # depends on BRCTL | ||
61 | # help | ||
62 | # Add support for option which print the current config: | ||
63 | # showmacs, showstp, show | ||
64 | |||
65 | config FEATURE_BRCTL_FANCY | ||
66 | bool "fancy options" | ||
67 | default n | ||
68 | depends on BRCTL | ||
69 | help | ||
70 | Add support for extended option like: | ||
71 | setageing, setfd, sethello, setmaxage, | ||
72 | setpathcost, setportprio, setbridgeprio, | ||
73 | stp | ||
55 | 74 | ||
56 | config DNSD | 75 | config DNSD |
57 | bool "dnsd" | 76 | bool "dnsd" |
diff --git a/networking/brctl.c b/networking/brctl.c index 5255a552f..7c9d90fde 100644 --- a/networking/brctl.c +++ b/networking/brctl.c | |||
@@ -6,6 +6,9 @@ | |||
6 | * | 6 | * |
7 | * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. | 7 | * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. |
8 | */ | 8 | */ |
9 | /* This applet currently uses only the ioctl interface and no sysfs at all. | ||
10 | * At the time of this writing this was considered a feature. | ||
11 | */ | ||
9 | #include "libbb.h" | 12 | #include "libbb.h" |
10 | #include <linux/sockios.h> | 13 | #include <linux/sockios.h> |
11 | #include <net/if.h> | 14 | #include <net/if.h> |
@@ -15,72 +18,129 @@ | |||
15 | #endif | 18 | #endif |
16 | #define ENABLE_FEATURE_BRCTL_SHOW 0 | 19 | #define ENABLE_FEATURE_BRCTL_SHOW 0 |
17 | #define USE_FEATURE_BRCTL_SHOW(...) | 20 | #define USE_FEATURE_BRCTL_SHOW(...) |
18 | |||
19 | |||
20 | /* Fancy diagnostics -- printing add/del -- costs 49 bytes. */ | ||
21 | #if 0 | 21 | #if 0 |
22 | #define BRCTL_VERBOSE(...) __VA_ARGS__ | 22 | #define ENABLE_FEATURE_BRCTL_FANCY 0 |
23 | #if ENABLE_FEATURE_BRCTL_FANCY | ||
24 | #define USE_FEATURE_BRCTL_FANCY(...) __VA_ARGS__ | ||
23 | #else | 25 | #else |
24 | #define BRCTL_VERBOSE(...) | 26 | #define USE_FEATURE_BRCTL_FANCY(...) |
27 | #endif | ||
28 | #endif | ||
29 | #if ENABLE_FEATURE_BRCTL_FANCY | ||
30 | #include <linux/if_bridge.h> | ||
31 | /* FIXME: These 4 funcs are not really clean and could be improved */ | ||
32 | static inline ALWAYS_INLINE void strtotimeval(struct timeval *tv, | ||
33 | const char *time_str) | ||
34 | { | ||
35 | double secs; | ||
36 | if (sscanf(time_str, "%lf", &secs) != 1) | ||
37 | bb_error_msg_and_die (bb_msg_invalid_arg, time_str, "timespec"); | ||
38 | tv->tv_sec = secs; | ||
39 | tv->tv_usec = 1000000 * (secs - tv->tv_sec); | ||
40 | } | ||
41 | |||
42 | static inline ALWAYS_INLINE unsigned long __tv_to_jiffies(const struct timeval *tv) | ||
43 | { | ||
44 | unsigned long long jif; | ||
45 | |||
46 | jif = 1000000ULL * tv->tv_sec + tv->tv_usec; | ||
47 | |||
48 | return jif/10000; | ||
49 | } | ||
50 | # ifdef UNUSED && 00 | ||
51 | static void __jiffies_to_tv(struct timeval *tv, unsigned long jiffies) | ||
52 | { | ||
53 | unsigned long long tvusec; | ||
54 | |||
55 | tvusec = 10000ULL*jiffies; | ||
56 | tv->tv_sec = tvusec/1000000; | ||
57 | tv->tv_usec = tvusec - 1000000 * tv->tv_sec; | ||
58 | } | ||
59 | # endif | ||
60 | static unsigned long str_to_jiffies(const char *time_str) | ||
61 | { | ||
62 | struct timeval tv; | ||
63 | strtotimeval(&tv, time_str); | ||
64 | return __tv_to_jiffies(&tv); | ||
65 | } | ||
25 | #endif | 66 | #endif |
26 | 67 | ||
27 | int brctl_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | 68 | |
28 | int brctl_main(int argc, char **argv) | 69 | int brctl_main(int argc ATTRIBUTE_UNUSED, char **argv) MAIN_EXTERNALLY_VISIBLE; |
70 | int brctl_main(int argc ATTRIBUTE_UNUSED, char **argv) | ||
29 | { | 71 | { |
30 | int fd; | 72 | int fd; |
31 | static const char keywords[] ALIGN1 = | 73 | static const char keywords[] ALIGN1 = |
32 | "addbr\0" "delbr\0" "addif\0" "delif\0" | 74 | "addbr\0" "delbr\0" "addif\0" "delif\0" |
33 | USE_FEATURE_BRCTL_SHOW("show\0"); | 75 | USE_FEATURE_BRCTL_FANCY( |
34 | enum { ARG_addbr = 1, ARG_delbr, ARG_addif, ARG_delif | 76 | "setageing\0" "setfd\0" "sethello\0" "setmaxage\0" |
35 | USE_FEATURE_BRCTL_SHOW(, ARG_show) }; | 77 | "setpathcost\0" "setportprio\0" "setbridgeprio\0" |
36 | smalluint key; | 78 | "stp\0" |
37 | static char info[] = BRCTL_VERBOSE("%s ")"bridge %s\0 iface %s"; | 79 | ) |
80 | USE_FEATURE_BRCTL_SHOW("showmacs\0" "show\0"); | ||
81 | enum { ARG_addbr = 0, ARG_delbr, ARG_addif, ARG_delif | ||
82 | USE_FEATURE_BRCTL_FANCY(, | ||
83 | ARG_setageing, ARG_setfd, ARG_sethello, ARG_setmaxage, | ||
84 | ARG_setpathcost, ARG_setportprio, ARG_setbridgeprio, | ||
85 | ARG_stp | ||
86 | ) | ||
87 | USE_FEATURE_BRCTL_SHOW(, ARG_showmacs, ARG_show) }; | ||
88 | smallint key; | ||
89 | struct ifreq ifr; | ||
90 | static char info[] = "bridge %s\0 iface %s"; | ||
38 | char *br; | 91 | char *br; |
39 | 92 | ||
40 | argv++; | 93 | argv++; |
41 | while (*argv) { | 94 | while (*argv) { |
42 | BRCTL_VERBOSE(char *op;) | 95 | key = index_in_strings(keywords, *argv); |
43 | 96 | if (key == -1) /* no match found in keywords array, bail out. */ | |
44 | key = index_in_strings(keywords, *argv) + 1; | ||
45 | if (key == 0) /* no match found in keywords array, bail out. */ | ||
46 | bb_error_msg_and_die(bb_msg_invalid_arg, *argv, applet_name); | 97 | bb_error_msg_and_die(bb_msg_invalid_arg, *argv, applet_name); |
47 | argv++; | 98 | argv++; |
48 | #if ENABLE_FEATURE_BRCTL_SHOW | 99 | #if ENABLE_FEATURE_BRCTL_SHOW |
49 | if (key == ARG_show) { /* show */ | 100 | if (key == ARG_show) { /* show */ |
50 | ; | 101 | goto out; /* FIXME: implement me! :) */ |
51 | } | 102 | } |
52 | #endif | 103 | #endif |
53 | BRCTL_VERBOSE(op = (char*)((key % 2) ? "add" : "del");) | ||
54 | fd = xsocket(AF_INET, SOCK_STREAM, 0); | 104 | fd = xsocket(AF_INET, SOCK_STREAM, 0); |
55 | br = *(argv++); | 105 | br = *(argv++); |
56 | 106 | ||
57 | if (key < 3) { /* addbr or delbr */ | 107 | if (key == ARG_addbr || key == ARG_delbr) { /* addbr or delbr */ |
58 | if (ioctl(fd, key == ARG_addbr ? SIOCBRADDBR : SIOCBRDELBR, br) < 0) | 108 | ioctl_or_perror_and_die(fd, |
59 | { | 109 | key == ARG_addbr ? SIOCBRADDBR : SIOCBRDELBR, |
60 | info[9 BRCTL_VERBOSE(+3)] = '\0'; | 110 | br, info, br); |
61 | bb_perror_msg_and_die(info, BRCTL_VERBOSE(op,) br); | 111 | goto done; |
62 | } | ||
63 | } | 112 | } |
64 | if (key > 2) { /* addif or delif */ | 113 | if (!*argv) /* all but 'show' need at least one argument */ |
65 | struct ifreq ifr; | 114 | bb_show_usage(); |
115 | safe_strncpy(ifr.ifr_name, br, IFNAMSIZ); | ||
116 | if (key == ARG_addif || key == ARG_delif) { /* addif or delif */ | ||
66 | char *brif; | 117 | char *brif; |
67 | 118 | ||
68 | if (!*argv) | ||
69 | bb_show_usage(); | ||
70 | brif = *(argv++); | 119 | brif = *(argv++); |
71 | |||
72 | if (!(ifr.ifr_ifindex = if_nametoindex(brif))) { | 120 | if (!(ifr.ifr_ifindex = if_nametoindex(brif))) { |
73 | bb_perror_msg_and_die(info+11 BRCTL_VERBOSE(+3), brif); | 121 | bb_perror_msg_and_die(info+11, brif); |
74 | } | ||
75 | safe_strncpy(ifr.ifr_name, br, IFNAMSIZ); | ||
76 | if (ioctl(fd, | ||
77 | key == ARG_addif ? SIOCBRADDIF : SIOCBRDELIF, &ifr) < 0) { | ||
78 | info[9 BRCTL_VERBOSE(+3)] = ','; | ||
79 | bb_perror_msg_and_die (info, BRCTL_VERBOSE(op,) br, brif); | ||
80 | } | 122 | } |
123 | ioctl_or_perror_and_die(fd, | ||
124 | key == ARG_addif ? SIOCBRADDIF : SIOCBRDELIF, | ||
125 | &ifr, info, br); | ||
126 | } | ||
127 | #if ENABLE_FEATURE_BRCTL_FANCY | ||
128 | if (key - ARG_delif < 5) { /* time related ops */ | ||
129 | unsigned long op = (key == ARG_setageing) ? BRCTL_SET_AGEING_TIME : | ||
130 | (key == ARG_setfd) ? BRCTL_SET_BRIDGE_FORWARD_DELAY: | ||
131 | (key == ARG_sethello) ? BRCTL_SET_BRIDGE_HELLO_TIME: | ||
132 | (key == ARG_setmaxage) ? BRCTL_SET_BRIDGE_MAX_AGE : | ||
133 | -1/*will never be used */; | ||
134 | unsigned long jiff = str_to_jiffies (*(argv++)); | ||
135 | unsigned long args[4] = {op, jiff, 0, 0}; | ||
136 | ifr.ifr_data = (char *) &args; | ||
137 | xioctl(fd, SIOCDEVPRIVATE, &ifr); | ||
81 | } | 138 | } |
139 | #endif | ||
140 | done: | ||
82 | if (ENABLE_FEATURE_CLEAN_UP) | 141 | if (ENABLE_FEATURE_CLEAN_UP) |
83 | close(fd); | 142 | close(fd); |
84 | } | 143 | } |
144 | out: | ||
85 | return EXIT_SUCCESS; | 145 | return EXIT_SUCCESS; |
86 | } | 146 | } |