busybox/shell
Denys Vlasenko 9b67dde8cd ash: redir: Retry open on EINTR
Upstream commit:

    Date: Thu, 28 May 2020 21:31:45 +1000
    redir: Retry open64 on EINTR

    It is possible for open64 to block on named pipes, and therefore
    it can be interrupted by signals and return EINTR.  We should only
    let it fail with EINTR if real signals are pending (i.e., it should
    not fail on SIGCHLD if SIGCHLD has not been trapped).

    This patch adds a new helper sh_open to retry the open64 call if
    necessary.  It also calls sh_error when appropriate.

    Fixes: 3800d4934391 ("[JOBS] Fix dowait signal race")

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
2025-08-09 20:17:31 +02:00
..
ash_test ash: redir: Retry open on EINTR 2025-08-09 20:17:31 +02:00
hush_test ash: redir: Retry open on EINTR 2025-08-09 20:17:31 +02:00
ash.c ash: redir: Retry open on EINTR 2025-08-09 20:17:31 +02:00
ash_doc.txt
ash_ptr_hack.c
ash_remove_unnecessary_code_in_backquote_expansion.patch ash: save Ron's patch from oblivion 2021-06-06 13:01:25 +02:00
brace.txt
Config.src shell: update HISTFILESIZE code to be actually useful 2025-07-03 19:10:42 +02:00
cttyhack.c Update applet size estimates 2023-07-10 17:25:21 +02:00
hush.c ash: eval: Add vfork support 2025-08-09 17:36:18 +02:00
hush_doc.txt
hush_leaktool.sh hush: fix memory leak caused by compiler optimizing out a store 2025-08-03 20:42:52 +02:00
Kbuild.src
match.c style fix 2022-05-01 17:06:00 +02:00
match.h
math.c shell/math: avoid $((3**999999999999999999)) to take years 2023-07-02 19:32:12 +02:00
math.h shell/math: change ?: nesting code to not have 63 level nesting limitation 2023-06-17 11:03:02 +02:00
random.c whitespace fixes 2018-07-17 15:04:17 +02:00
random.h
README
README.job
shell_common.c shell: fix race between signal handlers setting bb_got_signal and poll() 2025-07-02 22:42:47 +02:00
shell_common.h shell: move varcmp() to shell_common.h and use it in hush 2023-06-17 21:13:13 +02:00

http://www.opengroup.org/onlinepubs/9699919799/
Open Group Base Specifications Issue 7


http://www.opengroup.org/onlinepubs/9699919799/utilities/V3_chap01.html
Shell & Utilities

It says that any of the standard utilities may be implemented
as a regular shell built-in. It gives a list of utilities which
are usually implemented that way (and some of them can only
be implemented as built-ins, like "alias"):

alias
bg
cd
command
false
fc
fg
getopts
jobs
kill
newgrp
pwd
read
true
umask
unalias
wait


http://www.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html
Shell Command Language

It says that shell must implement special built-ins. Special built-ins
differ from regular ones by the fact that variable assignments
done on special builtin are *PRESERVED*. That is,

VAR=VAL special_builtin; echo $VAR

should print VAL.

(Another distinction is that an error in special built-in should
abort the shell, but this is not such a critical difference,
and moreover, at least bash's "set" does not follow this rule,
which is even codified in autoconf configure logic now...)

List of special builtins:

. file
: [argument...]
break [n]
continue [n]
eval [argument...]
exec [command [argument...]]
exit [n]
export name[=word]...
export -p
readonly name[=word]...
readonly -p
return [n]
set [-abCefhmnuvx] [-o option] [argument...]
set [+abCefhmnuvx] [+o option] [argument...]
set -- [argument...]
set -o
set +o
shift [n]
times
trap n [condition...]
trap [action condition...]
unset [-fv] name...

In practice, no one uses this obscure feature - none of these builtins
gives any special reasons to play such dirty tricks.

However. This section also says that *function invocation* should act
similar to special built-in. That is, variable assignments
done on function invocation should be preserved after function invocation.

This is significant: it is not unthinkable to want to run a function
with some variables set to special values. But because of the above,
it does not work: variable will "leak" out of the function.