Stop using .com extension in monorepo

The WIN32 CreateProcess() function does not require an .exe or .com
suffix in order to spawn an executable. Now that we have Cosmo bash
we're no longer so dependent on the cmd.exe prompt.
This commit is contained in:
Justine Tunney 2024-03-02 16:57:56 -08:00
parent c8383f25b4
commit a6baba1b07
No known key found for this signature in database
GPG key ID: BE714B4575D6E328
239 changed files with 2092 additions and 2244 deletions

View file

@ -6,90 +6,90 @@ PKGS += TEST_LIBC_PROC
TEST_LIBC_PROC_SRCS := $(wildcard test/libc/proc/*.c)
TEST_LIBC_PROC_SRCS_TEST = $(filter %_test.c,$(TEST_LIBC_PROC_SRCS))
TEST_LIBC_PROC_OBJS = \
TEST_LIBC_PROC_OBJS = \
$(TEST_LIBC_PROC_SRCS:%.c=o/$(MODE)/%.o)
TEST_LIBC_PROC_COMS = \
$(TEST_LIBC_PROC_SRCS:%.c=o/$(MODE)/%.com)
TEST_LIBC_PROC_COMS = \
$(TEST_LIBC_PROC_SRCS:%.c=o/$(MODE)/%)
TEST_LIBC_PROC_BINS = \
$(TEST_LIBC_PROC_COMS) \
TEST_LIBC_PROC_BINS = \
$(TEST_LIBC_PROC_COMS) \
$(TEST_LIBC_PROC_COMS:%=%.dbg)
TEST_LIBC_PROC_TESTS = \
$(TEST_LIBC_PROC_SRCS_TEST:%.c=o/$(MODE)/%.com.ok)
TEST_LIBC_PROC_TESTS = \
$(TEST_LIBC_PROC_SRCS_TEST:%.c=o/$(MODE)/%.ok)
TEST_LIBC_PROC_CHECKS = \
$(TEST_LIBC_PROC_SRCS_TEST:%.c=o/$(MODE)/%.com.runs)
TEST_LIBC_PROC_CHECKS = \
$(TEST_LIBC_PROC_SRCS_TEST:%.c=o/$(MODE)/%.runs)
TEST_LIBC_PROC_DIRECTDEPS = \
LIBC_CALLS \
LIBC_FMT \
LIBC_INTRIN \
LIBC_MEM \
LIBC_NEXGEN32E \
LIBC_NT_KERNEL32 \
LIBC_RUNTIME \
LIBC_PROC \
LIBC_STR \
LIBC_SYSV \
LIBC_TESTLIB \
LIBC_THREAD \
LIBC_X \
THIRD_PARTY_MUSL \
TEST_LIBC_PROC_DIRECTDEPS = \
LIBC_CALLS \
LIBC_FMT \
LIBC_INTRIN \
LIBC_MEM \
LIBC_NEXGEN32E \
LIBC_NT_KERNEL32 \
LIBC_RUNTIME \
LIBC_PROC \
LIBC_STR \
LIBC_SYSV \
LIBC_TESTLIB \
LIBC_THREAD \
LIBC_X \
THIRD_PARTY_MUSL \
THIRD_PARTY_TR
TEST_LIBC_PROC_DEPS := \
TEST_LIBC_PROC_DEPS := \
$(call uniq,$(foreach x,$(TEST_LIBC_PROC_DIRECTDEPS),$($(x))))
o/$(MODE)/test/libc/proc/proc.pkg: \
$(TEST_LIBC_PROC_OBJS) \
o/$(MODE)/test/libc/proc/proc.pkg: \
$(TEST_LIBC_PROC_OBJS) \
$(foreach x,$(TEST_LIBC_PROC_DIRECTDEPS),$($(x)_A).pkg)
o/$(MODE)/test/libc/proc/%.com.dbg: \
$(TEST_LIBC_PROC_DEPS) \
o/$(MODE)/test/libc/proc/%.o \
o/$(MODE)/test/libc/proc/proc.pkg \
o/$(MODE)/tool/build/echo.com.zip.o \
$(LIBC_TESTMAIN) \
$(CRT) \
o/$(MODE)/test/libc/proc/%.dbg: \
$(TEST_LIBC_PROC_DEPS) \
o/$(MODE)/test/libc/proc/%.o \
o/$(MODE)/test/libc/proc/proc.pkg \
o/$(MODE)/tool/build/echo.zip.o \
$(LIBC_TESTMAIN) \
$(CRT) \
$(APE_NO_MODIFY_SELF)
@$(APELINK)
o/$(MODE)/test/libc/proc/posix_spawn_test.com.runs: \
o/$(MODE)/test/libc/proc/posix_spawn_test.runs: \
private QUOTA += -M8192m
o/$(MODE)/test/libc/proc/posix_spawn_test.com.dbg: \
$(TEST_LIBC_PROC_DEPS) \
o/$(MODE)/test/libc/proc/posix_spawn_test.o \
o/$(MODE)/test/libc/proc/proc.pkg \
o/$(MODE)/tool/build/echo.com.zip.o \
o/$(MODE)/tool/build/cocmd.com.zip.o \
o/$(MODE)/test/libc/mem/prog/life.com.zip.o \
o/$(MODE)/test/libc/mem/prog/life.elf.zip.o \
o/$(MODE)/test/libc/proc/life-pe.com.zip.o \
$(LIBC_TESTMAIN) \
$(CRT) \
o/$(MODE)/test/libc/proc/posix_spawn_test.dbg: \
$(TEST_LIBC_PROC_DEPS) \
o/$(MODE)/test/libc/proc/posix_spawn_test.o \
o/$(MODE)/test/libc/proc/proc.pkg \
o/$(MODE)/tool/build/echo.zip.o \
o/$(MODE)/tool/build/cocmd.zip.o \
o/$(MODE)/test/libc/mem/prog/life.zip.o \
o/$(MODE)/test/libc/mem/prog/life.elf.zip.o \
o/$(MODE)/test/libc/proc/life-pe.zip.o \
$(LIBC_TESTMAIN) \
$(CRT) \
$(APE_NO_MODIFY_SELF)
@$(APELINK)
o/$(MODE)/test/libc/proc/system_test.com.dbg: \
$(TEST_LIBC_PROC_DEPS) \
o/$(MODE)/test/libc/proc/system_test.o \
o/$(MODE)/test/libc/proc/proc.pkg \
o/$(MODE)/tool/build/echo.com.zip.o \
o/$(MODE)/tool/build/cocmd.com.zip.o \
o/$(MODE)/tool/build/false.com.zip.o \
$(LIBC_TESTMAIN) \
$(CRT) \
o/$(MODE)/test/libc/proc/system_test.dbg: \
$(TEST_LIBC_PROC_DEPS) \
o/$(MODE)/test/libc/proc/system_test.o \
o/$(MODE)/test/libc/proc/proc.pkg \
o/$(MODE)/tool/build/echo.zip.o \
o/$(MODE)/tool/build/cocmd.zip.o \
o/$(MODE)/tool/build/false.zip.o \
$(LIBC_TESTMAIN) \
$(CRT) \
$(APE_NO_MODIFY_SELF)
@$(APELINK)
o/$(MODE)/test/libc/proc/execve_test.com.dbg: \
o/$(MODE)/test/libc/proc/execve_test.dbg: \
$(TEST_LIBC_PROC_DEPS) \
o/$(MODE)/test/libc/proc/execve_test.o \
o/$(MODE)/test/libc/calls/life-nomod.com.zip.o \
o/$(MODE)/test/libc/proc/execve_test_prog1.com.zip.o \
o/$(MODE)/test/libc/calls/life-nomod.zip.o \
o/$(MODE)/test/libc/proc/execve_test_prog1.zip.o \
o/$(MODE)/test/libc/mem/prog/life.elf.zip.o \
o/$(MODE)/test/libc/mem/prog/sock.elf.zip.o \
o/$(MODE)/test/libc/proc/proc.pkg \
@ -98,26 +98,26 @@ o/$(MODE)/test/libc/proc/execve_test.com.dbg: \
$(APE_NO_MODIFY_SELF)
@$(APELINK)
o/$(MODE)/test/libc/proc/fexecve_test.com.dbg: \
o/$(MODE)/test/libc/proc/fexecve_test.dbg: \
$(TEST_LIBC_PROC_DEPS) \
o/$(MODE)/test/libc/proc/fexecve_test.o \
o/$(MODE)/test/libc/proc/fexecve_test.o \
o/$(MODE)/test/libc/proc/proc.pkg \
o/$(MODE)/test/libc/mem/prog/life.elf.zip.o \
o/$(MODE)/test/libc/calls/life-nomod.com.zip.o \
o/$(MODE)/test/libc/calls/zipread.com.zip.o \
o/$(MODE)/test/libc/calls/life-nomod.zip.o \
o/$(MODE)/test/libc/calls/zipread.zip.o \
$(LIBC_TESTMAIN) \
$(CRT) \
$(APE_NO_MODIFY_SELF)
@$(APELINK)
o/$(MODE)/test/libc/proc/execve_test_prog1.com.zip.o \
o/$(MODE)/test/libc/proc/life-pe.com.zip.o: private \
ZIPOBJ_FLAGS += \
o/$(MODE)/test/libc/proc/execve_test_prog1.zip.o \
o/$(MODE)/test/libc/proc/life-pe.zip.o: private \
ZIPOBJ_FLAGS += \
-B
$(TEST_LIBC_PROC_OBJS): test/libc/proc/BUILD.mk
.PHONY: o/$(MODE)/test/libc/proc
o/$(MODE)/test/libc/proc: \
$(TEST_LIBC_PROC_BINS) \
o/$(MODE)/test/libc/proc: \
$(TEST_LIBC_PROC_BINS) \
$(TEST_LIBC_PROC_CHECKS)

View file

@ -51,8 +51,8 @@ void GenBuf(char buf[8], int x) {
TEST(execve, testArgPassing) {
int i;
char ibuf[12], buf[8];
const char *prog = "./execve_test_prog1.com";
testlib_extract("/zip/execve_test_prog1.com", prog, 0755);
const char *prog = "./execve_test_prog1";
testlib_extract("/zip/execve_test_prog1", prog, 0755);
for (i = 0; i < N; ++i) {
FormatInt32(ibuf, i);
GenBuf(buf, i);
@ -84,12 +84,12 @@ TEST(execve, ziposAPE) {
if (IsFreebsd()) return; // TODO: fixme on freebsd
if (IsLinux() && !__is_linux_2_6_23()) return; // TODO: fixme on old linux
if (!IsLinux() && !IsFreebsd()) {
EXPECT_EQ(-1, execve("/zip/life-nomod.com", (char *const[]){0},
(char *const[]){0}));
EXPECT_EQ(
-1, execve("/zip/life-nomod", (char *const[]){0}, (char *const[]){0}));
return;
}
SPAWN(fork);
execve("/zip/life-nomod.com", (char *const[]){0}, (char *const[]){0});
execve("/zip/life-nomod", (char *const[]){0}, (char *const[]){0});
kprintf("execve failed: %m\n");
EXITS(42);
}

View file

@ -102,9 +102,9 @@ TEST(fexecve, memfd_create) {
TEST(fexecve, APE) {
if (!IsLinux() && !IsFreebsd()) return;
testlib_extract("/zip/life-nomod.com", "life-nomod.com", 0555);
testlib_extract("/zip/life-nomod", "life-nomod", 0555);
SPAWN(fork);
int fd = open("life-nomod.com", O_RDONLY);
int fd = open("life-nomod", O_RDONLY);
ASSERT_NE(-1, fd);
fexecve(fd, (char *const[]){0}, (char *const[]){0});
EXITS(42);
@ -112,9 +112,9 @@ TEST(fexecve, APE) {
TEST(fexecve, APE_cloexec) {
if (!IsLinux() && !IsFreebsd()) return;
testlib_extract("/zip/life-nomod.com", "life-nomod.com", 0555);
testlib_extract("/zip/life-nomod", "life-nomod", 0555);
SPAWN(fork);
int fd = open("life-nomod.com", O_RDONLY | O_CLOEXEC);
int fd = open("life-nomod", O_RDONLY | O_CLOEXEC);
ASSERT_NE(-1, fd);
fexecve(fd, (char *const[]){0}, (char *const[]){0});
EXITS(42);
@ -132,7 +132,7 @@ TEST(fexecve, zipos) {
TEST(fexecve, ziposAPE) {
if (!IsLinux() && !IsFreebsd()) return;
int fd = open("/zip/life-nomod.com", O_RDONLY);
int fd = open("/zip/life-nomod", O_RDONLY);
ASSERT_NE(-1, fd);
SPAWN(fork);
fexecve(fd, (char *const[]){0}, (char *const[]){0});
@ -143,7 +143,7 @@ TEST(fexecve, ziposAPE) {
TEST(fexecve, ziposAPEHasZipos) {
if (1) return; // TODO: fixme
if (!IsLinux() && !IsFreebsd()) return;
int fd = open("/zip/zipread.com", O_RDONLY);
int fd = open("/zip/zipread", O_RDONLY);
ASSERT_NE(-1, fd);
SPAWN(fork);
ASSERT_NE(-1, fd);

View file

@ -29,7 +29,7 @@
void SetUp(void) {
if (getpriority(PRIO_PROCESS, getpid()) != 0) {
kprintf("getpriority_test.com must be launched at priority zero\n");
kprintf("getpriority_test must be launched at priority zero\n");
exit(0);
}
}

View file

@ -118,10 +118,10 @@ TEST(posix_spawn, self) {
TEST(posix_spawn, ape) {
int ws, pid;
char *prog = "./life.com";
char *prog = "./life";
char *args[] = {prog, 0};
char *envs[] = {0};
testlib_extract("/zip/life.com", prog, 0755);
testlib_extract("/zip/life", prog, 0755);
ASSERT_EQ(0, posix_spawn(&pid, prog, NULL, NULL, args, envs));
ASSERT_NE(-1, waitpid(pid, &ws, 0));
ASSERT_TRUE(WIFEXITED(ws));
@ -145,9 +145,9 @@ TEST(posix_spawn, elf) {
TEST(posix_spawn, pipe) {
char buf[10];
int p[2], pid, status;
const char *pn = "./echo.com";
const char *pn = "./echo";
posix_spawn_file_actions_t fa;
testlib_extract("/zip/echo.com", "echo.com", 0755);
testlib_extract("/zip/echo", "echo", 0755);
ASSERT_SYS(0, 0, pipe(p));
ASSERT_EQ(0, posix_spawn_file_actions_init(&fa));
ASSERT_EQ(0, posix_spawn_file_actions_addclose(&fa, p[0]));
@ -165,17 +165,17 @@ TEST(posix_spawn, pipe) {
TEST(posix_spawn, chdir) {
int ws, pid, p[2];
char buf[16] = {0};
char *args[] = {"cocmd.com", "-c", "cat hello.txt", 0};
char *args[] = {"cocmd", "-c", "cat hello.txt", 0};
char *envs[] = {0};
posix_spawn_file_actions_t fa;
testlib_extract("/zip/cocmd.com", "cocmd.com", 0755);
testlib_extract("/zip/cocmd", "cocmd", 0755);
ASSERT_SYS(0, 0, mkdir("subdir", 0777));
ASSERT_SYS(0, 0, xbarf("subdir/hello.txt", "hello\n", -1));
ASSERT_SYS(0, 0, pipe2(p, O_CLOEXEC));
ASSERT_EQ(0, posix_spawn_file_actions_init(&fa));
ASSERT_EQ(0, posix_spawn_file_actions_adddup2(&fa, p[1], 1));
ASSERT_EQ(0, posix_spawn_file_actions_addchdir_np(&fa, "subdir"));
ASSERT_EQ(0, posix_spawn(&pid, "../cocmd.com", &fa, 0, args, envs));
ASSERT_EQ(0, posix_spawn(&pid, "../cocmd", &fa, 0, args, envs));
ASSERT_EQ(0, posix_spawn_file_actions_destroy(&fa));
ASSERT_SYS(0, 0, close(p[1]));
ASSERT_NE(-1, waitpid(pid, &ws, 0));
@ -201,8 +201,8 @@ TEST(posix_spawn, torture) {
posix_spawn_file_actions_t fa;
signal(SIGUSR2, OhMyGoth);
sigfillset(&allsig);
if (!fileexists("echo.com")) {
testlib_extract("/zip/echo.com", "echo.com", 0755);
if (!fileexists("echo")) {
testlib_extract("/zip/echo", "echo", 0755);
}
// XXX: NetBSD doesn't seem to let us set the scheduler to itself ;_;
ASSERT_EQ(0, posix_spawnattr_init(&attr));
@ -220,10 +220,10 @@ TEST(posix_spawn, torture) {
for (int i = 0; i < n; ++i) {
char *volatile zzz = malloc(13);
volatile int fd = open("/dev/null", O_WRONLY);
char *args[] = {"./echo.com", NULL};
char *args[] = {"./echo", NULL};
char *envs[] = {NULL};
raise(SIGUSR2);
ASSERT_EQ(0, posix_spawn(&pid, "./echo.com", &fa, &attr, args, envs));
ASSERT_EQ(0, posix_spawn(&pid, "./echo", &fa, &attr, args, envs));
ASSERT_FALSE(__vforked);
ASSERT_NE(-1, waitpid(pid, &ws, 0));
EXPECT_FALSE(WIFSIGNALED(ws));
@ -246,7 +246,7 @@ void *Torturer(void *arg) {
TEST(posix_spawn, agony) {
int i, n = 4;
pthread_t *t = gc(malloc(sizeof(pthread_t) * n));
testlib_extract("/zip/echo.com", "echo.com", 0755);
testlib_extract("/zip/echo", "echo", 0755);
for (i = 0; i < n; ++i) {
ASSERT_EQ(0, pthread_create(t + i, 0, Torturer, 0));
}
@ -264,11 +264,11 @@ TEST(posix_spawn, etxtbsy) {
if (IsNetbsd()) return; // they don't appear impacted by this race condition
if (IsOpenbsd()) return; // they don't appear impacted by this race condition
int ws, me, pid, thief;
char *prog = "./life.com";
char *prog = "./life";
char *args[] = {prog, 0};
char *envs[] = {0};
sigset_t ss, old;
testlib_extract("/zip/life.com", prog, 0755);
testlib_extract("/zip/life", prog, 0755);
for (int i = 0; i < 2; ++i) {
sigemptyset(&ss);
sigaddset(&ss, SIGUSR1);
@ -382,22 +382,21 @@ BENCH(posix_spawn, bench) {
creat("tiny64", 0755);
write(3, kTinyLinuxExit, 128);
close(3);
testlib_extract("/zip/life.com", "life.com", 0755);
testlib_extract("/zip/life", "life", 0755);
testlib_extract("/zip/life.elf", "life.elf", 0755);
testlib_extract("/zip/life-pe.com", "life-pe.com", 0755);
testlib_extract("/zip/life-pe", "life-pe", 0755);
kprintf("%s %s (MODE=" MODE
" rss=%'zu tiny64=%'zu life.com=%'zu life.elf=%'zu)\n",
" rss=%'zu tiny64=%'zu life=%'zu life.elf=%'zu)\n",
__describe_os(), GetHost(), GetRss(), GetSize("tiny64"),
GetSize("life.com"), GetSize("life.elf"));
ForkExecveWait("./life.com");
EZBENCH2("posix_spawn life.com", donothing, PosixSpawnWait("./life.com"));
EZBENCH2("vfork life.com", donothing, VforkExecveWait("./life.com"));
EZBENCH2("fork life.com", donothing, ForkExecveWait("./life.com"));
GetSize("life"), GetSize("life.elf"));
ForkExecveWait("./life");
EZBENCH2("posix_spawn life", donothing, PosixSpawnWait("./life"));
EZBENCH2("vfork life", donothing, VforkExecveWait("./life"));
EZBENCH2("fork life", donothing, ForkExecveWait("./life"));
if (IsWindows()) {
EZBENCH2("posix_spawn life-pe.com", donothing,
PosixSpawnWait("./life-pe.com"));
EZBENCH2("vfork life-pe.com", donothing, VforkExecveWait("./life-pe.com"));
EZBENCH2("fork life-pe.com", donothing, ForkExecveWait("./life-pe.com"));
EZBENCH2("posix_spawn life-pe", donothing, PosixSpawnWait("./life-pe"));
EZBENCH2("vfork life-pe", donothing, VforkExecveWait("./life-pe"));
EZBENCH2("fork life-pe", donothing, ForkExecveWait("./life-pe"));
}
if (IsXnu() || IsWindows() || IsMetal()) return;
EZBENCH2("posix_spawn life.elf", donothing, PosixSpawnWait("./life.elf"));

View file

@ -21,7 +21,6 @@
#include "libc/dce.h"
#include "libc/intrin/kprintf.h"
#include "libc/mem/gc.h"
#include "libc/mem/gc.h"
#include "libc/paths.h"
#include "libc/runtime/runtime.h"
#include "libc/stdio/stdio.h"
@ -81,14 +80,14 @@ TEST(system, exit) {
}
TEST(system, testStdoutRedirect) {
testlib_extract("/zip/echo.com", "echo.com", 0755);
ASSERT_EQ(0, system("./echo.com hello >hello.txt"));
testlib_extract("/zip/echo", "echo", 0755);
ASSERT_EQ(0, system("./echo hello >hello.txt"));
EXPECT_STREQ("hello\n", gc(xslurp("hello.txt", 0)));
}
TEST(system, testStdoutRedirect_withSpacesInFilename) {
testlib_extract("/zip/echo.com", "echo.com", 0755);
ASSERT_EQ(0, system("./echo.com hello >\"hello there.txt\""));
testlib_extract("/zip/echo", "echo", 0755);
ASSERT_EQ(0, system("./echo hello >\"hello there.txt\""));
EXPECT_STREQ("hello\n", gc(xslurp("hello there.txt", 0)));
}
@ -109,10 +108,10 @@ TEST(system, testStderrRedirect_toStdout) {
buf[1] = 0;
buf[2] = 0;
buf[3] = 0;
testlib_extract("/zip/echo.com", "echo.com", 0755);
testlib_extract("/zip/echo", "echo", 0755);
ASSERT_NE(-1, dup2(1, 2));
success = false;
if (GETEXITSTATUS(system("./echo.com aaa 2>&1")) == 0) {
if (GETEXITSTATUS(system("./echo aaa 2>&1")) == 0) {
success = read(pipefd[0], buf, 4) == (4);
}
ASSERT_NE(-1, dup2(stderrBack, 2));
@ -176,17 +175,17 @@ TEST(system, kill) {
}
TEST(system, exitStatusPreservedAfterSemiColon) {
testlib_extract("/zip/false.com", "false.com", 0755);
testlib_extract("/zip/false", "false", 0755);
ASSERT_EQ(1, GETEXITSTATUS(system("false;")));
ASSERT_EQ(1, GETEXITSTATUS(system("false; ")));
ASSERT_EQ(1, GETEXITSTATUS(system("./false.com;")));
ASSERT_EQ(1, GETEXITSTATUS(system("./false.com;")));
ASSERT_EQ(1, GETEXITSTATUS(system("./false;")));
ASSERT_EQ(1, GETEXITSTATUS(system("./false;")));
CaptureStdout();
ASSERT_EQ(0, GETEXITSTATUS(system("false; echo $?")));
char buf[9] = {0};
ASSERT_EQ(2, read(pipefd[0], buf, 8));
ASSERT_STREQ("1\n", buf);
ASSERT_EQ(0, GETEXITSTATUS(system("./false.com; echo $?")));
ASSERT_EQ(0, GETEXITSTATUS(system("./false; echo $?")));
ASSERT_EQ(2, read(pipefd[0], buf, 8));
ASSERT_STREQ("1\n", buf);
ASSERT_EQ(0, GETEXITSTATUS(system("echo -n hi")));
@ -222,17 +221,17 @@ TEST(system, allowsLoneCloseCurlyBrace) {
ASSERT_EQ(5, read(pipefd[0], buf, 5));
ASSERT_STREQ("aaa}\n", buf);
bzero(buf, 6);
testlib_extract("/zip/echo.com", "echo.com", 0755);
ASSERT_EQ(0, GETEXITSTATUS(system("./echo.com \"aaa\"}")));
testlib_extract("/zip/echo", "echo", 0755);
ASSERT_EQ(0, GETEXITSTATUS(system("./echo \"aaa\"}")));
ASSERT_EQ(5, read(pipefd[0], buf, 5));
ASSERT_STREQ("aaa}\n", buf);
RestoreStdout();
}
TEST(system, glob) {
testlib_extract("/zip/echo.com", "echo.com", 0755);
ASSERT_EQ(0, system("./ec*.com aaa"));
ASSERT_EQ(0, system("./ec?o.com aaa"));
testlib_extract("/zip/echo", "echo", 0755);
ASSERT_EQ(0, system("./ec* aaa"));
ASSERT_EQ(0, system("./ec?o aaa"));
}
TEST(system, env) {
@ -253,8 +252,8 @@ TEST(system, env) {
TEST(system, pipelineCanOutputToFile) {
ASSERT_EQ(0, GETEXITSTATUS(system("echo hello | tr a-z A-Z >res")));
ASSERT_STREQ("HELLO\n", gc(xslurp("res", 0)));
testlib_extract("/zip/echo.com", "echo.com", 0755);
ASSERT_EQ(0, GETEXITSTATUS(system("./echo.com hello | tr a-z A-Z >res")));
testlib_extract("/zip/echo", "echo", 0755);
ASSERT_EQ(0, GETEXITSTATUS(system("./echo hello | tr a-z A-Z >res")));
ASSERT_STREQ("HELLO\n", gc(xslurp("res", 0)));
}
@ -267,11 +266,11 @@ TEST(system, pipelineCanOutputBackToSelf) {
ASSERT_EQ(0, GETEXITSTATUS(system("echo hello | exec tr a-z A-Z")));
ASSERT_SYS(0, 6, read(pipefd[0], buf, 16));
ASSERT_STREQ("HELLO\n", buf);
testlib_extract("/zip/echo.com", "echo.com", 0755);
ASSERT_EQ(0, GETEXITSTATUS(system("./echo.com hello | tr a-z A-Z")));
testlib_extract("/zip/echo", "echo", 0755);
ASSERT_EQ(0, GETEXITSTATUS(system("./echo hello | tr a-z A-Z")));
ASSERT_SYS(0, 6, read(pipefd[0], buf, 16));
ASSERT_STREQ("HELLO\n", buf);
ASSERT_EQ(0, GETEXITSTATUS(system("./echo.com hello | exec tr a-z A-Z")));
ASSERT_EQ(0, GETEXITSTATUS(system("./echo hello | exec tr a-z A-Z")));
ASSERT_SYS(0, 6, read(pipefd[0], buf, 16));
ASSERT_STREQ("HELLO\n", buf);
RestoreStdout();
@ -280,10 +279,10 @@ TEST(system, pipelineCanOutputBackToSelf) {
int system2(const char *);
BENCH(system, bench) {
testlib_extract("/zip/echo.com", "echo.com", 0755);
EZBENCH2("system cmd", donothing, system("./echo.com hi >/dev/null"));
testlib_extract("/zip/echo", "echo", 0755);
EZBENCH2("system cmd", donothing, system("./echo hi >/dev/null"));
EZBENCH2("systemvpe cmd", donothing,
systemvpe("./echo.com", (char *[]){"./echo.com", "hi", 0}, 0));
systemvpe("./echo", (char *[]){"./echo", "hi", 0}, 0));
EZBENCH2("cocmd echo", donothing, system("echo hi >/dev/null"));
EZBENCH2("cocmd exit", donothing, system("exit"));
}