aboutsummaryrefslogtreecommitdiff
path: root/lib/std/os.zig
diff options
context:
space:
mode:
authorLeRoyce Pearson <leroycepearson@geemili.xyz>2020-03-17 20:53:43 -0600
committerLeRoyce Pearson <leroycepearson@geemili.xyz>2020-03-17 20:53:43 -0600
commitb773a8b175b6be130af2249f267e4113fdbf30ea (patch)
tree0ae3b738d90819fc06bc4cad579c9e4d89638aa1 /lib/std/os.zig
parent4532f5ecad23a3478310f159f43d31217c863c35 (diff)
downloadzig-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.zig28
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),
+ }
}
}