aboutsummaryrefslogtreecommitdiff
path: root/shell
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2017-07-31 19:43:47 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2017-07-31 19:43:47 +0200
commitec05df13b0f3bc69074909f078f981f417d95c89 (patch)
tree3854fd1fc3c1f1c1855362487734b41cd7aad5d0 /shell
parent78b1b1b07ac2784f67bc65bb1d86cc2559a12446 (diff)
downloadbusybox-ec05df13b0f3bc69074909f078f981f417d95c89.tar.gz
ash: align --login code with dash
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@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@googlemail.com>
Diffstat (limited to 'shell')
-rw-r--r--shell/ash.c30
1 files changed, 17 insertions, 13 deletions
diff --git a/shell/ash.c b/shell/ash.c
index 9c61ce618..1deae7c2f 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;