[git commit master 1/1] if only one applet is enabled, make "busybox applet [params]" work as expected

Denys Vlasenko vda.linux at googlemail.com
Mon Nov 29 01:55:35 UTC 2010


commit: http://git.busybox.net/busybox/commit/?id=8f0af3b0013156b8aa3bae802af5e33c3a440915
branch: http://git.busybox.net/busybox/commit/?id=refs/heads/master

Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 libbb/appletlib.c |   62 ++++++++++++++++++++++++++++------------------------
 1 files changed, 33 insertions(+), 29 deletions(-)

diff --git a/libbb/appletlib.c b/libbb/appletlib.c
index c417a27..c65180c 100644
--- a/libbb/appletlib.c
+++ b/libbb/appletlib.c
@@ -227,7 +227,7 @@ bool re_execed;
 
 IF_FEATURE_SUID(static uid_t ruid;)  /* real uid */
 
-#if ENABLE_FEATURE_SUID_CONFIG
+# if ENABLE_FEATURE_SUID_CONFIG
 
 /* applets[] is const, so we have to define this "override" structure */
 static struct BB_suid_config {
@@ -498,15 +498,15 @@ static void parse_config_file(void)
 		sct_head = sct;
 	}
 }
-#else
+# else
 static inline void parse_config_file(void)
 {
 	IF_FEATURE_SUID(ruid = getuid();)
 }
-#endif /* FEATURE_SUID_CONFIG */
+# endif /* FEATURE_SUID_CONFIG */
 
 
-#if ENABLE_FEATURE_SUID
+# if ENABLE_FEATURE_SUID
 static void check_suid(int applet_no)
 {
 	gid_t rgid;  /* real gid */
@@ -515,7 +515,7 @@ static void check_suid(int applet_no)
 		return; /* run by root - no need to check more */
 	rgid = getgid();
 
-#if ENABLE_FEATURE_SUID_CONFIG
+#  if ENABLE_FEATURE_SUID_CONFIG
 	if (suid_cfg_readable) {
 		uid_t uid;
 		struct BB_suid_config *sct;
@@ -558,7 +558,7 @@ static void check_suid(int applet_no)
 			bb_perror_msg_and_die("setresuid");
 		return;
 	}
-#if !ENABLE_FEATURE_SUID_CONFIG_QUIET
+#   if !ENABLE_FEATURE_SUID_CONFIG_QUIET
 	{
 		static bool onetime = 0;
 
@@ -567,9 +567,9 @@ static void check_suid(int applet_no)
 			fprintf(stderr, "Using fallback suid method\n");
 		}
 	}
-#endif
+#   endif
  check_need_suid:
-#endif
+#  endif
 	if (APPLET_SUID(applet_no) == _BB_SUID_REQUIRE) {
 		/* Real uid is not 0. If euid isn't 0 too, suid bit
 		 * is most probably not set on our executable */
@@ -580,25 +580,24 @@ static void check_suid(int applet_no)
 		xsetuid(ruid);
 	}
 }
-#else
-#define check_suid(x) ((void)0)
-#endif /* FEATURE_SUID */
+# else
+#  define check_suid(x) ((void)0)
+# endif /* FEATURE_SUID */
 
 
-#if ENABLE_FEATURE_INSTALLER
+# if ENABLE_FEATURE_INSTALLER
 static const char usr_bin [] ALIGN1 = "/usr/bin/";
 static const char usr_sbin[] ALIGN1 = "/usr/sbin/";
 static const char *const install_dir[] = {
 	&usr_bin [8], /* "/" */
 	&usr_bin [4], /* "/bin/" */
 	&usr_sbin[4]  /* "/sbin/" */
-# if !ENABLE_INSTALL_NO_USR
+#  if !ENABLE_INSTALL_NO_USR
 	,usr_bin
 	,usr_sbin
-# endif
+#  endif
 };
 
-
 /* create (sym)links for each applet */
 static void install_links(const char *busybox, int use_symbolic_links,
 		char *custom_install_dir)
@@ -628,9 +627,9 @@ static void install_links(const char *busybox, int use_symbolic_links,
 		free(fpc);
 	}
 }
-#else
-# define install_links(x,y,z) ((void)0)
-#endif
+# else
+#  define install_links(x,y,z) ((void)0)
+# endif
 
 /* If we were called as "busybox..." */
 static int busybox_main(char **argv)
@@ -695,10 +694,10 @@ static int busybox_main(char **argv)
 		const char *a = applet_names;
 		dup2(1, 2);
 		while (*a) {
-#if ENABLE_FEATURE_INSTALLER
+# if ENABLE_FEATURE_INSTALLER
 			if (argv[1][6]) /* --list-path? */
 				full_write2_str(install_dir[APPLET_INSTALL_LOC(i)] + 1);
-#endif
+# endif
 			full_write2_str(a);
 			full_write2_str("\n");
 			i++;
@@ -771,7 +770,7 @@ void FAST_FUNC run_applet_and_exit(const char *name, char **argv)
 	int applet = find_applet_by_name(name);
 	if (applet >= 0)
 		run_applet_no_and_exit(applet, argv);
-	if (!strncmp(name, "busybox", 7))
+	if (strncmp(name, "busybox", 7) == 0)
 		exit(busybox_main(argv));
 }
 
@@ -803,14 +802,6 @@ int main(int argc UNUSED_PARAM, char **argv)
 	mallopt(M_MMAP_THRESHOLD, 8 * PAGE_SIZE - 256);
 #endif
 
-#if defined(SINGLE_APPLET_MAIN)
-	/* Only one applet is selected by the user! */
-	/* applet_names in this case is just "applet\0\0" */
-	lbb_prepare(applet_names IF_FEATURE_INDIVIDUAL(, argv));
-	return SINGLE_APPLET_MAIN(argc, argv);
-#else
-	lbb_prepare("busybox" IF_FEATURE_INDIVIDUAL(, argv));
-
 #if !BB_MMU
 	/* NOMMU re-exec trick sets high-order bit in first byte of name */
 	if (argv[0][0] & 0x80) {
@@ -818,6 +809,19 @@ int main(int argc UNUSED_PARAM, char **argv)
 		argv[0][0] &= 0x7f;
 	}
 #endif
+
+#if defined(SINGLE_APPLET_MAIN)
+	/* Only one applet is selected in .config */
+	if (strncmp(argv[0], "busybox", 7) == 0) {
+		/* "busybox <applet> <params>" should still work as expected */
+		argv++;
+	}
+	/* applet_names in this case is just "applet\0\0" */
+	lbb_prepare(applet_names IF_FEATURE_INDIVIDUAL(, argv));
+	return SINGLE_APPLET_MAIN(argc, argv);
+#else
+	lbb_prepare("busybox" IF_FEATURE_INDIVIDUAL(, argv));
+
 	applet_name = argv[0];
 	if (applet_name[0] == '-')
 		applet_name++;
-- 
1.7.2.2



More information about the busybox-cvs mailing list