summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2019-05-28 14:42:55 +0200
committerGitHub <noreply@github.com>2019-05-28 14:42:55 +0200
commit127c167cdbbce1c3d730cd53fd79ef5a0603ab7d (patch)
tree8390fee7c2b1fb72ce34a7f819483be6f5104bb9
parent365939fc9f52686359d56f324939498e830932ce (diff)
parente82e549fb2cd97966bd3a5d38dfab15e3d9cd7b6 (diff)
downloadsystemd-127c167cdbbce1c3d730cd53fd79ef5a0603ab7d.tar.gz
systemd-127c167cdbbce1c3d730cd53fd79ef5a0603ab7d.tar.bz2
systemd-127c167cdbbce1c3d730cd53fd79ef5a0603ab7d.zip
Merge pull request #12390 from poettering/string-file-mkdir
fileio: add a WRITE_STRING_FILE_MKDIR_0755 flag to write_string_file() that creates parent directories if needed
-rw-r--r--src/basic/fileio.c7
-rw-r--r--src/basic/fileio.h1
-rw-r--r--src/binfmt/binfmt.c2
-rw-r--r--src/firstboot/firstboot.c18
-rw-r--r--src/gpt-auto-generator/gpt-auto-generator.c3
-rw-r--r--src/nspawn/nspawn-cgroup.c3
-rw-r--r--src/rfkill/rfkill.c8
7 files changed, 21 insertions, 21 deletions
diff --git a/src/basic/fileio.c b/src/basic/fileio.c
index 16034fb9e8..4c18212668 100644
--- a/src/basic/fileio.c
+++ b/src/basic/fileio.c
@@ -21,6 +21,7 @@
#include "log.h"
#include "macro.h"
#include "missing.h"
+#include "mkdir.h"
#include "parse-util.h"
#include "path-util.h"
#include "stdio-util.h"
@@ -174,6 +175,12 @@ int write_string_file_ts(
/* We don't know how to verify whether the file contents was already on-disk. */
assert(!((flags & WRITE_STRING_FILE_VERIFY_ON_FAILURE) && (flags & WRITE_STRING_FILE_SYNC)));
+ if (flags & WRITE_STRING_FILE_MKDIR_0755) {
+ r = mkdir_parents(fn, 0755);
+ if (r < 0)
+ return r;
+ }
+
if (flags & WRITE_STRING_FILE_ATOMIC) {
assert(flags & WRITE_STRING_FILE_CREATE);
diff --git a/src/basic/fileio.h b/src/basic/fileio.h
index eb551c7ac1..05f6c89da0 100644
--- a/src/basic/fileio.h
+++ b/src/basic/fileio.h
@@ -21,6 +21,7 @@ typedef enum {
WRITE_STRING_FILE_SYNC = 1 << 4,
WRITE_STRING_FILE_DISABLE_BUFFER = 1 << 5,
WRITE_STRING_FILE_NOFOLLOW = 1 << 6,
+ WRITE_STRING_FILE_MKDIR_0755 = 1 << 7,
/* And before you wonder, why write_string_file_atomic_label_ts() is a separate function instead of just one
more flag here: it's about linking: we don't want to pull -lselinux into all users of write_string_file()
diff --git a/src/binfmt/binfmt.c b/src/binfmt/binfmt.c
index 66e2f0131c..dda979cc42 100644
--- a/src/binfmt/binfmt.c
+++ b/src/binfmt/binfmt.c
@@ -213,7 +213,7 @@ static int run(int argc, char *argv[]) {
}
/* Flush out all rules */
- write_string_file("/proc/sys/fs/binfmt_misc/status", "-1", WRITE_STRING_FILE_DISABLE_BUFFER);
+ (void) write_string_file("/proc/sys/fs/binfmt_misc/status", "-1", WRITE_STRING_FILE_DISABLE_BUFFER);
STRV_FOREACH(f, files) {
k = apply_file(*f, true);
diff --git a/src/firstboot/firstboot.c b/src/firstboot/firstboot.c
index 7d97777b0d..e6b40294bf 100644
--- a/src/firstboot/firstboot.c
+++ b/src/firstboot/firstboot.c
@@ -253,7 +253,7 @@ static int process_locale(void) {
if (arg_copy_locale && arg_root) {
- mkdir_parents(etc_localeconf, 0755);
+ (void) mkdir_parents(etc_localeconf, 0755);
r = copy_file("/etc/locale.conf", etc_localeconf, 0, 0644, 0, 0, COPY_REFLINK);
if (r != -ENOENT) {
if (r < 0)
@@ -278,7 +278,7 @@ static int process_locale(void) {
locales[i] = NULL;
- mkdir_parents(etc_localeconf, 0755);
+ (void) mkdir_parents(etc_localeconf, 0755);
r = write_env_file(etc_localeconf, locales);
if (r < 0)
return log_error_errno(r, "Failed to write %s: %m", etc_localeconf);
@@ -327,7 +327,7 @@ static int process_keymap(void) {
if (arg_copy_keymap && arg_root) {
- mkdir_parents(etc_vconsoleconf, 0755);
+ (void) mkdir_parents(etc_vconsoleconf, 0755);
r = copy_file("/etc/vconsole.conf", etc_vconsoleconf, 0, 0644, 0, 0, COPY_REFLINK);
if (r != -ENOENT) {
if (r < 0)
@@ -411,7 +411,7 @@ static int process_timezone(void) {
if (r < 0)
return log_error_errno(r, "Failed to read host timezone: %m");
- mkdir_parents(etc_localtime, 0755);
+ (void) mkdir_parents(etc_localtime, 0755);
if (symlink(p, etc_localtime) < 0)
return log_error_errno(errno, "Failed to create %s symlink: %m", etc_localtime);
@@ -429,7 +429,7 @@ static int process_timezone(void) {
e = strjoina("../usr/share/zoneinfo/", arg_timezone);
- mkdir_parents(etc_localtime, 0755);
+ (void) mkdir_parents(etc_localtime, 0755);
if (symlink(e, etc_localtime) < 0)
return log_error_errno(errno, "Failed to create %s symlink: %m", etc_localtime);
@@ -490,9 +490,8 @@ static int process_hostname(void) {
if (isempty(arg_hostname))
return 0;
- mkdir_parents(etc_hostname, 0755);
r = write_string_file(etc_hostname, arg_hostname,
- WRITE_STRING_FILE_CREATE | WRITE_STRING_FILE_SYNC);
+ WRITE_STRING_FILE_CREATE | WRITE_STRING_FILE_SYNC | WRITE_STRING_FILE_MKDIR_0755);
if (r < 0)
return log_error_errno(r, "Failed to write %s: %m", etc_hostname);
@@ -512,9 +511,8 @@ static int process_machine_id(void) {
if (sd_id128_is_null(arg_machine_id))
return 0;
- mkdir_parents(etc_machine_id, 0755);
r = write_string_file(etc_machine_id, sd_id128_to_string(arg_machine_id, id),
- WRITE_STRING_FILE_CREATE | WRITE_STRING_FILE_SYNC);
+ WRITE_STRING_FILE_CREATE | WRITE_STRING_FILE_SYNC | WRITE_STRING_FILE_MKDIR_0755);
if (r < 0)
return log_error_errno(r, "Failed to write machine id: %m");
@@ -615,7 +613,7 @@ static int process_root_password(void) {
if (laccess(etc_shadow, F_OK) >= 0)
return 0;
- mkdir_parents(etc_shadow, 0755);
+ (void) mkdir_parents(etc_shadow, 0755);
lock = take_etc_passwd_lock(arg_root);
if (lock < 0)
diff --git a/src/gpt-auto-generator/gpt-auto-generator.c b/src/gpt-auto-generator/gpt-auto-generator.c
index 0f1e184eea..6c70054d93 100644
--- a/src/gpt-auto-generator/gpt-auto-generator.c
+++ b/src/gpt-auto-generator/gpt-auto-generator.c
@@ -521,13 +521,12 @@ static int add_root_rw(DissectedPartition *p) {
(void) generator_enable_remount_fs_service(arg_dest);
path = strjoina(arg_dest, "/systemd-remount-fs.service.d/50-remount-rw.conf");
- (void) mkdir_parents(path, 0755);
r = write_string_file(path,
"# Automatically generated by systemd-gpt-generator\n\n"
"[Service]\n"
"Environment=SYSTEMD_REMOUNT_ROOT_RW=1\n",
- WRITE_STRING_FILE_CREATE|WRITE_STRING_FILE_NOFOLLOW);
+ WRITE_STRING_FILE_CREATE|WRITE_STRING_FILE_NOFOLLOW|WRITE_STRING_FILE_MKDIR_0755);
if (r < 0)
return log_error_errno(r, "Failed to write drop-in file %s: %m", path);
diff --git a/src/nspawn/nspawn-cgroup.c b/src/nspawn/nspawn-cgroup.c
index ec62b64b00..f84bb39796 100644
--- a/src/nspawn/nspawn-cgroup.c
+++ b/src/nspawn/nspawn-cgroup.c
@@ -121,10 +121,9 @@ int sync_cgroup(pid_t pid, CGroupUnified unified_requested, uid_t uid_shift) {
(void) rm_rf(fn, REMOVE_ROOT|REMOVE_ONLY_DIRECTORIES);
fn = strjoina(tree, cgroup, "/cgroup.procs");
- (void) mkdir_parents(fn, 0755);
sprintf(pid_string, PID_FMT, pid);
- r = write_string_file(fn, pid_string, WRITE_STRING_FILE_DISABLE_BUFFER);
+ r = write_string_file(fn, pid_string, WRITE_STRING_FILE_DISABLE_BUFFER|WRITE_STRING_FILE_MKDIR_0755);
if (r < 0) {
log_error_errno(r, "Failed to move process: %m");
goto finish;
diff --git a/src/rfkill/rfkill.c b/src/rfkill/rfkill.c
index 16610cd476..fe26566fa3 100644
--- a/src/rfkill/rfkill.c
+++ b/src/rfkill/rfkill.c
@@ -154,7 +154,7 @@ static int load_state(Context *c, const struct rfkill_event *event) {
if (IN_SET(r, -ENOENT, 0)) {
/* No state file or it's truncated? Then save the current state */
- r = write_string_file(state_file, one_zero(event->soft), WRITE_STRING_FILE_CREATE|WRITE_STRING_FILE_ATOMIC);
+ r = write_string_file(state_file, one_zero(event->soft), WRITE_STRING_FILE_CREATE|WRITE_STRING_FILE_ATOMIC|WRITE_STRING_FILE_MKDIR_0755);
if (r < 0)
return log_error_errno(r, "Failed to write state file %s: %m", state_file);
@@ -246,7 +246,7 @@ static int save_state_cancel(Context *c, const struct rfkill_event *event) {
static int save_state_write_one(struct write_queue_item *item) {
int r;
- r = write_string_file(item->file, one_zero(item->state), WRITE_STRING_FILE_CREATE|WRITE_STRING_FILE_ATOMIC);
+ r = write_string_file(item->file, one_zero(item->state), WRITE_STRING_FILE_CREATE|WRITE_STRING_FILE_ATOMIC|WRITE_STRING_FILE_MKDIR_0755);
if (r < 0)
return log_error_errno(r, "Failed to write state file %s: %m", item->file);
@@ -280,10 +280,6 @@ static int run(int argc, char *argv[]) {
umask(0022);
- r = mkdir_p("/var/lib/systemd/rfkill", 0755);
- if (r < 0)
- return log_error_errno(r, "Failed to create rfkill directory: %m");
-
n = sd_listen_fds(false);
if (n < 0)
return log_error_errno(n, "Failed to determine whether we got any file descriptors passed: %m");