mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-05-23 13:52:28 +00:00
Remove Windows executable path guessing logic
Unlike CMD.EXE, CreateProcess() doesn't care if an executable name ends with .COM or .EXE. We now have the unbourne shell and bash working well on Windows, so we don't need DOS anymore. Making this change will grant us better performance, particularly for builds, because commandv() will need to make fewer system calls. Path mangling magic still happens with WinMain() and ntspawn() in order to do things like turn \ into / so the interop works well at the borders. But all the code in libraries, which did that, has been removed. It's not possible for libraries to abstract the differences between paths.
This commit is contained in:
parent
0c5dd7b342
commit
c88f95a892
19 changed files with 125 additions and 610 deletions
|
@ -17,23 +17,13 @@
|
|||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/calls/calls.h"
|
||||
#include "libc/calls/struct/dirent.h"
|
||||
#include "libc/calls/struct/stat.h"
|
||||
#include "libc/dce.h"
|
||||
#include "libc/errno.h"
|
||||
#include "libc/fmt/fmt.h"
|
||||
#include "libc/intrin/safemacros.internal.h"
|
||||
#include "libc/limits.h"
|
||||
#include "libc/log/check.h"
|
||||
#include "libc/mem/gc.internal.h"
|
||||
#include "libc/mem/mem.h"
|
||||
#include "libc/runtime/internal.h"
|
||||
#include "libc/runtime/runtime.h"
|
||||
#include "libc/stdio/stdio.h"
|
||||
#include "libc/str/str.h"
|
||||
#include "libc/sysv/consts/dt.h"
|
||||
#include "libc/testlib/testlib.h"
|
||||
#include "libc/x/x.h"
|
||||
|
||||
uint64_t i;
|
||||
char *oldpath;
|
||||
|
@ -49,93 +39,63 @@ void SetUp(void) {
|
|||
mkdir("bin", 0755);
|
||||
mkdir("home", 0755);
|
||||
oldpath = strdup(nulltoempty(getenv("PATH")));
|
||||
CHECK_NE(-1, setenv("PATH", "bin", true));
|
||||
ASSERT_NE(-1, setenv("PATH", "bin", true));
|
||||
}
|
||||
|
||||
void TearDown(void) {
|
||||
CHECK_NE(-1, setenv("PATH", oldpath, true));
|
||||
ASSERT_NE(-1, setenv("PATH", oldpath, true));
|
||||
free(oldpath);
|
||||
}
|
||||
|
||||
TEST(commandv, testPathSearch) {
|
||||
EXPECT_NE(-1, touch("bin/sh", 0755));
|
||||
if (IsWindows()) {
|
||||
EXPECT_EQ(NULL, commandv("sh", pathbuf, sizeof(pathbuf)));
|
||||
EXPECT_EQ(errno, ENOENT);
|
||||
} else {
|
||||
EXPECT_STREQ("bin/sh", commandv("sh", pathbuf, sizeof(pathbuf)));
|
||||
}
|
||||
}
|
||||
|
||||
TEST(commandv, testPathSearch_appendsComExtension) {
|
||||
EXPECT_NE(-1, touch("bin/sh.com", 0755));
|
||||
EXPECT_STREQ("bin/sh.com", commandv("sh", pathbuf, sizeof(pathbuf)));
|
||||
EXPECT_SYS(0, 0, touch("bin/sh", 0755));
|
||||
EXPECT_STREQ("bin/sh", commandv("sh", pathbuf, sizeof(pathbuf)));
|
||||
}
|
||||
|
||||
TEST(commandv, testSlashes_wontSearchPath_butChecksAccess) {
|
||||
EXPECT_NE(-1, touch("home/sh.com", 0755));
|
||||
i = __syscount;
|
||||
EXPECT_SYS(0, 0, touch("home/sh.com", 0755));
|
||||
EXPECT_STREQ("home/sh.com",
|
||||
commandv("home/sh.com", pathbuf, sizeof(pathbuf)));
|
||||
#ifdef __x86_64__
|
||||
if (!IsWindows()) EXPECT_EQ(i + 2, __syscount);
|
||||
#endif
|
||||
}
|
||||
|
||||
TEST(commandv, testSlashes_wontSearchPath_butStillAppendsComExtension) {
|
||||
EXPECT_NE(-1, touch("home/sh.com", 0755));
|
||||
i = __syscount;
|
||||
EXPECT_STREQ("home/sh.com", commandv("home/sh", pathbuf, sizeof(pathbuf)));
|
||||
#ifdef __x86_64__
|
||||
if (!IsWindows()) EXPECT_EQ(i + 3, __syscount);
|
||||
#endif
|
||||
}
|
||||
|
||||
TEST(commandv, testSameDir_doesntHappenByDefaultUnlessItsWindows) {
|
||||
EXPECT_NE(-1, touch("bog.com", 0755));
|
||||
if (IsWindows()) {
|
||||
EXPECT_STREQ("./bog.com", commandv("bog.com", pathbuf, sizeof(pathbuf)));
|
||||
} else {
|
||||
EXPECT_EQ(NULL, commandv("bog.com", pathbuf, sizeof(pathbuf)));
|
||||
EXPECT_EQ(errno, ENOENT);
|
||||
}
|
||||
EXPECT_SYS(0, 0, touch("bog.com", 0755));
|
||||
EXPECT_STREQ(NULL, commandv("bog.com", pathbuf, sizeof(pathbuf)));
|
||||
EXPECT_EQ(ENOENT, errno);
|
||||
}
|
||||
|
||||
TEST(commandv, testSameDir_willHappenWithColonBlank) {
|
||||
CHECK_NE(-1, setenv("PATH", "bin:", true));
|
||||
EXPECT_NE(-1, touch("bog.com", 0755));
|
||||
if (IsWindows()) {
|
||||
EXPECT_STREQ("./bog.com", commandv("bog.com", pathbuf, sizeof(pathbuf)));
|
||||
} else {
|
||||
EXPECT_STREQ("bog.com", commandv("bog.com", pathbuf, sizeof(pathbuf)));
|
||||
}
|
||||
ASSERT_NE(-1, setenv("PATH", "bin:", true));
|
||||
EXPECT_SYS(0, 0, touch("bog.com", 0755));
|
||||
EXPECT_STREQ("bog.com", commandv("bog.com", pathbuf, sizeof(pathbuf)));
|
||||
}
|
||||
|
||||
TEST(commandv, testSameDir_willHappenWithColonBlank2) {
|
||||
CHECK_NE(-1, setenv("PATH", ":bin", true));
|
||||
EXPECT_NE(-1, touch("bog.com", 0755));
|
||||
if (IsWindows()) {
|
||||
EXPECT_STREQ("./bog.com", commandv("bog.com", pathbuf, sizeof(pathbuf)));
|
||||
} else {
|
||||
EXPECT_STREQ("bog.com", commandv("bog.com", pathbuf, sizeof(pathbuf)));
|
||||
}
|
||||
ASSERT_NE(-1, setenv("PATH", ":bin", true));
|
||||
EXPECT_SYS(0, 0, touch("bog.com", 0755));
|
||||
EXPECT_STREQ("bog.com", commandv("bog.com", pathbuf, sizeof(pathbuf)));
|
||||
}
|
||||
|
||||
TEST(commandv, test_DirPaths_wontConsiderDirectoriesExecutable) {
|
||||
CHECK_NE(-1, setenv("PATH", ":bin", true));
|
||||
EXPECT_NE(-1, mkdir("Cursors", 0755));
|
||||
EXPECT_EQ(NULL, commandv("Cursors", pathbuf, sizeof(pathbuf)));
|
||||
if (IsWindows()) {
|
||||
EXPECT_EQ(errno, ENOENT);
|
||||
} else {
|
||||
EXPECT_EQ(errno, EACCES);
|
||||
}
|
||||
ASSERT_NE(-1, setenv("PATH", ":bin", true));
|
||||
EXPECT_SYS(0, 0, mkdir("Cursors", 0755));
|
||||
EXPECT_STREQ(NULL, commandv("Cursors", pathbuf, sizeof(pathbuf)));
|
||||
EXPECT_EQ(ENOENT, errno);
|
||||
}
|
||||
|
||||
TEST(commandv, test_DirPaths_wontConsiderDirectoriesExecutable2) {
|
||||
CHECK_NE(-1, setenv("PATH", ":bin", true));
|
||||
EXPECT_NE(-1, mkdir("this_is_a_directory.com", 0755));
|
||||
EXPECT_EQ(NULL,
|
||||
commandv("this_is_a_directory.com", pathbuf, sizeof(pathbuf)));
|
||||
EXPECT_EQ(errno, EACCES);
|
||||
ASSERT_NE(-1, setenv("PATH", ":bin", true));
|
||||
EXPECT_SYS(0, 0, mkdir("this_is_a_directory.com", 0755));
|
||||
EXPECT_STREQ(NULL,
|
||||
commandv("this_is_a_directory.com", pathbuf, sizeof(pathbuf)));
|
||||
EXPECT_EQ(ENOENT, errno);
|
||||
}
|
||||
|
||||
TEST(commandv, test_nonExecutableFile_willEacces) {
|
||||
if (IsWindows()) return; // TODO: fixme
|
||||
setenv("PATH", "foo", true);
|
||||
EXPECT_SYS(0, 0, mkdir("foo", 0755));
|
||||
EXPECT_SYS(0, 0, touch("foo/bar", 0400));
|
||||
EXPECT_SYS(EACCES, NULL, commandv("bar", pathbuf, sizeof(pathbuf)));
|
||||
EXPECT_SYS(EACCES, NULL, commandv("foo/bar", pathbuf, sizeof(pathbuf)));
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue