Make cp and mv optionally preserve hard links.
[oweals/busybox.git] / applets / applets.c
index 90667e52e50918f62b89eabb8edf4dc3ce88dd21..f3e56a9f39b6563cd1dd88386223109561c708fe 100644 (file)
@@ -45,13 +45,6 @@ extern void show_usage(void)
        const char *format_string;
        const char *usage_string = usage_messages;
        int i;
-       /* From busybox.c */
-       extern int been_there_done_that;
-
-       if (strcmp(applet_using->name, "busybox")==0) {
-               been_there_done_that=1;
-               busybox_main(0, NULL);
-       }
 
        for (i = applet_using - applets; i > 0; ) {
                if (!*usage_string++) {
@@ -74,7 +67,7 @@ static int applet_name_compare(const void *x, const void *y)
        return strcmp(name, applet->name);
 }
 
-extern size_t NUM_APPLETS;
+extern const size_t NUM_APPLETS;
 
 struct BB_applet *find_applet_by_name(const char *name)
 {
@@ -85,13 +78,23 @@ struct BB_applet *find_applet_by_name(const char *name)
 void run_applet_by_name(const char *name, int argc, char **argv)
 {
        static int recurse_level = 0;
+       extern int been_there_done_that; /* From busybox.c */
 
        recurse_level++;
        /* Do a binary search to find the applet entry given the name. */
        if ((applet_using = find_applet_by_name(name)) != NULL) {
                applet_name = applet_using->name;
                if (argv[1] && strcmp(argv[1], "--help") == 0) {
-                       show_usage();
+                       if (strcmp(applet_using->name, "busybox")==0) {
+                               if(argv[2])
+                                 applet_using = find_applet_by_name(argv[2]);
+                                else
+                                 applet_using = NULL;
+                       }
+                       if(applet_using)
+                               show_usage();
+                       been_there_done_that=1;
+                       busybox_main(0, NULL);
                }
                exit((*(applet_using->main)) (argc, argv));
        }
@@ -99,7 +102,7 @@ void run_applet_by_name(const char *name, int argc, char **argv)
        if (recurse_level == 1) {
                run_applet_by_name("busybox", argc, argv);
        }
-       recurse_level = 0;
+       recurse_level--;
 }