aboutsummaryrefslogtreecommitdiff
path: root/src/introspect.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2022-11-10 13:50:44 -0700
committerAndrew Kelley <andrew@ziglang.org>2022-12-06 12:15:04 -0700
commitd5312d53a066092ba9efd687e25b29a87eb6290c (patch)
treeb94a89b89f333cf381046982afe6a86c72c8122e /src/introspect.zig
parent0a2fdfbdb934faae7fcf63e9b3ab760c00f47918 (diff)
downloadzig-d5312d53a066092ba9efd687e25b29a87eb6290c.tar.gz
zig-d5312d53a066092ba9efd687e25b29a87eb6290c.zip
WASI: remove absolute path emulation from std lib
Instead of checking for absolute paths and current working directories in various file system operations, there is one simple solution: allow overriding `std.fs.cwd` on WASI. os.realpath is back to causing a compile error when used on WASI. This caused a compile error in the Sema handling of `@src()`. The compiler should never call realpath, so the commit that made this change is reverted (95ab942184427e7c9b840d71f4d093931e3e48fb). If this breaks debug info, a different strategy is needed to solve it other than using realpath. I also removed the preopens code and replaced it with something much simpler. There is no longer any global state in the standard library. Additionally- * os.openat no longer does an unnecessary fstat on WASI when O.WRONLY is not provided. * os.chdir is back to causing a compile error on WASI.
Diffstat (limited to 'src/introspect.zig')
-rw-r--r--src/introspect.zig44
1 files changed, 5 insertions, 39 deletions
diff --git a/src/introspect.zig b/src/introspect.zig
index 27925ab667..2eeae956ec 100644
--- a/src/introspect.zig
+++ b/src/introspect.zig
@@ -37,34 +37,7 @@ fn testZigInstallPrefix(base_dir: fs.Dir) ?Compilation.Directory {
/// based on a hard-coded Preopen directory ("/zig")
pub fn findZigExePath(allocator: mem.Allocator) ![]u8 {
if (builtin.os.tag == .wasi) {
- var args = try std.process.argsWithAllocator(allocator);
- defer args.deinit();
- // On WASI, argv[0] is always just the basename of the current executable
- const argv0 = args.next() orelse return error.FileNotFound;
-
- // Check these paths:
- // 1. "/zig/{exe_name}"
- // 2. "/zig/bin/{exe_name}"
- const base_paths_to_check = &[_][]const u8{ "/zig", "/zig/bin" };
- const exe_names_to_check = &[_][]const u8{ fs.path.basename(argv0), "zig.wasm" };
-
- for (base_paths_to_check) |base_path| {
- for (exe_names_to_check) |exe_name| {
- const test_path = fs.path.join(allocator, &.{ base_path, exe_name }) catch continue;
- defer allocator.free(test_path);
-
- // Make sure it's a file we're pointing to
- const file = os.fstatat(os.wasi.AT.FDCWD, test_path, 0) catch continue;
- if (file.filetype != .REGULAR_FILE) continue;
-
- // Path seems to be valid, let's try to turn it into an absolute path
- var real_path_buf: [fs.MAX_PATH_BYTES]u8 = undefined;
- if (os.realpath(test_path, &real_path_buf)) |real_path| {
- return allocator.dupe(u8, real_path); // Success: return absolute path
- } else |_| continue;
- }
- }
- return error.FileNotFound;
+ @compileError("this function is unsupported on WASI");
}
return fs.selfExePathAlloc(allocator);
@@ -107,6 +80,9 @@ pub fn findZigLibDirFromSelfExe(
/// Caller owns returned memory.
pub fn resolveGlobalCacheDir(allocator: mem.Allocator) ![]u8 {
+ if (builtin.os.tag == .wasi) {
+ @compileError("on WASI the global cache dir must be resolved with preopens");
+ }
if (std.process.getEnvVarOwned(allocator, "ZIG_GLOBAL_CACHE_DIR")) |value| {
if (value.len > 0) {
return value;
@@ -125,17 +101,7 @@ pub fn resolveGlobalCacheDir(allocator: mem.Allocator) ![]u8 {
}
}
- if (builtin.os.tag == .wasi) {
- // On WASI, we have no way to get an App data dir, so we try to use a fixed
- // Preopen path "/cache" as a last resort
- const path = "/cache";
-
- const file = os.fstatat(os.wasi.AT.FDCWD, path, 0) catch return error.CacheDirUnavailable;
- if (file.filetype != .DIRECTORY) return error.CacheDirUnavailable;
- return allocator.dupe(u8, path);
- } else {
- return fs.getAppDataDir(allocator, appname);
- }
+ return fs.getAppDataDir(allocator, appname);
}
/// Similar to std.fs.path.resolve, with a few important differences: