diff options
| author | 2023-01-16 13:59:52 -0800 | |
|---|---|---|
| committer | 2023-01-16 13:59:52 -0800 | |
| commit | a345efd270bcd19672b13b363d287354113b7aba (patch) | |
| tree | 6447cb4a47dbe8460ad950871e3e2a1ad441339b /src | |
| parent | 30bfb31bce0d915b0b0d44bc9c215a2e19d0630a (diff) | |
| download | bun-a345efd270bcd19672b13b363d287354113b7aba.tar.gz bun-a345efd270bcd19672b13b363d287354113b7aba.tar.zst bun-a345efd270bcd19672b13b363d287354113b7aba.zip | |
Fix `getFdPath` when `/proc/fd` is not mounted
Diffstat (limited to 'src')
| -rw-r--r-- | src/bun.zig | 38 | ||||
| -rw-r--r-- | src/cli.zig | 2 | ||||
| -rw-r--r-- | src/cli/install_completions_command.zig | 2 | ||||
| -rw-r--r-- | src/cli/package_manager_command.zig | 2 | ||||
| -rw-r--r-- | src/cli/run_command.zig | 2 | ||||
| -rw-r--r-- | src/cli/upgrade_command.zig | 2 | ||||
| -rw-r--r-- | src/fs.zig | 4 | ||||
| -rw-r--r-- | src/http.zig | 2 | ||||
| -rw-r--r-- | src/install/bin.zig | 8 | ||||
| -rw-r--r-- | src/install/extract_tarball.zig | 2 | ||||
| -rw-r--r-- | src/install/install.zig | 10 | ||||
| -rw-r--r-- | src/open.zig | 2 | ||||
| -rw-r--r-- | src/resolver/resolver.zig | 8 | ||||
| -rw-r--r-- | src/router.zig | 2 |
14 files changed, 62 insertions, 24 deletions
diff --git a/src/bun.zig b/src/bun.zig index 0f68e8bc8..b6c0e2c4a 100644 --- a/src/bun.zig +++ b/src/bun.zig @@ -769,3 +769,41 @@ pub fn zero(comptime Type: type) Type { } pub const c_ares = @import("./deps/c_ares.zig"); pub const URL = @import("./url.zig").URL; + +var needs_proc_self_workaround: bool = false; + +// This is our "polyfill" when /proc/self/fd is not available it's only +// necessary on linux because other platforms don't have an optional +// /proc/self/fd +fn getFdPathViaCWD(fd: std.os.fd_t, buf: *[@This().MAX_PATH_BYTES]u8) ![]u8 { + const prev_fd = try std.os.openatZ(std.os.AT.FDCWD, ".", 0, 0); + var needs_chdir = false; + defer { + if (needs_chdir) std.os.fchdir(prev_fd) catch unreachable; + std.os.close(prev_fd); + } + try std.os.fchdir(fd); + needs_chdir = true; + return std.os.getcwd(buf); +} + +/// Get the absolute path to a file descriptor. +/// On Linux, when `/proc/self/fd` is not available, this function will attempt to use `fchdir` and `getcwd` to get the path instead. +pub fn getFdPath(fd: std.os.fd_t, buf: *[@This().MAX_PATH_BYTES]u8) ![]u8 { + if (comptime !Environment.isLinux) { + return std.os.getFdPath(fd, buf); + } + + if (needs_proc_self_workaround) { + return getFdPathViaCWD(fd, buf); + } + + return std.os.getFdPath(fd, buf) catch |err| { + if (err == error.FileNotFound and !needs_proc_self_workaround) { + needs_proc_self_workaround = true; + return getFdPathViaCWD(fd, buf); + } + + return err; + }; +} diff --git a/src/cli.zig b/src/cli.zig index 6807cd66b..233e9438d 100644 --- a/src/cli.zig +++ b/src/cli.zig @@ -1338,7 +1338,7 @@ pub const Command = struct { Global.configureAllocator(.{ .long_running = true }); // the case where this doesn't work is if the script name on disk doesn't end with a known JS-like file extension - var absolute_script_path = std.os.getFdPath(file.handle, &script_name_buf) catch return false; + var absolute_script_path = bun.getFdPath(file.handle, &script_name_buf) catch return false; BunJS.Run.boot( ctx.*, file, diff --git a/src/cli/install_completions_command.zig b/src/cli/install_completions_command.zig index 99a1702a5..a67a57f4f 100644 --- a/src/cli/install_completions_command.zig +++ b/src/cli/install_completions_command.zig @@ -380,7 +380,7 @@ pub const InstallCompletionsCommand = struct { // Check if they need to load the zsh completions file into their .zshrc if (shell == .zsh) { var completions_absolute_path_buf: [bun.MAX_PATH_BYTES]u8 = undefined; - var completions_path = std.os.getFdPath(output_file.handle, &completions_absolute_path_buf) catch unreachable; + var completions_path = bun.getFdPath(output_file.handle, &completions_absolute_path_buf) catch unreachable; var zshrc_filepath: [bun.MAX_PATH_BYTES]u8 = undefined; const needs_to_tell_them_to_add_completions_file = brk: { var dot_zshrc: std.fs.File = zshrc: { diff --git a/src/cli/package_manager_command.zig b/src/cli/package_manager_command.zig index a52b16694..d81dcbab0 100644 --- a/src/cli/package_manager_command.zig +++ b/src/cli/package_manager_command.zig @@ -144,7 +144,7 @@ pub const PackageManagerCommand = struct { } else if (strings.eqlComptime(subcommand, "cache")) { var dir: [bun.MAX_PATH_BYTES]u8 = undefined; var fd = pm.getCacheDirectory(); - var outpath = std.os.getFdPath(fd.dir.fd, &dir) catch |err| { + var outpath = bun.getFdPath(fd.dir.fd, &dir) catch |err| { Output.prettyErrorln("{s} getting cache directory", .{@errorName(err)}); Global.crash(); }; diff --git a/src/cli/run_command.zig b/src/cli/run_command.zig index 312776c79..e5cb95333 100644 --- a/src/cli/run_command.zig +++ b/src/cli/run_command.zig @@ -1052,7 +1052,7 @@ pub const RunCommand = struct { // Output.flush(); // return err; // }; - // // var outbuf = std.os.getFdPath(file.handle, &path_buf2) catch |err| { + // // var outbuf = bun.getFdPath(file.handle, &path_buf2) catch |err| { // // if (!log_errors) return false; // // Output.prettyErrorln("<r>error: <red>{s}<r> resolving file: \"{s}\"", .{ err, std.mem.span(destination) }); // // Output.flush(); diff --git a/src/cli/upgrade_command.zig b/src/cli/upgrade_command.zig index 6bab7c510..80c7fe0cb 100644 --- a/src/cli/upgrade_command.zig +++ b/src/cli/upgrade_command.zig @@ -514,7 +514,7 @@ pub const UpgradeCommand = struct { Global.exit(1); }; const save_dir = save_dir_it.dir; - var tmpdir_path = std.os.getFdPath(save_dir.fd, &tmpdir_path_buf) catch { + var tmpdir_path = bun.getFdPath(save_dir.fd, &tmpdir_path_buf) catch { Output.prettyErrorln("<r><red>error:<r> Failed to read temporary directory", .{}); Global.exit(1); }; diff --git a/src/fs.zig b/src/fs.zig index 6e278f711..68f8bfe33 100644 --- a/src/fs.zig +++ b/src/fs.zig @@ -111,7 +111,7 @@ pub const FileSystem = struct { pub fn getFdPath(this: *const FileSystem, fd: FileDescriptorType) ![]const u8 { var buf: [bun.MAX_PATH_BYTES]u8 = undefined; - var dir = try std.os.getFdPath(fd, &buf); + var dir = try bun.getFdPath(fd, &buf); return try this.dirname_store.append([]u8, dir); } @@ -1057,7 +1057,7 @@ pub const FileSystem = struct { } const _stat = try file.stat(); - symlink = try std.os.getFdPath(file.handle, &outpath); + symlink = try bun.getFdPath(file.handle, &outpath); _kind = _stat.kind; } diff --git a/src/http.zig b/src/http.zig index dfe2f9141..8fcb078d1 100644 --- a/src/http.zig +++ b/src/http.zig @@ -564,7 +564,7 @@ pub const RequestContext = struct { if (stat.kind == .SymLink) { file.* = std.fs.openFileAbsolute(absolute_path, .{ .mode = .read_only }) catch return null; - absolute_path = std.os.getFdPath( + absolute_path = bun.getFdPath( file.handle, &Bundler.tmp_buildfile_buf, ) catch return null; diff --git a/src/install/bin.zig b/src/install/bin.zig index c7dd50367..4cc529f6a 100644 --- a/src/install/bin.zig +++ b/src/install/bin.zig @@ -308,7 +308,7 @@ pub const Bin = extern struct { from_remain = target_buf[this.global_bin_path.len..]; from_remain[0] = std.fs.path.sep; from_remain = from_remain[1..]; - const abs = std.os.getFdPath(this.root_node_modules_folder, &dest_buf) catch |err| { + const abs = bun.getFdPath(this.root_node_modules_folder, &dest_buf) catch |err| { this.err = err; return; }; @@ -433,7 +433,7 @@ pub const Bin = extern struct { var iter = child_dir.iterate(); - var basedir_path = std.os.getFdPath(child_dir.dir.fd, &target_buf) catch |err| { + var basedir_path = bun.getFdPath(child_dir.dir.fd, &target_buf) catch |err| { this.err = err; return; }; @@ -485,7 +485,7 @@ pub const Bin = extern struct { from_remain = target_buf[this.global_bin_path.len..]; from_remain[0] = std.fs.path.sep; from_remain = from_remain[1..]; - const abs = std.os.getFdPath(this.root_node_modules_folder, &dest_buf) catch |err| { + const abs = bun.getFdPath(this.root_node_modules_folder, &dest_buf) catch |err| { this.err = err; return; }; @@ -585,7 +585,7 @@ pub const Bin = extern struct { var iter = child_dir.iterate(); - var basedir_path = std.os.getFdPath(child_dir.dir.fd, &target_buf) catch |err| { + var basedir_path = bun.getFdPath(child_dir.dir.fd, &target_buf) catch |err| { this.err = err; return; }; diff --git a/src/install/extract_tarball.zig b/src/install/extract_tarball.zig index 219c89399..1316302f8 100644 --- a/src/install/extract_tarball.zig +++ b/src/install/extract_tarball.zig @@ -261,7 +261,7 @@ fn extract(this: *const ExtractTarball, tgz_bytes: []const u8) !string { defer final_dir.close(); // and get the fd path - var final_path = std.os.getFdPath( + var final_path = bun.getFdPath( final_dir.fd, &abs_buf, ) catch |err| { diff --git a/src/install/install.zig b/src/install/install.zig index a1a8d69a0..a2826ea33 100644 --- a/src/install/install.zig +++ b/src/install/install.zig @@ -1168,7 +1168,7 @@ const PackageInstall = struct { ) !u32 { var real_file_count: u32 = 0; var buf: [bun.MAX_PATH_BYTES]u8 = undefined; - var cache_dir_path = try std.os.getFdPath(cache_dir_fd, &buf); + var cache_dir_path = try bun.getFdPath(cache_dir_fd, &buf); var remain = buf[cache_dir_path.len..]; var cache_dir_offset = cache_dir_path.len; @@ -1178,7 +1178,7 @@ const PackageInstall = struct { remain = remain[1..]; } var dest_buf: [bun.MAX_PATH_BYTES]u8 = undefined; - var dest_base = try std.os.getFdPath(dest_dir_fd, &dest_buf); + var dest_base = try bun.getFdPath(dest_dir_fd, &dest_buf); var dest_remaining = dest_buf[dest_base.len..]; var dest_dir_offset = dest_base.len; if (dest_base.len > 0 and dest_buf[dest_base.len - 1] != std.fs.path.sep) { @@ -1687,7 +1687,7 @@ pub const PackageManager = struct { this.global_dir = global_dir; this.global_link_dir = try global_dir.dir.makeOpenPathIterable("node_modules", .{}); var buf: [bun.MAX_PATH_BYTES]u8 = undefined; - const _path = try std.os.getFdPath(this.global_link_dir.?.dir.fd, &buf); + const _path = try bun.getFdPath(this.global_link_dir.?.dir.fd, &buf); this.global_link_dir_path = try Fs.FileSystem.DirnameStore.instance.append([]const u8, _path); break :brk this.global_link_dir.?; }; @@ -1868,7 +1868,7 @@ pub const PackageManager = struct { if (this.options.log_level != .silent) { const elapsed = timer.read(); if (elapsed > std.time.ns_per_ms * 100) { - var cache_dir_path = std.os.getFdPath(cache_directory.dir.fd, &path_buf) catch "it's"; + var cache_dir_path = bun.getFdPath(cache_directory.dir.fd, &path_buf) catch "it's"; Output.prettyErrorln( "<r><yellow>warn<r>: Slow filesystem detected. If {s} is a network drive, consider setting $BUN_INSTALL_CACHE_DIR to a local folder.", .{cache_dir_path}, @@ -6212,7 +6212,7 @@ pub const PackageManager = struct { pub fn setupGlobalDir(manager: *PackageManager, ctx: *const Command.Context) !void { manager.options.global_bin_dir = try Options.openGlobalBinDir(ctx.install); var out_buffer: [bun.MAX_PATH_BYTES]u8 = undefined; - var result = try std.os.getFdPath(manager.options.global_bin_dir.dir.fd, &out_buffer); + var result = try bun.getFdPath(manager.options.global_bin_dir.dir.fd, &out_buffer); out_buffer[result.len] = 0; var result_: [:0]u8 = out_buffer[0..result.len :0]; manager.options.bin_path = std.meta.assumeSentinel(try FileSystem.instance.dirname_store.append([:0]u8, result_), 0); diff --git a/src/open.zig b/src/open.zig index da99e134b..3224207c9 100644 --- a/src/open.zig +++ b/src/open.zig @@ -362,7 +362,7 @@ pub const EditorContext = struct { var path_buf: [bun.MAX_PATH_BYTES]u8 = undefined; try editor_.open( path, - try std.os.getFdPath(opened.handle, &path_buf), + try bun.getFdPath(opened.handle, &path_buf), line, column, default_allocator, diff --git a/src/resolver/resolver.zig b/src/resolver/resolver.zig index 8e05d6441..f9ccf014d 100644 --- a/src/resolver/resolver.zig +++ b/src/resolver/resolver.zig @@ -895,7 +895,7 @@ pub const Resolver = struct { var file = try std.fs.openFileAbsoluteZ(span, .{ .mode = .read_only }); if (comptime !FeatureFlags.store_file_descriptors) { - out = try std.os.getFdPath(query.entry.cache.fd, &buf); + out = try bun.getFdPath(query.entry.cache.fd, &buf); file.close(); } else { query.entry.cache.fd = file.handle; @@ -914,7 +914,7 @@ pub const Resolver = struct { } if (comptime FeatureFlags.store_file_descriptors) { - out = try std.os.getFdPath(query.entry.cache.fd, &buf); + out = try bun.getFdPath(query.entry.cache.fd, &buf); } const symlink = try Fs.FileSystem.FilenameStore.instance.append(@TypeOf(out), out); @@ -3316,7 +3316,7 @@ pub const Resolver = struct { const this_dir = std.fs.Dir{ .fd = fd }; var file = this_dir.openDirZ("node_modules/.bin", .{}, true) catch break :append_bin_dir; defer file.close(); - var bin_path = std.os.getFdPath(file.fd, &node_bin_path) catch break :append_bin_dir; + var bin_path = bun.getFdPath(file.fd, &node_bin_path) catch break :append_bin_dir; bin_folders_lock.lock(); defer bin_folders_lock.unlock(); @@ -3341,7 +3341,7 @@ pub const Resolver = struct { const this_dir = std.fs.Dir{ .fd = fd }; var file = this_dir.openDirZ(".bin", .{}, false) catch break :append_bin_dir; defer file.close(); - var bin_path = std.os.getFdPath(file.fd, &node_bin_path) catch break :append_bin_dir; + var bin_path = bun.getFdPath(file.fd, &node_bin_path) catch break :append_bin_dir; bin_folders_lock.lock(); defer bin_folders_lock.unlock(); diff --git a/src/router.zig b/src/router.zig index 378c8b311..e29df954d 100644 --- a/src/router.zig +++ b/src/router.zig @@ -757,7 +757,7 @@ pub const Route = struct { if (!needs_close) entry.cache.fd = file.handle; } - var _abs = std.os.getFdPath(file.handle, &route_file_buf) catch |err| { + var _abs = bun.getFdPath(file.handle, &route_file_buf) catch |err| { log.addErrorFmt(null, Logger.Loc.Empty, allocator, "{s} resolving route: {s}", .{ @errorName(err), abs_path_str }) catch unreachable; return null; }; |
