authorgravatar for thatlemon@gmail.comLemonBoy <thatlemon@gmail.com> 2020-11-22 23:28:40+01:00
committergravatar for thatlemon@gmail.comLemonBoy <thatlemon@gmail.com> 2020-11-23 18:00:05+01:00
logf8ddc3d8732feece71d6ee55cdfc4d61a5a7e16e
tree725d930ad3dcba14370029dc649df54ef1a772e4
parent9d2fe1682f19bd21a393deeea2c4173b4429b482

std: Fix file locking logic for BSD targets


4 files changed, 10 insertions(+), 15 deletions(-)

lib/std/child_process.zig+1
......@@ -368,6 +368,7 @@ pub const ChildProcess = struct {
368368 error.DeviceBusy => unreachable,
369369 error.FileLocksNotSupported => unreachable,
370370 error.BadPathName => unreachable, // Windows-only
371 error.WouldBlock => unreachable,
371372 else => |e| return e,
372373 }
373374 else
lib/std/fs.zig+5-3
......@@ -405,7 +405,7 @@ pub const Dir = struct {
405405 else => false,
406406 };
407407 if (mem.eql(u8, name, ".") or mem.eql(u8, name, "..") or
408 (skip_zero_fileno and bsd_entry.d_fileno == 0))
408 (skip_zero_fileno and bsd_entry.d_fileno == 0))
409409 {
410410 continue :start_over;
411411 }
......@@ -863,8 +863,8 @@ pub const Dir = struct {
863863 0;
864864 const lock_flag: u32 = if (has_flock_open_flags) switch (flags.lock) {
865865 .None => @as(u32, 0),
866 .Shared => os.O_SHLOCK,
867 .Exclusive => os.O_EXLOCK,
866 .Shared => os.O_SHLOCK | nonblocking_lock_flag,
867 .Exclusive => os.O_EXLOCK | nonblocking_lock_flag,
868868 } else 0;
869869
870870 const O_LARGEFILE = if (@hasDecl(os, "O_LARGEFILE")) os.O_LARGEFILE else 0;
......@@ -1178,6 +1178,7 @@ pub const Dir = struct {
11781178 error.NoSpaceLeft => unreachable, // not providing O_CREAT
11791179 error.PathAlreadyExists => unreachable, // not providing O_CREAT
11801180 error.FileLocksNotSupported => unreachable, // locking folders is not supported
1181 error.WouldBlock => unreachable, // can't happen for directories
11811182 else => |e| return e,
11821183 };
11831184 return Dir{ .fd = fd };
......@@ -1221,6 +1222,7 @@ pub const Dir = struct {
12211222 error.NoSpaceLeft => unreachable, // not providing O_CREAT
12221223 error.PathAlreadyExists => unreachable, // not providing O_CREAT
12231224 error.FileLocksNotSupported => unreachable, // locking folders is not supported
1225 error.WouldBlock => unreachable, // can't happen for directories
12241226 else => |e| return e,
12251227 };
12261228 return Dir{ .fd = fd };
lib/std/fs/test.zig-12
......@@ -691,9 +691,6 @@ test "realpath" {
691691test "open file with exclusive nonblocking lock twice" {
692692 if (builtin.os.tag == .wasi) return error.SkipZigTest;
693693
694 // TODO: fix this test on FreeBSD. https://github.com/ziglang/zig/issues/1759
695 if (builtin.os.tag == .freebsd) return error.SkipZigTest;
696
697694 const filename = "file_nonblocking_lock_test.txt";
698695
699696 var tmp = tmpDir(.{});
......@@ -709,9 +706,6 @@ test "open file with exclusive nonblocking lock twice" {
709706test "open file with shared and exclusive nonblocking lock" {
710707 if (builtin.os.tag == .wasi) return error.SkipZigTest;
711708
712 // TODO: fix this test on FreeBSD. https://github.com/ziglang/zig/issues/1759
713 if (builtin.os.tag == .freebsd) return error.SkipZigTest;
714
715709 const filename = "file_nonblocking_lock_test.txt";
716710
717711 var tmp = tmpDir(.{});
......@@ -727,9 +721,6 @@ test "open file with shared and exclusive nonblocking lock" {
727721test "open file with exclusive and shared nonblocking lock" {
728722 if (builtin.os.tag == .wasi) return error.SkipZigTest;
729723
730 // TODO: fix this test on FreeBSD. https://github.com/ziglang/zig/issues/1759
731 if (builtin.os.tag == .freebsd) return error.SkipZigTest;
732
733724 const filename = "file_nonblocking_lock_test.txt";
734725
735726 var tmp = tmpDir(.{});
......@@ -791,9 +782,6 @@ test "open file with exclusive lock twice, make sure it waits" {
791782test "open file with exclusive nonblocking lock twice (absolute paths)" {
792783 if (builtin.os.tag == .wasi) return error.SkipZigTest;
793784
794 // TODO: fix this test on FreeBSD. https://github.com/ziglang/zig/issues/1759
795 if (builtin.os.tag == .freebsd) return error.SkipZigTest;
796
797785 const allocator = testing.allocator;
798786
799787 const file_paths: [1][]const u8 = .{"zig-test-absolute-paths.txt"};
lib/std/os.zig+4
......@@ -1020,6 +1020,8 @@ pub const OpenError = error{
10201020
10211021 BadPathName,
10221022 InvalidUtf8,
1023
1024 WouldBlock,
10231025} || UnexpectedError;
10241026
10251027/// Open and possibly create a file. Keeps trying if it gets interrupted.
......@@ -1201,6 +1203,7 @@ pub fn openatZ(dir_fd: fd_t, file_path: [*:0]const u8, flags: u32, mode: mode_t)
12011203 EEXIST => return error.PathAlreadyExists,
12021204 EBUSY => return error.DeviceBusy,
12031205 EOPNOTSUPP => return error.FileLocksNotSupported,
1206 EWOULDBLOCK => return error.WouldBlock,
12041207 else => |err| return unexpectedErrno(err),
12051208 }
12061209 }
......@@ -4187,6 +4190,7 @@ pub fn realpathZ(pathname: [*:0]const u8, out_buffer: *[MAX_PATH_BYTES]u8) RealP
41874190 const flags = if (builtin.os.tag == .linux) O_PATH | O_NONBLOCK | O_CLOEXEC else O_NONBLOCK | O_CLOEXEC;
41884191 const fd = openZ(pathname, flags, 0) catch |err| switch (err) {
41894192 error.FileLocksNotSupported => unreachable,
4193 error.WouldBlock => unreachable,
41904194 else => |e| return e,
41914195 };
41924196 defer close(fd);