sh: Sync with FreeBSD:
authorPeter Avalos <pavalos@dragonflybsd.org>
Mon, 18 Mar 2013 00:29:29 +0000 (17:29 -0700)
committerPeter Avalos <pavalos@dragonflybsd.org>
Mon, 18 Mar 2013 00:46:30 +0000 (17:46 -0700)
* Expand assignment-like words specially for export/readonly/local.
* Remove unused variables.
* Reset pendingsigs before checking pending traps, not after.
* Track continued jobs (even if not continued by bg or fg).
* Inline waitproc() into its only caller.
* Fix EINTR race condition in "wait" and "set -T" using sigsuspend().
* use setinputfile instead of open/setinputfd.
* Prefer internal nextopt() to libc getopt().
* Use C99 flexible array instead of accessing array beyond bounds.
* Fix two issues when an alias is redefined.
* Detect and flag write errors on stdout in builtins.
* Prefer strsignal() to accessing sys_siglist directly.
* Don't lose $? when backquoted command ends with semicolon or newline.
* Fix crash when parsing '{ } &'.
* Pass $? to command substitution containing compound/multiple commands.
* Simplify cd-hash interaction.
* Remove mkinit's initialization routine.
* Move some stackmarks to fix high memory usage in some loops.
* Show negated commands (!) in jobs output.
* Prefer our character classification functions to <ctype.h>.
* Expand here documents in the current process.
* Do not test for digit_contig in mksyntax.
* Simplify mksyntax
* Fix a crash with the stackmark code.
* If a SIGINT or SIGQUIT interrupts "wait", return status 128+sig.
* When executing a trap, keep exit status along with evalskip.
* Update $FreeBSD$ to include SVN id.

Obtained-from:   FreeBSD

410 files changed:
bin/sh/Makefile
bin/sh/TOUR
bin/sh/alias.c
bin/sh/alias.h
bin/sh/arith.h
bin/sh/arith_yacc.c
bin/sh/arith_yacc.h
bin/sh/arith_yylex.c
bin/sh/bltin/bltin.h
bin/sh/bltin/echo.c
bin/sh/builtins.def
bin/sh/cd.c
bin/sh/cd.h
bin/sh/error.c
bin/sh/error.h
bin/sh/eval.c
bin/sh/eval.h
bin/sh/exec.c
bin/sh/exec.h
bin/sh/expand.c
bin/sh/expand.h
bin/sh/funcs/cmv
bin/sh/funcs/dirs
bin/sh/funcs/login
bin/sh/funcs/newgrp
bin/sh/funcs/popd
bin/sh/funcs/pushd
bin/sh/funcs/suspend
bin/sh/histedit.c
bin/sh/init.h
bin/sh/input.c
bin/sh/input.h
bin/sh/jobs.c
bin/sh/jobs.h
bin/sh/mail.c
bin/sh/mail.h
bin/sh/main.c
bin/sh/main.h
bin/sh/memalloc.c
bin/sh/memalloc.h
bin/sh/miscbltin.c
bin/sh/mkbuiltins
bin/sh/mkinit.c
bin/sh/mknodes.c
bin/sh/mksyntax.c
bin/sh/mktokens
bin/sh/myhistedit.h
bin/sh/mystring.c
bin/sh/mystring.h
bin/sh/nodes.c.pat
bin/sh/nodetypes
bin/sh/options.c
bin/sh/options.h
bin/sh/output.c
bin/sh/output.h
bin/sh/parser.c
bin/sh/parser.h
bin/sh/redir.c
bin/sh/redir.h
bin/sh/sh.1
bin/sh/shell.h
bin/sh/show.c
bin/sh/show.h
bin/sh/trap.c
bin/sh/trap.h
bin/sh/var.c
bin/sh/var.h
tools/regression/bin/sh/Makefile
tools/regression/bin/sh/builtins/alias.0
tools/regression/bin/sh/builtins/alias.1
tools/regression/bin/sh/builtins/alias3.0 [new file with mode: 0644]
tools/regression/bin/sh/builtins/alias3.0.stdout [new file with mode: 0644]
tools/regression/bin/sh/builtins/break1.0
tools/regression/bin/sh/builtins/break2.0
tools/regression/bin/sh/builtins/break3.0
tools/regression/bin/sh/builtins/builtin1.0
tools/regression/bin/sh/builtins/case1.0
tools/regression/bin/sh/builtins/case10.0
tools/regression/bin/sh/builtins/case11.0
tools/regression/bin/sh/builtins/case12.0
tools/regression/bin/sh/builtins/case13.0
tools/regression/bin/sh/builtins/case14.0
tools/regression/bin/sh/builtins/case15.0
tools/regression/bin/sh/builtins/case16.0
tools/regression/bin/sh/builtins/case17.0
tools/regression/bin/sh/builtins/case18.0
tools/regression/bin/sh/builtins/case19.0
tools/regression/bin/sh/builtins/case2.0
tools/regression/bin/sh/builtins/case3.0
tools/regression/bin/sh/builtins/case4.0
tools/regression/bin/sh/builtins/case5.0
tools/regression/bin/sh/builtins/case6.0
tools/regression/bin/sh/builtins/case7.0
tools/regression/bin/sh/builtins/case8.0
tools/regression/bin/sh/builtins/case9.0
tools/regression/bin/sh/builtins/cd1.0
tools/regression/bin/sh/builtins/cd2.0
tools/regression/bin/sh/builtins/cd3.0
tools/regression/bin/sh/builtins/cd4.0
tools/regression/bin/sh/builtins/cd5.0
tools/regression/bin/sh/builtins/cd6.0
tools/regression/bin/sh/builtins/cd7.0
tools/regression/bin/sh/builtins/cd8.0
tools/regression/bin/sh/builtins/command1.0
tools/regression/bin/sh/builtins/command10.0
tools/regression/bin/sh/builtins/command11.0
tools/regression/bin/sh/builtins/command2.0
tools/regression/bin/sh/builtins/command3.0
tools/regression/bin/sh/builtins/command4.0
tools/regression/bin/sh/builtins/command5.0
tools/regression/bin/sh/builtins/command6.0
tools/regression/bin/sh/builtins/command7.0
tools/regression/bin/sh/builtins/command8.0
tools/regression/bin/sh/builtins/command9.0
tools/regression/bin/sh/builtins/dot1.0
tools/regression/bin/sh/builtins/dot2.0
tools/regression/bin/sh/builtins/dot3.0
tools/regression/bin/sh/builtins/dot4.0
tools/regression/bin/sh/builtins/eval1.0
tools/regression/bin/sh/builtins/eval2.0
tools/regression/bin/sh/builtins/eval3.0
tools/regression/bin/sh/builtins/eval4.0
tools/regression/bin/sh/builtins/eval5.0
tools/regression/bin/sh/builtins/exec1.0
tools/regression/bin/sh/builtins/exec2.0
tools/regression/bin/sh/builtins/exit1.0
tools/regression/bin/sh/builtins/exit2.8
tools/regression/bin/sh/builtins/exit3.0
tools/regression/bin/sh/builtins/export1.0
tools/regression/bin/sh/builtins/fc1.0
tools/regression/bin/sh/builtins/fc2.0
tools/regression/bin/sh/builtins/for1.0
tools/regression/bin/sh/builtins/for2.0
tools/regression/bin/sh/builtins/for3.0
tools/regression/bin/sh/builtins/getopts1.0
tools/regression/bin/sh/builtins/getopts2.0
tools/regression/bin/sh/builtins/hash1.0
tools/regression/bin/sh/builtins/hash2.0
tools/regression/bin/sh/builtins/hash3.0
tools/regression/bin/sh/builtins/hash4.0
tools/regression/bin/sh/builtins/lineno.0
tools/regression/bin/sh/builtins/local1.0 [new file with mode: 0644]
tools/regression/bin/sh/builtins/locale1.0
tools/regression/bin/sh/builtins/printf1.0
tools/regression/bin/sh/builtins/printf2.0
tools/regression/bin/sh/builtins/printf3.0
tools/regression/bin/sh/builtins/printf4.0
tools/regression/bin/sh/builtins/read1.0
tools/regression/bin/sh/builtins/read2.0
tools/regression/bin/sh/builtins/read3.0
tools/regression/bin/sh/builtins/read4.0
tools/regression/bin/sh/builtins/read5.0
tools/regression/bin/sh/builtins/read6.0 [new file with mode: 0644]
tools/regression/bin/sh/builtins/return1.0
tools/regression/bin/sh/builtins/return2.1
tools/regression/bin/sh/builtins/return3.1
tools/regression/bin/sh/builtins/return4.0
tools/regression/bin/sh/builtins/return5.0
tools/regression/bin/sh/builtins/return6.4
tools/regression/bin/sh/builtins/return7.4
tools/regression/bin/sh/builtins/set1.0
tools/regression/bin/sh/builtins/set2.0
tools/regression/bin/sh/builtins/trap1.0
tools/regression/bin/sh/builtins/trap10.0
tools/regression/bin/sh/builtins/trap11.0
tools/regression/bin/sh/builtins/trap12.0 [new file with mode: 0644]
tools/regression/bin/sh/builtins/trap2.0
tools/regression/bin/sh/builtins/trap3.0
tools/regression/bin/sh/builtins/trap4.0
tools/regression/bin/sh/builtins/trap5.0
tools/regression/bin/sh/builtins/trap6.0
tools/regression/bin/sh/builtins/trap7.0
tools/regression/bin/sh/builtins/trap8.0
tools/regression/bin/sh/builtins/trap9.0
tools/regression/bin/sh/builtins/type1.0
tools/regression/bin/sh/builtins/type2.0
tools/regression/bin/sh/builtins/unalias.0
tools/regression/bin/sh/builtins/var-assign.0
tools/regression/bin/sh/builtins/var-assign2.0
tools/regression/bin/sh/builtins/wait1.0
tools/regression/bin/sh/builtins/wait2.0
tools/regression/bin/sh/builtins/wait3.0
tools/regression/bin/sh/builtins/wait4.0 [new file with mode: 0644]
tools/regression/bin/sh/builtins/wait5.0 [new file with mode: 0644]
tools/regression/bin/sh/builtins/wait6.0 [new file with mode: 0644]
tools/regression/bin/sh/builtins/wait7.0 [new file with mode: 0644]
tools/regression/bin/sh/errors/assignment-error1.0
tools/regression/bin/sh/errors/assignment-error2.0
tools/regression/bin/sh/errors/backquote-error1.0
tools/regression/bin/sh/errors/backquote-error2.0
tools/regression/bin/sh/errors/bad-binary1.126
tools/regression/bin/sh/errors/bad-keyword1.0
tools/regression/bin/sh/errors/bad-parm-exp1.0
tools/regression/bin/sh/errors/bad-parm-exp2.2
tools/regression/bin/sh/errors/bad-parm-exp3.2
tools/regression/bin/sh/errors/bad-parm-exp4.2
tools/regression/bin/sh/errors/bad-parm-exp5.2
tools/regression/bin/sh/errors/bad-parm-exp6.2
tools/regression/bin/sh/errors/option-error.0
tools/regression/bin/sh/errors/redirection-error.0
tools/regression/bin/sh/errors/redirection-error2.2
tools/regression/bin/sh/errors/redirection-error3.0
tools/regression/bin/sh/errors/redirection-error4.0
tools/regression/bin/sh/errors/redirection-error5.0
tools/regression/bin/sh/errors/redirection-error6.0
tools/regression/bin/sh/errors/redirection-error7.0
tools/regression/bin/sh/errors/write-error1.0 [new file with mode: 0644]
tools/regression/bin/sh/execution/bg1.0
tools/regression/bin/sh/execution/bg2.0
tools/regression/bin/sh/execution/bg3.0
tools/regression/bin/sh/execution/bg4.0
tools/regression/bin/sh/execution/fork1.0
tools/regression/bin/sh/execution/fork2.0
tools/regression/bin/sh/execution/fork3.0
tools/regression/bin/sh/execution/func1.0
tools/regression/bin/sh/execution/func2.0
tools/regression/bin/sh/execution/func3.0
tools/regression/bin/sh/execution/hash1.0
tools/regression/bin/sh/execution/killed1.0
tools/regression/bin/sh/execution/killed2.0
tools/regression/bin/sh/execution/path1.0
tools/regression/bin/sh/execution/redir1.0
tools/regression/bin/sh/execution/redir2.0
tools/regression/bin/sh/execution/redir3.0
tools/regression/bin/sh/execution/redir4.0
tools/regression/bin/sh/execution/redir5.0
tools/regression/bin/sh/execution/redir6.0
tools/regression/bin/sh/execution/redir7.0
tools/regression/bin/sh/execution/set-n1.0
tools/regression/bin/sh/execution/set-n2.0
tools/regression/bin/sh/execution/set-n3.0
tools/regression/bin/sh/execution/set-n4.0
tools/regression/bin/sh/execution/set-x1.0
tools/regression/bin/sh/execution/set-x2.0
tools/regression/bin/sh/execution/set-x3.0
tools/regression/bin/sh/execution/shellproc1.0
tools/regression/bin/sh/execution/subshell1.0 [new file with mode: 0644]
tools/regression/bin/sh/execution/subshell1.0.stdout [new file with mode: 0644]
tools/regression/bin/sh/execution/subshell2.0 [new file with mode: 0644]
tools/regression/bin/sh/execution/subshell3.0 [new file with mode: 0644]
tools/regression/bin/sh/execution/subshell4.0 [new file with mode: 0644]
tools/regression/bin/sh/execution/unknown1.0
tools/regression/bin/sh/execution/var-assign1.0
tools/regression/bin/sh/expansion/arith1.0
tools/regression/bin/sh/expansion/arith10.0
tools/regression/bin/sh/expansion/arith11.0
tools/regression/bin/sh/expansion/arith12.0 [new file with mode: 0644]
tools/regression/bin/sh/expansion/arith2.0
tools/regression/bin/sh/expansion/arith3.0
tools/regression/bin/sh/expansion/arith4.0
tools/regression/bin/sh/expansion/arith5.0
tools/regression/bin/sh/expansion/arith6.0
tools/regression/bin/sh/expansion/arith7.0
tools/regression/bin/sh/expansion/arith8.0
tools/regression/bin/sh/expansion/arith9.0
tools/regression/bin/sh/expansion/assign1.0
tools/regression/bin/sh/expansion/cmdsubst1.0
tools/regression/bin/sh/expansion/cmdsubst10.0
tools/regression/bin/sh/expansion/cmdsubst11.0
tools/regression/bin/sh/expansion/cmdsubst12.0
tools/regression/bin/sh/expansion/cmdsubst13.0
tools/regression/bin/sh/expansion/cmdsubst14.0 [new file with mode: 0644]
tools/regression/bin/sh/expansion/cmdsubst15.0 [new file with mode: 0644]
tools/regression/bin/sh/expansion/cmdsubst16.0 [new file with mode: 0644]
tools/regression/bin/sh/expansion/cmdsubst17.0 [new file with mode: 0644]
tools/regression/bin/sh/expansion/cmdsubst2.0
tools/regression/bin/sh/expansion/cmdsubst3.0
tools/regression/bin/sh/expansion/cmdsubst4.0
tools/regression/bin/sh/expansion/cmdsubst5.0
tools/regression/bin/sh/expansion/cmdsubst6.0
tools/regression/bin/sh/expansion/cmdsubst7.0
tools/regression/bin/sh/expansion/cmdsubst8.0
tools/regression/bin/sh/expansion/cmdsubst9.0
tools/regression/bin/sh/expansion/export1.0 [new file with mode: 0644]
tools/regression/bin/sh/expansion/export2.0 [new file with mode: 0644]
tools/regression/bin/sh/expansion/export3.0 [new file with mode: 0644]
tools/regression/bin/sh/expansion/heredoc1.0
tools/regression/bin/sh/expansion/heredoc2.0
tools/regression/bin/sh/expansion/ifs1.0
tools/regression/bin/sh/expansion/ifs2.0
tools/regression/bin/sh/expansion/ifs3.0
tools/regression/bin/sh/expansion/ifs4.0
tools/regression/bin/sh/expansion/length1.0
tools/regression/bin/sh/expansion/length2.0
tools/regression/bin/sh/expansion/length3.0
tools/regression/bin/sh/expansion/length4.0
tools/regression/bin/sh/expansion/length5.0
tools/regression/bin/sh/expansion/length6.0
tools/regression/bin/sh/expansion/length7.0
tools/regression/bin/sh/expansion/length8.0
tools/regression/bin/sh/expansion/local1.0 [new file with mode: 0644]
tools/regression/bin/sh/expansion/local2.0 [new file with mode: 0644]
tools/regression/bin/sh/expansion/pathname1.0
tools/regression/bin/sh/expansion/pathname2.0
tools/regression/bin/sh/expansion/pathname3.0
tools/regression/bin/sh/expansion/pathname4.0
tools/regression/bin/sh/expansion/plus-minus1.0
tools/regression/bin/sh/expansion/plus-minus2.0
tools/regression/bin/sh/expansion/plus-minus3.0
tools/regression/bin/sh/expansion/plus-minus4.0
tools/regression/bin/sh/expansion/plus-minus5.0
tools/regression/bin/sh/expansion/plus-minus6.0
tools/regression/bin/sh/expansion/plus-minus7.0
tools/regression/bin/sh/expansion/plus-minus8.0
tools/regression/bin/sh/expansion/question1.0
tools/regression/bin/sh/expansion/readonly1.0 [new file with mode: 0644]
tools/regression/bin/sh/expansion/set-u1.0
tools/regression/bin/sh/expansion/set-u2.0
tools/regression/bin/sh/expansion/set-u3.0
tools/regression/bin/sh/expansion/tilde1.0
tools/regression/bin/sh/expansion/tilde2.0
tools/regression/bin/sh/expansion/trim1.0
tools/regression/bin/sh/expansion/trim2.0
tools/regression/bin/sh/expansion/trim3.0
tools/regression/bin/sh/expansion/trim4.0
tools/regression/bin/sh/expansion/trim5.0
tools/regression/bin/sh/expansion/trim6.0
tools/regression/bin/sh/expansion/trim7.0
tools/regression/bin/sh/expansion/trim8.0
tools/regression/bin/sh/parameters/env1.0
tools/regression/bin/sh/parameters/exitstatus1.0
tools/regression/bin/sh/parameters/mail1.0
tools/regression/bin/sh/parameters/mail2.0
tools/regression/bin/sh/parameters/optind1.0
tools/regression/bin/sh/parameters/positional1.0
tools/regression/bin/sh/parameters/positional2.0
tools/regression/bin/sh/parameters/pwd1.0
tools/regression/bin/sh/parameters/pwd2.0
tools/regression/bin/sh/parser/alias1.0
tools/regression/bin/sh/parser/alias10.0 [new file with mode: 0644]
tools/regression/bin/sh/parser/alias2.0
tools/regression/bin/sh/parser/alias3.0
tools/regression/bin/sh/parser/alias4.0
tools/regression/bin/sh/parser/alias5.0
tools/regression/bin/sh/parser/alias6.0
tools/regression/bin/sh/parser/alias7.0 [new file with mode: 0644]
tools/regression/bin/sh/parser/alias8.0 [new file with mode: 0644]
tools/regression/bin/sh/parser/alias9.0 [new file with mode: 0644]
tools/regression/bin/sh/parser/and-pipe-not.0
tools/regression/bin/sh/parser/case1.0
tools/regression/bin/sh/parser/case2.0
tools/regression/bin/sh/parser/dollar-quote1.0
tools/regression/bin/sh/parser/dollar-quote10.0
tools/regression/bin/sh/parser/dollar-quote11.0
tools/regression/bin/sh/parser/dollar-quote2.0
tools/regression/bin/sh/parser/dollar-quote3.0
tools/regression/bin/sh/parser/dollar-quote4.0
tools/regression/bin/sh/parser/dollar-quote5.0
tools/regression/bin/sh/parser/dollar-quote6.0
tools/regression/bin/sh/parser/dollar-quote7.0
tools/regression/bin/sh/parser/dollar-quote8.0
tools/regression/bin/sh/parser/dollar-quote9.0
tools/regression/bin/sh/parser/empty-braces1.0 [new file with mode: 0644]
tools/regression/bin/sh/parser/for1.0
tools/regression/bin/sh/parser/for2.0
tools/regression/bin/sh/parser/func1.0
tools/regression/bin/sh/parser/func2.0
tools/regression/bin/sh/parser/func3.0
tools/regression/bin/sh/parser/heredoc1.0
tools/regression/bin/sh/parser/heredoc10.0
tools/regression/bin/sh/parser/heredoc11.0
tools/regression/bin/sh/parser/heredoc2.0
tools/regression/bin/sh/parser/heredoc3.0
tools/regression/bin/sh/parser/heredoc4.0
tools/regression/bin/sh/parser/heredoc5.0
tools/regression/bin/sh/parser/heredoc6.0
tools/regression/bin/sh/parser/heredoc7.0
tools/regression/bin/sh/parser/heredoc8.0
tools/regression/bin/sh/parser/heredoc9.0
tools/regression/bin/sh/parser/no-space1.0
tools/regression/bin/sh/parser/no-space2.0
tools/regression/bin/sh/parser/only-redir1.0
tools/regression/bin/sh/parser/pipe-not1.0
tools/regression/bin/sh/regress.sh
tools/regression/bin/sh/regress.t
tools/regression/bin/sh/set-e/and1.0
tools/regression/bin/sh/set-e/and2.1
tools/regression/bin/sh/set-e/and3.0
tools/regression/bin/sh/set-e/and4.0
tools/regression/bin/sh/set-e/background1.0
tools/regression/bin/sh/set-e/cmd1.0
tools/regression/bin/sh/set-e/cmd2.1
tools/regression/bin/sh/set-e/elif1.0
tools/regression/bin/sh/set-e/elif2.0
tools/regression/bin/sh/set-e/eval1.0
tools/regression/bin/sh/set-e/eval2.1
tools/regression/bin/sh/set-e/for1.0
tools/regression/bin/sh/set-e/func1.0
tools/regression/bin/sh/set-e/func2.1
tools/regression/bin/sh/set-e/if1.0
tools/regression/bin/sh/set-e/if2.0
tools/regression/bin/sh/set-e/if3.0
tools/regression/bin/sh/set-e/not1.0
tools/regression/bin/sh/set-e/not2.0
tools/regression/bin/sh/set-e/or1.0
tools/regression/bin/sh/set-e/or2.0
tools/regression/bin/sh/set-e/or3.1
tools/regression/bin/sh/set-e/pipe1.1
tools/regression/bin/sh/set-e/pipe2.0
tools/regression/bin/sh/set-e/return1.0
tools/regression/bin/sh/set-e/semi1.1
tools/regression/bin/sh/set-e/semi2.1
tools/regression/bin/sh/set-e/subshell1.0
tools/regression/bin/sh/set-e/subshell2.1
tools/regression/bin/sh/set-e/until1.0
tools/regression/bin/sh/set-e/until2.0
tools/regression/bin/sh/set-e/until3.0
tools/regression/bin/sh/set-e/while1.0
tools/regression/bin/sh/set-e/while2.0
tools/regression/bin/sh/set-e/while3.0

index f6dcc08..bab4cf3 100644 (file)
@@ -1,5 +1,5 @@
 #      @(#)Makefile    8.4 (Berkeley) 5/5/95
-# $FreeBSD: src/bin/sh/Makefile,v 1.57 2012/05/24 19:48:15 marcel Exp $
+# $FreeBSD: head/bin/sh/Makefile 235927 2012-05-24 19:48:15Z marcel $
 
 PROG=  sh
 INSTALLFLAGS= -S
index b97491f..50f83ca 100644 (file)
@@ -1,5 +1,5 @@
 #      @(#)TOUR        8.1 (Berkeley) 5/31/93
-# $FreeBSD: src/bin/sh/TOUR,v 1.9 2011/05/27 16:00:37 jilles Exp $
+# $FreeBSD: head/bin/sh/TOUR 245689 2013-01-20 12:44:50Z jilles $
 
 NOTE -- This is the original TOUR paper distributed with ash and
 does not represent the current state of the shell.  It is provided anyway
@@ -33,10 +33,6 @@ programs is:
 There are undoubtedly too many of these.  Mkinit searches all the
 C source files for entries looking like:
 
-        INIT {
-              x = 1;    /* executed during initialization */
-        }
-
         RESET {
               x = 2;    /* executed when the shell does a longjmp
                            back to the main command loop */
index 27d059f..0bb69da 100644 (file)
@@ -34,7 +34,7 @@
  * SUCH DAMAGE.
  *
  * @(#)alias.c 8.3 (Berkeley) 5/4/95
- * $FreeBSD: src/bin/sh/alias.c,v 1.32 2011/06/13 21:03:27 jilles Exp $
+ * $FreeBSD: head/bin/sh/alias.c 242766 2012-11-08 13:33:48Z jilles $
  */
 
 #include <stdlib.h>
@@ -67,7 +67,18 @@ setalias(const char *name, const char *val)
                if (equal(name, ap->name)) {
                        INTOFF;
                        ckfree(ap->val);
+                       /* See HACK below. */
+#ifdef notyet
                        ap->val = savestr(val);
+#else
+                       {
+                       size_t len = strlen(val);
+                       ap->val = ckmalloc(len + 2);
+                       memcpy(ap->val, val, len);
+                       ap->val[len] = ' ';
+                       ap->val[len+1] = '\0';
+                       }
+#endif
                        INTON;
                        return;
                }
index fe964c5..434d6ce 100644 (file)
@@ -34,7 +34,7 @@
  * SUCH DAMAGE.
  *
  *     @(#)alias.h     8.2 (Berkeley) 5/4/95
- * $FreeBSD: src/bin/sh/alias.h,v 1.11 2011/06/13 21:03:27 jilles Exp $
+ * $FreeBSD: head/bin/sh/alias.h 223060 2011-06-13 21:03:27Z jilles $
  */
 
 #define ALIASINUSE     1
index 0d6e429..ca98289 100644 (file)
@@ -31,7 +31,7 @@
  * SUCH DAMAGE.
  *
  *     @(#)arith.h     1.1 (Berkeley) 5/4/95
- * $FreeBSD: src/bin/sh/arith.h,v 1.15 2011/06/13 21:03:27 jilles Exp $
+ * $FreeBSD: head/bin/sh/arith.h 223060 2011-06-13 21:03:27Z jilles $
  */
 
 #include "shell.h"
index d916504..695ad37 100644 (file)
@@ -31,7 +31,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/bin/sh/arith_yacc.c,v 1.7 2011/11/08 23:54:39 jilles Exp $
+ * $FreeBSD: head/bin/sh/arith_yacc.c 230530 2012-01-25 08:42:19Z charnier $
  */
 
 #include <limits.h>
index 14c075e..5ea7f97 100644 (file)
@@ -31,7 +31,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/bin/sh/arith_yacc.h,v 1.1 2011/02/08 23:18:06 jilles Exp $
+ * $FreeBSD: head/bin/sh/arith_yacc.h 218466 2011-02-08 23:18:06Z jilles $
  */
 
 #define ARITH_ASS 1
index 2d62a55..232d360 100644 (file)
@@ -31,7 +31,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/bin/sh/arith_yylex.c,v 1.3 2011/03/07 07:31:15 stefanf Exp $
+ * $FreeBSD: head/bin/sh/arith_yylex.c 230530 2012-01-25 08:42:19Z charnier $
  */
 
 #include <inttypes.h>
index d8dd468..b0ea6b3 100644 (file)
@@ -34,7 +34,7 @@
  * SUCH DAMAGE.
  *
  *     @(#)bltin.h     8.2 (Berkeley) 5/4/95
- * $FreeBSD: src/bin/sh/bltin/bltin.h,v 1.19 2011/06/13 21:03:27 jilles Exp $
+ * $FreeBSD: head/bin/sh/bltin/bltin.h 223060 2011-06-13 21:03:27Z jilles $
  */
 
 /*
index 11f1091..c109be8 100644 (file)
@@ -34,7 +34,7 @@
  * SUCH DAMAGE.
  *
  *     @(#)echo.c      8.2 (Berkeley) 5/4/95
- * $FreeBSD: src/bin/sh/bltin/echo.c,v 1.14 2004/04/06 20:06:53 markm Exp $
+ * $FreeBSD: head/bin/sh/bltin/echo.c 127958 2004-04-06 20:06:54Z markm $
  */
 
 /*
index 190b4f7..fbbf5c6 100644 (file)
@@ -36,7 +36,7 @@
 # SUCH DAMAGE.
 #
 #      @(#)builtins.def        8.4 (Berkeley) 5/4/95
-# $FreeBSD: src/bin/sh/builtins.def,v 1.22 2011/05/27 20:53:07 jilles Exp $
+# $FreeBSD: head/bin/sh/builtins.def 222386 2011-05-27 20:53:07Z jilles $
 
 #
 # This file lists all the builtin commands.  The first column is the name
index 87d3f55..694a944 100644 (file)
@@ -34,7 +34,7 @@
  * SUCH DAMAGE.
  *
  * @(#)cd.c    8.2 (Berkeley) 5/4/95
- * $FreeBSD: src/bin/sh/cd.c,v 1.50 2012/01/13 23:32:27 jilles Exp $
+ * $FreeBSD: head/bin/sh/cd.c 240541 2012-09-15 21:56:30Z jilles $
  */
 
 #include <sys/types.h>
@@ -78,7 +78,7 @@ static char *prevdir;         /* previous working directory */
 static char *cdcomppath;
 
 int
-cdcmd(int argc, char **argv)
+cdcmd(int argc __unused, char **argv __unused)
 {
        const char *dest;
        const char *path;
@@ -88,9 +88,8 @@ cdcmd(int argc, char **argv)
        int rc;
        int errno1 = ENOENT;
 
-       optreset = 1; optind = 1; opterr = 0; /* initialize getopt */
        phys = Pflag;
-       while ((ch = getopt(argc, argv, "eLP")) != -1) {
+       while ((ch = nextopt("eLP")) != '\0') {
                switch (ch) {
                case 'e':
                        getcwderr = 1;
@@ -101,18 +100,13 @@ cdcmd(int argc, char **argv)
                case 'P':
                        phys = 1;
                        break;
-               default:
-                       error("unknown option: -%c", optopt);
-                       break;
                }
        }
-       argc -= optind;
-       argv += optind;
 
-       if (argc > 1)
+       if (*argptr != NULL && argptr[1] != NULL)
                error("too many arguments");
 
-       if ((dest = *argv) == NULL && (dest = bltinlookup("HOME", 1)) == NULL)
+       if ((dest = *argptr) == NULL && (dest = bltinlookup("HOME", 1)) == NULL)
                error("HOME not set");
        if (*dest == '\0')
                dest = ".";
@@ -329,14 +323,13 @@ updatepwd(char *dir)
 }
 
 int
-pwdcmd(int argc, char **argv)
+pwdcmd(int argc __unused, char **argv __unused)
 {
        char *p;
        int ch, phys;
 
-       optreset = 1; optind = 1; opterr = 0; /* initialize getopt */
        phys = Pflag;
-       while ((ch = getopt(argc, argv, "LP")) != -1) {
+       while ((ch = nextopt("LP")) != '\0') {
                switch (ch) {
                case 'L':
                        phys = 0;
@@ -344,15 +337,10 @@ pwdcmd(int argc, char **argv)
                case 'P':
                        phys = 1;
                        break;
-               default:
-                       error("unknown option: -%c", optopt);
-                       break;
                }
        }
-       argc -= optind;
-       argv += optind;
 
-       if (argc != 0)
+       if (*argptr != NULL)
                error("too many arguments");
 
        if (!phys && getpwd()) {
index be98dfb..3eaf3f5 100644 (file)
@@ -30,7 +30,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/bin/sh/cd.h,v 1.9 2011/06/13 21:03:27 jilles Exp $
+ * $FreeBSD: head/bin/sh/cd.h 223060 2011-06-13 21:03:27Z jilles $
  */
 
 void    pwd_init(int);
index f1cec2c..5426a05 100644 (file)
@@ -34,7 +34,7 @@
  * SUCH DAMAGE.
  *
  * @(#)error.c 8.2 (Berkeley) 5/4/95
- * $FreeBSD: src/bin/sh/error.c,v 1.33 2010/12/21 20:47:06 jilles Exp $
+ * $FreeBSD: head/bin/sh/error.c 216622 2010-12-21 20:47:06Z jilles $
  */
 
 /*
index 8f0cd6e..63d2033 100644 (file)
@@ -34,7 +34,7 @@
  * SUCH DAMAGE.
  *
  *     @(#)error.h     8.2 (Berkeley) 5/4/95
- * $FreeBSD: src/bin/sh/error.h,v 1.22 2011/04/23 22:28:56 jilles Exp $
+ * $FreeBSD: head/bin/sh/error.h 220978 2011-04-23 22:28:56Z jilles $
  */
 
 /*
index 9e429ff..690e232 100644 (file)
@@ -34,7 +34,7 @@
  * SUCH DAMAGE.
  *
  * @(#)eval.c  8.9 (Berkeley) 6/8/95
- * $FreeBSD: src/bin/sh/eval.c,v 1.120 2012/02/04 23:12:14 jilles Exp $
+ * $FreeBSD: head/bin/sh/eval.c 247206 2013-02-23 22:50:57Z jilles $
  */
 
 #include <sys/time.h>
@@ -93,6 +93,7 @@ static void evalfor(union node *, int);
 static union node *evalcase(union node *);
 static void evalsubshell(union node *, int);
 static void evalredir(union node *, int);
+static void exphere(union node *, struct arglist *);
 static void expredir(union node *);
 static void evalpipe(union node *);
 static int is_valid_fast_cmdsubst(union node *n);
@@ -174,6 +175,7 @@ evalstring(char *s, int flags)
                        any = 1;
                }
                popstackmark(&smark);
+               setstackmark(&smark);
        }
        popfile();
        popstackmark(&smark);
@@ -194,7 +196,9 @@ evaltree(union node *n, int flags)
 {
        int do_etest;
        union node *next;
+       struct stackmark smark;
 
+       setstackmark(&smark);
        do_etest = 0;
        if (n == NULL) {
                TRACE(("evaltree(NULL) called\n"));
@@ -293,9 +297,12 @@ evaltree(union node *n, int flags)
                        break;
                }
                n = next;
+               popstackmark(&smark);
+               setstackmark(&smark);
        } while (n != NULL);
 out:
-       if (pendingsigs)
+       popstackmark(&smark);
+       if (pendingsig)
                dotrap();
        if (eflag && exitstatus != 0 && do_etest)
                exitshell(exitstatus);
@@ -348,10 +355,8 @@ evalfor(union node *n, int flags)
        struct arglist arglist;
        union node *argp;
        struct strlist *sp;
-       struct stackmark smark;
        int status;
 
-       setstackmark(&smark);
        arglist.lastp = &arglist.list;
        for (argp = n->nfor.args ; argp ; argp = argp->narg.next) {
                oexitstatus = exitstatus;
@@ -376,7 +381,6 @@ evalfor(union node *n, int flags)
                }
        }
        loopnest--;
-       popstackmark(&smark);
        exitstatus = status;
 }
 
@@ -393,16 +397,13 @@ evalcase(union node *n)
        union node *cp;
        union node *patp;
        struct arglist arglist;
-       struct stackmark smark;
 
-       setstackmark(&smark);
        arglist.lastp = &arglist.list;
        oexitstatus = exitstatus;
        expandarg(n->ncase.expr, &arglist, EXP_TILDE);
        for (cp = n->ncase.cases ; cp ; cp = cp->nclist.next) {
                for (patp = cp->nclist.pattern ; patp ; patp = patp->narg.next) {
                        if (casematch(patp, arglist.list->text)) {
-                               popstackmark(&smark);
                                while (cp->nclist.next &&
                                    cp->type == NCLISTFALLTHRU &&
                                    cp->nclist.body == NULL)
@@ -416,7 +417,6 @@ evalcase(union node *n)
                        }
                }
        }
-       popstackmark(&smark);
        exitstatus = 0;
        return (NULL);
 }
@@ -492,6 +492,37 @@ evalredir(union node *n, int flags)
 }
 
 
+static void
+exphere(union node *redir, struct arglist *fn)
+{
+       struct jmploc jmploc;
+       struct jmploc *savehandler;
+       struct localvar *savelocalvars;
+       int need_longjmp = 0;
+
+       redir->nhere.expdoc = nullstr;
+       savelocalvars = localvars;
+       localvars = NULL;
+       forcelocal++;
+       savehandler = handler;
+       if (setjmp(jmploc.loc))
+               need_longjmp = exception != EXERROR && exception != EXEXEC;
+       else {
+               handler = &jmploc;
+               expandarg(redir->nhere.doc, fn, 0);
+               redir->nhere.expdoc = fn->list->text;
+               INTOFF;
+       }
+       handler = savehandler;
+       forcelocal--;
+       poplocalvars();
+       localvars = savelocalvars;
+       if (need_longjmp)
+               longjmp(handler->loc, 1);
+       INTON;
+}
+
+
 /*
  * Compute the names of the files in a redirection list.
  */
@@ -520,6 +551,9 @@ expredir(union node *n)
                                fixredir(redir, fn.list->text, 1);
                        }
                        break;
+               case NXHERE:
+                       exphere(redir, &fn);
+                       break;
                }
        }
 }
@@ -612,7 +646,7 @@ evalbackcmd(union node *n, struct backcmd *result)
 {
        int pip[2];
        struct job *jp;
-       struct stackmark smark;         /* unnecessary */
+       struct stackmark smark;
        struct jmploc jmploc;
        struct jmploc *savehandler;
        struct localvar *savelocalvars;
@@ -626,8 +660,8 @@ evalbackcmd(union node *n, struct backcmd *result)
                exitstatus = 0;
                goto out;
        }
+       exitstatus = oexitstatus;
        if (is_valid_fast_cmdsubst(n)) {
-               exitstatus = oexitstatus;
                savelocalvars = localvars;
                localvars = NULL;
                forcelocal++;
@@ -651,7 +685,6 @@ evalbackcmd(union node *n, struct backcmd *result)
                poplocalvars();
                localvars = savelocalvars;
        } else {
-               exitstatus = 0;
                if (pipe(pip) < 0)
                        error("Pipe call failed: %s", strerror(errno));
                jp = makejob(n, 1);
@@ -674,6 +707,52 @@ out:
                result->fd, result->buf, result->nleft, result->jp));
 }
 
+static int
+mustexpandto(const char *argtext, const char *mask)
+{
+       for (;;) {
+               if (*argtext == CTLQUOTEMARK || *argtext == CTLQUOTEEND) {
+                       argtext++;
+                       continue;
+               }
+               if (*argtext == CTLESC)
+                       argtext++;
+               else if (BASESYNTAX[(int)*argtext] == CCTL)
+                       return (0);
+               if (*argtext != *mask)
+                       return (0);
+               if (*argtext == '\0')
+                       return (1);
+               argtext++;
+               mask++;
+       }
+}
+
+static int
+isdeclarationcmd(struct narg *arg)
+{
+       int have_command = 0;
+
+       if (arg == NULL)
+               return (0);
+       while (mustexpandto(arg->text, "command")) {
+               have_command = 1;
+               arg = &arg->next->narg;
+               if (arg == NULL)
+                       return (0);
+               /*
+                * To also allow "command -p" and "command --" as part of
+                * a declaration command, add code here.
+                * We do not do this, as ksh does not do it either and it
+                * is not required by POSIX.
+                */
+       }
+       return (mustexpandto(arg->text, "export") ||
+           mustexpandto(arg->text, "readonly") ||
+           (mustexpandto(arg->text, "local") &&
+               (have_command || !isfunc("local"))));
+}
+
 /*
  * Check if a builtin can safely be executed in the same process,
  * even though it should be in a subshell (command substitution).
@@ -708,7 +787,6 @@ safe_builtin(int idx, int argc, char **argv)
 static void
 evalcommand(union node *cmd, int flgs, struct backcmd *backcmd)
 {
-       struct stackmark smark;
        union node *argp;
        struct arglist arglist;
        struct arglist varlist;
@@ -736,7 +814,6 @@ evalcommand(union node *cmd, int flgs, struct backcmd *backcmd)
 
        /* First expand the arguments. */
        TRACE(("evalcommand(%p, %d) called\n", (void *)cmd, flags));
-       setstackmark(&smark);
        arglist.lastp = &arglist.list;
        varlist.lastp = &varlist.list;
        varflag = 1;
@@ -746,11 +823,12 @@ evalcommand(union node *cmd, int flgs, struct backcmd *backcmd)
        exitstatus = 0;
        for (argp = cmd->ncmd.args ; argp ; argp = argp->narg.next) {
                if (varflag && isassignment(argp->narg.text)) {
-                       expandarg(argp, &varlist, EXP_VARTILDE);
+                       expandarg(argp, varflag == 1 ? &varlist : &arglist,
+                           EXP_VARTILDE);
                        continue;
-               }
+               } else if (varflag == 1)
+                       varflag = isdeclarationcmd(&argp->narg) ? 2 : 0;
                expandarg(argp, &arglist, EXP_FULL | EXP_TILDE);
-               varflag = 0;
        }
        *arglist.lastp = NULL;
        *varlist.lastp = NULL;
@@ -1026,6 +1104,7 @@ evalcommand(union node *cmd, int flgs, struct backcmd *backcmd)
                }
                handler = &jmploc;
                redirect(cmd->ncmd.redirect, mode);
+               outclearerror(out1);
                /*
                 * If there is no command word, redirection errors should
                 * not be fatal but assignment errors should.
@@ -1041,6 +1120,11 @@ evalcommand(union node *cmd, int flgs, struct backcmd *backcmd)
                builtin_flags = flags;
                exitstatus = (*builtinfunc[cmdentry.u.index])(argc, argv);
                flushall();
+               if (outiserror(out1)) {
+                       warning("write error on stdout");
+                       if (exitstatus == 0 || exitstatus == 1)
+                               exitstatus = 2;
+               }
 cmddone:
                if (argc > 0)
                        bltinunsetlocale();
@@ -1100,7 +1184,6 @@ out:
                setvar("_", lastarg, 0);
        if (do_clearcmdentry)
                clearcmdentry();
-       popstackmark(&smark);
 }
 
 
@@ -1179,7 +1262,7 @@ breakcmd(int argc, char **argv)
  * The `command' command.
  */
 int
-commandcmd(int argc, char **argv)
+commandcmd(int argc __unused, char **argv __unused)
 {
        const char *path;
        int ch;
@@ -1187,9 +1270,7 @@ commandcmd(int argc, char **argv)
 
        path = bltinlookup("PATH", 1);
 
-       optind = optreset = 1;
-       opterr = 0;
-       while ((ch = getopt(argc, argv, "pvV")) != -1) {
+       while ((ch = nextopt("pvV")) != '\0') {
                switch (ch) {
                case 'p':
                        path = _PATH_STDPATH;
@@ -1200,20 +1281,15 @@ commandcmd(int argc, char **argv)
                case 'V':
                        cmd = TYPECMD_BIGV;
                        break;
-               case '?':
-               default:
-                       error("unknown option: -%c", optopt);
                }
        }
-       argc -= optind;
-       argv += optind;
 
        if (cmd != -1) {
-               if (argc != 1)
+               if (*argptr == NULL || argptr[1] != NULL)
                        error("wrong number of arguments");
-               return typecmd_impl(2, argv - 1, cmd, path);
+               return typecmd_impl(2, argptr - 1, cmd, path);
        }
-       if (argc != 0)
+       if (*argptr != NULL)
                error("commandcmd bad call");
 
        /*
index d9ef734..33f5e02 100644 (file)
@@ -34,7 +34,7 @@
  * SUCH DAMAGE.
  *
  *     @(#)eval.h      8.2 (Berkeley) 5/4/95
- * $FreeBSD: src/bin/sh/eval.h,v 1.16 2012/01/16 11:07:46 dumbbell Exp $
+ * $FreeBSD: head/bin/sh/eval.h 230212 2012-01-16 11:07:46Z dumbbell $
  */
 
 extern const char *commandname;        /* currently executing command */
index 202a74b..a3699ba 100644 (file)
@@ -34,7 +34,7 @@
  * SUCH DAMAGE.
  *
  * @(#)exec.c  8.4 (Berkeley) 6/8/95
- * $FreeBSD: src/bin/sh/exec.c,v 1.55 2012/02/11 21:06:45 jilles Exp $
+ * $FreeBSD: head/bin/sh/exec.c 245426 2013-01-14 16:40:50Z jilles $
  */
 
 #include <sys/types.h>
@@ -77,7 +77,6 @@
 
 
 #define CMDTABLESIZE 31                /* should be prime */
-#define ARB 1                  /* actual size determined at run time */
 
 
 
@@ -85,13 +84,13 @@ struct tblentry {
        struct tblentry *next;  /* next entry in hash chain */
        union param param;      /* definition of builtin function */
        int special;            /* flag for special builtin commands */
-       short cmdtype;          /* index identifying command */
-       char rehash;            /* if set, cd done since entry created */
-       char cmdname[ARB];      /* name of command */
+       signed char cmdtype;    /* index identifying command */
+       char cmdname[];         /* name of command */
 };
 
 
 static struct tblentry *cmdtable[CMDTABLESIZE];
+static int cmdtable_cd = 0;    /* cmdtable contains cd-dependent entries */
 int exerrno = 0;                       /* Last exec error */
 
 
@@ -303,8 +302,6 @@ printentry(struct tblentry *cmdp, int verbose)
                error("internal error: cmdtype %d", cmdp->cmdtype);
 #endif
        }
-       if (cmdp->rehash)
-               out1c('*');
        out1c('\n');
 }
 
@@ -321,12 +318,12 @@ find_command(const char *name, struct cmdentry *entry, int act,
 {
        struct tblentry *cmdp, loc_cmd;
        int idx;
-       int prev;
        char *fullname;
        struct stat statb;
        int e;
        int i;
        int spec;
+       int cd;
 
        /* If name contains a slash, don't use the hash table */
        if (strchr(name, '/') != NULL) {
@@ -335,8 +332,10 @@ find_command(const char *name, struct cmdentry *entry, int act,
                return;
        }
 
+       cd = 0;
+
        /* If name is in the table, and not invalidated by cd, we're done */
-       if ((cmdp = cmdlookup(name, 0)) != NULL && cmdp->rehash == 0) {
+       if ((cmdp = cmdlookup(name, 0)) != NULL) {
                if (cmdp->cmdtype == CMDFUNCTION && act & DO_NOFUNC)
                        cmdp = NULL;
                else
@@ -357,13 +356,6 @@ find_command(const char *name, struct cmdentry *entry, int act,
        }
 
        /* We have to search path. */
-       prev = -1;              /* where to start */
-       if (cmdp) {             /* doing a rehash */
-               if (cmdp->cmdtype == CMDBUILTIN)
-                       prev = -1;
-               else
-                       prev = cmdp->param.index;
-       }
 
        e = ENOENT;
        idx = -1;
@@ -378,13 +370,8 @@ loop:
                                goto loop;      /* ignore unimplemented options */
                        }
                }
-               /* if rehash, don't redo absolute path names */
-               if (fullname[0] == '/' && idx <= prev) {
-                       if (idx < prev)
-                               goto loop;
-                       TRACE(("searchexec \"%s\": no change\n", name));
-                       goto success;
-               }
+               if (fullname[0] != '/')
+                       cd = 1;
                if (stat(fullname, &statb) < 0) {
                        if (errno != ENOENT && errno != ENOTDIR)
                                e = errno;
@@ -424,9 +411,6 @@ loop:
                goto success;
        }
 
-       /* We failed.  If there was an entry for this command, delete it */
-       if (cmdp && cmdp->cmdtype != CMDFUNCTION)
-               delete_cmd_entry();
        if (act & DO_ERR) {
                if (e == ENOENT || e == ENOTDIR)
                        outfmt(out2, "%s: not found\n", name);
@@ -439,7 +423,8 @@ loop:
 
 success:
        if (cmdp) {
-               cmdp->rehash = 0;
+               if (cd)
+                       cmdtable_cd = 1;
                entry->cmdtype = cmdp->cmdtype;
                entry->u = cmdp->param;
                entry->special = cmdp->special;
@@ -470,22 +455,15 @@ find_builtin(const char *name, int *special)
 
 
 /*
- * Called when a cd is done.  Marks all commands so the next time they
- * are executed they will be rehashed.
+ * Called when a cd is done.  If any entry in cmdtable depends on the current
+ * directory, simply clear cmdtable completely.
  */
 
 void
 hashcd(void)
 {
-       struct tblentry **pp;
-       struct tblentry *cmdp;
-
-       for (pp = cmdtable ; pp < &cmdtable[CMDTABLESIZE] ; pp++) {
-               for (cmdp = *pp ; cmdp ; cmdp = cmdp->next) {
-                       if (cmdp->cmdtype == CMDNORMAL)
-                               cmdp->rehash = 1;
-               }
-       }
+       if (cmdtable_cd)
+               clearcmdentry();
 }
 
 
@@ -527,6 +505,7 @@ clearcmdentry(void)
                        }
                }
        }
+       cmdtable_cd = 0;
        INTON;
 }
 
@@ -563,11 +542,10 @@ cmdlookup(const char *name, int add)
        }
        if (add && cmdp == NULL) {
                INTOFF;
-               cmdp = *pp = ckmalloc(sizeof (struct tblentry) - ARB
+               cmdp = *pp = ckmalloc(sizeof (struct tblentry)
                                        + strlen(name) + 1);
                cmdp->next = NULL;
                cmdp->cmdtype = CMDUNKNOWN;
-               cmdp->rehash = 0;
                strcpy(cmdp->cmdname, name);
                INTON;
        }
@@ -647,6 +625,19 @@ unsetfunc(const char *name)
        return (0);
 }
 
+
+/*
+ * Check if a function by a certain name exists.
+ */
+int
+isfunc(const char *name)
+{
+       struct tblentry *cmdp;
+       cmdp = cmdlookup(name, 0);
+       return (cmdp != NULL && cmdp->cmdtype == CMDFUNCTION);
+}
+
+
 /*
  * Shared code for the following builtin commands:
  *    type, command -v, command -V
index 721e20b..546ad53 100644 (file)
@@ -34,7 +34,7 @@
  * SUCH DAMAGE.
  *
  *     @(#)exec.h      8.3 (Berkeley) 6/8/95
- * $FreeBSD: src/bin/sh/exec.h,v 1.24 2012/01/01 22:17:12 jilles Exp $
+ * $FreeBSD: head/bin/sh/exec.h 238468 2012-07-15 10:19:43Z jilles $
  */
 
 /* values of cmdtype */
@@ -76,5 +76,6 @@ void hashcd(void);
 void changepath(const char *);
 void defun(const char *, union node *);
 int unsetfunc(const char *);
+int isfunc(const char *);
 int typecmd_impl(int, char **, int, const char *);
 void clearcmdentry(void);
index 52fc78f..8b0d4da 100644 (file)
@@ -36,7 +36,7 @@
  * SUCH DAMAGE.
  *
  * @(#)expand.c        8.5 (Berkeley) 5/15/95
- * $FreeBSD: src/bin/sh/expand.c,v 1.95 2012/01/01 22:17:12 jilles Exp $
+ * $FreeBSD: head/bin/sh/expand.c 246288 2013-02-03 15:54:57Z jilles $
  */
 
 #include <sys/types.h>
@@ -126,19 +126,6 @@ collate_range_cmp(wchar_t c1, wchar_t c2)
        return (wcscoll(s1, s2));
 }
 
-/*
- * Expand shell variables and backquotes inside a here document.
- *     union node *arg         the document
- *     int fd;                 where to write the expanded version
- */
-
-void
-expandhere(union node *arg, int fd)
-{
-       expandarg(arg, NULL, 0);
-       xwrite(fd, stackblock(), expdest - stackblock());
-}
-
 static char *
 stputs_quotes(const char *data, const char *syntax, char *p)
 {
index 778c9d8..0f0032a 100644 (file)
@@ -34,7 +34,7 @@
  * SUCH DAMAGE.
  *
  *     @(#)expand.h    8.2 (Berkeley) 5/4/95
- * $FreeBSD: src/bin/sh/expand.h,v 1.18 2012/01/01 22:17:12 jilles Exp $
+ * $FreeBSD: head/bin/sh/expand.h 246288 2013-02-03 15:54:57Z jilles $
  */
 
 struct strlist {
@@ -61,7 +61,6 @@ struct arglist {
 
 
 union node;
-void expandhere(union node *, int);
 void expandarg(union node *, struct arglist *, int);
 void expari(int);
 void rmescapes(char *);
index 8876fd2..5676f77 100644 (file)
@@ -36,7 +36,7 @@
 # SUCH DAMAGE.
 #
 #      @(#)cmv 8.2 (Berkeley) 5/4/95
-# $FreeBSD: src/bin/sh/funcs/cmv,v 1.8 2005/01/10 08:39:26 imp Exp $
+# $FreeBSD: head/bin/sh/funcs/cmv 139969 2005-01-10 08:39:26Z imp $
 
 # Conditional move--don't replace an existing file.
 
index 2b7188e..b6aa59d 100644 (file)
@@ -36,7 +36,7 @@
 # SUCH DAMAGE.
 #
 #      @(#)dirs        8.2 (Berkeley) 5/4/95
-# $FreeBSD: src/bin/sh/funcs/dirs,v 1.8 2005/01/10 08:39:26 imp Exp $
+# $FreeBSD: head/bin/sh/funcs/dirs 139969 2005-01-10 08:39:26Z imp $
 
 # pushd, popd, and dirs --- written by Chris Bertin
 # Pixel Computer Inc. ...!wjh12!pixel!pixutl!chris
index bf1a182..1863b26 100644 (file)
@@ -36,7 +36,7 @@
 # SUCH DAMAGE.
 #
 #      @(#)login       8.2 (Berkeley) 5/4/95
-# $FreeBSD: src/bin/sh/funcs/login,v 1.8 2005/01/10 08:39:26 imp Exp $
+# $FreeBSD: head/bin/sh/funcs/login 139969 2005-01-10 08:39:26Z imp $
 
 # replaces the login builtin in the BSD shell
 login () exec login "$@"
index 1f80c02..8d7d8ce 100644 (file)
@@ -36,6 +36,6 @@
 # SUCH DAMAGE.
 #
 #      @(#)newgrp      8.2 (Berkeley) 5/4/95
-# $FreeBSD: src/bin/sh/funcs/newgrp,v 1.8 2005/01/10 08:39:26 imp Exp $
+# $FreeBSD: head/bin/sh/funcs/newgrp 139969 2005-01-10 08:39:26Z imp $
 
 newgrp() exec newgrp "$@"
index 08f4a28..12b3c6e 100644 (file)
@@ -36,7 +36,7 @@
 # SUCH DAMAGE.
 #
 #      @(#)popd        8.2 (Berkeley) 5/4/95
-# $FreeBSD: src/bin/sh/funcs/popd,v 1.8 2005/01/10 08:39:26 imp Exp $
+# $FreeBSD: head/bin/sh/funcs/popd 139969 2005-01-10 08:39:26Z imp $
 
 # pushd, popd, and dirs --- written by Chris Bertin
 # Pixel Computer Inc. ...!wjh12!pixel!pixutl!chris
index 3df956e..b3058ed 100644 (file)
@@ -36,7 +36,7 @@
 # SUCH DAMAGE.
 #
 #      @(#)pushd       8.2 (Berkeley) 5/4/95
-# $FreeBSD: src/bin/sh/funcs/pushd,v 1.8 2005/01/10 08:39:26 imp Exp $
+# $FreeBSD: head/bin/sh/funcs/pushd 139969 2005-01-10 08:39:26Z imp $
 
 # pushd, popd, and dirs --- written by Chris Bertin
 # Pixel Computer Inc. ...!wjh12!pixel!pixutl!chris
index f023ada..6817d4a 100644 (file)
@@ -34,7 +34,7 @@
 # SUCH DAMAGE.
 #
 #      @(#)suspend     8.2 (Berkeley) 5/4/95
-# $FreeBSD: src/bin/sh/funcs/suspend,v 1.9 2010/11/13 22:20:46 jilles Exp $
+# $FreeBSD: head/bin/sh/funcs/suspend 215268 2010-11-13 22:20:46Z jilles $
 
 suspend() {
        local -
index 5405317..04fefba 100644 (file)
@@ -34,7 +34,7 @@
  * SUCH DAMAGE.
  *
  * @(#)histedit.c      8.2 (Berkeley) 5/4/95
- * $FreeBSD: src/bin/sh/histedit.c,v 1.44 2012/01/01 22:17:12 jilles Exp $
+ * $FreeBSD: head/bin/sh/histedit.c 240541 2012-09-15 21:56:30Z jilles $
  */
 
 #include <sys/param.h>
@@ -184,7 +184,7 @@ setterm(const char *term)
 }
 
 int
-histcmd(int argc, char **argv)
+histcmd(int argc, char **argv __unused)
 {
        int ch;
        const char *volatile editor = NULL;
@@ -208,13 +208,10 @@ histcmd(int argc, char **argv)
        if (argc == 1)
                error("missing history argument");
 
-       optreset = 1; optind = 1; /* initialize getopt */
-       opterr = 0;
-       while (not_fcnumber(argv[optind]) &&
-             (ch = getopt(argc, argv, ":e:lnrs")) != -1)
+       while (not_fcnumber(*argptr) && (ch = nextopt("e:lnrs")) != '\0')
                switch ((char)ch) {
                case 'e':
-                       editor = optarg;
+                       editor = shoptarg;
                        break;
                case 'l':
                        lflg = 1;
@@ -228,13 +225,7 @@ histcmd(int argc, char **argv)
                case 's':
                        sflg = 1;
                        break;
-               case ':':
-                       error("option -%c expects argument", optopt);
-               case '?':
-               default:
-                       error("unknown option: -%c", optopt);
                }
-       argc -= optind, argv += optind;
 
        savehandler = handler;
        /*
@@ -278,31 +269,26 @@ histcmd(int argc, char **argv)
        /*
         * If executing, parse [old=new] now
         */
-       if (lflg == 0 && argc > 0 &&
-            ((repl = strchr(argv[0], '=')) != NULL)) {
-               pat = argv[0];
+       if (lflg == 0 && *argptr != NULL &&
+            ((repl = strchr(*argptr, '=')) != NULL)) {
+               pat = *argptr;
                *repl++ = '\0';
-               argc--, argv++;
+               argptr++;
        }
        /*
         * determine [first] and [last]
         */
-       switch (argc) {
-       case 0:
+       if (*argptr == NULL) {
                firststr = lflg ? "-16" : "-1";
                laststr = "-1";
-               break;
-       case 1:
-               firststr = argv[0];
-               laststr = lflg ? "-1" : argv[0];
-               break;
-       case 2:
-               firststr = argv[0];
-               laststr = argv[1];
-               break;
-       default:
+       } else if (argptr[1] == NULL) {
+               firststr = argptr[0];
+               laststr = lflg ? "-1" : argptr[0];
+       } else if (argptr[2] == NULL) {
+               firststr = argptr[0];
+               laststr = argptr[1];
+       } else
                error("too many arguments");
-       }
        /*
         * Turn into event numbers.
         */
index e9f058c..2b9ad02 100644 (file)
@@ -34,8 +34,7 @@
  * SUCH DAMAGE.
  *
  *     @(#)init.h      8.2 (Berkeley) 5/4/95
- * $FreeBSD: src/bin/sh/init.h,v 1.9 2011/02/04 22:47:55 jilles Exp $
+ * $FreeBSD: head/bin/sh/init.h 245689 2013-01-20 12:44:50Z jilles $
  */
 
-void   init(void);
 void   reset(void);
index 4139988..5937a35 100644 (file)
@@ -34,7 +34,7 @@
  * SUCH DAMAGE.
  *
  * @(#)input.c 8.3 (Berkeley) 6/9/95
- * $FreeBSD: src/bin/sh/input.c,v 1.36 2012/07/11 22:17:58 pfg Exp $
+ * $FreeBSD: head/bin/sh/input.c 245676 2013-01-19 22:12:08Z jilles $
  */
 
 #include <stdio.h>     /* defines BUFSIZ */
@@ -63,7 +63,6 @@
 
 #define EOF_NLEFT -99          /* value of parsenleft when EOF pushed back */
 
-MKINIT
 struct strpush {
        struct strpush *prev;   /* preceding string on stack */
        char *prevstring;
@@ -77,7 +76,6 @@ struct strpush {
  * contains information about the current file being read.
  */
 
-MKINIT
 struct parsefile {
        struct parsefile *prev; /* preceding file on stack */
        int linno;              /* current line */
@@ -95,10 +93,12 @@ int plinno = 1;                     /* input line number */
 int parsenleft;                        /* copy of parsefile->nleft */
 MKINIT int parselleft;         /* copy of parsefile->lleft */
 char *parsenextc;              /* copy of parsefile->nextc */
-MKINIT struct parsefile basepf;        /* top level input file */
-MKINIT char basebuf[BUFSIZ + 1];       /* buffer for top level input file */
+static char basebuf[BUFSIZ + 1];/* buffer for top level input file */
+static struct parsefile basepf = {     /* top level input file */
+       .nextc = basebuf,
+       .buf = basebuf
+};
 static struct parsefile *parsefile = &basepf;  /* current input file */
-int init_editline = 0;         /* editline library initialized? */
 int whichprompt;               /* 1 == PS1, 2 == PS2 */
 
 EditLine *el;                  /* cookie for editline package */
@@ -112,10 +112,6 @@ INCLUDE <stdio.h>
 INCLUDE "input.h"
 INCLUDE "error.h"
 
-INIT {
-       basepf.nextc = basepf.buf = basebuf;
-}
-
 RESET {
        popallfiles();
        parselleft = parsenleft = 0;    /* clear input buffer */
@@ -348,7 +344,7 @@ pungetc(void)
  * We handle aliases this way.
  */
 void
-pushstring(char *s, int len, void *ap)
+pushstring(char *s, int len, struct alias *ap)
 {
        struct strpush *sp;
 
@@ -363,9 +359,9 @@ pushstring(char *s, int len, void *ap)
        sp->prevstring = parsenextc;
        sp->prevnleft = parsenleft;
        sp->prevlleft = parselleft;
-       sp->ap = (struct alias *)ap;
+       sp->ap = ap;
        if (ap)
-               ((struct alias *)ap)->flag |= ALIASINUSE;
+               ap->flag |= ALIASINUSE;
        parsenextc = s;
        parsenleft = len;
        INTON;
index 97cbb46..6a3c7fd 100644 (file)
@@ -34,7 +34,7 @@
  * SUCH DAMAGE.
  *
  *     @(#)input.h     8.2 (Berkeley) 5/4/95
- * $FreeBSD: src/bin/sh/input.h,v 1.13 2012/01/01 22:17:12 jilles Exp $
+ * $FreeBSD: head/bin/sh/input.h 243027 2012-11-14 14:08:24Z jilles $
  */
 
 /* PEOF (the end of file marker) is defined in syntax.h */
@@ -47,8 +47,8 @@
 extern int plinno;
 extern int parsenleft;         /* number of characters left in input buffer */
 extern char *parsenextc;       /* next character in input buffer */
-extern int init_editline;      /* 0 == not setup, 1 == OK, -1 == failed */
 
+struct alias;
 struct parsefile;
 
 char *pfgets(char *, int);
@@ -56,7 +56,7 @@ int pgetc(void);
 int preadbuffer(void);
 int preadateof(void);
 void pungetc(void);
-void pushstring(char *, int, void *);
+void pushstring(char *, int, struct alias *);
 void setinputfile(const char *, int);
 void setinputfd(int, int);
 void setinputstring(char *, int);
index a0be96c..0e43102 100644 (file)
@@ -34,7 +34,7 @@
  * SUCH DAMAGE.
  *
  * @(#)jobs.c  8.5 (Berkeley) 5/4/95
- * $FreeBSD: src/bin/sh/jobs.c,v 1.98 2012/04/02 17:16:24 jilles Exp $
+ * $FreeBSD: head/bin/sh/jobs.c 248349 2013-03-15 20:29:31Z jilles $
  */
 
 #include <sys/ioctl.h>
@@ -83,17 +83,19 @@ static struct job *jobmru;  /* most recently used job list */
 static pid_t initialpgrp;      /* pgrp of shell on invocation */
 #endif
 int in_waitcmd = 0;            /* are we in waitcmd()? */
-int in_dowait = 0;             /* are we in dowait()? */
 volatile sig_atomic_t breakwaitcmd = 0;        /* should wait be terminated? */
 static int ttyfd = -1;
 
+/* mode flags for dowait */
+#define DOWAIT_BLOCK   0x1 /* wait until a child exits */
+#define DOWAIT_SIG     0x2 /* if DOWAIT_BLOCK, abort on signals */
+
 #if JOBS
 static void restartjob(struct job *);
 #endif
 static void freejob(struct job *);
 static struct job *getjob(char *);
 static pid_t dowait(int, struct job *);
-static pid_t waitproc(int, int *);
 static void checkzombies(void);
 static void cmdtxt(union node *);
 static void cmdputs(const char *);
@@ -246,15 +248,13 @@ restartjob(struct job *jp)
 
 
 int
-jobscmd(int argc, char *argv[])
+jobscmd(int argc __unused, char *argv[] __unused)
 {
        char *id;
        int ch, mode;
 
-       optind = optreset = 1;
-       opterr = 0;
        mode = SHOWJOBS_DEFAULT;
-       while ((ch = getopt(argc, argv, "lps")) != -1) {
+       while ((ch = nextopt("lps")) != '\0') {
                switch (ch) {
                case 'l':
                        mode = SHOWJOBS_VERBOSE;
@@ -265,18 +265,13 @@ jobscmd(int argc, char *argv[])
                case 's':
                        mode = SHOWJOBS_PIDS;
                        break;
-               case '?':
-               default:
-                       error("unknown option: -%c", optopt);
                }
        }
-       argc -= optind;
-       argv += optind;
 
-       if (argc == 0)
+       if (*argptr == NULL)
                showjobs(0, mode);
        else
-               while ((id = *argv++) != NULL)
+               while ((id = *argptr++) != NULL)
                        showjob(getjob(id), mode);
 
        return (0);
@@ -301,6 +296,7 @@ showjob(struct job *jp, int mode)
 {
        char s[64];
        char statestr[64];
+       const char *sigstr;
        struct procstat *ps;
        struct job *j;
        int col, curr, i, jobno, prev, procno;
@@ -327,8 +323,9 @@ showjob(struct job *jp, int mode)
                        i = WSTOPSIG(ps->status);
                else
                        i = -1;
-               if (i > 0 && i < sys_nsig && sys_siglist[i])
-                       strcpy(statestr, sys_siglist[i]);
+               sigstr = strsignal(i);
+               if (sigstr != NULL)
+                       strcpy(statestr, sigstr);
                else
                        strcpy(statestr, "Suspended");
 #endif
@@ -340,10 +337,11 @@ showjob(struct job *jp, int mode)
                            WEXITSTATUS(ps->status));
        } else {
                i = WTERMSIG(ps->status);
-               if (i > 0 && i < sys_nsig && sys_siglist[i])
-                       strcpy(statestr, sys_siglist[i]);
+               sigstr = strsignal(i);
+               if (sigstr != NULL)
+                       strcpy(statestr, sigstr);
                else
-                       fmtstr(statestr, 64, "Signal %d", i);
+                       strcpy(statestr, "Unknown signal");
                if (WCOREDUMP(ps->status))
                        strcat(statestr, " (core dumped)");
        }
@@ -518,10 +516,10 @@ waitcmd(int argc, char **argv)
                                        break;
                        }
                }
-       } while (dowait(1, NULL) != -1);
+       } while (dowait(DOWAIT_BLOCK | DOWAIT_SIG, NULL) != -1);
        in_waitcmd--;
 
-       return 0;
+       return pendingsig + 128;
 }
 
 
@@ -965,7 +963,7 @@ waitforjob(struct job *jp, int *origstatus)
        INTOFF;
        TRACE(("waitforjob(%%%td) called\n", jp - jobtab + 1));
        while (jp->state == 0)
-               if (dowait(1, jp) == -1)
+               if (dowait(DOWAIT_BLOCK | (Tflag ? DOWAIT_SIG : 0), jp) == -1)
                        dotrap();
 #if JOBS
        if (jp->jobctl) {
@@ -1003,34 +1001,73 @@ waitforjob(struct job *jp, int *origstatus)
 }
 
 
+static void
+dummy_handler(int sig __unused)
+{
+}
 
 /*
  * Wait for a process to terminate.
  */
 
 static pid_t
-dowait(int block, struct job *job)
+dowait(int mode, struct job *job)
 {
+       struct sigaction sa, osa;
+       sigset_t mask, omask;
        pid_t pid;
        int status;
        struct procstat *sp;
        struct job *jp;
        struct job *thisjob;
+       const char *sigstr;
        int done;
        int stopped;
        int sig;
        int coredump;
-
-       in_dowait++;
-       TRACE(("dowait(%d) called\n", block));
+       int wflags;
+       int restore_sigchld;
+
+       TRACE(("dowait(%d, %p) called\n", mode, job));
+       restore_sigchld = 0;
+       if ((mode & DOWAIT_SIG) != 0) {
+               sigfillset(&mask);
+               sigprocmask(SIG_BLOCK, &mask, &omask);
+               INTOFF;
+               if (!issigchldtrapped()) {
+                       restore_sigchld = 1;
+                       sa.sa_handler = dummy_handler;
+                       sa.sa_flags = 0;
+                       sigemptyset(&sa.sa_mask);
+                       sigaction(SIGCHLD, &sa, &osa);
+               }
+       }
        do {
-               pid = waitproc(block, &status);
+#if JOBS
+               if (iflag)
+                       wflags = WUNTRACED | WCONTINUED;
+               else
+#endif
+                       wflags = 0;
+               if ((mode & (DOWAIT_BLOCK | DOWAIT_SIG)) != DOWAIT_BLOCK)
+                       wflags |= WNOHANG;
+               pid = wait3(&status, wflags, NULL);
                TRACE(("wait returns %d, status=%d\n", (int)pid, status));
-       } while ((pid == -1 && errno == EINTR && breakwaitcmd == 0) ||
-                (pid > 0 && WIFSTOPPED(status) && !iflag));
-       in_dowait--;
+               if (pid == 0 && (mode & DOWAIT_SIG) != 0) {
+                       sigsuspend(&omask);
+                       pid = -1;
+                       if (int_pending())
+                               break;
+               }
+       } while (pid == -1 && errno == EINTR && breakwaitcmd == 0);
        if (pid == -1 && errno == ECHILD && job != NULL)
                job->state = JOBDONE;
+       if ((mode & DOWAIT_SIG) != 0) {
+               if (restore_sigchld)
+                       sigaction(SIGCHLD, &osa, NULL);
+               sigprocmask(SIG_SETMASK, &omask, NULL);
+               INTON;
+       }
        if (breakwaitcmd != 0) {
                breakwaitcmd = 0;
                /*
@@ -1055,7 +1092,11 @@ dowait(int block, struct job *job)
                                        TRACE(("Changing status of proc %d from 0x%x to 0x%x\n",
                                                   (int)pid, sp->status,
                                                   status));
-                                       sp->status = status;
+                                       if (WIFCONTINUED(status)) {
+                                               sp->status = -1;
+                                               jp->state = 0;
+                                       } else
+                                               sp->status = status;
                                        thisjob = jp;
                                }
                                if (sp->status == -1)
@@ -1094,10 +1135,11 @@ dowait(int block, struct job *job)
                                coredump = WCOREDUMP(sp->status);
                        }
                if (sig > 0 && sig != SIGINT && sig != SIGPIPE) {
-                       if (sig < sys_nsig && sys_siglist[sig])
-                               out2str(sys_siglist[sig]);
+                       sigstr = strsignal(sig);
+                       if (sigstr != NULL)
+                               out2str(sigstr);
                        else
-                               outfmt(out2, "Signal %d", sig);
+                               out2str("Unknown signal");
                        if (coredump)
                                out2str(" (core dumped)");
                        out2c('\n');
@@ -1113,26 +1155,6 @@ dowait(int block, struct job *job)
 
 
 /*
- * Do a wait system call.  If job control is compiled in, we accept
- * stopped processes.  If block is zero, we return a value of zero
- * rather than blocking.
- */
-static pid_t
-waitproc(int block, int *status)
-{
-       int flags;
-
-#if JOBS
-       flags = WUNTRACED;
-#else
-       flags = 0;
-#endif
-       if (block == 0)
-               flags |= WNOHANG;
-       return wait3(status, flags, NULL);
-}
-
-/*
  * return 1 if there are stopped jobs, otherwise 0
  */
 int job_warning = 0;
@@ -1278,6 +1300,10 @@ until:
                cmdputs(n->narg.text);
                cmdputs("() ...");
                break;
+       case NNOT:
+               cmdputs("! ");
+               cmdtxt(n->nnot.com);
+               break;
        case NCMD:
                for (np = n->ncmd.args ; np ; np = np->narg.next) {
                        cmdtxt(np);
index 72274f3..fc325f0 100644 (file)
@@ -34,7 +34,7 @@
  * SUCH DAMAGE.
  *
  *     @(#)jobs.h      8.2 (Berkeley) 5/4/95
- * $FreeBSD: src/bin/sh/jobs.h,v 1.22 2012/02/04 23:12:14 jilles Exp $
+ * $FreeBSD: head/bin/sh/jobs.h 238470 2012-07-15 10:49:16Z jilles $
  */
 
 /* Mode argument to forkshell.  Don't change FORK_FG or FORK_BG. */
@@ -88,7 +88,6 @@ enum {
 
 extern int job_warning;                /* user was warned about stopped jobs */
 extern int in_waitcmd;         /* are we in waitcmd()? */
-extern int in_dowait;          /* are we in dowait()? */
 extern volatile sig_atomic_t breakwaitcmd; /* break wait to process traps? */
 
 void setjobctl(int);
index 225fe80..9c793e0 100644 (file)
@@ -34,7 +34,7 @@
  * SUCH DAMAGE.
  *
  * @(#)mail.c  8.2 (Berkeley) 5/4/95
- * $FreeBSD: src/bin/sh/mail.c,v 1.16 2010/10/13 04:01:01 obrien Exp $
+ * $FreeBSD: head/bin/sh/mail.c 213760 2010-10-13 04:01:01Z obrien $
  */
 
 /*
index 81ae71c..e5947b9 100644 (file)
@@ -34,7 +34,7 @@
  * SUCH DAMAGE.
  *
  *     @(#)mail.h      8.2 (Berkeley) 5/4/95
- * $FreeBSD: src/bin/sh/mail.h,v 1.8 2004/04/06 20:06:51 markm Exp $
+ * $FreeBSD: head/bin/sh/mail.h 127958 2004-04-06 20:06:54Z markm $
  */
 
 void   chkmail(int);
index c478f71..b195afd 100644 (file)
@@ -35,7 +35,7 @@
  *
  * @(#) Copyright (c) 1991, 1993 The Regents of the University of California.  All rights reserved.
  * @(#)main.c  8.6 (Berkeley) 5/28/95
- * $FreeBSD: src/bin/sh/main.c,v 1.53 2012/01/01 22:17:12 jilles Exp $
+ * $FreeBSD: head/bin/sh/main.c 247206 2013-02-23 22:50:57Z jilles $
  */
 
 #include <stdio.h>
@@ -133,7 +133,7 @@ main(int argc, char *argv[])
 #endif
        rootpid = getpid();
        rootshell = 1;
-       init();
+       initvar();
        setstackmark(&smark);
        setstackmark(&smark2);
        procargs(argc, argv);
@@ -190,7 +190,7 @@ cmdloop(int top)
        TRACE(("cmdloop(%d) called\n", top));
        setstackmark(&smark);
        for (;;) {
-               if (pendingsigs)
+               if (pendingsig)
                        dotrap();
                inter = 0;
                if (iflag && top) {
@@ -260,14 +260,7 @@ read_profile(const char *name)
 void
 readcmdfile(const char *name)
 {
-       int fd;
-
-       INTOFF;
-       if ((fd = open(name, O_RDONLY)) >= 0)
-               setinputfd(fd, 1);
-       else
-               error("cannot open %s: %s", name, strerror(errno));
-       INTON;
+       setinputfile(name, 1);
        cmdloop(0);
        popfile();
 }
index ede4722..027273d 100644 (file)
@@ -34,7 +34,7 @@
  * SUCH DAMAGE.
  *
  *     @(#)main.h      8.2 (Berkeley) 5/4/95
- * $FreeBSD: src/bin/sh/main.h,v 1.12 2012/01/01 22:17:12 jilles Exp $
+ * $FreeBSD: head/bin/sh/main.h 229220 2012-01-01 22:17:12Z jilles $
  */
 
 extern int rootpid;    /* pid of main shell */
index 8336b99..4475663 100644 (file)
@@ -34,7 +34,7 @@
  * SUCH DAMAGE.
  *
  * @(#)memalloc.c      8.3 (Berkeley) 5/4/95
- * $FreeBSD: src/bin/sh/memalloc.c,v 1.38 2011/01/09 22:47:58 jilles Exp $
+ * $FreeBSD: head/bin/sh/memalloc.c 217209 2011-01-09 22:47:58Z jilles $
  */
 
 #include <sys/param.h>
index 198d9d0..88da554 100644 (file)
@@ -34,7 +34,7 @@
  * SUCH DAMAGE.
  *
  *     @(#)memalloc.h  8.2 (Berkeley) 5/4/95
- * $FreeBSD: src/bin/sh/memalloc.h,v 1.18 2011/01/09 22:47:58 jilles Exp $
+ * $FreeBSD: head/bin/sh/memalloc.h 217209 2011-01-09 22:47:58Z jilles $
  */
 
 #include <string.h>
index d469443..75ed0b2 100644 (file)
@@ -34,7 +34,7 @@
  * SUCH DAMAGE.
  *
  * @(#)miscbltin.c     8.4 (Berkeley) 5/4/95
- * $FreeBSD: src/bin/sh/miscbltin.c,v 1.46 2012/05/15 22:50:47 jilles Exp $
+ * $FreeBSD: head/bin/sh/miscbltin.c 246167 2013-01-31 22:10:57Z jilles $
  */
 
 /*
@@ -46,7 +46,6 @@
 #include <sys/time.h>
 #include <sys/resource.h>
 #include <unistd.h>
-#include <ctype.h>
 #include <errno.h>
 #include <stdint.h>
 #include <stdio.h>
@@ -59,6 +58,7 @@
 #include "memalloc.h"
 #include "error.h"
 #include "mystring.h"
+#include "syntax.h"
 
 int readcmd(int, char **);
 int umaskcmd(int, char **);
@@ -306,7 +306,7 @@ umaskcmd(int argc __unused, char **argv __unused)
                        out1fmt("%.4o\n", mask);
                }
        } else {
-               if (isdigit(*ap)) {
+               if (is_digit(*ap)) {
                        mask = 0;
                        do {
                                if (*ap >= '8' || *ap < '0')
index d340ad3..d97e3fd 100644 (file)
@@ -36,7 +36,7 @@
 # SUCH DAMAGE.
 #
 #      @(#)mkbuiltins  8.2 (Berkeley) 5/4/95
-# $FreeBSD: src/bin/sh/mkbuiltins,v 1.19 2012/05/24 19:48:15 marcel Exp $
+# $FreeBSD: head/bin/sh/mkbuiltins 235927 2012-05-24 19:48:15Z marcel $
 
 temp=`/usr/bin/mktemp -t ka`
 havehist=1
index 7c56a36..ede06f1 100644 (file)
@@ -35,7 +35,7 @@
  *
  * @(#) Copyright (c) 1991, 1993 The Regents of the University of California.  All rights reserved.
  * @(#)mkinit.c        8.2 (Berkeley) 5/4/95
- * $FreeBSD: src/bin/sh/mkinit.c,v 1.23 2011/06/24 07:29:04 kevlo Exp $
+ * $FreeBSD: head/bin/sh/mkinit.c 245689 2013-01-20 12:44:50Z jilles $
  */
 
 /*
@@ -95,7 +95,7 @@ struct block {
  */
 
 struct event {
-       const char *name;       /* name of event (e.g. INIT) */
+       const char *name;       /* name of event (e.g. RESET) */
        const char *routine;    /* name of routine called on event */
        const char *comment;    /* comment describing routine */
        struct text code;       /* code for handling event */
@@ -108,11 +108,6 @@ char writer[] = "\
  */\n\
 \n";
 
-char init[] = "\
-/*\n\
- * Initialization code.\n\
- */\n";
-
 char reset[] = "\
 /*\n\
  * This routine is called when an error or an interrupt occurs in an\n\
@@ -121,7 +116,6 @@ char reset[] = "\
 
 
 struct event event[] = {
-       { "INIT", "init", init, { NULL, 0, NULL, NULL } },
        { "RESET", "reset", reset, { NULL, 0, NULL, NULL } },
        { NULL, NULL, NULL, { NULL, 0, NULL, NULL } }
 };
index 0ac17b2..0b8597e 100644 (file)
@@ -35,7 +35,7 @@
  *
  * @(#) Copyright (c) 1991, 1993 The Regents of the University of California.  All rights reserved.
  * @(#)mknodes.c       8.2 (Berkeley) 5/4/95
- * $FreeBSD: src/bin/sh/mknodes.c,v 1.20 2009/08/28 22:41:25 jilles Exp $
+ * $FreeBSD: head/bin/sh/mknodes.c 196634 2009-08-28 22:41:25Z jilles $
  */
 
 /*
index 84f8a37..dbbe91a 100644 (file)
@@ -35,7 +35,7 @@
  *
  * @(#) Copyright (c) 1991, 1993 The Regents of the University of California.  All rights reserved.
  * @(#)mksyntax.c      8.2 (Berkeley) 5/4/95
- * $FreeBSD: src/bin/sh/mksyntax.c,v 1.36 2011/12/28 23:51:17 jilles Exp $
+ * $FreeBSD: head/bin/sh/mksyntax.c 246522 2013-02-07 22:42:33Z jilles $
  */
 
 /*
@@ -97,29 +97,19 @@ static char writer[] = "\
 
 static FILE *cfile;
 static FILE *hfile;
-static const char *syntax[513];
-static int base;
-static int size;       /* number of values which a char variable can have */
-static int nbits;      /* number of bits in a character */
-static int digit_contig;/* true if digits are contiguous */
-
-static void filltable(const char *);
-static void init(void);
+
+static void add_default(void);
+static void finish(void);
+static void init(const char *);
 static void add(const char *, const char *);
-static void print(const char *);
 static void output_type_macros(void);
-static void digit_convert(void);
 
 int
 main(int argc __unused, char **argv __unused)
 {
-       char c;
-       char d;
-       int sign;
        int i;
        char buf[80];
        int pos;
-       static char digit[] = "0123456789";
 
        /* Create output files */
        if ((cfile = fopen("syntax.c", "w")) == NULL) {
@@ -133,33 +123,8 @@ main(int argc __unused, char **argv __unused)
        fputs(writer, hfile);
        fputs(writer, cfile);
 
-       /* Determine the characteristics of chars. */
-       c = -1;
-       sign = (c > 0) ? 0 : 1;
-       for (nbits = 1 ; ; nbits++) {
-               d = (1 << nbits) - 1;
-               if (d == c)
-                       break;
-       }
-#if 0
-       printf("%s %d bit chars\n", sign? "signed" : "unsigned", nbits);
-#endif
-       if (nbits > 9) {
-               fputs("Characters can't have more than 9 bits\n", stderr);
-               exit(2);
-       }
-       size = (1 << nbits) + 1;
-       base = 1;
-       if (sign)
-               base += 1 << (nbits - 1);
-       digit_contig = 1;
-       for (i = 0 ; i < 10 ; i++) {
-               if (digit[i] != '0' + i)
-                       digit_contig = 0;
-       }
-
        fputs("#include <sys/cdefs.h>\n", hfile);
-       fputs("#include <ctype.h>\n", hfile);
+       fputs("#include <limits.h>\n\n", hfile);
 
        /* Generate the #define statements in the header file */
        fputs("/* Syntax classes */\n", hfile);
@@ -180,8 +145,8 @@ main(int argc __unused, char **argv __unused)
                fprintf(hfile, "/* %s */\n", is_entry[i].comment);
        }
        putc('\n', hfile);
-       fprintf(hfile, "#define SYNBASE %d\n", base);
-       fprintf(hfile, "#define PEOF %d\n\n", -base);
+       fputs("#define SYNBASE (1 - CHAR_MIN)\n", hfile);
+       fputs("#define PEOF -SYNBASE\n\n", hfile);
        putc('\n', hfile);
        fputs("#define BASESYNTAX (basesyntax + SYNBASE)\n", hfile);
        fputs("#define DQSYNTAX (dqsyntax + SYNBASE)\n", hfile);
@@ -192,10 +157,13 @@ main(int argc __unused, char **argv __unused)
        putc('\n', hfile);
 
        /* Generate the syntax tables. */
+       fputs("#include \"parser.h\"\n", cfile);
        fputs("#include \"shell.h\"\n", cfile);
        fputs("#include \"syntax.h\"\n\n", cfile);
-       init();
+
        fputs("/* syntax table used when not in quotes */\n", cfile);
+       init("basesyntax");
+       add_default();
        add("\n", "CNL");
        add("\\", "CBACK");
        add("'", "CSQUOTE");
@@ -204,9 +172,11 @@ main(int argc __unused, char **argv __unused)
        add("$", "CVAR");
        add("}", "CENDVAR");
        add("<>();&| \t", "CSPCL");
-       print("basesyntax");
-       init();
+       finish();
+
        fputs("\n/* syntax table used when in double quotes */\n", cfile);
+       init("dqsyntax");
+       add_default();
        add("\n", "CNL");
        add("\\", "CBACK");
        add("\"", "CENDQUOTE");
@@ -215,17 +185,21 @@ main(int argc __unused, char **argv __unused)
        add("}", "CENDVAR");
        /* ':/' for tilde expansion, '-^]' for [a\-x] pattern ranges */
        add("!*?[]=~:/-^", "CCTL");
-       print("dqsyntax");
-       init();
+       finish();
+
        fputs("\n/* syntax table used when in single quotes */\n", cfile);
+       init("sqsyntax");
+       add_default();
        add("\n", "CNL");
        add("\\", "CSBACK");
        add("'", "CENDQUOTE");
        /* ':/' for tilde expansion, '-^]' for [a\-x] pattern ranges */
        add("!*?[]=~:/-^", "CCTL");
-       print("sqsyntax");
-       init();
+       finish();
+
        fputs("\n/* syntax table used when in arithmetic */\n", cfile);
+       init("arisyntax");
+       add_default();
        add("\n", "CNL");
        add("\\", "CBACK");
        add("`", "CBQUOTE");
@@ -234,114 +208,108 @@ main(int argc __unused, char **argv __unused)
        add("}", "CENDVAR");
        add("(", "CLP");
        add(")", "CRP");
-       print("arisyntax");
-       filltable("0");
+       finish();
+
        fputs("\n/* character classification table */\n", cfile);
+       init("is_type");
        add("0123456789", "ISDIGIT");
        add("abcdefghijklmnopqrstuvwxyz", "ISLOWER");
        add("ABCDEFGHIJKLMNOPQRSTUVWXYZ", "ISUPPER");
        add("_", "ISUNDER");
        add("#?$!-*@", "ISSPECL");
-       print("is_type");
-       if (! digit_contig)
-               digit_convert();
+       finish();
+
        exit(0);
 }
 
 
-
 /*
- * Clear the syntax table.
+ * Output the header and declaration of a syntax table.
  */
 
 static void
-filltable(const char *dftval)
+init(const char *name)
 {
-       int i;
+       fprintf(hfile, "extern const char %s[];\n", name);
+       fprintf(cfile, "const char %s[SYNBASE + CHAR_MAX + 1] = {\n", name);
+}
 
-       for (i = 0 ; i < size ; i++)
-               syntax[i] = dftval;
+
+static void
+add_one(const char *key, const char *type)
+{
+       fprintf(cfile, "\t[SYNBASE + %s] = %s,\n", key, type);
 }
 
 
 /*
- * Initialize the syntax table with default values.
+ * Add default values to the syntax table.
  */
 
 static void
-init(void)
+add_default(void)
 {
-       filltable("CWORD");
-       syntax[0] = "CEOF";
-       syntax[base + CTLESC] = "CCTL";
-       syntax[base + CTLVAR] = "CCTL";
-       syntax[base + CTLENDVAR] = "CCTL";
-       syntax[base + CTLBACKQ] = "CCTL";
-       syntax[base + CTLBACKQ + CTLQUOTE] = "CCTL";
-       syntax[base + CTLARI] = "CCTL";
-       syntax[base + CTLENDARI] = "CCTL";
-       syntax[base + CTLQUOTEMARK] = "CCTL";
-       syntax[base + CTLQUOTEEND] = "CCTL";
+       add_one("PEOF",                "CEOF");
+       add_one("CTLESC",              "CCTL");
+       add_one("CTLVAR",              "CCTL");
+       add_one("CTLENDVAR",           "CCTL");
+       add_one("CTLBACKQ",            "CCTL");
+       add_one("CTLBACKQ + CTLQUOTE", "CCTL");
+       add_one("CTLARI",              "CCTL");
+       add_one("CTLENDARI",           "CCTL");
+       add_one("CTLQUOTEMARK",        "CCTL");
+       add_one("CTLQUOTEEND",         "CCTL");
 }
 
 
 /*
- * Add entries to the syntax table.
+ * Output the footer of a syntax table.
  */
 
 static void
-add(const char *p, const char *type)
+finish(void)
 {
-       while (*p)
-               syntax[*p++ + base] = type;
+       fputs("};\n", cfile);
 }
 
 
-
 /*
- * Output the syntax table.
+ * Add entries to the syntax table.
  */
 
 static void
-print(const char *name)
+add(const char *p, const char *type)
 {
-       int i;
-       int col;
-
-       fprintf(hfile, "extern const char %s[];\n", name);
-       fprintf(cfile, "const char %s[%d] = {\n", name, size);
-       col = 0;
-       for (i = 0 ; i < size ; i++) {
-               if (i == 0) {
-                       fputs("      ", cfile);
-               } else if ((i & 03) == 0) {
-                       fputs(",\n      ", cfile);
-                       col = 0;
-               } else {
-                       putc(',', cfile);
-                       while (++col < 9 * (i & 03))
-                               putc(' ', cfile);
+       for (; *p; ++p) {
+               char c = *p;
+               switch (c) {
+               case '\t': c = 't';  break;
+               case '\n': c = 'n';  break;
+               case '\'': c = '\''; break;
+               case '\\': c = '\\'; break;
+
+               default:
+                       fprintf(cfile, "\t[SYNBASE + '%c'] = %s,\n", c, type);
+                       continue;
                }
-               fputs(syntax[i], cfile);
-               col += strlen(syntax[i]);
+               fprintf(cfile, "\t[SYNBASE + '\\%c'] = %s,\n", c, type);
        }
-       fputs("\n};\n", cfile);
 }
 
 
-
 /*
  * Output character classification macros (e.g. is_digit).  If digits are
  * contiguous, we can test for them quickly.
  */
 
 static const char *macro[] = {
-       "#define is_digit(c)\t((is_type+SYNBASE)[(int)c] & ISDIGIT)",
+       "#define is_digit(c)\t((unsigned int)((c) - '0') <= 9)",
        "#define is_eof(c)\t((c) == PEOF)",
        "#define is_alpha(c)\t((is_type+SYNBASE)[(int)c] & (ISUPPER|ISLOWER))",
        "#define is_name(c)\t((is_type+SYNBASE)[(int)c] & (ISUPPER|ISLOWER|ISUNDER))",
        "#define is_in_name(c)\t((is_type+SYNBASE)[(int)c] & (ISUPPER|ISLOWER|ISUNDER|ISDIGIT))",
        "#define is_special(c)\t((is_type+SYNBASE)[(int)c] & (ISSPECL|ISDIGIT))",
+       "#define digit_val(c)\t((c) - '0')",
        NULL
 };
 
@@ -350,41 +318,6 @@ output_type_macros(void)
 {
        const char **pp;
 
-       if (digit_contig)
-               macro[0] = "#define is_digit(c)\t((unsigned int)((c) - '0') <= 9)";
        for (pp = macro ; *pp ; pp++)
                fprintf(hfile, "%s\n", *pp);
-       if (digit_contig)
-               fputs("#define digit_val(c)\t((c) - '0')\n", hfile);
-       else
-               fputs("#define digit_val(c)\t(digit_value[c])\n", hfile);
-}
-
-
-
-/*
- * Output digit conversion table (if digits are not contiguous).
- */
-
-static void
-digit_convert(void)
-{
-       int maxdigit;
-       static char digit[] = "0123456789";
-       char *p;
-       int i;
-
-       maxdigit = 0;
-       for (p = digit ; *p ; p++)
-               if (*p > maxdigit)
-                       maxdigit = *p;
-       fputs("extern const char digit_value[];\n", hfile);
-       fputs("\n\nconst char digit_value[] = {\n", cfile);
-       for (i = 0 ; i <= maxdigit ; i++) {
-               for (p = digit ; *p && *p != i ; p++);
-               if (*p == '\0')
-                       p = digit;
-               fprintf(cfile, "      %td,\n", p - digit);
-       }
-       fputs("};\n", cfile);
 }
index 9e79eab..bdcaaeb 100644 (file)
@@ -36,7 +36,7 @@
 # SUCH DAMAGE.
 #
 #      @(#)mktokens    8.1 (Berkeley) 5/31/93
-# $FreeBSD: src/bin/sh/mktokens,v 1.12 2011/06/17 13:03:49 jilles Exp $
+# $FreeBSD: head/bin/sh/mktokens 223186 2011-06-17 13:03:49Z jilles $
 
 # The following is a list of tokens.  The second column is nonzero if the
 # token marks the end of a list.  The third column is the name to print in
index a8c5305..ae20522 100644 (file)
@@ -31,7 +31,7 @@
  * SUCH DAMAGE.
  *
  *     @(#)myhistedit.h        8.2 (Berkeley) 5/4/95
- * $FreeBSD: src/bin/sh/myhistedit.h,v 1.14 2012/01/01 22:17:12 jilles Exp $
+ * $FreeBSD: head/bin/sh/myhistedit.h 229220 2012-01-01 22:17:12Z jilles $
  */
 
 #include <histedit.h>
index f022b56..c676e44 100644 (file)
@@ -34,7 +34,7 @@
  * SUCH DAMAGE.
  *
  * @(#)mystring.c      8.2 (Berkeley) 5/4/95
- * $FreeBSD: src/bin/sh/mystring.c,v 1.15 2012/01/01 22:15:38 jilles Exp $
+ * $FreeBSD: head/bin/sh/mystring.c 229219 2012-01-01 22:15:38Z jilles $
  */
 
 /*
index 6c876b9..6e5abc2 100644 (file)
@@ -34,7 +34,7 @@
  * SUCH DAMAGE.
  *
  *     @(#)mystring.h  8.2 (Berkeley) 5/4/95
- * $FreeBSD: src/bin/sh/mystring.h,v 1.9 2012/01/01 22:15:38 jilles Exp $
+ * $FreeBSD: head/bin/sh/mystring.h 229219 2012-01-01 22:15:38Z jilles $
  */
 
 #include <string.h>
index 9457e04..61fc65a 100644 (file)
@@ -34,7 +34,7 @@
  * SUCH DAMAGE.
  *
  *     @(#)nodes.c.pat 8.2 (Berkeley) 5/4/95
- * $FreeBSD: src/bin/sh/nodes.c.pat,v 1.18 2010/10/13 22:18:03 obrien Exp $
+ * $FreeBSD: head/bin/sh/nodes.c.pat 213811 2010-10-13 22:18:03Z obrien $
  */
 
 #include <sys/param.h>
index f2475a1..a0915b7 100644 (file)
@@ -34,7 +34,7 @@
 # SUCH DAMAGE.
 #
 #      @(#)nodetypes   8.2 (Berkeley) 5/4/95
-# $FreeBSD: src/bin/sh/nodetypes,v 1.12 2011/06/18 23:58:59 jilles Exp $
+# $FreeBSD: head/bin/sh/nodetypes 246288 2013-02-03 15:54:57Z jilles $
 
 # This file describes the nodes used in parse trees.  Unindented lines
 # contain a node type followed by a structure tag.  Subsequent indented
@@ -142,6 +142,7 @@ NXHERE nhere                        # fd<<!
        next      nodeptr               # next redirection in list
        fd        int                   # file descriptor being redirected
        doc       nodeptr               # input to command (NARG node)
+       expdoc    temp  char *expdoc    # actual document (for NXHERE)
 
 NNOT nnot                      # ! command  (actually pipeline)
        type    int
index b3cb352..1bffcf3 100644 (file)
@@ -34,7 +34,7 @@
  * SUCH DAMAGE.
  *
  * @(#)options.c       8.2 (Berkeley) 5/4/95
- * $FreeBSD: src/bin/sh/options.c,v 1.38 2011/11/20 21:48:50 jilles Exp $
+ * $FreeBSD: head/bin/sh/options.c 240247 2012-09-08 19:24:03Z jilles $
  */
 
 #include <signal.h>
@@ -532,10 +532,6 @@ out:
 }
 
 /*
- * XXX - should get rid of.  have all builtins use getopt(3).  the
- * library getopt must have the BSD extension static variable "optreset"
- * otherwise it can't be used within the shell safely.
- *
  * Standard option processing (a la getopt) for builtin routines.  The
  * only argument that is passed to nextopt is the option string; the
  * other arguments are unnecessary.  It return the character, or '\0' on
index ffa63a1..37d33e8 100644 (file)
@@ -34,7 +34,7 @@
  * SUCH DAMAGE.
  *
  *     @(#)options.h   8.2 (Berkeley) 5/4/95
- * $FreeBSD: src/bin/sh/options.h,v 1.17 2011/06/18 23:43:28 jilles Exp $
+ * $FreeBSD: head/bin/sh/options.h 223281 2011-06-18 23:43:28Z jilles $
  */
 
 struct shparam {
index 8951097..28836fc 100644 (file)
@@ -34,7 +34,7 @@
  * SUCH DAMAGE.
  *
  * @(#)output.c        8.2 (Berkeley) 5/4/95
- * $FreeBSD: src/bin/sh/output.c,v 1.28 2010/12/11 17:47:27 jilles Exp $
+ * $FreeBSD: head/bin/sh/output.c 244162 2012-12-12 22:01:10Z jilles $
  */
 
 /*
@@ -238,6 +238,20 @@ freestdout(void)
 }
 
 
+int
+outiserror(struct output *file)
+{
+       return (file->flags & OUTPUT_ERR);
+}
+
+
+void
+outclearerror(struct output *file)
+{
+       file->flags &= ~OUTPUT_ERR;
+}
+
+
 void
 outfmt(struct output *file, const char *fmt, ...)
 {
index 6aff4d3..fab2967 100644 (file)
@@ -34,7 +34,7 @@
  * SUCH DAMAGE.
  *
  *     @(#)output.h    8.2 (Berkeley) 5/4/95
- * $FreeBSD: src/bin/sh/output.h,v 1.19 2010/11/20 14:14:52 jilles Exp $
+ * $FreeBSD: head/bin/sh/output.h 244162 2012-12-12 22:01:10Z jilles $
  */
 
 #ifndef OUTPUT_INCL
@@ -70,6 +70,8 @@ void emptyoutbuf(struct output *);
 void flushall(void);
 void flushout(struct output *);
 void freestdout(void);
+int outiserror(struct output *);
+void outclearerror(struct output *);
 void outfmt(struct output *, const char *, ...) __printflike(2, 3);
 void out1fmt(const char *, ...) __printflike(1, 2);
 void out2fmt_flush(const char *, ...) __printflike(1, 2);
index 112b854..d4031ab 100644 (file)
@@ -34,7 +34,7 @@
  * SUCH DAMAGE.
  *
  * @(#)parser.c        8.7 (Berkeley) 5/16/95
- * $FreeBSD: src/bin/sh/parser.c,v 1.115 2011/06/18 23:58:59 jilles Exp $
+ * $FreeBSD: head/bin/sh/parser.c 245382 2013-01-13 19:26:33Z jilles $
  */
 
 #include <stdio.h>
@@ -239,9 +239,9 @@ list(int nlflag, int erflag)
                n2 = andor();
                tok = readtoken();
                if (tok == TBACKGND) {
-                       if (n2->type == NPIPE) {
+                       if (n2 != NULL && n2->type == NPIPE) {
                                n2->npipe.backgnd = 1;
-                       } else if (n2->type == NREDIR) {
+                       } else if (n2 != NULL && n2->type == NREDIR) {
                                n2->type = NBACKGND;
                        } else {
                                n3 = (union node *)stalloc(sizeof (struct nredir));
@@ -285,7 +285,8 @@ list(int nlflag, int erflag)
                                tokpushback++;
                        }
                        checkkwd = CHKNL | CHKKWD | CHKALIAS;
-                       if (!nlflag && !erflag && tokendlist[peektoken()])
+                       if (!nlflag && (erflag ? peektoken() == TEOF :
+                           tokendlist[peektoken()]))
                                return ntop;
                        break;
                case TEOF:
index c0d5fdd..bd2fa90 100644 (file)
@@ -34,7 +34,7 @@
  * SUCH DAMAGE.
  *
  *     @(#)parser.h    8.3 (Berkeley) 5/4/95
- * $FreeBSD: src/bin/sh/parser.h,v 1.18 2011/06/09 23:12:23 jilles Exp $
+ * $FreeBSD: head/bin/sh/parser.h 246507 2013-02-07 21:24:10Z jilles $
  */
 
 /* control characters in argument strings */
@@ -43,7 +43,7 @@
 #define CTLENDVAR '\371'
 #define CTLBACKQ '\372'
 #define CTLQUOTE 01            /* ored with CTLBACKQ code if in quotes */
-/*     CTLBACKQ | CTLQUOTE == '\205' */
+/*     CTLBACKQ | CTLQUOTE == '\373' */
 #define        CTLARI  '\374'
 #define        CTLENDARI '\375'
 #define        CTLQUOTEMARK '\376'
index 52cdfcb..9a65f34 100644 (file)
@@ -34,7 +34,7 @@
  * SUCH DAMAGE.
  *
  * @(#)redir.c 8.2 (Berkeley) 5/4/95
- * $FreeBSD: src/bin/sh/redir.c,v 1.34 2011/02/04 22:47:55 jilles Exp $
+ * $FreeBSD: head/bin/sh/redir.c 246288 2013-02-03 15:54:57Z jilles $
  */
 
 #include <sys/types.h>
@@ -250,18 +250,23 @@ movefd:
 static int
 openhere(union node *redir)
 {
+       char *p;
        int pip[2];
        int len = 0;
 
        if (pipe(pip) < 0)
                error("Pipe call failed: %s", strerror(errno));
-       if (redir->type == NHERE) {
-               len = strlen(redir->nhere.doc->narg.text);
-               if (len <= PIPESIZE) {
-                       xwrite(pip[1], redir->nhere.doc->narg.text, len);
-                       goto out;
-               }
+
+       if (redir->type == NXHERE)
+               p = redir->nhere.expdoc;
+       else
+               p = redir->nhere.doc->narg.text;
+       len = strlen(p);
+       if (len <= PIPESIZE) {
+               xwrite(pip[1], p, len);
+               goto out;
        }
+
        if (forkshell(NULL, NULL, FORK_NOJOB) == 0) {
                close(pip[0]);
                signal(SIGINT, SIG_IGN);
@@ -269,10 +274,7 @@ openhere(union node *redir)
                signal(SIGHUP, SIG_IGN);
                signal(SIGTSTP, SIG_IGN);
                signal(SIGPIPE, SIG_DFL);
-               if (redir->type == NHERE)
-                       xwrite(pip[1], redir->nhere.doc->narg.text, len);
-               else
-                       expandhere(redir->nhere.doc, pip[1]);
+               xwrite(pip[1], p, len);
                _exit(0);
        }
 out:
index 5e6407c..47a79a8 100644 (file)
@@ -34,8 +34,7 @@
  * SUCH DAMAGE.
  *
  *     @(#)redir.h     8.2 (Berkeley) 5/4/95
- * $FreeBSD: src/bin/sh/redir.h,v 1.10 2004/04/06 20:06:51 markm Exp $
- * $DragonFly: src/bin/sh/redir.h,v 1.3 2007/01/14 05:48:08 pavalos Exp $
+ * $FreeBSD: head/bin/sh/redir.h 127958 2004-04-06 20:06:54Z markm $
  */
 
 /* flags passed to redirect */
index 6ad01ae..777fadc 100644 (file)
@@ -34,9 +34,9 @@
 .\" SUCH DAMAGE.
 .\"
 .\"    from: @(#)sh.1  8.6 (Berkeley) 5/4/95
-.\" $FreeBSD: src/bin/sh/sh.1,v 1.179 2012/05/13 14:16:04 joel Exp $
+.\" $FreeBSD: head/bin/sh/sh.1 245805 2013-01-22 18:02:58Z joel $
 .\"
-.Dd December 25, 2011
+.Dd January 22, 2013
 .Dt SH 1
 .Os
 .Sh NAME
@@ -142,10 +142,10 @@ variable to some file by placing the following line in the file
 .Pa .profile
 in the home directory,
 substituting for
-.Pa .shinit
+.Pa .shrc
 the filename desired:
 .Pp
-.Dl "ENV=$HOME/.shinit; export ENV"
+.Dl "ENV=$HOME/.shrc; export ENV"
 .Pp
 The first non-option argument specified on the command line
 will be treated as the
@@ -498,8 +498,9 @@ and backslash
 The backslash inside double quotes is historically weird.
 It remains literal unless it precedes the following characters,
 which it serves to quote:
+.Pp
 .Bl -column "XXX" "XXX" "XXX" "XXX" "XXX" -offset center -compact
-.It Li $ Ta Li ` Ta Li \&" Ta Li \e Ta Li \en
+.It Li $ Ta Li ` Ta Li \&" Ta Li \e Ta Li \en
 .El
 .It Backslash
 A backslash preserves the literal meaning of the following
@@ -659,8 +660,8 @@ The following redirection is often called a
 .Dq here-document .
 .Bd -unfilled -offset indent
 .Oo Ar n Oc Ns Li << Ar delimiter
-.D1 Ar here-doc-text
-.D1 ...
+.Ar here-doc-text
+.Ar ...
 .Ar delimiter
 .Ed
 .Pp
@@ -1175,6 +1176,20 @@ Assignments are expanded differently from other words:
 tilde expansion is also performed after the equals sign and after any colon
 and usernames are also terminated by colons,
 and field splitting and pathname expansion are not performed.
+.Pp
+This special expansion applies not only to assignments that form a simple
+command by themselves or precede a command word,
+but also to words passed to the
+.Ic export ,
+.Ic local
+or
+.Ic readonly
+built-in commands that have this form.
+For this, the builtin's name must be literal
+(not the result of an expansion)
+and may optionally be preceded by one or more literal instances of
+.Ic command
+without options.
 .Ss Positional Parameters
 A positional parameter is a parameter denoted by a number greater than zero.
 The shell sets these initially to the values of its command line
@@ -2215,10 +2230,6 @@ The shell maintains a hash table which remembers the locations of commands.
 With no arguments whatsoever, the
 .Ic hash
 command prints out the contents of this table.
-Entries which have not been looked at since the last
-.Ic cd
-command are marked with an asterisk;
-it is possible for these entries to be invalid.
 .Pp
 With arguments, the
 .Ic hash
@@ -2669,6 +2680,17 @@ Additionally, all environment variables are turned into shell variables
 at startup,
 which may affect the shell as described under
 .Sx Special Variables .
+.Sh FILES
+.Bl -tag -width "/etc/suid_profileXX" -compact
+.It Pa ~/.profile
+User's login profile.
+.It Pa /etc/profile
+System login profile.
+.It Pa /etc/shells
+Shell database.
+.It Pa /etc/suid_profile
+Privileged shell profile.
+.El
 .Sh EXIT STATUS
 Errors that are detected by the shell, such as a syntax error, will
 cause the shell to exit with a non-zero exit status.
@@ -2695,6 +2717,7 @@ will return the argument.
 .Xr umask 2 ,
 .Xr wctype 3 ,
 .Xr editrc 5 ,
+.Xr shells 5 ,
 .Xr script 7
 .Sh HISTORY
 A
index b3a094d..9776d59 100644 (file)
@@ -34,7 +34,7 @@
  * SUCH DAMAGE.
  *
  *     @(#)shell.h     8.2 (Berkeley) 5/4/95
- * $FreeBSD: src/bin/sh/shell.h,v 1.21 2010/10/13 22:18:03 obrien Exp $
+ * $FreeBSD: head/bin/sh/shell.h 218626 2011-02-12 23:44:05Z jilles $
  */
 
 #ifndef SHELL_H_
index 6d4a79e..0f3171b 100644 (file)
@@ -34,7 +34,7 @@
  * SUCH DAMAGE.
  *
  * @(#)show.c  8.3 (Berkeley) 5/4/95
- * $FreeBSD: src/bin/sh/show.c,v 1.27 2010/10/13 22:18:03 obrien Exp $
+ * $FreeBSD: head/bin/sh/show.c 213811 2010-10-13 22:18:03Z obrien $
  */
 
 #include <fcntl.h>
index d87bdf0..73460dd 100644 (file)
@@ -31,7 +31,7 @@
  * SUCH DAMAGE.
  *
  *     @(#)show.h      1.1 (Berkeley) 5/4/95
- * $FreeBSD: src/bin/sh/show.h,v 1.12 2009/12/24 18:41:14 jilles Exp $
+ * $FreeBSD: head/bin/sh/show.h 200956 2009-12-24 18:41:14Z jilles $
  */
 
 void showtree(union node *);
index e65a997..8814af7 100644 (file)
@@ -34,7 +34,7 @@
  * SUCH DAMAGE.
  *
  * @(#)trap.c  8.5 (Berkeley) 6/5/95
- * $FreeBSD: src/bin/sh/trap.c,v 1.48 2012/01/16 11:07:46 dumbbell Exp $
+ * $FreeBSD: head/bin/sh/trap.c 247720 2013-03-03 17:33:59Z jilles $
  */
 
 #include <signal.h>
@@ -72,7 +72,7 @@
 
 
 MKINIT char sigmode[NSIG];     /* current value of signal */
-int pendingsigs;               /* indicates some signal received */
+volatile sig_atomic_t pendingsig;      /* indicates some signal received */
 int in_dotrap;                 /* do we execute in a trap handler? */
 static char *volatile trap[NSIG];      /* trap handler commands */
 static volatile sig_atomic_t gotsig[NSIG];
@@ -367,6 +367,14 @@ ignoresig(int signo)
 }
 
 
+int
+issigchldtrapped(void)
+{
+
+       return (trap[SIGCHLD] != NULL && *trap[SIGCHLD] != '\0');
+}
+
+
 /*
  * Signal handler.
  */
@@ -379,22 +387,25 @@ onsig(int signo)
                return;
        }
 
-       if (signo != SIGCHLD || !ignore_sigchld)
-               gotsig[signo] = 1;
-       pendingsigs++;
-
        /* If we are currently in a wait builtin, prepare to break it */
-       if ((signo == SIGINT || signo == SIGQUIT) && in_waitcmd != 0)
-               breakwaitcmd = 1;
-       /*
-        * If a trap is set, not ignored and not the null command, we need
-        * to make sure traps are executed even when a child blocks signals.
-        */
-       if (Tflag &&
-           trap[signo] != NULL &&
-           ! (trap[signo][0] == '\0') &&
-           ! (trap[signo][0] == ':' && trap[signo][1] == '\0'))
+       if ((signo == SIGINT || signo == SIGQUIT) && in_waitcmd != 0) {
                breakwaitcmd = 1;
+               pendingsig = signo;
+       }
+
+       if (trap[signo] != NULL && trap[signo][0] != '\0' &&
+           (signo != SIGCHLD || !ignore_sigchld)) {
+               gotsig[signo] = 1;
+               pendingsig = signo;
+
+               /*
+                * If a trap is set, not ignored and not the null command, we
+                * need to make sure traps are executed even when a child
+                * blocks signals.
+                */
+               if (Tflag && !(trap[signo][0] == ':' && trap[signo][1] == '\0'))
+                       breakwaitcmd = 1;
+       }
 
 #ifndef NO_HISTORY
        if (signo == SIGWINCH)
@@ -415,6 +426,7 @@ dotrap(void)
 
        in_dotrap++;
        for (;;) {
+               pendingsig = 0;
                for (i = 1; i < NSIG; i++) {
                        if (gotsig[i]) {
                                gotsig[i] = 0;
@@ -442,7 +454,6 @@ dotrap(void)
                                        last_trapsig = i;
                                        savestatus = exitstatus;
                                        evalstring(trap[i], 0);
-                                       exitstatus = savestatus;
 
                                        /*
                                         * If such a command was not
@@ -451,9 +462,11 @@ dotrap(void)
                                         * trap action to have an effect
                                         * outside of it.
                                         */
-                                       if (prev_evalskip != 0) {
+                                       if (evalskip == 0 ||
+                                           prev_evalskip != 0) {
                                                evalskip  = prev_evalskip;
                                                skipcount = prev_skipcount;
+                                               exitstatus = savestatus;
                                        }
 
                                        if (i == SIGCHLD)
@@ -466,7 +479,6 @@ dotrap(void)
                        break;
        }
        in_dotrap--;
-       pendingsigs = 0;
 }
 
 
index 06a0d10..bd5fa1d 100644 (file)
  * SUCH DAMAGE.
  *
  *     @(#)trap.h      8.3 (Berkeley) 6/5/95
- * $FreeBSD: src/bin/sh/trap.h,v 1.16 2011/06/13 21:03:27 jilles Exp $
+ * $FreeBSD: head/bin/sh/trap.h 247206 2013-02-23 22:50:57Z jilles $
  */
 
-extern int pendingsigs;
+extern volatile sig_atomic_t pendingsig;
 extern int in_dotrap;
 extern volatile sig_atomic_t gotwinch;
 
@@ -45,6 +45,7 @@ void clear_traps(void);
 int have_traps(void);
 void setsignal(int);
 void ignoresig(int);
+int issigchldtrapped(void);
 void onsig(int);
 void dotrap(void);
 void setinteractive(int);
index 75657ee..db205d5 100644 (file)
@@ -34,7 +34,7 @@
  * SUCH DAMAGE.
  *
  * @(#)var.c   8.3 (Berkeley) 5/4/95
- * $FreeBSD: src/bin/sh/var.c,v 1.65 2012/02/04 23:29:07 jilles Exp $
+ * $FreeBSD: head/bin/sh/var.c 245689 2013-01-20 12:44:50Z jilles $
  */
 
 #include <unistd.h>
@@ -145,29 +145,11 @@ static int varequal(const char *, const char *);
 static struct var *find_var(const char *, struct var ***, int *);
 static int localevar(const char *);
 
-/*
- * Initialize the variable symbol tables and import the environment.
- */
-
-#ifdef mkinit
-INCLUDE "var.h"
-MKINIT char **environ;
-INIT {
-       char **envp;
-
-       initvar();
-       for (envp = environ ; *envp ; envp++) {
-               if (strchr(*envp, '=')) {
-                       setvareq(*envp, VEXPORT|VTEXTFIXED);
-               }
-       }
-}
-#endif
-
+extern char **environ;
 
 /*
- * This routine initializes the builtin variables.  It is called when the
- * shell is initialized.
+ * This routine initializes the builtin variables and imports the environment.
+ * It is called when the shell is initialized.
  */
 
 void
@@ -177,6 +159,7 @@ initvar(void)
        const struct varinit *ip;
        struct var *vp;
        struct var **vpp;
+       char **envp;
 
        for (ip = varinit ; (vp = ip->var) != NULL ; ip++) {
                if (find_var(ip->text, &vpp, &vp->name_len) != NULL)
@@ -200,6 +183,11 @@ initvar(void)
                fmtstr(ppid, sizeof(ppid), "%d", (int)getppid());
                setvarsafe("PPID", ppid, 0);
        }
+       for (envp = environ ; *envp ; envp++) {
+               if (strchr(*envp, '=')) {
+                       setvareq(*envp, VEXPORT|VTEXTFIXED);
+               }
+       }
 }
 
 /*
@@ -353,7 +341,7 @@ setvareq(char *s, int flags)
                 * a regular variable function callback, but why bother?
                 *
                 * Note: this assumes iflag is not set to 1 initially.
-                * As part of init(), this is called before arguments
+                * As part of initvar(), this is called before arguments
                 * are looked at.
                 */
                if ((vp == &vmpath || (vp == &vmail && ! mpathset())) &&
@@ -637,10 +625,11 @@ showvarscmd(int argc __unused, char **argv __unused)
  */
 
 int
-exportcmd(int argc, char **argv)
+exportcmd(int argc __unused, char **argv)
 {
        struct var **vpp;
        struct var *vp;
+       char **ap;
        char *name;
        char *p;
        char *cmdname;
@@ -648,26 +637,19 @@ exportcmd(int argc, char **argv)
        int flag = argv[0][0] == 'r'? VREADONLY : VEXPORT;
 
        cmdname = argv[0];
-       optreset = optind = 1;
-       opterr = 0;
        values = 0;
-       while ((ch = getopt(argc, argv, "p")) != -1) {
+       while ((ch = nextopt("p")) != '\0') {
                switch (ch) {
                case 'p':
                        values = 1;
                        break;
-               case '?':
-               default:
-                       error("unknown option: -%c", optopt);
                }
        }
-       argc -= optind;
-       argv += optind;
 
-       if (values && argc != 0)
+       if (values && *argptr != NULL)
                error("-p requires no arguments");
-       if (argc != 0) {
-               while ((name = *argv++) != NULL) {
+       if (*argptr != NULL) {
+               for (ap = argptr; (name = *ap) != NULL; ap++) {
                        if ((p = strchr(name, '=')) != NULL) {
                                p++;
                        } else {
index fbbba59..a81656c 100644 (file)
@@ -34,7 +34,7 @@
  * SUCH DAMAGE.
  *
  *     @(#)var.h       8.2 (Berkeley) 5/4/95
- * $FreeBSD: src/bin/sh/var.h,v 1.25 2012/02/04 23:12:14 jilles Exp $
+ * $FreeBSD: head/bin/sh/var.h 230998 2012-02-04 23:12:14Z jilles $
  */
 
 /*
index 724d50f..84556e5 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/Makefile,v 1.2 2010/10/12 18:20:38 obrien Exp $
+# $FreeBSD: head/tools/regression/bin/sh/Makefile 213738 2010-10-12 18:20:38Z obrien $
 
 # Allow one to specify the 'sh' to regress.
 SH?=   /bin/sh
index 3585833..52c5df2 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/alias.0,v 1.3 2009/03/22 21:12:00 stefanf Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/alias.0 190285 2009-03-22 21:12:00Z stefanf $
 set -e
 
 unalias -a
index 841c7bc..cc59b83 100644 (file)
@@ -1,3 +1,3 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/alias.1,v 1.1 2005/09/04 11:59:59 stefanf Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/alias.1 149781 2005-09-04 11:59:59Z stefanf $
 unalias -a
 alias foo
diff --git a/tools/regression/bin/sh/builtins/alias3.0 b/tools/regression/bin/sh/builtins/alias3.0
new file mode 100644 (file)
index 0000000..4f5a5b8
--- /dev/null
@@ -0,0 +1,12 @@
+# $FreeBSD: head/tools/regression/bin/sh/builtins/alias3.0 242767 2012-11-08 13:36:19Z jilles $
+set -e
+
+unalias -a
+alias foo=bar
+alias bar=
+alias quux="1 2 3"
+alias foo=bar
+alias bar=
+alias quux="1 2 3"
+alias
+alias foo
diff --git a/tools/regression/bin/sh/builtins/alias3.0.stdout b/tools/regression/bin/sh/builtins/alias3.0.stdout
new file mode 100644 (file)
index 0000000..52efaf0
--- /dev/null
@@ -0,0 +1,4 @@
+bar=''
+foo=bar
+quux='1 2 3'
+foo=bar
index e44a310..5841eea 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/break1.0,v 1.1 2010/08/15 21:06:53 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/break1.0 211349 2010-08-15 21:06:53Z jilles $
 
 if [ "$1" != nested ]; then
        while :; do
index 8722cde..352e5e4 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/break2.0,v 1.1 2010/08/18 20:26:50 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/break2.0 211467 2010-08-18 20:26:50Z jilles $
 
 # It is not immediately obvious that this should work, and someone probably
 # relies on it.
index 6236bab..0576019 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/break3.0,v 1.1 2010/08/22 11:04:30 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/break3.0 211612 2010-08-22 11:07:46Z jilles $
 
 # We accept this and people might rely on it.
 # However, various other shells do not accept it.
index a3e5bc5..62cd2e3 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/builtin1.0,v 1.1 2010/01/03 15:01:38 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/builtin1.0 201431 2010-01-03 15:01:38Z jilles $
 
 failures=0
 
index aa5a90e..4645d1a 100644 (file)
@@ -1,4 +1,4 @@
-#$FreeBSD: src/tools/regression/bin/sh/builtins/case1.0,v 1.1 2007/10/04 16:14:48 stefanf Exp $
+#$FreeBSD: head/tools/regression/bin/sh/builtins/case1.0 172440 2007-10-04 16:14:48Z stefanf $
 f()
 {
        false
index 9883ce5..e5b10cd 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/case10.0,v 1.1 2011/06/25 20:37:43 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/case10.0 223546 2011-06-25 20:37:43Z jilles $
 
 case ! in
 [\!!]) ;;
index 5d56b49..9803180 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/case11.0,v 1.1 2011/11/26 22:28:25 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/case11.0 228007 2011-11-26 22:28:25Z jilles $
 
 false
 case x in
index 70f0fc0..dcc8951 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/case12.0,v 1.1 2011/11/26 22:28:25 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/case12.0 228007 2011-11-26 22:28:25Z jilles $
 
 false
 case x in
index d1027b8..f887a8c 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/case13.0,v 1.1 2011/12/28 23:51:17 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/case13.0 228943 2011-12-28 23:51:17Z jilles $
 
 case ^ in
 [\^^]) ;;
index f2dc336..c30b838 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/case14.0,v 1.1 2012/01/15 20:04:05 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/case14.0 230154 2012-01-15 20:04:05Z jilles $
 
 case `false` in
 no) exit 3 ;;
index f7ee26f..aee8166 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/case15.0,v 1.1 2012/01/15 20:04:05 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/case15.0 230154 2012-01-15 20:04:05Z jilles $
 
 case x in
 `false`) exit 3 ;;
index 4cb6cf3..8d15b57 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/case16.0,v 1.1 2012/01/15 20:04:05 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/case16.0 230154 2012-01-15 20:04:05Z jilles $
 
 f() { return 42; }
 f
index cb65455..712e78d 100644 (file)
@@ -1,3 +1,3 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/case17.0,v 1.1 2012/01/15 21:39:38 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/case17.0 230161 2012-01-15 21:39:38Z jilles $
 
 ! case x in x) false ;& y) esac
index 263d619..7603aa7 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/case18.0,v 1.1 2012/01/15 21:39:38 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/case18.0 230161 2012-01-15 21:39:38Z jilles $
 
 case x$(false) in
 x)     ;&
index eb366dd..497d45e 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/case19.0,v 1.1 2012/01/15 21:39:38 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/case19.0 230161 2012-01-15 21:39:38Z jilles $
 
 [ "`case x in
 x)     false ;&
index c6bab2f..c113896 100644 (file)
@@ -1,5 +1,5 @@
 # Generated by ./test-fnmatch -s 1, do not edit.
-# $FreeBSD: src/tools/regression/bin/sh/builtins/case2.0,v 1.1 2010/05/09 16:15:40 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/case2.0 207821 2010-05-09 16:15:40Z jilles $
 failures=
 failed() { printf '%s\n' "Failed: $1 '$2' '$3'"; failures=x$failures; }
 testmatch() { eval "case \$2 in ''$1) ;; *) failed testmatch \"\$@\";; esac"; }
index 83d5835..240aa3d 100644 (file)
@@ -1,5 +1,5 @@
 # Generated by ./test-fnmatch -s 2, do not edit.
-# $FreeBSD: src/tools/regression/bin/sh/builtins/case3.0,v 1.1 2010/05/09 16:15:40 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/case3.0 207821 2010-05-09 16:15:40Z jilles $
 failures=
 failed() { printf '%s\n' "Failed: $1 '$2' '$3'"; failures=x$failures; }
 # We do not treat a backslash specially in this case,
index 066c584..5a7ef2b 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/case4.0,v 1.1 2011/04/15 15:14:58 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/case4.0 220654 2011-04-15 15:14:58Z jilles $
 
 set -- "*"
 case x in
index 6909fbe..203fd8e 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/case5.0,v 1.1 2011/05/08 11:32:20 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/case5.0 221646 2011-05-08 11:32:20Z jilles $
 
 unset LC_ALL
 LC_CTYPE=en_US.UTF-8
index cf3dbe1..02d2b43 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/case6.0,v 1.1 2011/06/12 12:27:17 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/case6.0 223007 2011-06-12 12:27:17Z jilles $
 
 unset LC_ALL
 LC_CTYPE=de_DE.ISO8859-1
index 1fa2c4a..e851911 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/case7.0,v 1.1 2011/06/12 12:55:46 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/case7.0 223011 2011-06-12 12:55:46Z jilles $
 
 # Character ranges in a locale other than the POSIX locale, not specified
 # by POSIX.
index 0d9aefb..d9f1b16 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/case8.0,v 1.1 2011/06/15 21:48:10 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/case8.0 223120 2011-06-15 21:48:10Z jilles $
 
 case aZ_ in
 [[:alpha:]_][[:upper:]_][[:alpha:]_]) ;;
index 19b18fd..bfeeacb 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/case9.0,v 1.1 2011/06/17 13:03:49 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/case9.0 223186 2011-06-17 13:03:49Z jilles $
 
 errors=0
 
index 3637c65..6fb958b 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/cd1.0,v 1.4 2010/10/11 23:24:57 obrien Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/cd1.0 228975 2011-12-30 00:04:11Z uqs $
 set -e
 
 P=${TMPDIR:-/tmp}
@@ -7,7 +7,7 @@ T=$(mktemp -d sh-test.XXXXXX)
 
 chmod 0 $T
 if [ `id -u` -ne 0 ]; then
-       # Root can always cd, irregardless of directory permissions.
+       # Root can always cd, regardless of directory permissions.
        cd -L $T 2>/dev/null && exit 1
        [ "$PWD" = "$P" ]
        [ "$(pwd)" = "$P" ]
index f1dbdc0..8e25cc0 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/cd2.0,v 1.2 2010/11/28 22:49:58 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/cd2.0 216019 2010-11-28 22:49:58Z jilles $
 set -e
 
 L=$(getconf PATH_MAX / 2>/dev/null) || L=4096
index f697d23..edbc567 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/cd3.0,v 1.1 2011/05/20 22:55:18 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/cd3.0 222154 2011-05-20 22:55:18Z jilles $
 
 # If fully successful, cd -Pe must be like cd -P.
 
index ea071e3..c8a2efc 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/cd4.0,v 1.1 2011/05/20 22:55:18 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/cd4.0 222154 2011-05-20 22:55:18Z jilles $
 
 # This test assumes that whatever mechanism cd -P uses to determine the
 # pathname to the current directory if it is longer than PATH_MAX requires
index d2421e4..146991a 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/cd5.0,v 1.1 2011/05/27 19:36:07 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/cd5.0 222379 2011-05-27 19:36:07Z jilles $
 
 set -e
 T=$(mktemp -d "${TMPDIR:-/tmp}/sh-test.XXXXXX")
index 664f11d..46ab136 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/cd6.0,v 1.1 2011/05/27 20:01:46 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/cd6.0 222381 2011-05-27 20:01:46Z jilles $
 
 set -e
 cd -P /bin
index 0a9c9d8..9fb5011 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/cd7.0,v 1.1 2011/05/27 20:01:46 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/cd7.0 222381 2011-05-27 20:01:46Z jilles $
 
 set -e
 cd /usr/bin
index 181235d..79f49cb 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/cd8.0,v 1.1 2012/01/13 23:32:27 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/cd8.0 230095 2012-01-13 23:32:27Z jilles $
 
 # The exact wording of the error message is not standardized, but giving
 # a description of the errno is useful.
index 01b6c5b..92c61d1 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/command1.0,v 1.1 2005/10/28 14:02:42 stefanf Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/command1.0 151797 2005-10-28 14:02:42Z stefanf $
 true() {
        false
 }
index 1a9c0e1..aa2a7d1 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/command10.0,v 1.1 2010/03/06 17:31:09 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/command10.0 204802 2010-03-06 17:31:09Z jilles $
 
 failures=0
 
index cd22a3c..0a7731f 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/command11.0,v 1.1 2010/03/14 14:24:35 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/command11.0 205154 2010-03-14 14:24:35Z jilles $
 
 failures=0
 
index 213b7a7..31d3f4d 100644 (file)
@@ -1,3 +1,3 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/command2.0,v 1.1 2005/10/28 14:02:42 stefanf Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/command2.0 151797 2005-10-28 14:02:42Z stefanf $
 PATH=
 command -p cat < /dev/null
index 9f0ddff..0c39d58 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/command3.0,v 1.2 2010/08/16 17:18:08 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/command3.0 211399 2010-08-16 17:18:08Z jilles $
 command -v ls
 command -v true
 command -v /bin/ls
index 266004f..98faf1c 100644 (file)
@@ -1,2 +1,2 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/command4.0,v 1.1 2010/08/29 20:53:24 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/command4.0 211973 2010-08-29 20:53:24Z jilles $
 ! command -v nonexisting
index 5744051..34408ca 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/command5.0,v 1.2 2010/08/16 17:18:08 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/command5.0 211399 2010-08-16 17:18:08Z jilles $
 command -V ls
 command -V true
 command -V /bin/ls
index eda5aef..784cdab 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/command6.0,v 1.3 2011/02/05 23:00:24 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/command6.0 218356 2011-02-05 23:00:24Z jilles $
 PATH=/var/empty
 case $(command -pV ls) in
 */var/empty/ls*)
index 92fff56..5e6a165 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/command7.0,v 1.2 2011/02/05 23:00:24 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/command7.0 218356 2011-02-05 23:00:24Z jilles $
 
 failures=0
 
index ee43085..fd56b47 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/command8.0,v 1.2 2010/10/12 18:20:38 obrien Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/command8.0 213738 2010-10-12 18:20:38Z obrien $
 IFS=,
 
 SPECIAL="break,\
index 9460f4b..e453031 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/command9.0,v 1.1 2010/03/06 17:09:22 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/command9.0 204801 2010-03-06 17:09:22Z jilles $
 
 failures=0
 
index 8caf6b0..454cd35 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/dot1.0,v 1.1 2010/05/28 22:08:34 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/dot1.0 208629 2010-05-28 22:08:34Z jilles $
 
 failures=
 failure() {
index 40808a9..ec5d2bb 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/dot2.0,v 1.1 2010/05/28 22:40:24 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/dot2.0 208630 2010-05-28 22:40:24Z jilles $
 
 failures=
 failure() {
index 7fd2175..f9f2a0b 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/dot3.0,v 1.1 2011/03/07 23:52:23 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/dot3.0 219390 2011-03-07 23:52:23Z jilles $
 
 # . should return 0 if no command was executed.
 
index 1c8467c..5e9d51a 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/dot4.0,v 1.1 2011/05/22 12:15:14 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/dot4.0 222174 2011-05-22 12:15:14Z jilles $
 
 v=abcd
 v=$v$v$v$v
index 388304f..4734f0c 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/eval1.0,v 1.1 2009/05/31 17:23:27 stefanf Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/eval1.0 193178 2009-05-31 17:23:27Z stefanf $
 set -e
 
 eval
index 83d5873..20fd15b 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/eval2.0,v 1.1 2009/06/24 20:22:54 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/eval2.0 194897 2009-06-24 20:22:54Z jilles $
 
 eval '
 false
index 227839c..f978982 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/eval3.0,v 1.1 2009/08/27 22:23:23 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/eval3.0 196607 2009-08-27 22:23:23Z jilles $
 
 eval 'false;' && exit 1
 eval 'true;' || exit 1
index 1311201..c5ec7e7 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/eval4.0,v 1.1 2010/08/01 22:39:07 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/eval4.0 210738 2010-08-01 22:39:07Z jilles $
 
 # eval should preserve $? from command substitutions when starting
 # the parsed command.
index 93ccf68..7612129 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/eval5.0,v 1.1 2010/08/03 22:17:29 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/eval5.0 210829 2010-08-03 22:17:29Z jilles $
 
 # eval should return 0 if no command was executed.
 eval $(false)
index 68f9606..a124c51 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/exec1.0,v 1.2 2010/10/12 18:20:38 obrien Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/exec1.0 213738 2010-10-12 18:20:38Z obrien $
 
 failures=
 failure() {
index 9042176..fac7099 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/exec2.0,v 1.2 2010/10/12 18:20:38 obrien Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/exec2.0 213738 2010-10-12 18:20:38Z obrien $
 
 failures=
 failure() {
index 74ea6ae..e70385f 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/exit1.0,v 1.1 2011/01/01 15:25:15 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/exit1.0 216871 2011-01-01 15:25:15Z jilles $
 
 # exit with an argument should overwrite the exit status in an EXIT trap.
 
index 8f45ec7..2b177eb 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/exit2.8,v 1.1 2011/01/08 23:00:38 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/exit2.8 217172 2011-01-08 23:00:38Z jilles $
 
 # exit without arguments is the same as exit $? outside a trap.
 
index 90d42b5..523c41e 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/exit3.0,v 1.1 2011/01/08 23:08:13 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/exit3.0 217175 2011-01-08 23:08:13Z jilles $
 
 # exit without arguments differs from exit $? in an EXIT trap.
 
index 8315699..8cc5e6a 100644 (file)
@@ -1,3 +1,3 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/export1.0,v 1.1 2011/06/17 10:21:24 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/export1.0 223183 2011-06-17 10:21:24Z jilles $
 
 env @badness=1 ${SH} -c 'v=`export -p`; eval "$v"'
index dd1e8a7..7793f1b 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/fc1.0,v 1.4 2010/10/12 18:20:38 obrien Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/fc1.0 213738 2010-10-12 18:20:38Z obrien $
 set -e
 trap 'echo Broken pipe -- test failed' PIPE
 
index c7cb66c..9ddaef9 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/fc2.0,v 1.3 2010/10/12 18:20:38 obrien Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/fc2.0 213738 2010-10-12 18:20:38Z obrien $
 set -e
 trap 'echo Broken pipe -- test failed' PIPE
 
index 8343cdb..732390d 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/for1.0,v 1.1 2011/10/28 23:02:21 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/for1.0 226892 2011-10-28 23:02:21Z jilles $
 
 false
 for i in `false`; do exit 3; done
index 2eef5a7..bb94c78 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/for2.0,v 1.1 2012/01/22 14:00:33 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/for2.0 230463 2012-01-22 14:00:33Z jilles $
 
 r=x
 f() { return 42; }
index dd0f952..0ed2759 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/for3.0,v 1.1 2012/01/22 14:00:33 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/for3.0 230463 2012-01-22 14:00:33Z jilles $
 
 r=x
 f() { return 42; }
index b7e565f..fbfb424 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/getopts1.0,v 1.3 2012/01/06 23:20:33 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/getopts1.0 229742 2012-01-06 23:20:33Z jilles $
 
 printf -- '-1-\n'
 set -- -abc
index a95ec83..a949246 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/getopts2.0,v 1.1 2008/08/27 20:26:34 stefanf Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/getopts2.0 182301 2008-08-27 20:26:34Z stefanf $
 set - -ax
 getopts ax option
 set -C
index 4f0ac3b..99a5e75 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/hash1.0,v 1.1 2005/09/05 09:42:09 stefanf Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/hash1.0 149791 2005-09-05 09:42:10Z stefanf $
 cat /dev/null
 hash
 hash -r
index 5b5f0a4..88e5a71 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/hash2.0,v 1.1 2005/09/05 09:42:09 stefanf Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/hash2.0 149791 2005-09-05 09:42:10Z stefanf $
 hash
 hash cat
 hash
index 7eaeea0..0ca270f 100644 (file)
@@ -1,3 +1,3 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/hash3.0,v 1.1 2005/09/05 09:42:09 stefanf Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/hash3.0 149791 2005-09-05 09:42:10Z stefanf $
 hash -v cat
 hash
index 5650500..ea76170 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/hash4.0,v 1.1 2012/02/11 21:06:45 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/hash4.0 231535 2012-02-11 21:06:45Z jilles $
 
 exec 3>&1
 m=`hash nosuchtool 2>&1 >&3`
index c6ce0b7..9970f8e 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/lineno.0,v 1.1 2008/05/15 19:58:44 stefanf Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/lineno.0 179023 2008-05-15 19:58:44Z stefanf $
 echo $LINENO
 echo $LINENO
 
diff --git a/tools/regression/bin/sh/builtins/local1.0 b/tools/regression/bin/sh/builtins/local1.0
new file mode 100644 (file)
index 0000000..a4cfa35
--- /dev/null
@@ -0,0 +1,13 @@
+# $FreeBSD: head/tools/regression/bin/sh/builtins/local1.0 238469 2012-07-15 10:22:13Z jilles $
+# A commonly used but non-POSIX builtin.
+
+f() {
+       local x
+       x=2
+       [ "$x" = 2 ]
+}
+x=1
+f || exit 3
+[ "$x" = 1 ] || exit 3
+f || exit 3
+[ "$x" = 1 ] || exit 3
index 2de987c..e97e710 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/locale1.0,v 1.2 2011/02/18 20:37:09 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/locale1.0 218819 2011-02-18 20:37:09Z jilles $
 # Note: this test depends on strerror() using locale.
 
 failures=0
index 288365b..0cf7bc0 100644 (file)
@@ -1,3 +1,3 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/printf1.0,v 1.1 2010/11/05 21:47:58 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/printf1.0 214853 2010-11-05 21:47:58Z jilles $
 
 [ "$(printf '%c\0%s%d' x '\' 010 | tr '\0' Z)" = 'xZ\8' ]
index bb776af..0238224 100644 (file)
@@ -1,3 +1,3 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/printf2.0,v 1.1 2010/11/05 21:47:58 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/printf2.0 214853 2010-11-05 21:47:58Z jilles $
 
 [ "$(printf '%cZ%s%d' x '\' 010)" = 'xZ\8' ]
index e4002d3..eee41b6 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/printf3.0,v 1.1 2010/12/20 23:06:57 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/printf3.0 216606 2010-12-20 23:06:57Z jilles $
 
 set -e
 v=$(! printf "%d" @wrong 2>/dev/null)
index 295f41c..1ea6369 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/printf4.0,v 1.1 2010/12/20 23:06:57 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/printf4.0 216606 2010-12-20 23:06:57Z jilles $
 
 set -e
 v=$(! printf "%d" 4wrong 2>/dev/null)
index 13376ad..283537f 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/read1.0,v 1.2 2009/03/22 23:00:52 stefanf Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/read1.0 190300 2009-03-22 23:00:52Z stefanf $
 set -e
 
 echo "1 2 3"           | { read a; echo "x${a}x"; }
index 9cea29a..450c864 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/read2.0,v 1.1 2010/09/03 21:17:33 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/read2.0 212187 2010-09-03 21:17:33Z jilles $
 
 set -e
 {
index 3bd56ca..060bf27 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/read3.0,v 1.1 2010/09/08 18:32:23 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/read3.0 212330 2010-09-08 18:32:23Z jilles $
 
 printf '%s\n' 'a\ b c' | { read a b; printf '%s\n' "x${a}x${b}x"; }
 printf '%s\n' 'a b\ c' | { read a b; printf '%s\n' "x${a}x${b}x"; }
index 1a82a2c..205b8a6 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/read4.0,v 1.1 2010/09/08 20:35:43 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/read4.0 212339 2010-09-08 20:35:43Z jilles $
 
 printf '%s\n' '\a\ b c'        | { read a b; printf '%s\n' "x${a}x${b}x"; }
 printf '%s\n' '\a b\ c'        | { read a b; printf '%s\n' "x${a}x${b}x"; }
index 5683b11..dcaabb6 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/read5.0,v 1.1 2011/02/18 20:51:13 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/read5.0 218821 2011-02-18 20:51:13Z jilles $
 
 unset LC_ALL
 LC_CTYPE=en_US.ISO8859-1
diff --git a/tools/regression/bin/sh/builtins/read6.0 b/tools/regression/bin/sh/builtins/read6.0
new file mode 100644 (file)
index 0000000..ad0b367
--- /dev/null
@@ -0,0 +1,5 @@
+# $FreeBSD: head/tools/regression/bin/sh/builtins/read6.0 247190 2013-02-23 15:15:41Z jilles $
+
+: | read x
+r=$?
+[ "$r" = 1 ]
index 9a08320..d122bf7 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/return1.0,v 1.1 2005/09/05 09:42:09 stefanf Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/return1.0 149791 2005-09-05 09:42:10Z stefanf $
 f() {
        return 0
        exit 1
index 3de71dd..3587c14 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/return2.1,v 1.1 2005/09/05 09:42:10 stefanf Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/return2.1 149791 2005-09-05 09:42:10Z stefanf $
 f() {
        true && return 1
        return 0
index 18eb37b..1f72866 100644 (file)
@@ -1,3 +1,3 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/return3.1,v 1.1 2005/09/05 09:42:10 stefanf Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/return3.1 149791 2005-09-05 09:42:10Z stefanf $
 return 1
 exit 0
index d535650..1a65bdc 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/return4.0,v 1.1 2010/05/28 22:08:34 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/return4.0 208629 2010-05-28 22:08:34Z jilles $
 
 failures=
 failure() {
index f192cc6..58c83c8 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/return5.0,v 1.1 2010/08/15 21:06:53 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/return5.0 211349 2010-08-15 21:06:53Z jilles $
 
 if [ "$1" != nested ]; then
        f() {
index aaa4907..adb73cd 100644 (file)
@@ -1,3 +1,3 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/return6.4,v 1.1 2010/09/11 15:07:40 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/return6.4 212475 2010-09-11 15:07:40Z jilles $
 
 while return 4; do exit 3; done
index 1765ac3..bc7fd64 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/return7.4,v 1.1 2010/09/11 15:07:40 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/return7.4 212475 2010-09-11 15:07:40Z jilles $
 
 f() {
        while return 4; do exit 3; done
index 2b3b55b..fc39fad 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/set1.0,v 1.2 2011/06/07 08:46:13 attilio Exp $
+# $FreeBSD$
 
 set +C
 set +f
index c7cc5cc..86fe2ff 100644 (file)
@@ -1,3 +1,3 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/set2.0,v 1.1 2011/06/17 10:21:24 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/set2.0 223183 2011-06-17 10:21:24Z jilles $
 
 ! env @badness=1 ${SH} -c 'v=`set`; eval "$v"' 2>&1 | grep @badness
index d18020c..dc1c7c9 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/trap1.0,v 1.2 2010/10/12 18:20:38 obrien Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/trap1.0 213738 2010-10-12 18:20:38Z obrien $
 
 test "$(trap 'echo trapped' EXIT; :)" = trapped || exit 1
 
index 6e67dbf..0968094 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/trap10.0,v 1.1 2012/01/16 11:07:46 dumbbell Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/trap10.0 230212 2012-01-16 11:07:46Z dumbbell $
 
 # Check that the return statement will not break the EXIT trap, ie. all
 # trap commands are executed before the script exits.
index 972c2ec..44e75ff 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/trap11.0,v 1.1 2012/01/16 11:07:46 dumbbell Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/trap11.0 230212 2012-01-16 11:07:46Z dumbbell $
 
 # Check that the return statement will not break the USR1 trap, ie. all
 # trap commands are executed before the script resumes.
diff --git a/tools/regression/bin/sh/builtins/trap12.0 b/tools/regression/bin/sh/builtins/trap12.0
new file mode 100644 (file)
index 0000000..fbb8181
--- /dev/null
@@ -0,0 +1,10 @@
+# $FreeBSD: head/tools/regression/bin/sh/builtins/trap12.0 247720 2013-03-03 17:33:59Z jilles $
+
+f() {
+       trap 'return 42' USR1
+       kill -USR1 $$
+       return 3
+}
+f
+r=$?
+[ "$r" = 42 ]
index 2b8366e..16b6c85 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/trap2.0,v 1.1 2009/06/19 22:15:59 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/trap2.0 194517 2009-06-19 22:15:59Z jilles $
 # This is really a test for outqstr(), which is readily accessible via trap.
 
 runtest()
index a0edc72..6df60b7 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/trap3.0,v 1.2 2011/02/20 14:18:58 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/trap3.0 218889 2011-02-20 14:18:58Z jilles $
 
 {
        trap '' garbage && exit 3
index 39d0cb7..51d22fc 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/trap4.0,v 1.1 2011/01/05 23:17:29 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/trap4.0 217035 2011-01-05 23:17:29Z jilles $
 
 T=$(mktemp -d ${TMPDIR:-/tmp}/sh-test.XXXXXX)
 trap 'rm -rf $T' 0
index 2ec256c..642104c 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/trap5.0,v 1.1 2011/01/15 21:09:00 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/trap5.0 217461 2011-01-15 21:09:00Z jilles $
 
 set -e
 trap - USR1
index 3d18966..5d2b3b9 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/trap6.0,v 1.1 2011/01/16 13:56:41 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/trap6.0 217472 2011-01-16 13:56:41Z jilles $
 
 v=$(
        ${SH} -c 'trap "echo ok; exit" USR1; kill -USR1 $$' &
index cb3433c..32c90cc 100644 (file)
@@ -1,3 +1,3 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/trap7.0,v 1.1 2011/01/27 23:08:20 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/trap7.0 217996 2011-01-27 23:08:20Z jilles $
 
 [ "$(trap 'echo trapped' EXIT)" = trapped ]
index 048fef8..91da2c6 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/trap8.0,v 1.1 2011/02/20 14:18:58 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/trap8.0 218889 2011-02-20 14:18:58Z jilles $
 
 # I am not sure if POSIX requires the shell to continue processing
 # further trap names in the same trap command after an invalid one.
index 4059db4..cb485e8 100644 (file)
@@ -1,3 +1,3 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/trap9.0,v 1.1 2012/01/16 10:59:44 dumbbell Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/trap9.0 230211 2012-01-16 10:59:44Z dumbbell $
 
 test "$(trap 'printf trap; echo ped' EXIT; f() { :; }; f)" = trapped || exit 1
index 438886b..e87e160 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/type1.0,v 1.1 2007/01/11 00:25:20 stefanf Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/type1.0 165931 2007-01-11 00:25:20Z stefanf $
 command -v not-here && exit 1
 command -v /not-here && exit 1
 command -V not-here && exit 1
index 3999534..0ff1830 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/type2.0,v 1.1 2009/12/31 17:44:24 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/type2.0 201344 2009-12-31 17:44:24Z jilles $
 
 failures=0
 
index cd275ac..8816395 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/unalias.0,v 1.1 2005/09/04 11:59:59 stefanf Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/unalias.0 149781 2005-09-04 11:59:59Z stefanf $
 set -e
 
 alias false=true
index 08f6946..ecdff8b 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/var-assign.0,v 1.2 2010/10/12 18:20:38 obrien Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/var-assign.0 213738 2010-10-12 18:20:38Z obrien $
 IFS=,
 
 SPECIAL="break,\
index e8a103f..cda8127 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/var-assign2.0,v 1.3 2010/10/12 18:20:38 obrien Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/var-assign2.0 213738 2010-10-12 18:20:38Z obrien $
 IFS=,
 
 SPECIAL="break,\
index 1030e6e..ddf85ff 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/wait1.0,v 1.1 2010/05/23 22:10:20 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/wait1.0 208476 2010-05-23 22:10:20Z jilles $
 
 failures=
 failure() {
index 36c587f..d2d6f6e 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/wait2.0,v 1.1 2010/05/23 22:10:20 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/wait2.0 208476 2010-05-23 22:10:20Z jilles $
 
 failures=
 failure() {
index ab34740..d87a816 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/builtins/wait3.0,v 1.1 2010/11/19 21:15:06 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/builtins/wait3.0 236771 2012-06-08 22:54:25Z jilles $
 
 failures=
 failure() {
@@ -15,7 +15,7 @@ for i in 1 2 3 4 5 6 7 8 9 10; do
 done
 exec 3>fifo1
 wait || failure $LINENO
-(echo >&3) 2>/dev/null && failure $LINENO
+(${SH} -c echo >&3) 2>/dev/null && failure $LINENO
 wait || failure $LINENO
 
 test -z "$failures"
diff --git a/tools/regression/bin/sh/builtins/wait4.0 b/tools/regression/bin/sh/builtins/wait4.0
new file mode 100644 (file)
index 0000000..96c23f1
--- /dev/null
@@ -0,0 +1,12 @@
+# $FreeBSD: head/tools/regression/bin/sh/builtins/wait4.0 247206 2013-02-23 22:50:57Z jilles $
+
+T=`mktemp -d ${TMPDIR:-/tmp}/sh-test.XXXXXX`
+trap 'rm -rf $T' 0
+cd $T || exit 3
+mkfifo fifo1
+trapped=
+trap trapped=1 QUIT
+{ kill -QUIT $$; sleep 1; exit 4; } >fifo1 &
+wait $! <fifo1
+r=$?
+[ "$r" -gt 128 ] && [ -n "$trapped" ]
diff --git a/tools/regression/bin/sh/builtins/wait5.0 b/tools/regression/bin/sh/builtins/wait5.0
new file mode 100644 (file)
index 0000000..f84fb42
--- /dev/null
@@ -0,0 +1,12 @@
+# $FreeBSD: head/tools/regression/bin/sh/builtins/wait5.0 247206 2013-02-23 22:50:57Z jilles $
+
+T=`mktemp -d ${TMPDIR:-/tmp}/sh-test.XXXXXX`
+trap 'rm -rf $T' 0
+cd $T || exit 3
+mkfifo fifo1
+trapped=
+trap trapped=1 QUIT
+{ kill -QUIT $$; sleep 1; exit 4; } >fifo1 &
+wait <fifo1
+r=$?
+[ "$r" -gt 128 ] && [ -n "$trapped" ]
diff --git a/tools/regression/bin/sh/builtins/wait6.0 b/tools/regression/bin/sh/builtins/wait6.0
new file mode 100644 (file)
index 0000000..6c3b809
--- /dev/null
@@ -0,0 +1,3 @@
+# $FreeBSD: head/tools/regression/bin/sh/builtins/wait6.0 248349 2013-03-15 20:29:31Z jilles $
+
+wait --
diff --git a/tools/regression/bin/sh/builtins/wait7.0 b/tools/regression/bin/sh/builtins/wait7.0
new file mode 100644 (file)
index 0000000..01ca019
--- /dev/null
@@ -0,0 +1,4 @@
+# $FreeBSD: head/tools/regression/bin/sh/builtins/wait7.0 248349 2013-03-15 20:29:31Z jilles $
+
+: &
+wait -- $!
index bb7b128..f2242c7 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/errors/assignment-error1.0,v 1.3 2010/10/12 18:20:38 obrien Exp $
+# $FreeBSD: head/tools/regression/bin/sh/errors/assignment-error1.0 213738 2010-10-12 18:20:38Z obrien $
 IFS=,
 
 SPECIAL="break,\
index b8507eb..1ce342a 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/errors/assignment-error2.0,v 1.1 2011/01/01 13:26:18 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/errors/assignment-error2.0 216870 2011-01-01 13:26:18Z jilles $
 
 set -e
 HOME=/
index a5fd585..935bebd 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/errors/backquote-error1.0,v 1.3 2010/10/12 18:20:38 obrien Exp $
+# $FreeBSD: head/tools/regression/bin/sh/errors/backquote-error1.0 213738 2010-10-12 18:20:38Z obrien $
 
 echo 'echo `for` echo ".BAD"CODE.' | ${SH} +m -i 2>&1 | grep -q BADCODE && exit 1
 exit 0
index b2075b5..0679e70 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/errors/backquote-error2.0,v 1.2 2010/10/12 18:20:38 obrien Exp $
+# $FreeBSD: head/tools/regression/bin/sh/errors/backquote-error2.0 213738 2010-10-12 18:20:38Z obrien $
 
 ${SH} -c 'echo `echo .BA"DCODE.`
 echo ".BAD"CODE.' 2>&1 | grep -q BADCODE && exit 1
index 1e41fd7..a35c15f 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/errors/bad-binary1.126,v 1.1 2011/02/05 12:54:59 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/errors/bad-binary1.126 218320 2011-02-05 12:54:59Z jilles $
 # Checking for binary "scripts" without magic number is permitted but not
 # required by POSIX. However, it is preferable to getting errors like
 # Syntax error: word unexpected (expecting ")")
index 4630388..a539503 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/errors/bad-keyword1.0,v 1.2 2010/12/12 21:18:16 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/errors/bad-keyword1.0 216398 2010-12-12 21:18:16Z jilles $
 
 echo ':; fi' | ${SH} -n 2>/dev/null && exit 1
 exit 0
index cab51eb..62f0605 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/errors/bad-parm-exp1.0,v 1.1 2006/11/05 18:41:23 stefanf Exp $
+# $FreeBSD: head/tools/regression/bin/sh/errors/bad-parm-exp1.0 164004 2006-11-05 18:41:23Z stefanf $
 false && {
        ${}
        ${foo/}
index 3df05dd..959eb85 100644 (file)
@@ -1,2 +1,2 @@
-# $FreeBSD: src/tools/regression/bin/sh/errors/bad-parm-exp2.2,v 1.1 2006/11/05 18:41:23 stefanf Exp $
+# $FreeBSD: head/tools/regression/bin/sh/errors/bad-parm-exp2.2 164004 2006-11-05 18:41:23Z stefanf $
 ${}
index ccf45a0..c0d21ba 100644 (file)
@@ -1,2 +1,2 @@
-# $FreeBSD: src/tools/regression/bin/sh/errors/bad-parm-exp3.2,v 1.1 2006/11/05 18:41:23 stefanf Exp $
+# $FreeBSD: head/tools/regression/bin/sh/errors/bad-parm-exp3.2 164004 2006-11-05 18:41:23Z stefanf $
 ${foo/}
index 7050181..7dcc1c5 100644 (file)
@@ -1,2 +1,2 @@
-# $FreeBSD: src/tools/regression/bin/sh/errors/bad-parm-exp4.2,v 1.1 2006/11/05 18:41:23 stefanf Exp $
+# $FreeBSD: head/tools/regression/bin/sh/errors/bad-parm-exp4.2 164004 2006-11-05 18:41:23Z stefanf $
 ${foo:@abc}
index 1243c89..f6d9d2e 100644 (file)
@@ -1,2 +1,2 @@
-# $FreeBSD: src/tools/regression/bin/sh/errors/bad-parm-exp5.2,v 1.1 2006/11/05 18:41:23 stefanf Exp $
+# $FreeBSD: head/tools/regression/bin/sh/errors/bad-parm-exp5.2 164004 2006-11-05 18:41:23Z stefanf $
 ${/}
index e214a4a..e5fb194 100644 (file)
@@ -1,2 +1,2 @@
-# $FreeBSD: src/tools/regression/bin/sh/errors/bad-parm-exp6.2,v 1.1 2011/05/04 21:49:34 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/errors/bad-parm-exp6.2 221461 2011-05-04 21:49:34Z jilles $
 ${#foo^}
index 57a9d7b..1d63778 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/errors/option-error.0,v 1.2 2010/10/12 18:20:38 obrien Exp $
+# $FreeBSD: head/tools/regression/bin/sh/errors/option-error.0 213738 2010-10-12 18:20:38Z obrien $
 IFS=,
 
 SPECIAL="break abc,\
index 028e384..68e4b4e 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/errors/redirection-error.0,v 1.2 2010/10/12 18:20:38 obrien Exp $
+# $FreeBSD: head/tools/regression/bin/sh/errors/redirection-error.0 213738 2010-10-12 18:20:38Z obrien $
 IFS=,
 
 SPECIAL="break,\
index 0e428cc..440d354 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/errors/redirection-error2.2,v 1.2 2010/10/12 18:20:38 obrien Exp $
+# $FreeBSD: head/tools/regression/bin/sh/errors/redirection-error2.2 213738 2010-10-12 18:20:38Z obrien $
 
 # sh should fail gracefully on this bad redirect
 ${SH} -c 'echo 1 >&$a' 2>/dev/null
index 931b5bb..b566a5e 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/errors/redirection-error3.0,v 1.2 2010/10/12 18:20:38 obrien Exp $
+# $FreeBSD: head/tools/regression/bin/sh/errors/redirection-error3.0 213738 2010-10-12 18:20:38Z obrien $
 IFS=,
 
 SPECIAL="break,\
index 2c55605..9251282 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/errors/redirection-error4.0,v 1.1 2010/03/13 22:53:17 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/errors/redirection-error4.0 205138 2010-03-13 22:53:17Z jilles $
 # A redirection error should not abort the shell if there is no command word.
 exec 2>/dev/null
 </var/empty/x
index b81f0da..48ddfe3 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/errors/redirection-error5.0,v 1.1 2010/03/14 13:51:12 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/errors/redirection-error5.0 205153 2010-03-14 13:51:12Z jilles $
 # A redirection error on a subshell should not abort the shell.
 exec 2>/dev/null
 ( echo bad ) </var/empty/x
index c6a9893..50c831b 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/errors/redirection-error6.0,v 1.1 2010/03/14 14:24:35 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/errors/redirection-error6.0 205154 2010-03-14 14:24:35Z jilles $
 # A redirection error on a compound command should not abort the shell.
 exec 2>/dev/null
 { echo bad; } </var/empty/x
index b5b9322..bbb4a05 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/errors/redirection-error7.0,v 1.1 2010/12/31 18:20:17 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/errors/redirection-error7.0 216851 2010-12-31 18:20:17Z jilles $
 
 ! dummy=$(
        exec 3>&1 >&2 2>&3
diff --git a/tools/regression/bin/sh/errors/write-error1.0 b/tools/regression/bin/sh/errors/write-error1.0
new file mode 100644 (file)
index 0000000..17f634e
--- /dev/null
@@ -0,0 +1,3 @@
+# $FreeBSD: head/tools/regression/bin/sh/errors/write-error1.0 244924 2013-01-01 12:48:24Z jilles $
+
+! echo >&- 2>/dev/null
index c801013..9d7e8c9 100644 (file)
@@ -1,3 +1,3 @@
-# $FreeBSD: src/tools/regression/bin/sh/execution/bg1.0,v 1.1 2011/04/25 20:54:12 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/execution/bg1.0 221027 2011-04-25 20:54:12Z jilles $
 
 : `false` &
index d201070..6b89870 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/execution/bg2.0,v 1.1 2011/04/25 20:54:12 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/execution/bg2.0 221027 2011-04-25 20:54:12Z jilles $
 
 f() { return 42; }
 f
index 9e26b66..8af5455 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/execution/bg3.0,v 1.1 2011/04/25 20:54:12 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/execution/bg3.0 221027 2011-04-25 20:54:12Z jilles $
 
 f() { return 42; }
 f
index 4f5f784..6e280b7 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/execution/bg4.0,v 1.1 2011/06/19 00:00:36 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/execution/bg4.0 223283 2011-06-19 00:00:36Z jilles $
 
 x=''
 : ${x:=1} &
index 5a81e80..f587386 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/execution/fork1.0,v 1.3 2011/02/19 13:22:18 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/execution/fork1.0 218850 2011-02-19 13:22:18Z jilles $
 
 shname=${SH%% *}
 shname=${shname##*/}
index 4611d25..0e429a2 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/execution/fork2.0,v 1.2 2010/10/12 18:20:38 obrien Exp $
+# $FreeBSD: head/tools/regression/bin/sh/execution/fork2.0 213738 2010-10-12 18:20:38Z obrien $
 
 result=$(${SH} -c '(/bin/sleep 1)& sleep 0.1; ps -p $! -o comm=; kill $!')
 test "$result" = sleep || exit 1
index db9a523..34938df 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/execution/fork3.0,v 1.1 2011/04/23 22:28:56 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/execution/fork3.0 220978 2011-04-23 22:28:56Z jilles $
 
 result=$(${SH} -c 'f() { ps -p $$ -o comm=; }; f')
 test "$result" = "ps"
index d53847b..cda231e 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/execution/func1.0,v 1.2 2010/10/12 18:20:38 obrien Exp $
+# $FreeBSD: head/tools/regression/bin/sh/execution/func1.0 213738 2010-10-12 18:20:38Z obrien $
 
 MALLOC_OPTIONS=J ${SH} -c 'g() { g() { :; }; :; }; g' &&
 MALLOC_OPTIONS=J ${SH} -c 'g() { unset -f g; :; }; g'
index 5607568..49718ea 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/execution/func2.0,v 1.2 2010/08/16 17:18:08 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/execution/func2.0 211399 2010-08-16 17:18:08Z jilles $
 # The empty pairs of braces here are to test that this does not cause a crash.
 
 f() { }
index 4b9cb0d..77699c2 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/execution/func3.0,v 1.2 2010/12/12 21:18:16 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/execution/func3.0 216398 2010-12-12 21:18:16Z jilles $
 
 # This may fail when parsing or when defining the function, or the definition
 # may silently do nothing. In no event may the function be executed.
index 9b7e6bf..08f9649 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/execution/hash1.0,v 1.1 2011/02/05 14:01:46 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/execution/hash1.0 218323 2011-02-05 14:01:46Z jilles $
 
 T=`mktemp -d "${TMPDIR:-/tmp}/sh-test.XXXXXXXX"` || exit
 trap 'rm -rf "${T}"' 0
index 78c6ccf..5896be4 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/execution/killed1.0,v 1.1 2011/01/18 21:18:31 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/execution/killed1.0 217557 2011-01-18 21:18:31Z jilles $
 # Sometimes the "Killed" message is not flushed soon enough and it
 # is redirected along with the output of a builtin.
 # Do not change the semicolon to a newline as it would hide the bug.
index 7d6b9c7..a5a5155 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/execution/killed2.0,v 1.1 2011/01/30 22:57:52 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/execution/killed2.0 218105 2011-01-30 22:57:52Z jilles $
 # Most shells print a message when a foreground job is killed by a signal.
 # POSIX allows this, provided the message is sent to stderr, not stdout.
 # Some trickery is needed to capture the message as redirecting stderr of
index 6e666c6..f2dba60 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/execution/path1.0,v 1.1 2011/01/09 21:07:30 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/execution/path1.0 217206 2011-01-09 21:07:30Z jilles $
 # Some builtins should not be overridable via PATH.
 
 set -e
index 63a4c3b..d790c95 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/execution/redir1.0,v 1.2 2010/08/16 22:23:19 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/execution/redir1.0 211408 2010-08-16 22:23:19Z jilles $
 trap ': $((brokenpipe+=1))' PIPE
 
 P=${TMPDIR:-/tmp}
index ba2f6a8..a691662 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/execution/redir2.0,v 1.3 2010/10/12 18:20:38 obrien Exp $
+# $FreeBSD: head/tools/regression/bin/sh/execution/redir2.0 213738 2010-10-12 18:20:38Z obrien $
 trap ': $((brokenpipe+=1))' PIPE
 
 P=${TMPDIR:-/tmp}
index 31e8ab6..1260d58 100644 (file)
@@ -1,3 +1,3 @@
-# $FreeBSD: src/tools/regression/bin/sh/execution/redir3.0,v 1.1 2010/10/24 19:56:34 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/execution/redir3.0 214289 2010-10-24 19:56:34Z jilles $
 
 3>&- 3>&-
index 7cde409..3ddbaaa 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/execution/redir4.0,v 1.1 2010/10/24 20:09:49 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/execution/redir4.0 214290 2010-10-24 20:09:49Z jilles $
 
 { echo bad 0>&3; } 2>/dev/null 3>/dev/null 3>&-
 exit 0
index 2de097d..0942652 100644 (file)
@@ -1,3 +1,3 @@
-# $FreeBSD: src/tools/regression/bin/sh/execution/redir5.0,v 1.1 2011/02/05 15:02:19 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/execution/redir5.0 218325 2011-02-05 15:02:19Z jilles $
 
 { (echo bad) >/dev/null; } </dev/null
index b50159a..8a72771 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/execution/redir6.0,v 1.1 2011/04/23 22:28:56 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/execution/redir6.0 220978 2011-04-23 22:28:56Z jilles $
 
 failures=0
 
index e99a356..948eaa7 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/execution/redir7.0,v 1.1 2011/04/23 22:28:56 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/execution/redir7.0 220978 2011-04-23 22:28:56Z jilles $
 
 failures=0
 
index c03d780..3503bc1 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/execution/set-n1.0,v 1.1 2011/06/03 21:17:42 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/execution/set-n1.0 222661 2011-06-03 21:17:42Z jilles $
 
 v=$( ($SH -n <<'EOF'
 for
index b294829..239b88d 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/execution/set-n2.0,v 1.1 2011/06/03 21:17:42 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/execution/set-n2.0 222661 2011-06-03 21:17:42Z jilles $
 
 $SH -n <<'EOF'
 echo bad
index 1a99f2b..2a402f7 100644 (file)
@@ -1,4 +1,4 @@
-# $FreeBSD: src/tools/regression/bin/sh/execution/set-n3.0,v 1.1 2011/06/03 21:17:42 jilles Exp $
+# $FreeBSD: head/tools/regression/bin/sh/execution/set-n3.0 222661 2011-06-03 21:17:42Z jilles $
 
 v=$( ($SH -nc 'for') 2>&1 >/dev/null)
 [ $? -ne 0 ] && [ -n "$v" ]