mirror of
https://github.com/systemd/systemd.git
synced 2025-01-08 17:43:43 +08:00
systemd-tmpfiles: allow appending content to file
Adds support to append to files with w+ type. w /tmp/13291.out - - - - first line\n w+ /tmp/13291.out - - - - second line\n
This commit is contained in:
parent
c55ac24825
commit
d0ea5c5e39
@ -51,7 +51,7 @@ p /fifo/to/create mode user group - -
|
||||
L /symlink/to/create - - - - symlink/target/path
|
||||
c /dev/char-device-to-create mode user group - -
|
||||
b /dev/block-device-to-create mode user group - -
|
||||
# p+, L+, c+, b+ create target unconditionally
|
||||
# p+, L+, c+, b+ create target unconditionally, w+ appends to the file
|
||||
C /target/to/create - - - - /source/to/copy
|
||||
x /path-or-glob/to/ignore - - - - -
|
||||
X /path-or-glob/to/ignore/recursively - - - - -
|
||||
@ -167,13 +167,13 @@ L /tmp/foobar - - - - /dev/null</programlisting>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><varname>w</varname></term>
|
||||
<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. Follows
|
||||
symlinks.</para></listitem>
|
||||
<term><varname>w, w+</varname></term>
|
||||
<listitem><para>Write the argument parameter to a file, if the file exists.
|
||||
If suffixed with <varname>+</varname>, the line will be appended to the file.
|
||||
If your configuration writes multiple lines to the same file, use <varname>w+</varname>.
|
||||
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. Follows symlinks.</para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
|
@ -1257,7 +1257,7 @@ static int path_set_attribute(Item *item, const char *path) {
|
||||
static int write_one_file(Item *i, const char *path) {
|
||||
_cleanup_close_ int fd = -1, dir_fd = -1;
|
||||
char *bn;
|
||||
int r;
|
||||
int flags, r;
|
||||
|
||||
assert(i);
|
||||
assert(path);
|
||||
@ -1272,8 +1272,10 @@ static int write_one_file(Item *i, const char *path) {
|
||||
|
||||
bn = basename(path);
|
||||
|
||||
flags = O_NONBLOCK|O_CLOEXEC|O_WRONLY|O_NOCTTY;
|
||||
|
||||
/* Follows symlinks */
|
||||
fd = openat(dir_fd, bn, O_NONBLOCK|O_CLOEXEC|O_WRONLY|O_NOCTTY, i->mode);
|
||||
fd = openat(dir_fd, bn, i->append_or_force ? flags|O_APPEND : flags, i->mode);
|
||||
if (fd < 0) {
|
||||
if (errno == ENOENT) {
|
||||
log_debug_errno(errno, "Not writing missing file \"%s\": %m", path);
|
||||
@ -2794,7 +2796,7 @@ static int parse_line(const char *fname, unsigned line, const char *buffer, bool
|
||||
size_t n;
|
||||
|
||||
for (n = 0; n < existing->n_items; n++) {
|
||||
if (!item_compatible(existing->items + n, &i)) {
|
||||
if (!item_compatible(existing->items + n, &i) && !i.append_or_force) {
|
||||
log_notice("[%s:%u] Duplicate line for path \"%s\", ignoring.",
|
||||
fname, line, i.path);
|
||||
return 0;
|
||||
|
Loading…
Reference in New Issue
Block a user