History log of /src/bin/sh/options.c |
Revision | | Date | Author | Comments |
1.62 |
| 14-Oct-2024 |
kre | 80 column police (for the recent -r change). NFC.
|
1.61 |
| 14-Oct-2024 |
kre | Add a -r (version) option to sh
This new -r (or +r) option is for command line use only. When encountered, the shell simply prints its version info (such as it has, which isn't much) and exits (immediately).
This allows "funny" uses like sh -version the -v and -e options are standard, and processed as normal (changing nothing, yet, except setting the option). Then the 'r' option is seen, the version info is printed, and the shell exits. Any remaining "options" (there is no "-o n" option) are ignored, as are any other args given to the shell.
The string printed (currently) is just "NetBSD shell:" followed by the value of the NETBSD_SHELL variable (which has been established already by the time options are processed).
|
1.60 |
| 21-Sep-2024 |
kre | In !TINYPROG versions of sh, make the builtin "shift" builtin command perform a rotate instead or shift if given a numeric arg (which is otherwise an error).
"set -- a b c; shift -1; echo $*" will echo "c a b".
While here, make the shift builtin comply with POSIX, and accept (and ignore) a '--' arg before the shift (or rotate) count.
Document the variant of shift in sh(1)
Adapt the shell test for shift to not expect "shift -1" to be an error, test that rotate works as expected, and include some tests that use the (useless, but required) "--" arg.
|
1.59 |
| 12-Jul-2024 |
kre | Improve safety in var imports from the environment.
Add a new var flag VUNSAFE - set on all vars imported from the environment.
Add setvareqsafe() (which is to setvareq() as setvarsafe() is to setvar()) and use that instead of setvareq() when processing the environment, so errors don't cause the shell to abort. Use VUNSAFE in that call.
Add flags arguments to all var callback functions which are used when setting variables, and pass the flags given to the setvar*() functions to those functions, so they can act differently in different situations (if desired). Most of them just ignore the flags.
When unsetting a variable, call setvar() to clear things (and call the callback function) both when the variable had a value which needs to be freed, and when unsetting a variable which wasn't unset previously, so the VUNSET flag can be seen by that callback func.
When setting HISTSIZE, use the flags passed to determine whether to ignore bad values (if VUNSAFE) or treat them as an error. This replaces the earlier temporary hack to always ignore bad data there (histedit.c 1.68).
Miscellaneous associated minor changes.
These changes should largely be invisible in normal use.
|
1.58 |
| 18-Sep-2022 |
kre | Add the -l option (aka -o login): be a login shell. Meaningful only on the command line (with both - and + forms) - overrides the presence (or otherwise) of a '-' as argv[0][0].
Since this allows any shell to be a login shell (which simply means that it runs /etc/profile and ~/.profile at shell startup - there are no other side effects) add a new, always set at startup, variable NBSH_INVOCATION which has a char string as its value, where each char has a meaning, more or less related to how the shell was started. See sh(1). This is intended to allow those startup scripts to tailor their behaviour to the nature of this particular login shell (it is possible to detect whether a shell is a login shell merely because of -l, or whether it would have been anyway, before the -l option was added - and more). The var could also be used to set different values for $ENV for different uses of the shell.
|
1.57 |
| 16-Apr-2022 |
kre | Avoid generating error messages implying that user errors are illegal.
|
1.56 |
| 26-Oct-2021 |
kre | PR bin/56464
After almost 30 years, finally do the right thing and read $HOME/.profile rather than .profile in the initial directory (it was that way in version 1.1 ...) All other ash descendants seem to have fixed this long ago.
While here, copy a feature from FreeBSD which allows "set +p" (if a shell run by a setuid process with the -p flag is privileged) to reset the privileges. Once done (the set +p) it cannot be undone (a later set -p sets the 'p' flag, but that's all it does) - that just becomes a one bit storage location.
We do this, as (also copying from FreeBSD, and because it is the right thing to do) we don't run .profile in a privileged shell - FreeBSD run /etc/suid_profile in that case (not a good name, it also applies to setgid shells) but I see no real need for that, we run /etc/profile in any case, anything that would go in /etc/suid_profile can just go in /etc/profile instead (with suitable guards so the commands only run in priv'd shells).
One or two minor DEBUG mode changes (notably having priv'd shells identify themselves in the DEBUG trace) and sh.1 changes with doc of the "set +p" change, the effect that has on $PSc and a few other wording tweaks.
XXX pullup -9 (not -8, this isn't worth it for the short lifetime that has left - if it took 28+ years for anyone to notice this, it cannot be having all that much effect).
|
1.55 |
| 05-Feb-2020 |
kre | Oops, the previous didn't do what was promised. Rather that ignoring just "--" for exec & "." it ignored any first arg starting '-'. Do it properly.
|
1.54 |
| 04-Feb-2020 |
kre | After bug report 262 (from 2010) https://austingroupbugs.net/view.php?id=252 the Austin Group decided to require processing of "--" by the "." and "exec" commands to solve a problem where some shells did option processing for those commands (permitted) and others did not (also permitted) which left no safe way to process a file with a name beginning with "-".
This has finally made its way into what will be the next version of the POSIX standard.
Since this shell did no option processing at all for those commands, we need to update. This is that update.
The sole effect is that a "--" 'option' (to "." or "exec") is ignored. This means that if you want to use "--" as the arg to one of those commands, it needs to be given twice ". -- --". Apart from that there should be no difference at all (though the "--" can now be used in other situations, where we did not require it before, and still do not).
|
1.53 |
| 13-Jul-2018 |
kre | branches: 1.53.2; Remove atoi()
Mostly use number() (no longer implemented using atoi()) when an unsigned integer is required, but use strtoXXX() when a conversion is wanted, without the possibility or error (like setting OPTIND and RANDOM). Always init OPTIND to 1 when sh starts (overriding anything in environ.)
|
1.52 |
| 21-Nov-2017 |
kre | branches: 1.52.2; 1.52.4; Remove the -X option from SMALL shells (as used on boot floppies, some other install media, mini-roots, etc.) It is unlikely that such a shell will be used for much script debugging (and the old -x still exists of course) and it adds a little bloat, so, zap...
The ancient unused (unrelated) xioctl() function is gone as well (from all shells).
|
1.51 |
| 19-Nov-2017 |
kre | Implement the -X option - an apparent variant of -x which sends all trace output to the stderr which existed when the -X option was (last) enabled. It also enables tracing by enabling -x (and when reset, +X, also resets the 'x' flag (+x)). Note that it is still -x/+x which actually enables/disables the trace output. Hence "apparent variant" - what -X actually does (aside from setting -x) is just to lock the trace output, rather than having it follow wherever stderr is later redirected.
|
1.50 |
| 24-Jul-2017 |
kre | PR standards/52406
Absent other information, the shell should be interactive if reading from stdin, and stdin and stderr are ttys, not stdin and stdout.
So sayeth the great lord posix.
|
1.49 |
| 29-May-2017 |
kre | branches: 1.49.2;
More DEBUG mode changes. As usual, read the source if you care.
|
1.48 |
| 18-May-2017 |
kre | Command line, and "set" command options processing cleanup.
sh +c "command string" no longer works (it must be -c) sh +o and sh -o no longer work (if you could call what they did before working.) nb: this is without an option name. -ooo Opt1 Opt2 Opt3 no longer works (set & cmd line), this should be -o Opt1 -o Opt2 -o Opt3 (same with +ooo of course). -oOpt is now supported - option value (name of option in this case) immediately following -o (or +o). (as with other commands that use std opt parsing) Both set comamnd and command line.
In addition, the output from "set +o" has shrunk dramatically, by borrowing a trick from ksh93 (but implemented in a more traditional syntax). "set +o" is required to produce a command (or commands) which when executed later, will return all options to the state they were in when "set +o" was done. Previously that was done by generating a set command, with every option listed (set -o opt +o other-opt ...) to set them all back to their current setings. Now we have a new "magic option" ("default") which sets all options to their default values, so now set +o output need only be "set -o default -o changed-opt ..." (only the options that have been changed from their default values need be explicitly mentioned.) The definition of "default value" for this is the value the shell set the option to, after startup, after processing the command line (with any flags, or -o option type settings), but before beginning processing any user input (incuding startup files, like $ENV etc).
Anyone can execute "set -o default" of course, but only from a "set" command (it makes no sense at all as a -o option to sh). This also causes "set +o" to be slightly more useful as a general command, as ignoring the "set -o default" part of the result, it lists just those options that have been altered after sh startup. There is no +o default. There isn't an option called "default" at all...
This causes some of the commented out text from sh.1 to become uncommented.
|
1.47 |
| 15-May-2017 |
kre | DEBUG mode shell update (changes nothing for shells which are not compiled for DEBUG.)
Add debug builtin command, and corresponding -D command line option. As usual, for DEBUG related stuff, read the source for info, that's all there is about this.
This completes the infrastructure changes for the updated DEBUG TRACE mechanism, so now converting the rest of the shell's internal tracing can happen as desired - piecemeal.
|
1.46 |
| 31-Mar-2016 |
christos | branches: 1.46.6; Implement the NETBSD_SHELL readonly unexportable unimportable variable (with its current value set at 20160401) as discussed on current-users and tech-userlevel. This also includes the necessary support to implement it properly (particularly the unexportable part) and adds options to the export command to support unexportable variables. Also implement the "posix" option (no single letter equivalent) which gets its default value from whether or not POSIXLY_CORRECT is set in the environment when the shell starts (but can be changed just like any other option using -o and +o on the command line, or the set builtin command.) While there, fix all uses of options so it is possible to have options that have a short (one char) name, and no long name, just as it has been possible to have options with a long name and no short name, though there are currently none (with no long name). For now, the only use of the posix option is to control whether ${ENV} is read at startup by a non-interactive shell, so changing it with set is not usful - that might change in the future. (from kre@)
|
1.45 |
| 08-Mar-2016 |
christos | PR bin/50896: make shift with more than 1 arg give a usage message, from kre
|
1.44 |
| 24-Feb-2016 |
christos | If we don't have shared address space vfork fail back to using fork since we are depending on the shared address space feature (from kre)
|
1.43 |
| 20-Mar-2012 |
matt | Use C89 function definitions
|
1.42 |
| 18-Jun-2011 |
christos | branches: 1.42.2; PR/45069: Henning Petersen: Use prototypes from builtins.h .
|
1.41 |
| 18-Jan-2009 |
lukem | branches: 1.41.6; fix -Wsign-compare issues
|
1.40 |
| 13-Dec-2005 |
dsl | TOG require that 'set +o' output the options in a form suitable for restoring them - make it so.
|
1.39 |
| 15-Jul-2005 |
christos | If we have a script and we are interactive, set interactive to 2. This allows us to run scripts with -i without printing the prompt like the other shells do.
|
1.38 |
| 20-Mar-2005 |
dsl | Add 'continue' as body of empty loop.
|
1.37 |
| 30-Oct-2004 |
christos | Pass WARNS=3
|
1.36 |
| 05-Jan-2004 |
jmmv | Homogenize usage messages: make the 'usage' word all lowercase, as this seems to be the most common practice in our tree.
|
1.35 |
| 07-Aug-2003 |
agc | Move UCB-licensed code from 4-clause to 3-clause licence.
Patches provided by Joel Baker in PR 22249, verified by myself.
|
1.34 |
| 15-Apr-2003 |
itojun | %d is 12 chars, not 10 chars. hinted by deraadt
|
1.33 |
| 22-Jan-2003 |
dsl | Support command -p, -v and -V as posix Stop temporary PATH assigments messing up hash table Fix sh -c -e "echo $0 $*" -a x (as posix) (agreed by christos)
|
1.32 |
| 24-Nov-2002 |
christos | Fixes from David Laight: - ansification - format of output of jobs command (etc) - job identiers %+, %- etc - $? and $(...) - correct quoting of output of set, export -p and readonly -p - differentiation between nornal and 'posix special' builtins - correct behaviour (posix) for errors on builtins and special builtins - builtin printf and kill - set -o debug (if compiled with DEBUG) - cd src obj (as ksh - too useful to do without) - unset -e name, remove non-readonly variable from export list. (so I could unset -e PS1 before running the test shell...)
|
1.31 |
| 26-Feb-2001 |
wiz | Fix command name in error message for 'sh nonexistingfile'.
|
1.30 |
| 04-Feb-2001 |
christos | remove redundant declarations and nexted externs.
|
1.29 |
| 09-Jul-1999 |
christos | compile with WARNS = 2
|
1.28 |
| 28-Jul-1998 |
mycroft | Be more retentive about use of NOTREACHED and noreturn.
|
1.27 |
| 28-Jul-1998 |
mycroft | Delint.
|
1.26 |
| 02-May-1998 |
christos | PR/5315: Dan Winship: options parsing code should print errors to stderr.
|
1.25 |
| 04-Jul-1997 |
christos | branches: 1.25.2; Fix compiler warnings.
|
1.24 |
| 14-Mar-1997 |
christos | NO_HISTORY->SMALL
|
1.23 |
| 25-Feb-1997 |
christos | Fix PR/3258 sh -c 'echo $0' causes segmentation fault.
|
1.22 |
| 11-Jan-1997 |
tls | kill 'register'
|
1.21 |
| 15-Dec-1996 |
christos | Getopts bugs again (I'll never get this right). - make sure that OPTIND is set correctly even in the absence of options. - don't keep stale state between getopts calls.
|
1.20 |
| 24-Nov-1996 |
christos | Fix bug in getopts code where the argument list got truncated. From Todd Miller.
|
1.19 |
| 06-Nov-1996 |
christos | Fix miscellaneous getopts problems: - the 3 argument version of getopts would not reset properly - OPTARG did not get cleared after a non argument option was found - OPTIND was not set properly after a non argument option.
|
1.18 |
| 02-Nov-1996 |
christos | Fix problems that gcc -Wall found (from Todd Miller, OpenBSD)
|
1.17 |
| 16-Oct-1996 |
christos | PR/2808: POSIX 1003.2: first arg after -c cmd is $0, remainder $1... (from FreeBSD)
|
1.16 |
| 25-Jun-1996 |
christos | - Add getoptsreset to be used as a callback function when OPTIND is set. This is used to implement the POSIX behavior when OPTIND=1 - Call setvarsafe instead of setvar. If one ran "getopts optstr badvariable" where badvariable contained an illegal variable name, there was no way to recover, since setvar() would longjmp on the error.
|
1.15 |
| 04-Jun-1996 |
christos | getopts fixes:
1. OPTIND value was not computed correctly when the argument was part of the option string (i.e. for "l:" "-l 1" was working "-l1" was not). (PR/2505). 2. OPTARG was not being unset in case of errors [in the non POSIX error case]. 3. optvar could be set to random values. 4. Option string starting with a : was not treated specially as POSIX specifies (if the option string starts with a :, then there is no error printed when there are missing option arguments or illegal options, and OPTARG and optvar are being set specially). 5. Implemented getopts "opts" optvar [arg]. The optional argument case was not implemented.
To do: - what does Posix say about resetting the getopts state? Bash does it by setting OPTIND=0; is that correct? Should we be doing the same thing? - should we be using getopt(3) for everything internal to the shell? Is that feasible because we might need to handle multiple invocations at once.
|
1.14 |
| 11-May-1995 |
christos | branches: 1.14.6; Merge in my changes from vangogh, and fix the x=`false`; echo $? == 0 bug.
|
1.13 |
| 26-Mar-1995 |
christos | Reverted to set - turning off -x and -v. Charles corrected me... It is part of POSIX.
|
1.12 |
| 25-Mar-1995 |
christos | set - does not anymore clear the -x and -v flags. This was incompatible with all other bourne shell implementations.
|
1.11 |
| 21-Mar-1995 |
cgd | convert to new RCS id conventions.
|
1.10 |
| 05-Dec-1994 |
cgd | clean up further. more patches from Jim Jegers
|
1.9 |
| 04-Dec-1994 |
cgd | from James Jegers <jimj@miller.cs.uwm.edu>: quiet -Wall, and squelch some of the worst style errors.
|
1.8 |
| 11-Jun-1994 |
mycroft | Add RCS ids.
|
1.7 |
| 14-May-1994 |
cgd | add back in support for building w/o obj dir. also, add NO_HISTORY define, which (if you invoke mkbuiltins properly) gets you a sh w/o history of command line editing (for floppy sh).
|
1.6 |
| 12-May-1994 |
jtc | Include appropriate header files to bring function prototypes into scope.
|
1.5 |
| 11-May-1994 |
jtc | sync with 4.4lite
|
1.4 |
| 01-Aug-1993 |
mycroft | Add RCS identifiers.
|
1.3 |
| 23-Mar-1993 |
cgd | changed "Id" to "Header" for rcsids
|
1.2 |
| 22-Mar-1993 |
cgd | added rcs ids to all files
|
1.1 |
| 21-Mar-1993 |
cgd | branches: 1.1.1; Initial revision
|
1.1.1.2 |
| 11-May-1994 |
jtc | 44lite code
|
1.1.1.1 |
| 21-Mar-1993 |
cgd | initial import of 386bsd-0.1 sources
|
1.14.6.2 |
| 04-Mar-1997 |
mycroft | Pull up latest sh(1). Fixes yet more bugs.
|
1.14.6.1 |
| 26-Jan-1997 |
rat | Update /bin/sh from trunk per request of Christos Zoulas. Fixes many bugs.
|
1.25.2.1 |
| 08-May-1998 |
mycroft | Sync with trunk, per request of christos.
|
1.41.6.1 |
| 23-Jun-2011 |
cherry | Catchup with rmind-uvmplock merge.
|
1.42.2.1 |
| 17-Apr-2012 |
yamt | sync with head
|
1.46.6.1 |
| 19-May-2017 |
pgoyette | Resolve conflicts from previous merge (all resulting from $NetBSD keywork expansion)
|
1.49.2.1 |
| 25-Aug-2018 |
martin | Pull up following revision(s) (requested by kre in ticket #988):
bin/sh/parser.c: revision 1.147 bin/sh/var.c: revision 1.70 bin/sh/mystring.c: revision 1.18 bin/sh/options.c: revision 1.53 bin/sh/histedit.c: revision 1.53
Remove atoi()
Mostly use number() (no longer implemented using atoi()) when an unsigned integer is required, but use strtoXXX() when a conversion is wanted, without the possibility or error (like setting OPTIND and RANDOM). Always init OPTIND to 1 when sh starts (overriding anything in environ.)
|
1.52.4.4 |
| 21-Apr-2020 |
martin | Ooops, restore accidently removed files from merge mishap
|
1.52.4.3 |
| 21-Apr-2020 |
martin | Sync with HEAD
|
1.52.4.2 |
| 08-Apr-2020 |
martin | Merge changes from current as of 20200406
|
1.52.4.1 |
| 10-Jun-2019 |
christos | Sync with HEAD
|
1.52.2.1 |
| 28-Jul-2018 |
pgoyette | Sync with HEAD
|
1.53.2.1 |
| 06-Nov-2021 |
martin | Pull up following revision(s) (requested by kre in ticket #1371):
bin/sh/main.c: revision 1.87 bin/sh/main.c: revision 1.88 bin/sh/memalloc.h: revision 1.20 bin/sh/sh.1: revision 1.235 bin/sh/memalloc.c: revision 1.34 bin/sh/memalloc.c: revision 1.35 bin/sh/memalloc.h: revision 1.19 bin/sh/shell.h: revision 1.31 bin/sh/options.c: revision 1.56
PR bin/56464
After almost 30 years, finally do the right thing and read $HOME/.profile rather than .profile in the initial directory (it was that way in version 1.1 ...) All other ash descendants seem to have fixed this long ago. While here, copy a feature from FreeBSD which allows "set +p" (if a shell run by a setuid process with the -p flag is privileged) to reset the privileges. Once done (the set +p) it cannot be undone (a later set -p sets the 'p' flag, but that's all it does) - that just becomes a one bit storage location.
We do this, as (also copying from FreeBSD, and because it is the right thing to do) we don't run .profile in a privileged shell - FreeBSD run /etc/suid_profile in that case (not a good name, it also applies to setgid shells) but I see no real need for that, we run /etc/profile in any case, anything that would go in /etc/suid_profile can just go in /etc/profile instead (with suitable guards so the commands only run in priv'd shells).
One or two minor DEBUG mode changes (notably having priv'd shells identify themselves in the DEBUG trace) and sh.1 changes with doc of the "set +p" change, the effect that has on $PSc and a few other wording tweaks.
XXX pullup -9 (not -8, this isn't worth it for the short lifetime that has left - if it took 28+ years for anyone to notice this, it cannot be having all that much effect).
Use a type-correct end marker for strstrcat() rather than NULL, as for a function with unknown number & types of args, the compiler isn't able to automatically convert to the correct type. Issue pointed out in off list e-mail by Rolland Illig ... Thanks.
The first arg (pointer to where to put length of result) is of a known type, so doesn't have the same issue - we can keep using NULL for that one when the length isn't needed. Also, make sure to return a correctly null terminated null string in the (absurd) case that there are no non-null args to strstrcat() (though there are much better ways to generate "" on the stack). Since there is currently just one call in the code, and it has real string args, this isn't an issue for now, but who knows, some day.
NFCI - if there is any real change, then it is a change that is required.
XXX pullup -9 (together with the previous changes)
|