summaryrefslogtreecommitdiffstats
path: root/src/lib/file-create-locked.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/file-create-locked.h')
-rw-r--r--src/lib/file-create-locked.h47
1 files changed, 47 insertions, 0 deletions
diff --git a/src/lib/file-create-locked.h b/src/lib/file-create-locked.h
new file mode 100644
index 0000000..b88e3c8
--- /dev/null
+++ b/src/lib/file-create-locked.h
@@ -0,0 +1,47 @@
+#ifndef FILE_CREATE_LOCKED_H
+#define FILE_CREATE_LOCKED_H
+
+#include "file-lock.h"
+
+struct file_create_settings {
+ /* 0 = try locking without waiting */
+ unsigned int lock_timeout_secs;
+
+ struct file_lock_settings lock_settings;
+
+ /* 0 = 0600 */
+ int mode;
+ /* 0 = default */
+ uid_t uid;
+ /* 0 = default */
+ gid_t gid;
+ const char *gid_origin;
+
+ /* If parent directory doesn't exist, mkdir() it with this mode.
+ 0 = don't mkdir(). The parent directories are assumed to be
+ potentially rmdir() simultaneously, so the mkdir()+locking may be
+ attempted multiple times. */
+ int mkdir_mode;
+ /* 0 = default */
+ uid_t mkdir_uid;
+ /* 0 = default */
+ gid_t mkdir_gid;
+ const char *mkdir_gid_origin;
+};
+
+/* Either open an existing file and lock it, or create the file locked.
+ The creation is done by creating a temp file and link()ing it to path.
+ If link() fails, opening is retried again. Returns fd on success,
+ -1 on error. errno is preserved for the last failed syscall, so most
+ importantly ENOENT could mean that the directory doesn't exist and EAGAIN
+ means locking timed out.
+
+ If this function is used to create lock files, file_lock_set_unlink_on_free()
+ should be used for the resulting lock. It attempts to avoid unlinking the
+ file if there are already other processes using the lock. That can help to
+ avoid "Creating a locked file ... keeps failing" errors */
+int file_create_locked(const char *path, const struct file_create_settings *set,
+ struct file_lock **lock_r, bool *created_r,
+ const char **error_r);
+
+#endif