- rewrite the ip applet to be less bloaty
authorBernhard Reutner-Fischer <rep.dot.nop@gmail.com>
Tue, 10 Apr 2007 18:43:27 +0000 (18:43 -0000)
committerBernhard Reutner-Fischer <rep.dot.nop@gmail.com>
Tue, 10 Apr 2007 18:43:27 +0000 (18:43 -0000)
- mark libiproute's matches() as deprecated. Convert to index_in_(sub)str_array()!
   text    data     bss     dec     hex filename
    314       0       0     314     13a ip.o.orig
    200       0       0     200      c8 ip.o
Using a smallint for the key would save another byte.

networking/ip.c
networking/libiproute/utils.h

index d51689542cf7cefa69ddb6e5e51217ef4e940f59..dc9ca1f91700d8c16018587bb1ea92c5ce2eaa9e 100644 (file)
@@ -10,6 +10,7 @@
  * Changes:
  *
  * Rani Assaf <rani@magic.metawire.com> 980929:        resolve addresses
+ * Bernhard Fischer rewrote to use index_in_substr_array
  */
 
 #include "busybox.h"
 #include "libiproute/utils.h"
 #include "libiproute/ip_common.h"
 
+static int ATTRIBUTE_NORETURN ip_print_help(int ATTRIBUTE_UNUSED ac, char ATTRIBUTE_UNUSED **av)
+{
+       bb_show_usage();
+}
 int ip_main(int argc, char **argv);
 int ip_main(int argc, char **argv)
 {
-       ip_parse_common_args(&argc, &argv);
-
-       if (argc <= 1)
-               bb_show_usage();
+       const char * const keywords[] = {
+               USE_FEATURE_IP_ADDRESS("address",)
+               USE_FEATURE_IP_ROUTE("route",)
+               USE_FEATURE_IP_LINK("link",)
+               USE_FEATURE_IP_TUNNEL("tunnel", "tunl",)
+               USE_FEATURE_IP_RULE("rule",)
+               NULL
+       };
+       enum {
+               USE_FEATURE_IP_ADDRESS(IP_addr,)
+               USE_FEATURE_IP_ROUTE(IP_route,)
+               USE_FEATURE_IP_LINK(IP_link,)
+               USE_FEATURE_IP_TUNNEL(IP_tunnel, IP_tunl,)
+               USE_FEATURE_IP_RULE(IP_rule,)
+               IP_none
+       };
+       int (*ip_func)(int argc, char **argv) = ip_print_help;
 
-       if (ENABLE_FEATURE_IP_ADDRESS && matches(argv[1], "address") == 0) {
-               return do_ipaddr(argc-2, argv+2);
-       }
-       if (ENABLE_FEATURE_IP_ROUTE && matches(argv[1], "route") == 0) {
-               return do_iproute(argc-2, argv+2);
-       }
-       if (ENABLE_FEATURE_IP_LINK && matches(argv[1], "link") == 0) {
-               return do_iplink(argc-2, argv+2);
-       }
-       if (ENABLE_FEATURE_IP_TUNNEL
-        && (matches(argv[1], "tunnel") == 0 || strcmp(argv[1], "tunl") == 0)
-       ) {
-               return do_iptunnel(argc-2, argv+2);
-       }
-       if (ENABLE_FEATURE_IP_RULE && matches(argv[1], "rule") == 0) {
-               return do_iprule(argc-2, argv+2);
+       ip_parse_common_args(&argc, &argv);
+       if (argc > 1) {
+               int key = index_in_substr_array(keywords, argv[1]);
+               argc -= 2;
+               argv += 2;
+#if ENABLE_FEATURE_IP_ADDRESS
+               if (key == IP_addr)
+                       ip_func = do_ipaddr;
+#endif
+#if ENABLE_FEATURE_IP_ROUTE
+               if (key == IP_route)
+                       ip_func = do_iproute;
+#endif
+#if ENABLE_FEATURE_IP_LINK
+               if (key == IP_link)
+                       ip_func = do_iplink;
+#endif
+#if ENABLE_FEATURE_IP_TUNNEL
+               if (key == IP_tunnel || key == IP_tunl)
+                       ip_func = do_iptunnel;
+#endif
+#if ENABLE_FEATURE_IP_RULE
+               if (key == IP_rule)
+                       ip_func = do_iprule;
+#endif
        }
-
-       bb_show_usage();
+       return (ip_func(argc, argv));
 }
index 27afb32ac78d1d40b5db97678dc2981bdfca98e1..3b6fef1e3bc66dc93c305028fa53c3f63dca422b 100644 (file)
@@ -78,7 +78,7 @@ extern const char *rt_addr_n2a(int af, int len, void *addr, char *buf, int bufle
 void invarg(const char *, const char *) ATTRIBUTE_NORETURN;
 void duparg(const char *, const char *) ATTRIBUTE_NORETURN;
 void duparg2(const char *, const char *) ATTRIBUTE_NORETURN;
-int matches(const char *arg, const char *pattern);
+int ATTRIBUTE_DEPRECATED matches(const char *arg, const char *pattern);
 int inet_addr_match(inet_prefix *a, inet_prefix *b, int bits);
 
 const char *dnet_ntop(int af, const void *addr, char *str, size_t len);