diff options
| author | LeRoyce Pearson <leroycepearson@geemili.xyz> | 2020-03-17 20:53:43 -0600 |
|---|---|---|
| committer | LeRoyce Pearson <leroycepearson@geemili.xyz> | 2020-03-17 20:53:43 -0600 |
| commit | b773a8b175b6be130af2249f267e4113fdbf30ea (patch) | |
| tree | 0ae3b738d90819fc06bc4cad579c9e4d89638aa1 /lib/std/os.zig | |
| parent | 4532f5ecad23a3478310f159f43d31217c863c35 (diff) | |
| download | zig-b773a8b175b6be130af2249f267e4113fdbf30ea.tar.gz zig-b773a8b175b6be130af2249f267e4113fdbf30ea.zip | |
Make `fcntlFlock` follow conventions of `os.zig`
Diffstat (limited to 'lib/std/os.zig')
| -rw-r--r-- | lib/std/os.zig | 28 |
1 files changed, 18 insertions, 10 deletions
diff --git a/lib/std/os.zig b/lib/std/os.zig index 832e2901af..2741d2d8f3 100644 --- a/lib/std/os.zig +++ b/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), + } } } |
