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:
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user