Commit Graph

3282 Commits

Author SHA1 Message Date
kre 09ecfab926 Slightly improve "jobs" command output in cases where a job includes
embedded background commands or pipelines.   (just slightly...)
OK christos@
2016-05-07 20:07:47 +00:00
kre 3eee147437 PR bin/51119 - don't leak FDs in unusual error cases. OK christos@ 2016-05-07 20:06:30 +00:00
kre 0fe4e12852 Unbreak build ... again... gcc is insane. 2016-05-03 23:55:12 +00:00
kre 3c6d76cd74 PR bin/51114 - print the correct values for >&- and >& N (N > 9)
in output from the "jobs" command (and other places that use the
same routines.)
2016-05-03 20:46:35 +00:00
christos ddfe742084 add missing forward declaration for the STATIC= case. 2016-05-03 17:21:02 +00:00
kre 404b1d0271 Fix things so that STATIC can me made static (-DSTATIC=static)
and have the shell still compile, link, and run...

ok christos@
2016-05-03 13:47:58 +00:00
kre a18b822d05 Allow function names to be any shell word not containing '/'.
This allows anything that could be a filesystem command to be
implemented as a function instead.  The restriction on '/'
is because of the way that functions are (required to be) searched
for relative to PATH searching - a function with a name containing '/'
could never be executed, so simply prohibit defining such a thing.

ok christos@
2016-05-03 03:16:55 +00:00
kre 1d68040618 PR bin/43639 - check that a file being read by the '.' command
is a regular file, even when it is given as a full pathname.
2016-05-03 03:12:40 +00:00
kre 54c1af73d6 Remove unnecessary extern var declaration that was a
remnant of an earlier version of the previous (fd>10) fixes.

ok christos@
2016-05-03 03:08:21 +00:00
christos 1fad4bb60c Fix handing of user file descriptors outside the 0..9 range.
Also, move (most of) the shell's internal use fd's to much
higher values (depending upon what ulimit -n allows) so they
are less likely to clash with user supplied fd numbers.  A future
patch will (hopefully) avoid this problem completely by dynamically
moving the shell's internal fds around as needed. (From kre@)
2016-05-02 01:46:31 +00:00
wiz 6b7f9f8932 Remove some double quotes.
Parity is kept.
2016-04-04 13:05:56 +00:00
christos 478a0487ac Allow a heredoc to be positioned outside a `` command substitution.
POSIX just says "here docs begin after the next newline [token]".
Nothing about "provided it is inside any `` the redirect operator
appears in...    As best I can tell, NetBSD now has the only shell to
handle this "correctly" (which raises the question whether it is
correct - but if not, only erroneous scripts are affected.)
This is required by some (probably broken) autoconfigure related
scripts. (from kre@)
2016-04-04 12:39:08 +00:00
mrg 6d27b0e86e for GCC 5.3 pass -fwrapv as this relies upon well-defined integer overflow. 2016-04-01 08:19:31 +00:00
christos 65cf828420 After discussions with Jilles Tjoelker (FreeBSD shell) and
following a suggestion from him, the way the fix to PR bin/50993
was implemented has changed a little.   There are three steps involved
in processing a here document, reading it, parsing it, and then
evaluating it before applying it to the correct file descriptor for
the command to use.  The third of those is not related to this
problem, and has not changed.  The bug was caused by combining the
first two steps into one (and not doing it correctly - which would be
hard that way.)  The fix is to split the first two stages into
separate events.   The original fix moved the 2nd stage (parsing)
to just immediately before the 3rd stage (evaluation.)  Jilles
pointed out some unwanted side effects from doing it that way, and
suggested moving the 2nd stage to immediately after the first.
This commit makes that change.  The effect is to revert the changes
to expand.c and parser.h (which are no longer needed) and simplify
slightly the change to parser.c. (from kre@)
2016-03-31 23:11:05 +00:00
christos b732ccab17 replace with standard copyright :-) 2016-03-31 16:28:23 +00:00
christos 26427ea787 Document the NETBSD_SHELL variable, the enhancements to export,
the posix option, and a whole bunch of miscellaneous updates and
corrections. (from kre@)
2016-03-31 16:18:22 +00:00
christos 9302f8ef1a 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@)
2016-03-31 16:16:35 +00:00
christos ddf72776f1 PR bin/51027 - fix the parsing of references to shell parameters
when given without braces (ie: $2 etc).  Only the first 9 shell
parameters ($1 .. $9) and the special parameter ($0) can be
referenced this way, $10 is ${1}0 not ${10}.   Make it so.
This bug brought to notice by Sven Mascheck's web pages which
discuss (among other things) the history of this (and other ash
based) shells .. see http://www.in-ulm.de/~mascheck/ (from kre@)
2016-03-31 16:12:52 +00:00
christos 21cf17379f This is an internally visible change - no effect visible to the
user is expected. With the previous commits to parser.c, we no
longer need to handle reading here documents in the (massive)
readtoken1() function. That allows its code to be simplified and
made easier to read and understand (several goto's goto goto heaven.
RIP) (from kre@)
2016-03-31 16:12:09 +00:00
christos b322b670f0 After discussions with Jilles Tjoelker (FreeBSD shell) and following
a suggestion from him, the way the fix to PR bin/50993 was implemented
has changed a little.   There are three steps involved in processing
a here document, reading it, parsing it, and then evaluating it
before applying it to the correct file descriptor for the command
to use.  The third of those is not related to this problem, and
has not changed.  The bug was caused by combining the first two
steps into one (and not doing it correctly - which would be hard
that way.)  The fix is to split the first two stages into separate
events.   The original fix moved the 2nd stage (parsing) to just
immediately before the 3rd stage (evaluation.)  Jilles pointed out
some unwanted side effects from doing it that way, and suggested
moving the 2nd stage to immediately after the first.  This commit
makes that change.  The effect is to revert the changes to expand.c
and parser.h (which are no longer needed) and simplify slightly
the change to parser.c. (from kre@)
2016-03-31 13:27:44 +00:00
christos 7c8885a4e7 Move the parseredir internal subroutine out of readtoken1() into being
a real function of its own (also inspired by FreeBSD - though for
this one other sh differences require slightly different code.) (from kre@)
2016-03-27 14:40:20 +00:00
christos 1d1484aa26 PR bin/50993 - this is a significant rewrite of the way that here
documents are processed.  Now, when first detected, they are
simply read (the only change made to the text is to join lines
ended with a \ to the subsequent line, otherwise end marker detection
does not work correctly (for here docs with an unquoted endmarker
only of course.)  This patch also moves the "internal subroutine"
for looking for the end marker out of readtoken1() (which had to
happen as readtoken1 is no longer reading the here doc when it is
needed) - that uses code mostly taken from FreeBSD's sh (thanks!)
and along the way results in some restrictions on what the end
marker can be being removed.   We still do not allow all we should.
(from kre@)
2016-03-27 14:39:33 +00:00
christos 1d4fbce984 Cease "support" for <redirect> fn() { ...
Any redirect (or redirects) before a function definition were
allowed by the parser, but otherwise totally ignored.  The standard
syntax does not permit redirects there, now, neither do we. (from kre@)
2016-03-27 14:36:29 +00:00
christos f9acd92dd8 Finish constifying the new parsebackquote() function. Save a
variable or two...   Should change nothing. (from kre@)
2016-03-27 14:35:30 +00:00
christos ca12a0b88a General KNF and source code cleanups, avoid scattering the
magic string " \t\n" all over the place, slightly improved
syntax error messages, restructured some of the code for
clarity, don't allow IFS to be imported through the environment,
and remove the (never) conditionally compiled ATTY option.
Apart from one or two syntax error messages, and ignoring IFS
if present in the environment, this is intended to have no
user visible changes. (from kre@)
2016-03-27 14:34:46 +00:00
christos 29494835fd fix constness (from kre) 2016-03-21 02:37:26 +00:00
christos db56d5516c Move the command substitution "internal subroutine" part of
readtoken1() into a real function of its own (inspired by a
similar change made by FreeBSD - the other internal routines
they moved out are expected to move out here as well soon.)
This change helps avoid gcc 5.3 demanded (not required!) volatile
noise which would slow down parsing. (from kre)
2016-03-20 22:56:39 +00:00
christos fc55d6ef49 sprinkle more volatile (needed for the rescue build with gcc-5.3) 2016-03-18 18:07:28 +00:00
christos 9c9fb684e0 s/sed/${SED}/ 2016-03-17 13:59:02 +00:00
christos c6f7781d4f put back the complex sed/awk since the code can't handle unsorted or repeated
entries (Rin Okuyama)
2016-03-17 13:54:31 +00:00
christos 1a51ba6b13 Put back awk, other scripts need it. 2016-03-16 23:02:23 +00:00
christos 702bd67153 We don't need all this magic to build the signals lists. Do the work at
compile time.
2016-03-16 23:01:33 +00:00
christos 90f49946eb Sprinkle volatile for gcc 5! 2016-03-16 22:36:40 +00:00
christos e448e849b1 Avoid warning by using gcc'ism 2016-03-16 22:36:21 +00:00
christos c1d7b11ef3 add Will Robinson comment. 2016-03-16 22:35:44 +00:00
christos b4f0f90a59 Avoid gcc-5 conversion warning (|= expands to int) 2016-03-16 22:25:05 +00:00
christos 0c73873e5c Keep redirs for subshells. 2016-03-16 21:20:59 +00:00
christos 3b6be3a09c parenthesize for safety. 2016-03-16 19:02:26 +00:00
christos 6f9ac0be1e Remove wrong unsigned cast, index can be negative. Cast char to int so that
gcc does not warn. Probably better to do the offset at runtime, but that
would cost more.
2016-03-16 17:01:39 +00:00
christos 58a5df4203 factor out common code in macro. 2016-03-16 15:48:01 +00:00
christos 5f0a664efb Revert (kind of) the change in 1.12 of the ancient mksyntax.sh script
(undoing the effect of that commit on syntax.h when it was
being dynamically generated) from 1996.   This means that the shell
parser is now locale independent, so scripts that work anywhere will
work consistently everywhere.   Inspired by a similar change in
FreeBSD's sh (from 2010) - the original change in the other direction
came from FreeBSD as well....   Note that this does not in any way
add any kind of support for locales to sh (which is a whole different
problem.) (from kre)
2016-03-16 15:45:40 +00:00
christos 8c844a2ebd PR/19832, PR/35423: Fix handling 0x81 and 0x82 characters in expansions
($VAR etc) that are used to generate filenames for redirections. (from kre)
2016-03-16 15:44:35 +00:00
christos 5b34482515 PR/50960: The || and && operators in $(( )) should always have a 0 or 1
result, never anything different. (from kre)
2016-03-16 15:43:38 +00:00
christos 9815d7fee4 PR/50958: (partial fix) - support ?: expressions in arith expansions
(from kre)
2016-03-16 15:42:33 +00:00
christos fc1f924a3b PR bin/50959 - allow consistent use of 0X hex constants (not just 0x)
(from kre)
2016-03-16 15:41:55 +00:00
christos 2baec48ec5 We want this to work too:
$ cat sep1
	#!/bin/sh
	{ ./sep2; } 3>out

	$ cat sep2
	#!/bin/sh
	echo sep2 >&3

	$ ./sep1
2016-03-13 15:57:30 +00:00
christos e47a2585c4 dedup. 2016-03-13 01:22:42 +00:00
christos 284daf11ca Test for REDIR_KEEP in the non-copy case:
$ cat other1
	#!/bin/sh
	./other2 3>out

	$ cat other2
	#!/bin/sh
	echo other2 1>&3

	$ ./other1
2016-03-13 00:52:05 +00:00
christos 5047abd140 Don't close-on-exec redirections created explicitly for the command being
ran; i.e. we want this to work:
	$ cat succ1
	#!/bin/sh
	./succ2 6>out

	$ cat succ2
	#!/bin/sh
	echo succ2 >&6

	$ ./succ1

And this to fail:
	$ cat fail1
	#!/bin/sh
	exec 6> out
	echo "fail1" >&6
	./fail2
	exec 6>&-

	$ cat fail2
	#!obj.amd64/sh
	echo "fail2" >&6

	$ ./fail1
	./fail2: 6: Bad file descriptor

XXX: Do we want a -k (keep flag on exec to make redirections not close-on-exec?
2016-03-12 21:35:13 +00:00
christos f87bc150c8 Improve quoting in the output from sh -x - use less unnecessary
quotes ('_' and '.' do not need quoting) and never quote the '=' in
an assignment (or it would not be one.) From kre, with some refactoring
to be blamed to me.
2016-03-12 14:59:26 +00:00