diff options
author | jilles <jilles@FreeBSD.org> | 2009-11-22 14:04:20 +0000 |
---|---|---|
committer | jilles <jilles@FreeBSD.org> | 2009-11-22 14:04:20 +0000 |
commit | 20812b17e03ee11696a188bf6ff7052d42c72df8 (patch) | |
tree | 0ba1f228ffeefae0838e106fccaf6a76f2040cce /bin/sh/input.c | |
parent | 9b1c5e3514335e3055a2653349323a1a8a9220c0 (diff) | |
download | FreeBSD-src-20812b17e03ee11696a188bf6ff7052d42c72df8.zip FreeBSD-src-20812b17e03ee11696a188bf6ff7052d42c72df8.tar.gz |
sh: Ensure the same command input file is on top after executing a builtin.
This avoids weirdness when 'fc -e vi' or the like is done and there is a
syntax error in the file. Formerly an interactive shell tried to execute
stuff after the syntax error and exited.
This should also avoid similar issues with 'command eval' and 'command .'
when 'command' is implemented properly as in NetBSD sh.
Special builtins did not have this problem since errors in them cause the
shell to exit or to reset various state such as the current command input
file.
Diffstat (limited to 'bin/sh/input.c')
-rw-r--r-- | bin/sh/input.c | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/bin/sh/input.c b/bin/sh/input.c index 3d8f90c..548ae92 100644 --- a/bin/sh/input.c +++ b/bin/sh/input.c @@ -509,6 +509,32 @@ popfile(void) /* + * Return current file (to go back to it later using popfilesupto()). + */ + +struct parsefile * +getcurrentfile(void) +{ + return parsefile; +} + + +/* + * Pop files until the given file is on top again. Useful for regular + * builtins that read shell commands from files or strings. + * If the given file is not an active file, an error is raised. + */ + +void +popfilesupto(struct parsefile *file) +{ + while (parsefile != file && parsefile != &basepf) + popfile(); + if (parsefile != file) + error("popfilesupto() misused"); +} + +/* * Return to top level. */ |