| ... | ... | @@ -1146,18 +1146,26 @@ pub const LockCmd = enum { |
| 1146 | 1146 | SetLockBlocking, |
| 1147 | 1147 | }; |
| 1148 | 1148 | |
| 1149 | pub const FcntlError = error{ |
| 1150 | /// The file is locked by another process |
| 1151 | FileLocked, |
| 1152 | } || UnexpectedError; |
| 1153 | |
| 1149 | 1154 | /// Attempts to get lock the file, blocking if the file is locked. |
| 1150 | | pub fn fcntlFlock(fd: fd_t, lock_cmd: LockCmd, flock_p: *Flock) OpenError!void { |
| 1151 | | const cmd: i32 = cmdval: { |
| 1152 | | switch (lock_cmd) { |
| 1153 | | .GetLock => break :cmdval F_GETLK, |
| 1154 | | .SetLock => break :cmdval F_SETLK, |
| 1155 | | .SetLockBlocking => break :cmdval F_SETLKW, |
| 1156 | | } |
| 1155 | pub fn fcntlFlock(fd: fd_t, lock_cmd: LockCmd, flock_p: *Flock) FcntlError!void { |
| 1156 | const cmd: i32 = switch (lock_cmd) { |
| 1157 | .GetLock => F_GETLK, |
| 1158 | .SetLock => F_SETLK, |
| 1159 | .SetLockBlocking => F_SETLKW, |
| 1157 | 1160 | }; |
| 1158 | | const rc = system.fcntl(fd, cmd, flock_p); |
| 1159 | | if (rc < 0) { |
| 1160 | | std.debug.panic("fcntl error: {}\n", .{rc}); |
| 1161 | while (true) { |
| 1162 | switch (errno(system.fcntl(fd, cmd, flock_p))) { |
| 1163 | 0 => return, |
| 1164 | EACCES => return error.FileLocked, |
| 1165 | EAGAIN => return error.FileLocked, |
| 1166 | EINTR => continue, |
| 1167 | else => |err| return unexpectedErrno(err), |
| 1168 | } |
| 1161 | 1169 | } |
| 1162 | 1170 | } |
| 1163 | 1171 | |