tmpfiles: make "f" lines behaviour match what the documentation says

CHANGE OF BEHAVIOUR — with this commit "f" line's behaviour is altered
to match what the documentation says: if an "argument" string is
specified it is written to the file only when the file didn't exist
before. Previously, it would be appended to the file each time
systemd-tmpfiles was invoked — which is not a particularly useful
behaviour as the tool is not idempotent then and the indicated files
grow without bounds each time the tool is invoked.

I did some spelunking whether this change in behaviour would break
things, but afaics nothing relies on the previous O_APPEND behaviour of
this line type, hence I think it's relatively safe to make "f" lines
work the way the docs say, rather than adding a new modifier for it or
so.

Triggered by:

https://lists.freedesktop.org/archives/systemd-devel/2018-January/040171.html
This commit is contained in:
Lennart Poettering
2018-01-24 10:54:10 +01:00
parent 1302e7aa94
commit 49e87292dc
3 changed files with 29 additions and 20 deletions
+7 -2
View File
@@ -1189,7 +1189,7 @@ static int write_one_file(Item *i, const char *path) {
assert(i);
assert(path);
flags = i->type == CREATE_FILE ? O_CREAT|O_APPEND|O_NOFOLLOW :
flags = i->type == CREATE_FILE ? O_CREAT|O_EXCL|O_NOFOLLOW :
i->type == TRUNCATE_FILE ? O_CREAT|O_TRUNC|O_NOFOLLOW : 0;
RUN_WITH_UMASK(0000) {
@@ -1200,9 +1200,13 @@ static int write_one_file(Item *i, const char *path) {
if (fd < 0) {
if (i->type == WRITE_FILE && errno == ENOENT) {
log_debug_errno(errno, "Not writing \"%s\": %m", path);
log_debug_errno(errno, "Not writing missing file \"%s\": %m", path);
return 0;
}
if (i->type == CREATE_FILE && errno == EEXIST) {
log_debug_errno(errno, "Not writing to pre-existing file \"%s\": %m", path);
goto done;
}
r = -errno;
if (!i->argument && errno == EROFS && stat(path, &st) == 0 &&
@@ -1223,6 +1227,7 @@ static int write_one_file(Item *i, const char *path) {
fd = safe_close(fd);
done:
if (stat(path, &st) < 0)
return log_error_errno(errno, "stat(%s) failed: %m", path);