diff options
-rw-r--r-- | man/tmpfiles.d.xml | 5 | ||||
-rw-r--r-- | src/tmpfiles/tmpfiles.c | 22 |
2 files changed, 11 insertions, 16 deletions
diff --git a/man/tmpfiles.d.xml b/man/tmpfiles.d.xml index c6325a457b..a86ef33695 100644 --- a/man/tmpfiles.d.xml +++ b/man/tmpfiles.d.xml @@ -114,7 +114,10 @@ L /tmp/foobar - - - - /dev/null</programlisting> <varlistentry> <term><varname>w</varname></term> - <listitem><para>Write the argument parameter to a file, if it exists. Lines of this type accept shell-style globs in place of normal path names.</para></listitem> + <listitem><para>Write the argument parameter to a file, if the file exists. + Lines of this type accept shell-style globs in place of normal path + names. The argument parameter will be written without a trailing + newline. C-style backslash escapes are interpreted.</para></listitem> </varlistentry> <varlistentry> diff --git a/src/tmpfiles/tmpfiles.c b/src/tmpfiles/tmpfiles.c index ed51ec8a7f..5d0f571bea 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" @@ -503,24 +504,15 @@ 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); + unescaped = cunescape(i->argument); + if (unescaped == NULL) + return log_oom(); - zero(iovec); - iovec[0].iov_base = i->argument; - iovec[0].iov_len = l; + l = strlen(unescaped); + n = write(fd, unescaped, l); - iovec[1].iov_base = (void*) &new_line; - iovec[1].iov_len = 1; - - n = writev(fd, iovec, 2); - - /* 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); |