Allow defining nofork builtins from builtins.def and move always-safe ones there.

The generated code remains the same.

Reviewed by:	jilles
Differential Revision:	https://reviews.freebsd.org/D11042
This commit is contained in:
Bryan Drewery 2017-06-04 21:02:48 +00:00
parent eab4998278
commit 3ecb77f014
3 changed files with 62 additions and 18 deletions

View File

@ -41,6 +41,9 @@
# without job control.
# The -h flag specifies that this command is to be excluded from systems
# based on the NO_HISTORY compile-time symbol.
# The -n flag specifies that this command can safely be run in the same
# process when it is the only command in a command substitution. Some
# commands have special logic defined in safe_builtin().
# The -s flag specifies that this is a POSIX 'special built-in' command.
# The rest of the line specifies the command name or names used to run the
# command. The entry for bltincmd, which is run when the user does not specify
@ -48,43 +51,43 @@
#
# NOTE: bltincmd must come first!
bltincmd builtin
bltincmd -n builtin
aliascmd alias
bgcmd -j bg
bindcmd bind
breakcmd -s break -s continue
cdcmd cd chdir
commandcmd command
commandcmd -n command
dotcmd -s .
echocmd echo
echocmd -n echo
evalcmd -s eval
execcmd -s exec
exitcmd -s exit
letcmd let
exportcmd -s export -s readonly
#exprcmd expr
falsecmd false
falsecmd -n false
fgcmd -j fg
freebsd_wordexpcmd freebsd_wordexp
getoptscmd getopts
hashcmd hash
histcmd -h fc
jobidcmd jobid
jobscmd jobs
killcmd kill
jobidcmd -n jobid
jobscmd -n jobs
killcmd -n kill
localcmd local
printfcmd printf
pwdcmd pwd
printfcmd -n printf
pwdcmd -n pwd
readcmd read
returncmd -s return
setcmd -s set
setvarcmd setvar
shiftcmd -s shift
testcmd test [
timescmd -s times
testcmd -n test [
timescmd -n -s times
trapcmd -s trap
truecmd -s : true
typecmd type
truecmd -n -s : true
typecmd -n type
ulimitcmd ulimit
umaskcmd umask
unaliascmd unalias

View File

@ -800,11 +800,8 @@ xtracecommand(struct arglist *varlist, int argc, char **argv)
static int
safe_builtin(int idx, int argc, char **argv)
{
if (idx == BLTINCMD || idx == COMMANDCMD || idx == ECHOCMD ||
idx == FALSECMD || idx == JOBIDCMD || idx == JOBSCMD ||
idx == KILLCMD || idx == PRINTFCMD || idx == PWDCMD ||
idx == TESTCMD || idx == TIMESCMD || idx == TRUECMD ||
idx == TYPECMD)
/* Generated from builtins.def. */
if (safe_builtin_always(idx))
return (1);
if (idx == EXPORTCMD || idx == TRAPCMD || idx == ULIMITCMD ||
idx == UMASKCMD)

View File

@ -66,6 +66,9 @@ const unsigned char builtincmd[] = {'
awk '{ for (i = 2 ; i <= NF ; i++) {
if ($i == "-s") {
spc = 1;
} else if ($i == "-n") {
# Handled later for builtins.h
continue
} else {
printf "\t\"\\%03o\\%03o%s\"\n", length($i), (spc ? 128 : 0) + NR-1, $i
spc = 0;
@ -90,4 +93,45 @@ extern int (*const builtinfunc[])(int, char **);
extern const unsigned char builtincmd[];
'
awk '{ printf "int %s(int, char **);\n", $1}' $temp
# Build safe_builtin_always()
cat <<EOF
static inline int
safe_builtin_always(int idx)
{
EOF
awk '
BEGIN { printed = 0 }
{
for (i = 2 ; i <= NF ; i++) {
if ($i == "-s") {
continue
} else if ($i == "-n") {
nofork = 1;
} else {
if (nofork == 0) {
continue
}
if (printed == 1) {
printf " || \n\t "
} else {
printf "\tif ("
}
printf "idx == " toupper($1)
printed = 1
nofork = 0;
# Only need to check each once
break
}
}
}' $temp
cat << EOF
)
return (1);
return(0);
}
EOF
rm -f $temp