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: Martin Kletzander <mkletzan@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
This commit is contained in:
Martin Kletzander 2018-02-08 14:53:20 +01:00
parent f41bbfe0e5
commit 5a0a5f7fb5
3 changed files with 43 additions and 0 deletions

View File

@ -1783,6 +1783,7 @@ virFileFindHugeTLBFS;
virFileFindMountPoint;
virFileFindResource;
virFileFindResourceFull;
virFileFlock;
virFileFreeACLs;
virFileGetACLs;
virFileGetHugepageSize;

View File

@ -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,

View File

@ -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,