提交 5a0a5f7f 编写于 作者: M Martin Kletzander

util: Introduce virFileFlock

We already have virFileLock(), but we are now using flock() in the code as
well (due to requirements for mutual exclusion between libvirt and other
programs using flock() as well), so let's have a function for that as well so we
don't need to have stubs for unsupported platforms in other files.
Signed-off-by: NMartin Kletzander <mkletzan@redhat.com>
Reviewed-by: NJán Tomko <jtomko@redhat.com>
上级 f41bbfe0
......@@ -1783,6 +1783,7 @@ virFileFindHugeTLBFS;
virFileFindMountPoint;
virFileFindResource;
virFileFindResourceFull;
virFileFlock;
virFileFreeACLs;
virFileGetACLs;
virFileGetHugepageSize;
......
......@@ -51,6 +51,7 @@
#if HAVE_SYS_ACL_H
# include <sys/acl.h>
#endif
#include <sys/file.h>
#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,
......
......@@ -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,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册