Commit b773a8b175

LeRoyce Pearson <leroycepearson@geemili.xyz>
2020-03-18 03:53:43
Make `fcntlFlock` follow conventions of `os.zig`
1 parent 4532f5e
Changed files (3)
lib/std/fs/file.zig
@@ -34,7 +34,7 @@ pub const File = struct {
         else => 0o666,
     };
 
-    pub const OpenError = windows.CreateFileError || os.OpenError;
+    pub const OpenError = windows.CreateFileError || os.OpenError || os.FcntlError;
 
     /// TODO https://github.com/ziglang/zig/issues/3802
     pub const OpenFlags = struct {
lib/std/fs.zig
@@ -1605,7 +1605,7 @@ pub fn readLinkC(pathname_c: [*]const u8, buffer: *[MAX_PATH_BYTES]u8) ![]u8 {
     return os.readlinkC(pathname_c, buffer);
 }
 
-pub const OpenSelfExeError = os.OpenError || os.windows.CreateFileError || SelfExePathError;
+pub const OpenSelfExeError = os.OpenError || os.windows.CreateFileError || SelfExePathError || os.FcntlError;
 
 pub fn openSelfExe() OpenSelfExeError!File {
     if (builtin.os.tag == .linux) {
lib/std/os.zig
@@ -1146,18 +1146,26 @@ pub const LockCmd = enum {
     SetLockBlocking,
 };
 
+pub const FcntlError = error{
+    /// The file is locked by another process
+    FileLocked,
+} || UnexpectedError;
+
 /// Attempts to get lock the file, blocking if the file is locked.
-pub fn fcntlFlock(fd: fd_t, lock_cmd: LockCmd, flock_p: *Flock) OpenError!void {
-    const cmd: i32 = cmdval: {
-        switch (lock_cmd) {
-            .GetLock => break :cmdval F_GETLK,
-            .SetLock => break :cmdval F_SETLK,
-            .SetLockBlocking => break :cmdval F_SETLKW,
-        }
+pub fn fcntlFlock(fd: fd_t, lock_cmd: LockCmd, flock_p: *Flock) FcntlError!void {
+    const cmd: i32 = switch (lock_cmd) {
+        .GetLock => F_GETLK,
+        .SetLock => F_SETLK,
+        .SetLockBlocking => F_SETLKW,
     };
-    const rc = system.fcntl(fd, cmd, flock_p);
-    if (rc < 0) {
-        std.debug.panic("fcntl error: {}\n", .{rc});
+    while (true) {
+        switch (errno(system.fcntl(fd, cmd, flock_p))) {
+            0 => return,
+            EACCES => return error.FileLocked,
+            EAGAIN => return error.FileLocked,
+            EINTR => continue,
+            else => |err| return unexpectedErrno(err),
+        }
     }
 }