summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDaan De Meyer <daan.j.demeyer@gmail.com>2022-11-17 14:12:48 +0100
committerDaan De Meyer <daan.j.demeyer@gmail.com>2022-11-17 14:14:31 +0100
commitdd3c82529472b891c58995fca1f36686c45f856b (patch)
tree74a55d1cb82a122be25215c6c40a174d5b5bdf1c /src
parent305dd91adfde332e7e5c1b2470edb32774f9a032 (diff)
downloadsystemd-dd3c82529472b891c58995fca1f36686c45f856b.tar.gz
tmpfile-util: Introduce fopen_temporary_child()
Instead of having fopen_temporary() create the file either next to an existing file or in tmp/, let's split this up clearly into two different functions, one for creating temporary files next to existing files, and one for creating a temporary file in a directory.
Diffstat (limited to 'src')
-rw-r--r--src/basic/tmpfile-util.c72
-rw-r--r--src/basic/tmpfile-util.h6
-rw-r--r--src/home/homework-cifs.c2
-rw-r--r--src/partition/repart.c2
-rw-r--r--src/shared/mkfs-util.c2
-rw-r--r--src/shared/tmpfile-util-label.c2
-rw-r--r--src/test/test-uid-range.c2
7 files changed, 62 insertions, 26 deletions
diff --git a/src/basic/tmpfile-util.c b/src/basic/tmpfile-util.c
index 909057429d..dbbd54027e 100644
--- a/src/basic/tmpfile-util.c
+++ b/src/basic/tmpfile-util.c
@@ -19,31 +19,15 @@
#include "tmpfile-util.h"
#include "umask-util.h"
-int fopen_temporary_at(int dir_fd, const char *path, FILE **ret_file, char **ret_temp_path) {
+static int fopen_temporary_internal(int dir_fd, const char *path, FILE **ret_file) {
_cleanup_fclose_ FILE *f = NULL;
- _cleanup_free_ char *t = NULL;
_cleanup_close_ int fd = -1;
int r;
assert(dir_fd >= 0 || dir_fd == AT_FDCWD);
+ assert(path);
- if (path) {
- r = tempfn_random(path, NULL, &t);
- if (r < 0)
- return r;
- } else {
- const char *d;
-
- r = tmp_dir(&d);
- if (r < 0)
- return r;
-
- r = tempfn_random_child(d, NULL, &t);
- if (r < 0)
- return r;
- }
-
- fd = openat(dir_fd, t, O_CLOEXEC|O_NOCTTY|O_RDWR|O_CREAT|O_EXCL, 0600);
+ fd = openat(dir_fd, path, O_CLOEXEC|O_NOCTTY|O_RDWR|O_CREAT|O_EXCL, 0600);
if (fd < 0)
return -errno;
@@ -52,15 +36,59 @@ int fopen_temporary_at(int dir_fd, const char *path, FILE **ret_file, char **ret
r = take_fdopen_unlocked(&fd, "w", &f);
if (r < 0) {
- (void) unlinkat(dir_fd, t, 0);
+ (void) unlinkat(dir_fd, path, 0);
return r;
}
if (ret_file)
*ret_file = TAKE_PTR(f);
- if (ret_temp_path)
- *ret_temp_path = TAKE_PTR(t);
+ return 0;
+}
+
+int fopen_temporary_at(int dir_fd, const char *path, FILE **ret_file, char **ret_path) {
+ _cleanup_free_ char *t = NULL;
+ int r;
+
+ assert(dir_fd >= 0 || dir_fd == AT_FDCWD);
+ assert(path);
+
+ r = tempfn_random(path, NULL, &t);
+ if (r < 0)
+ return r;
+
+ r = fopen_temporary_internal(dir_fd, t, ret_file);
+ if (r < 0)
+ return r;
+
+ if (ret_path)
+ *ret_path = TAKE_PTR(t);
+
+ return 0;
+}
+
+int fopen_temporary_child_at(int dir_fd, const char *path, FILE **ret_file, char **ret_path) {
+ _cleanup_free_ char *t = NULL;
+ int r;
+
+ assert(dir_fd >= 0 || dir_fd == AT_FDCWD);
+
+ if (!path) {
+ r = tmp_dir(&path);
+ if (r < 0)
+ return r;
+ }
+
+ r = tempfn_random_child(path, NULL, &t);
+ if (r < 0)
+ return r;
+
+ r = fopen_temporary_internal(dir_fd, t, ret_file);
+ if (r < 0)
+ return r;
+
+ if (ret_path)
+ *ret_path = TAKE_PTR(t);
return 0;
}
diff --git a/src/basic/tmpfile-util.h b/src/basic/tmpfile-util.h
index 4af28b9da3..e5b7709e3f 100644
--- a/src/basic/tmpfile-util.h
+++ b/src/basic/tmpfile-util.h
@@ -8,6 +8,12 @@ int fopen_temporary_at(int dir_fd, const char *path, FILE **ret_file, char **ret
static inline int fopen_temporary(const char *path, FILE **ret_file, char **ret_path) {
return fopen_temporary_at(AT_FDCWD, path, ret_file, ret_path);
}
+
+int fopen_temporary_child_at(int dir_fd, const char *path, FILE **ret_file, char **ret_path);
+static inline int fopen_temporary_child(const char *path, FILE **ret_file, char **ret_path) {
+ return fopen_temporary_child_at(AT_FDCWD, path, ret_file, ret_path);
+}
+
int mkostemp_safe(char *pattern);
int fmkostemp_safe(char *pattern, const char *mode, FILE**_f);
diff --git a/src/home/homework-cifs.c b/src/home/homework-cifs.c
index e79def3dae..8ad1da6303 100644
--- a/src/home/homework-cifs.c
+++ b/src/home/homework-cifs.c
@@ -64,7 +64,7 @@ int home_setup_cifs(
pid_t mount_pid;
int exit_status;
- r = fopen_temporary(NULL, &f, &p);
+ r = fopen_temporary_child(NULL, &f, &p);
if (r < 0)
return log_error_errno(r, "Failed to create temporary credentials file: %m");
diff --git a/src/partition/repart.c b/src/partition/repart.c
index 5d4cdbe689..9ab051190d 100644
--- a/src/partition/repart.c
+++ b/src/partition/repart.c
@@ -3194,7 +3194,7 @@ static int partition_encrypt(Context *context, Partition *p, const char *node) {
log_info("Encrypting future partition %" PRIu64 "...", p->partno);
- r = fopen_temporary(NULL, &h, &hp);
+ r = fopen_temporary_child(NULL, &h, &hp);
if (r < 0)
return log_error_errno(r, "Failed to create temporary LUKS header file: %m");
diff --git a/src/shared/mkfs-util.c b/src/shared/mkfs-util.c
index 19ffd9151b..2070965387 100644
--- a/src/shared/mkfs-util.c
+++ b/src/shared/mkfs-util.c
@@ -254,7 +254,7 @@ static int make_protofile(const char *root, char **ret) {
assert(ret);
- r = fopen_temporary(NULL, &f, &p);
+ r = fopen_temporary_child(NULL, &f, &p);
if (r < 0)
return log_error_errno(r, "Failed to open temporary file: %m");
diff --git a/src/shared/tmpfile-util-label.c b/src/shared/tmpfile-util-label.c
index d37c0b0845..17c5038b51 100644
--- a/src/shared/tmpfile-util-label.c
+++ b/src/shared/tmpfile-util-label.c
@@ -14,6 +14,8 @@ int fopen_temporary_label(
int r;
+ assert(path);
+
r = mac_selinux_create_file_prepare(target, S_IFREG);
if (r < 0)
return r;
diff --git a/src/test/test-uid-range.c b/src/test/test-uid-range.c
index c759573173..186f6ee29c 100644
--- a/src/test/test-uid-range.c
+++ b/src/test/test-uid-range.c
@@ -114,7 +114,7 @@ TEST(load_userns) {
assert_se(uid_range_covers(p, 0, UINT32_MAX));
}
- assert_se(fopen_temporary(NULL, &f, &fn) >= 0);
+ assert_se(fopen_temporary_child(NULL, &f, &fn) >= 0);
fputs("0 0 20\n"
"100 0 20\n", f);
assert_se(fflush_and_check(f) >= 0);