get rid of global "struct bb_applet *current_applet"
authorDenis Vlasenko <vda.linux@googlemail.com>
Wed, 10 Oct 2007 14:38:47 +0000 (14:38 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Wed, 10 Oct 2007 14:38:47 +0000 (14:38 -0000)
applets/applets.c
docs/busybox.net/FAQ.html
include/libbb.h
libbb/appletlib.c
libbb/vfork_daemon_rexec.c
shell/ash.c
shell/hush.c

index 55f8e6b239db5be0c3ec884a1bd252036ff9236b..3b4f395c9b9f19545c79691101c0cc9124472929 100644 (file)
@@ -28,7 +28,6 @@
 #endif
 
 
-const struct bb_applet *current_applet;
 const char *applet_name;
 #if !BB_MMU
 bool re_execed;
@@ -507,7 +506,7 @@ static int busybox_main(char **argv)
        bb_error_msg_and_die("applet not found");
 }
 
-void run_current_applet_and_exit(char **argv)
+void run_appletstruct_and_exit(const struct bb_applet *applet, char **argv)
 {
        int argc = 1;
 
@@ -518,19 +517,19 @@ void run_current_applet_and_exit(char **argv)
        optind = 1;
        xfunc_error_retval = EXIT_FAILURE;
 
-       applet_name = current_applet->name;
+       applet_name = applet->name;
        if (argc == 2 && !strcmp(argv[1], "--help"))
                bb_show_usage();
        if (ENABLE_FEATURE_SUID)
-               check_suid(current_applet);
-       exit(current_applet->main(argc, argv));
+               check_suid(applet);
+       exit(applet->main(argc, argv));
 }
 
 void run_applet_and_exit(const char *name, char **argv)
 {
-       current_applet = find_applet_by_name(name);
-       if (current_applet)
-               run_current_applet_and_exit(argv);
+       const struct bb_applet *applet = find_applet_by_name(name);
+       if (applet)
+               run_appletstruct_and_exit(applet, argv);
        if (!strncmp(name, "busybox", 7))
                exit(busybox_main(argv));
 }
index 7b15bf78c45451702ea5ba1107462b146187f9e5..e0a7597813ee80f78ef0fcecddbb1d534b4414c4 100644 (file)
@@ -568,7 +568,7 @@ functionality: main() looks up argv[0] in applets[] to get a function pointer
 to APPLET_main().</p>
 
 <p>Busybox applets may also be invoked through the multiplexor applet
-"busybox" (see busybox_main() in applets/busybox.c), and through the
+"busybox" (see busybox_main() in libbb/appletlib.c), and through the
 standalone shell (grep for STANDALONE_SHELL in applets/shell/*.c).
 See <a href="FAQ.html#getting_started">getting started</a> in the
 FAQ for more information on these alternate usage mechanisms, which are
index d76571b58acf8259ccefe6bed6d9eeebb3ef5d16..9d8b5f3dfaf23c1400869b380c5468f3a4b4638d 100644 (file)
@@ -564,7 +564,7 @@ int wait_nohang(int *wstat);
 int spawn_and_wait(char **argv);
 struct nofork_save_area {
        jmp_buf die_jmp;
-       const struct bb_applet *current_applet;
+       const char *applet_name;
        int xfunc_error_retval;
        uint32_t option_mask32;
        int die_sleep;
@@ -748,7 +748,7 @@ const struct hwtype *get_hwntype(int type);
 extern const struct bb_applet *find_applet_by_name(const char *name);
 /* Returns only if applet is not found. */
 extern void run_applet_and_exit(const char *name, char **argv);
-extern void run_current_applet_and_exit(char **argv) ATTRIBUTE_NORETURN;
+extern void run_appletstruct_and_exit(const struct bb_applet *a, char **argv) ATTRIBUTE_NORETURN;
 #endif
 
 extern int match_fstype(const struct mntent *mt, const char *fstypes);
@@ -1040,7 +1040,6 @@ enum {    /* DO NOT CHANGE THESE VALUES!  cp.c, mv.c, install.c depend on them. */
 };
 
 #define FILEUTILS_CP_OPTSTR "pdRfils" USE_SELINUX("c")
-extern const struct bb_applet *current_applet;
 extern const char *applet_name;
 /* "BusyBox vN.N.N (timestamp or extra_vestion)" */
 extern const char bb_banner[];
index 565dacf36d7ec0956005f19dc05dbab6561335c8..cfa60a940d3c08332b0d8842e74f96200d44dce9 100644 (file)
@@ -133,7 +133,10 @@ void bbox_prepare_main(char **argv)
        if (ENABLE_LOCALE_SUPPORT && getpid() != 1)
                setlocale(LC_ALL, "");
 
-       /* Redundant for busybox, but needed for individual applets */
+#if ENABLE_FEATURE_INDIVIDUAL
+       /* Redundant for busybox (run_applet_and_exit covers that case)
+        * but needed for "individual applet" mode */
        if (argv[1] && strcmp(argv[1], "--help") == 0)
                bb_show_usage();
+#endif
 }
index 80c72f16500f8804c46b6cc108efc55eaffc51d2..a01065d691d0862087f485dbcbb6033f268d36a8 100644 (file)
@@ -104,7 +104,7 @@ int wait_pid(int *wstat, int pid)
 void save_nofork_data(struct nofork_save_area *save)
 {
        memcpy(&save->die_jmp, &die_jmp, sizeof(die_jmp));
-       save->current_applet = current_applet;
+       save->applet_name = applet_name;
        save->xfunc_error_retval = xfunc_error_retval;
        save->option_mask32 = option_mask32;
        save->die_sleep = die_sleep;
@@ -114,19 +114,16 @@ void save_nofork_data(struct nofork_save_area *save)
 void restore_nofork_data(struct nofork_save_area *save)
 {
        memcpy(&die_jmp, &save->die_jmp, sizeof(die_jmp));
-       current_applet = save->current_applet;
+       applet_name = save->applet_name;
        xfunc_error_retval = save->xfunc_error_retval;
        option_mask32 = save->option_mask32;
        die_sleep = save->die_sleep;
-
-       applet_name = current_applet->name;
 }
 
 int run_nofork_applet_prime(struct nofork_save_area *old, const struct bb_applet *a, char **argv)
 {
        int rc, argc;
 
-       current_applet = a;
        applet_name = a->name;
        xfunc_error_retval = EXIT_FAILURE;
        /*option_mask32 = 0; - not needed */
@@ -193,8 +190,7 @@ int spawn_and_wait(char **argv)
                        return wait4pid(rc);
                /* child */
                xfunc_error_retval = EXIT_FAILURE;
-               current_applet = a;
-               run_current_applet_and_exit(argv);
+               run_appletstruct_and_exit(a, argv);
 #endif
        }
 #endif /* FEATURE_PREFER_APPLETS */
index 8b21e655cfdff86fe66b945158ae3be598db75b3..af96c4d1da2365077ce4fd4441db598219c9a07d 100644 (file)
@@ -6470,10 +6470,8 @@ tryexec(char *cmd, char **argv, char **envp)
 
                a = find_applet_by_name(cmd);
                if (a) {
-                       if (a->noexec) {
-                               current_applet = a;
-                               run_current_applet_and_exit(argv);
-                       }
+                       if (a->noexec)
+                               run_appletstruct_and_exit(a, argv);
                        /* re-exec ourselves with the new arguments */
                        execve(bb_busybox_exec_path, argv, envp);
                        /* If they called chroot or otherwise made the binary no longer
index 90ed1554780d9ad29544961de03e29f553367ad8..1977da0f0c5592d12f9b371aca33f79db34112c0 100644 (file)
@@ -1399,10 +1399,9 @@ static void pseudo_exec_argv(char **argv)
                const struct bb_applet *a = find_applet_by_name(argv[0]);
                if (a) {
                        if (a->noexec) {
-                               current_applet = a;
                                debug_printf_exec("running applet '%s'\n", argv[0]);
-// is it ok that run_current_applet_and_exit() does exit(), not _exit()?
-                               run_current_applet_and_exit(argv);
+// is it ok that run_appletstruct_and_exit() does exit(), not _exit()?
+                               run_appletstruct_and_exit(a, argv);
                        }
                        /* re-exec ourselves with the new arguments */
                        debug_printf_exec("re-execing applet '%s'\n", argv[0]);