[git commit] ash: align --login code with dash

Denys Vlasenko vda.linux at googlemail.com
Mon Jul 31 17:43:47 UTC 2017


commit: https://git.busybox.net/busybox/commit/?id=ec05df13b0f3bc69074909f078f981f417d95c89
branch: https://git.busybox.net/busybox/commit/?id=refs/heads/master

Upstream commit:

    Date: Sun, 13 Jul 2008 22:34:50 +0800
    [OPTIONS] Added support for -l

    This patch adds support for the -l option (login shell) as required
    by the LSB.

    Signed-off-by: Herbert Xu <herbert at gondor.apana.org.au>

It's a bit bigger, but gets rid of one global variable

function                                             old     new   delta
options                                              554     576     +22

Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 shell/ash.c | 30 +++++++++++++++++-------------
 1 file changed, 17 insertions(+), 13 deletions(-)

diff --git a/shell/ash.c b/shell/ash.c
index 9c61ce6..1deae7c 100644
--- a/shell/ash.c
+++ b/shell/ash.c
@@ -328,7 +328,6 @@ struct globals_misc {
 #define EXERROR 1       /* a generic error */
 #define EXEXIT 4        /* exit the shell */
 
-	smallint isloginsh;
 	char nullstr[1];        /* zero length string */
 
 	char optlist[NOPTS];
@@ -397,7 +396,6 @@ extern struct globals_misc *const ash_ptr_to_globals_misc;
 #define pending_int       (G_misc.pending_int      )
 #define got_sigchld       (G_misc.got_sigchld      )
 #define pending_sig       (G_misc.pending_sig      )
-#define isloginsh   (G_misc.isloginsh  )
 #define nullstr     (G_misc.nullstr    )
 #define optlist     (G_misc.optlist    )
 #define sigmode     (G_misc.sigmode    )
@@ -10721,7 +10719,7 @@ setoption(int flag, int val)
 	/* NOTREACHED */
 }
 static int
-options(int cmdline)
+options(int cmdline, int *login_sh)
 {
 	char *p;
 	int val;
@@ -10762,11 +10760,14 @@ options(int cmdline)
 				if (*argptr)
 					argptr++;
 			} else if (cmdline && (c == 'l')) { /* -l or +l == --login */
-				isloginsh = 1;
+				if (login_sh)
+					*login_sh = 1;
 			/* bash does not accept +-login, we also won't */
 			} else if (cmdline && val && (c == '-')) { /* long options */
-				if (strcmp(p, "login") == 0)
-					isloginsh = 1;
+				if (strcmp(p, "login") == 0) {
+					if (login_sh)
+						*login_sh = 1;
+				}
 				break;
 			} else {
 				setoption(c, val);
@@ -10850,7 +10851,7 @@ setcmd(int argc UNUSED_PARAM, char **argv UNUSED_PARAM)
 		return showvars(nullstr, 0, VUNSET);
 
 	INT_OFF;
-	retval = options(/*cmdline:*/ 0);
+	retval = options(/*cmdline:*/ 0, NULL);
 	if (retval == 0) { /* if no parse error... */
 		optschanged();
 		if (*argptr != NULL) {
@@ -13602,21 +13603,23 @@ init(void)
 /*
  * Process the shell command line arguments.
  */
-static void
+static int
 procargs(char **argv)
 {
 	int i;
 	const char *xminusc;
 	char **xargv;
+	int login_sh;
 
 	xargv = argv;
+	login_sh = xargv[0] && xargv[0][0] == '-';
 	arg0 = xargv[0];
 	/* if (xargv[0]) - mmm, this is always true! */
 		xargv++;
 	for (i = 0; i < NOPTS; i++)
 		optlist[i] = 2;
 	argptr = xargv;
-	if (options(/*cmdline:*/ 1)) {
+	if (options(/*cmdline:*/ 1, &login_sh)) {
 		/* it already printed err message */
 		raise_exception(EXERROR);
 	}
@@ -13660,6 +13663,8 @@ procargs(char **argv)
 		xargv++;
 	}
 	optschanged();
+
+	return login_sh;
 }
 
 /*
@@ -13720,6 +13725,7 @@ int ash_main(int argc UNUSED_PARAM, char **argv)
 	volatile smallint state;
 	struct jmploc jmploc;
 	struct stackmark smark;
+	int login_sh;
 
 	/* Initialize global data */
 	INIT_G_misc();
@@ -13768,15 +13774,13 @@ int ash_main(int argc UNUSED_PARAM, char **argv)
 
 	init();
 	setstackmark(&smark);
-	procargs(argv);
+	login_sh = procargs(argv);
 #if DEBUG
 	TRACE(("Shell args: "));
 	trace_puts_args(argv);
 #endif
 
-	if (argv[0] && argv[0][0] == '-')
-		isloginsh = 1;
-	if (isloginsh) {
+	if (login_sh) {
 		const char *hp;
 
 		state = 1;


More information about the busybox-cvs mailing list