aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> 2023-01-16 13:59:52 -0800
committerGravatar Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> 2023-01-16 13:59:52 -0800
commita345efd270bcd19672b13b363d287354113b7aba (patch)
tree6447cb4a47dbe8460ad950871e3e2a1ad441339b /src
parent30bfb31bce0d915b0b0d44bc9c215a2e19d0630a (diff)
downloadbun-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.zig38
-rw-r--r--src/cli.zig2
-rw-r--r--src/cli/install_completions_command.zig2
-rw-r--r--src/cli/package_manager_command.zig2
-rw-r--r--src/cli/run_command.zig2
-rw-r--r--src/cli/upgrade_command.zig2
-rw-r--r--src/fs.zig4
-rw-r--r--src/http.zig2
-rw-r--r--src/install/bin.zig8
-rw-r--r--src/install/extract_tarball.zig2
-rw-r--r--src/install/install.zig10
-rw-r--r--src/open.zig2
-rw-r--r--src/resolver/resolver.zig8
-rw-r--r--src/router.zig2
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;
};