aboutsummaryrefslogtreecommitdiff
path: root/init
diff options
context:
space:
mode:
authorvda <vda@69ca8d6d-28ef-0310-b511-8ec308f3f277>2007-01-21 00:41:04 +0000
committervda <vda@69ca8d6d-28ef-0310-b511-8ec308f3f277>2007-01-21 00:41:04 +0000
commitbb21944ea0d5e95f07691dfaeaba404ddfa70528 (patch)
tree3e82c2dd94d674a723f3d7df350f32dc8892adc1 /init
parentff978c7d73d84e06ee5dc927a180cdc794d35b21 (diff)
downloadbusybox-w32-bb21944ea0d5e95f07691dfaeaba404ddfa70528.tar.gz
busybox-w32-bb21944ea0d5e95f07691dfaeaba404ddfa70528.tar.bz2
busybox-w32-bb21944ea0d5e95f07691dfaeaba404ddfa70528.zip
Introduce FEATURE_EXEC_PREFER_APPLETS = "re-execute our own
executable if we asked to exec someting with argv[0] == known_applet" Use it in init. Also respect PATH in init, remove explicit "/sbin" etc from exec. Patch by Gabriel L. Somlo <somlo@cmu.edu> git-svn-id: svn://busybox.net/trunk/busybox@17426 69ca8d6d-28ef-0310-b511-8ec308f3f277
Diffstat (limited to 'init')
-rw-r--r--init/init.c29
1 files changed, 20 insertions, 9 deletions
diff --git a/init/init.c b/init/init.c
index 6fc68afb1..7694b4448 100644
--- a/init/init.c
+++ b/init/init.c
@@ -389,6 +389,7 @@ static pid_t run(const struct init_action *a)
389#include CUSTOMIZED_BANNER 389#include CUSTOMIZED_BANNER
390#endif 390#endif
391 "\nPlease press Enter to activate this console. "; 391 "\nPlease press Enter to activate this console. ";
392 char *prog;
392 393
393 /* Block sigchild while forking. */ 394 /* Block sigchild while forking. */
394 sigemptyset(&nmask); 395 sigemptyset(&nmask);
@@ -560,7 +561,10 @@ static pid_t run(const struct init_action *a)
560 561
561 /* Now run it. The new program will take over this PID, 562 /* Now run it. The new program will take over this PID,
562 * so nothing further in init.c should be run. */ 563 * so nothing further in init.c should be run. */
563 execv(cmdpath, cmd); 564 prog = cmdpath;
565 if (ENABLE_FEATURE_EXEC_PREFER_APPLETS && find_applet_by_name(prog))
566 prog = CONFIG_BUSYBOX_EXEC_PATH;
567 execvp(prog, cmd);
564 568
565 /* We're still here? Some error happened. */ 569 /* We're still here? Some error happened. */
566 message(LOG | CONSOLE, "Bummer, cannot run '%s': %m", cmdpath); 570 message(LOG | CONSOLE, "Bummer, cannot run '%s': %m", cmdpath);
@@ -678,6 +682,7 @@ static void exec_signal(int sig ATTRIBUTE_UNUSED)
678{ 682{
679 struct init_action *a, *tmp; 683 struct init_action *a, *tmp;
680 sigset_t unblock_signals; 684 sigset_t unblock_signals;
685 char *prog;
681 686
682 for (a = init_action_list; a; a = tmp) { 687 for (a = init_action_list; a; a = tmp) {
683 tmp = a->next; 688 tmp = a->next;
@@ -713,7 +718,10 @@ static void exec_signal(int sig ATTRIBUTE_UNUSED)
713 dup(0); 718 dup(0);
714 719
715 messageD(CONSOLE | LOG, "Trying to re-exec %s", a->command); 720 messageD(CONSOLE | LOG, "Trying to re-exec %s", a->command);
716 execl(a->command, a->command, NULL); 721 prog = a->command;
722 if (ENABLE_FEATURE_EXEC_PREFER_APPLETS && find_applet_by_name(prog))
723 prog = CONFIG_BUSYBOX_EXEC_PATH;
724 execlp(prog, a->command, NULL);
717 725
718 message(CONSOLE | LOG, "exec of '%s' failed: %m", 726 message(CONSOLE | LOG, "exec of '%s' failed: %m",
719 a->command); 727 a->command);
@@ -852,13 +860,13 @@ static void parse_inittab(void)
852 /* No inittab file -- set up some default behavior */ 860 /* No inittab file -- set up some default behavior */
853#endif 861#endif
854 /* Reboot on Ctrl-Alt-Del */ 862 /* Reboot on Ctrl-Alt-Del */
855 new_init_action(CTRLALTDEL, "/sbin/reboot", ""); 863 new_init_action(CTRLALTDEL, "reboot", "");
856 /* Umount all filesystems on halt/reboot */ 864 /* Umount all filesystems on halt/reboot */
857 new_init_action(SHUTDOWN, "/bin/umount -a -r", ""); 865 new_init_action(SHUTDOWN, "umount -a -r", "");
858 /* Swapoff on halt/reboot */ 866 /* Swapoff on halt/reboot */
859 if(ENABLE_SWAPONOFF) new_init_action(SHUTDOWN, "/sbin/swapoff -a", ""); 867 if(ENABLE_SWAPONOFF) new_init_action(SHUTDOWN, "swapoff -a", "");
860 /* Prepare to restart init when a HUP is received */ 868 /* Prepare to restart init when a HUP is received */
861 new_init_action(RESTART, "/sbin/init", ""); 869 new_init_action(RESTART, "init", "");
862 /* Askfirst shell on tty1-4 */ 870 /* Askfirst shell on tty1-4 */
863 new_init_action(ASKFIRST, bb_default_login_shell, ""); 871 new_init_action(ASKFIRST, bb_default_login_shell, "");
864 new_init_action(ASKFIRST, bb_default_login_shell, VC_2); 872 new_init_action(ASKFIRST, bb_default_login_shell, VC_2);
@@ -1039,9 +1047,9 @@ int init_main(int argc, char **argv)
1039 { 1047 {
1040 message(CONSOLE,"Low memory: forcing swapon."); 1048 message(CONSOLE,"Low memory: forcing swapon.");
1041 /* swapon -a requires /proc typically */ 1049 /* swapon -a requires /proc typically */
1042 new_init_action(SYSINIT, "/bin/mount -t proc proc /proc", ""); 1050 new_init_action(SYSINIT, "mount -t proc proc /proc", "");
1043 /* Try to turn on swap */ 1051 /* Try to turn on swap */
1044 new_init_action(SYSINIT, "/sbin/swapon -a", ""); 1052 new_init_action(SYSINIT, "swapon -a", "");
1045 run_actions(SYSINIT); /* wait and removing */ 1053 run_actions(SYSINIT); /* wait and removing */
1046 } 1054 }
1047 } 1055 }
@@ -1068,7 +1076,10 @@ int init_main(int argc, char **argv)
1068 1076
1069 putenv("SELINUX_INIT=YES"); 1077 putenv("SELINUX_INIT=YES");
1070 if (selinux_init_load_policy(&enforce) == 0) { 1078 if (selinux_init_load_policy(&enforce) == 0) {
1071 execv(argv[0], argv); 1079 char *prog = argv[0];
1080 if (ENABLE_FEATURE_EXEC_PREFER_APPLETS && find_applet_by_name(prog))
1081 prog = CONFIG_BUSYBOX_EXEC_PATH;
1082 execvp(prog, argv);
1072 } else if (enforce > 0) { 1083 } else if (enforce > 0) {
1073 /* SELinux in enforcing mode but load_policy failed */ 1084 /* SELinux in enforcing mode but load_policy failed */
1074 /* At this point, we probably can't open /dev/console, so log() won't work */ 1085 /* At this point, we probably can't open /dev/console, so log() won't work */