-
Notifications
You must be signed in to change notification settings - Fork 32
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
command -x: fix efficiency; always run external cmd (re: acf84e9)
This commit fixes 'command -x' to adapt to OS limitations with regards to data alignment in the arguments list. A feature test is added that detects if the OS aligns the argument on 32-bit or 64-bit boundaries or not at all, allowing 'command -x' to avoid E2BIG errors while maximising efficiency. Also, as of now, 'command -x' is a way to bypass built-ins and run/query an external command. Built-ins do not limit the length of their argument list, so '-x' never made sense to use for them. And because '-x' hangs on Linux and macOS on every ksh93 release version to date (see acf84e9), few use it, so there is little reason not to make this change. Finally, this fixes a longstanding bug that caused the minimum exit status of 'command -x' to be 1 if a command with many arguments was divided into several command invocations. This is done by replacing broken flaggery with a new SH_XARG state flag bit. src/cmd/ksh93/features/externs: - Add new C feature test detecting byte alignment in args list. The test writes a #define ARG_ALIGN_BYTES with the amount of bytes the OS aligns arguments to, or zero for no alignment. src/cmd/ksh93/include/defs.h: - Add new SH_XARG state bit indicating 'command -x' is active. src/cmd/ksh93/sh/path.c: path_xargs(): - Leave extra 2k in the args buffer instead of 1k, just to be sure; some commands add large environment variables these days. - Fix a bug in subtracting the length of existing arguments and environment variables. 'size -= strlen(cp)-1;' subtracts one less than the size of cp, which makes no sense; what is necessary is to substract the length plus one to account for the terminating zero byte, i.e.: 'size -= strlen(cp)+1'. - Use the ARG_ALIGN_BYTES feature test result to match the OS's data alignment requirements. - path_spawn(): E2BIG: Change to checking SH_XARG state bit. src/cmd/ksh93/bltins/whence.c: b_command(): - Allow combining -x with -p, -v and -V with the expected results by setting P_FLAG to act like 'whence -p'. E.g., as of now, command -xv printf is equivalent to whence -p printf but note that 'whence' has no equivalent of 'command -pvx printf' which searches $(getconf PATH) for a command. - When -x will run a command, now set the new SH_XARG state flag. src/cmd/ksh93/sh/xec.c: sh_exec(): - Change to using the new SH_XARG state bit. - Skip the check for built-ins if SH_XARG is active, so that 'command -x' now always runs an external command. src/lib/libcmd/date.c, src/lib/libcmd/uname.c: - These path-bound builtins sometimes need to run the external system command by the same name, but they did that by hardcoding an unportable direct path. Now that 'command -x' runs an external command, change this to using 'command -px' to guarantee using the known-good external system utility in the default PATH. - In date.c, fix the format string passed to 'command -px date' when setting the date; it was only compatible with BSD systems. Use the POSIX variant on non-BSD systems.
- Loading branch information
Showing
12 changed files
with
241 additions
and
77 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.