mirror of
git://git.code.sf.net/p/cdesktopenv/code
synced 2025-03-09 15:50:02 +00:00
command -x: tweak args list size detection (re: 9ddb45b1)
src/cmd/ksh93/features/externs: ARG_EXTRA_BYTES detection: - Improve detection of extra bytes per argument: on every loop iteration, recalculate the size of the environment while taking the amount extra bytes we're currently trying into account. Also count arguments (argv[]) as they are stored in the same buffer. On 64-bit Linux with glibc, this now detects 9 extra bytes per argument instead of 8. An odd number (literally and figuratively) but apparently it needs it; I do think my method is correct now. On 64-bit Solaris and macOS, this still detects 8 extra bytes. (On 64-bit Linux with musl C library, it detects 0 bytes. Nice.) src/cmd/ksh93/sh/path.c: path_xargs(): - Remove the kludge subtracting twice the size of the environment. With the feature test fixed, this should no longer fail on Linux. - Take into account the size of the final null element in the argument and environment lists. src/cmd/ksh93/tests/path.sh: - Do not use awk for the test due to breakage in the system awks on Solaris/Illumos (hangs) and AIX & UnixWare (drops arguments). Instead, use (wait for it...) ksh. It's a bit slower, but works.
This commit is contained in:
parent
8c1e9971a7
commit
6f6b22016a
3 changed files with 31 additions and 22 deletions
|
|
@ -17,8 +17,8 @@ tst note{ determining extra bytes per argument for arguments list }end output{
|
|||
* Figure out if this OS requires extra bytes per argument
|
||||
* in the arguments list of a process.
|
||||
* Outputs an appropriate #define ARG_EXTRA_BYTES.
|
||||
* Without this, 'command -x' failed with E2BIG on macOS and Linux even
|
||||
* if all the arguments should fit in ARG_MAX based on their length.
|
||||
* Without this, 'command -x' failed with E2BIG on macOS, Linux and Solaris
|
||||
* even if all the arguments should fit in ARG_MAX based on their length.
|
||||
*/
|
||||
|
||||
/* AST includes */
|
||||
|
|
@ -43,20 +43,25 @@ tst note{ determining extra bytes per argument for arguments list }end output{
|
|||
|
||||
int main(int argc,char *argv[])
|
||||
{
|
||||
int extra_bytes = 0, envlen = 0, argmax, i;
|
||||
int extra_bytes = 0, envlen, argmax, i;
|
||||
pid_t childpid;
|
||||
|
||||
error_info.id="ARG_EXTRA_BYTES test (parent)";
|
||||
for(i=0; environ[i]; i++)
|
||||
envlen += strlen(environ[i]) + 1;
|
||||
argmax = strtoimax(astconf("ARG_MAX",NiL,NiL),NiL,0) - 2 * envlen;
|
||||
if (argmax < 2048)
|
||||
{
|
||||
error(ERROR_ERROR|2, "argmax too small");
|
||||
return 1;
|
||||
}
|
||||
while(1)
|
||||
{
|
||||
envlen = 0;
|
||||
for(i=0; argv[i]; i++)
|
||||
envlen += strlen(argv[i]) + 1 + extra_bytes;
|
||||
envlen += 1 + extra_bytes; /* final null element */
|
||||
for(i=0; environ[i]; i++)
|
||||
envlen += strlen(environ[i]) + 1 + extra_bytes;
|
||||
envlen += 1 + extra_bytes; /* final null element */
|
||||
argmax = strtoimax(astconf("ARG_MAX",NiL,NiL),NiL,0) - envlen;
|
||||
if (argmax < 2048)
|
||||
{
|
||||
error(ERROR_ERROR|2, "argmax too small");
|
||||
return 1;
|
||||
}
|
||||
if(!(childpid = fork()))
|
||||
{
|
||||
/* child */
|
||||
|
|
@ -122,5 +127,5 @@ tst note{ determining extra bytes per argument for arguments list }end output{
|
|||
return 0;
|
||||
}
|
||||
}end fail{
|
||||
echo "#define ARG_EXTRA_BYTES 8 /* BUG: test failed; assuming 8 */"
|
||||
echo "#define ARG_EXTRA_BYTES 16 /* BUG: test failed; assuming 16 */"
|
||||
}end
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue