/* $Id: lockfile.c 6020 2002-12-20 00:19:58Z rra $ ** ** Lock a file or a range in a file. ** ** Provides inn_lock_file and inn_lock_range functions to lock or unlock a ** file or ranges within a file with a more convenient syntax than fcntl. ** Assume that fcntl is available. */ #include "config.h" #include "clibrary.h" #include #include #include "libinn.h" bool inn_lock_file(int fd, enum inn_locktype type, bool block) { return inn_lock_range(fd, type, block, 0, 0); } bool inn_lock_range(int fd, enum inn_locktype type, bool block, off_t offset, off_t size) { struct flock fl; int status; switch (type) { case INN_LOCK_READ: fl.l_type = F_RDLCK; break; case INN_LOCK_WRITE: fl.l_type = F_WRLCK; break; default: case INN_LOCK_UNLOCK: fl.l_type = F_UNLCK; break; } do { fl.l_whence = SEEK_SET; fl.l_start = offset; fl.l_len = size; status = fcntl(fd, block ? F_SETLKW : F_SETLK, &fl); } while (status == -1 && errno == EINTR); return (status != -1); }