X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Ftmpfiles%2Ftmpfiles.c;h=d8fb07e59a1e0008bfc62915be066274da730a14;hp=70de06b20b55adb47270381455f94812ae196f19;hb=3785ba6966c6f42ed1109bd238f001862736ff73;hpb=d4e9eb91ea12e11bff7d8c6265b067a20ccf37b8 diff --git a/src/tmpfiles/tmpfiles.c b/src/tmpfiles/tmpfiles.c index 70de06b20..d8fb07e59 100644 --- a/src/tmpfiles/tmpfiles.c +++ b/src/tmpfiles/tmpfiles.c @@ -42,6 +42,7 @@ #include "log.h" #include "util.h" +#include "macro.h" #include "mkdir.h" #include "path-util.h" #include "strv.h" @@ -408,7 +409,7 @@ static int clean_item(Item *i) { i->type != IGNORE_PATH) return 0; - if (!i->age_set || i->age <= 0) + if (!i->age_set) return 0; n = now(CLOCK_REALTIME); @@ -503,24 +504,17 @@ static int write_one_file(Item *i, const char *path) { if (i->argument) { ssize_t n; size_t l; - struct iovec iovec[2]; - static const char new_line = '\n'; + _cleanup_free_ char *unescaped; - l = strlen(i->argument); - - zero(iovec); - iovec[0].iov_base = i->argument; - iovec[0].iov_len = l; - - iovec[1].iov_base = (void*) &new_line; - iovec[1].iov_len = 1; + unescaped = cunescape(i->argument); + if (unescaped == NULL) { + close_nointr_nofail(fd); + return log_oom(); + } - n = writev(fd, iovec, 2); + l = strlen(unescaped); + n = write(fd, unescaped, l); - /* It's OK if we don't write the trailing - * newline, hence we check for l, instead of - * l+1 here. Files in /sys often refuse - * writing of the trailing newline. */ if (n < 0 || (size_t) n < l) { log_error("Failed to write file %s: %s", path, n < 0 ? strerror(-n) : "Short write"); close_nointr_nofail(fd); @@ -528,6 +522,8 @@ static int write_one_file(Item *i, const char *path) { } } + close_nointr_nofail(fd); + if (stat(path, &st) < 0) { log_error("stat(%s) failed: %m", path); return -errno; @@ -557,12 +553,13 @@ static int recursive_relabel_children(Item *i, const char *path) { return errno == ENOENT ? 0 : -errno; for (;;) { - struct dirent buf, *de; + struct dirent *de; + union dirent_storage buf; bool is_dir; int r; char *entry_path; - r = readdir_r(d, &buf, &de); + r = readdir_r(d, &buf.de, &de); if (r != 0) { if (ret == 0) ret = -r; @@ -678,6 +675,10 @@ static int create_item(Item *i) { case CREATE_FILE: case TRUNCATE_FILE: + r = write_one_file(i, i->path); + if (r < 0) + return r; + break; case WRITE_FILE: r = glob_item(i, write_one_file); if (r < 0) @@ -1366,7 +1367,7 @@ int main(int argc, char *argv[]) { for (j = optind; j < argc; j++) { char *fragment; - fragment = resolve_fragment(argv[j], (const char**) conf_file_dirs); + fragment = resolve_fragment(argv[j], (const char **)conf_file_dirs); if (!fragment) { log_error("Failed to find a %s file: %m", argv[j]); r = EXIT_FAILURE; @@ -1380,8 +1381,7 @@ int main(int argc, char *argv[]) { } else { char **files, **f; - r = conf_files_list_strv(&files, ".conf", - (const char **) conf_file_dirs); + r = conf_files_list_strv(&files, ".conf", (const char **)conf_file_dirs); if (r < 0) { log_error("Failed to enumerate tmpfiles.d files: %s", strerror(-r)); r = EXIT_FAILURE;