diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index b4ab1f3629..3a9680b3cd 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1783,6 +1783,7 @@ virFileFindHugeTLBFS; virFileFindMountPoint; virFileFindResource; virFileFindResourceFull; +virFileFlock; virFileFreeACLs; virFileGetACLs; virFileGetHugepageSize; diff --git a/src/util/virfile.c b/src/util/virfile.c index 12b41a64e0..9296ccbe2a 100644 --- a/src/util/virfile.c +++ b/src/util/virfile.c @@ -51,6 +51,7 @@ #if HAVE_SYS_ACL_H # include #endif +#include #ifdef __linux__ # if HAVE_LINUX_MAGIC_H @@ -362,6 +363,7 @@ virFileWrapperFdFree(virFileWrapperFdPtr wfd) #ifndef WIN32 + /** * virFileLock: * @fd: file descriptor to acquire the lock on @@ -430,7 +432,32 @@ int virFileUnlock(int fd, off_t start, off_t len) return 0; } + + +/** + * virFileFlock: + * @fd: file descriptor to call flock on + * @lock: true for lock, false for unlock + * @shared: true if shared, false for exclusive, ignored if `@lock == false` + * + * This is just a simple wrapper around flock(2) that errors out on unsupported + * platforms. + * + * The lock will be released when @fd is closed or this function is called with + * `@lock == false`. + * + * Returns 0 on success, -1 otherwise (with errno set) + */ +int virFileFlock(int fd, bool lock, bool shared) +{ + if (lock) + return flock(fd, shared ? LOCK_SH : LOCK_EX); + + return flock(fd, LOCK_UN); +} + #else + int virFileLock(int fd ATTRIBUTE_UNUSED, bool shared ATTRIBUTE_UNUSED, off_t start ATTRIBUTE_UNUSED, @@ -439,14 +466,27 @@ int virFileLock(int fd ATTRIBUTE_UNUSED, { return -ENOSYS; } + + int virFileUnlock(int fd ATTRIBUTE_UNUSED, off_t start ATTRIBUTE_UNUSED, off_t len ATTRIBUTE_UNUSED) { return -ENOSYS; } + + +int virFileFlock(int fd ATTRIBUTE_UNUSED, + bool lock ATTRIBUTE_UNUSED, + bool shared ATTRIBUTE_UNUSED) +{ + errno = ENOSYS; + return -1; +} + #endif + int virFileRewrite(const char *path, mode_t mode, diff --git a/src/util/virfile.h b/src/util/virfile.h index 59c14b97a6..6f1e802fde 100644 --- a/src/util/virfile.h +++ b/src/util/virfile.h @@ -104,6 +104,8 @@ void virFileWrapperFdFree(virFileWrapperFdPtr dfd); int virFileLock(int fd, bool shared, off_t start, off_t len, bool waitForLock); int virFileUnlock(int fd, off_t start, off_t len); +int virFileFlock(int fd, bool lock, bool shared); + typedef int (*virFileRewriteFunc)(int fd, const void *opaque); int virFileRewrite(const char *path, mode_t mode,