diff options
author | Barton E. Schaefer <schaefer@zsh.org> | 2014-10-12 11:18:30 -0700 |
---|---|---|
committer | Barton E. Schaefer <schaefer@zsh.org> | 2014-10-12 11:18:30 -0700 |
commit | 2d14c085b761c71e35cc362f87cd4fecbc8e0676 (patch) | |
tree | 4a198e4be32bf40455a72b49a433e53e77fd2b5a /Src/init.c | |
parent | 3b5d77d819e1b7a94c4b14d69bddb2dddf8605ff (diff) | |
download | zsh-2d14c085b761c71e35cc362f87cd4fecbc8e0676.tar.gz zsh-2d14c085b761c71e35cc362f87cd4fecbc8e0676.tar.xz zsh-2d14c085b761c71e35cc362f87cd4fecbc8e0676.zip |
33445: fix handling of -s when combined with -i at shell invocation
Fixes a long-standing (25+ years) bug where using -i -s together did have the documented effect of disabling command line script files but also had the side-effect of invoking ZLE, thereby ignoring the redirected input.
Diffstat (limited to 'Src/init.c')
-rw-r--r-- | Src/init.c | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/Src/init.c b/Src/init.c index 6d005dce7..68d36125e 100644 --- a/Src/init.c +++ b/Src/init.c @@ -243,12 +243,24 @@ parseargs(char **argv, char **runscript) */ opts[MONITOR] = 2; /* may be unset in init_io() */ opts[HASHDIRS] = 2; /* same relationship to INTERACTIVE */ + opts[USEZLE] = 1; /* see below, related to SHINSTDIN */ opts[SHINSTDIN] = 0; opts[SINGLECOMMAND] = 0; if (parseopts(NULL, &argv, opts, &cmd, NULL)) exit(1); + /* + * USEZLE remains set if the shell has access to a terminal and + * is not reading from some other source as indicated by SHINSTDIN. + * SHINSTDIN becomes set below if there is no command argument, + * but it is the explicit setting (or not) that matters to USEZLE. + * USEZLE may also become unset in init_io() if the shell is not + * interactive or the terminal cannot be re-opened read/write. + */ + if (opts[SHINSTDIN]) + opts[USEZLE] = (opts[USEZLE] && isatty(0)); + paramlist = znewlinklist(); if (*argv) { if (unset(SHINSTDIN)) { @@ -603,7 +615,7 @@ init_shout(void) if (SHTTY == -1) { - /* Since we're interative, it's nice to have somewhere to write. */ + /* Since we're interactive, it's nice to have somewhere to write. */ shout = stderr; return; } @@ -616,7 +628,8 @@ init_shout(void) /* Associate terminal file descriptor with a FILE pointer */ shout = fdopen(SHTTY, "w"); #ifdef _IOFBF - setvbuf(shout, shoutbuf, _IOFBF, BUFSIZ); + if (shout) + setvbuf(shout, shoutbuf, _IOFBF, BUFSIZ); #endif gettyinfo(&shttyinfo); /* get tty state */ @@ -1608,8 +1621,7 @@ zsh_main(UNUSED(int argc), char **argv) emulate(zsh_name, 1, &emulation, opts); /* initialises most options */ opts[LOGINSHELL] = (**argv == '-'); opts[PRIVILEGED] = (getuid() != geteuid() || getgid() != getegid()); - opts[USEZLE] = 1; /* may be unset in init_io() */ - /* sets INTERACTIVE, SHINSTDIN and SINGLECOMMAND */ + /* sets ZLE, INTERACTIVE, SHINSTDIN and SINGLECOMMAND */ parseargs(argv, &runscript); SHTTY = -1; |