From 872c40396384f9fa89b01baf4e739d28ed590299 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Thu, 11 May 2017 10:29:34 -0400 Subject: [PATCH] update-done: use newly added library function to write the file Fixes #5861. --- src/update-done/update-done.c | 64 ++++++++----------------------------------- 1 file changed, 11 insertions(+), 53 deletions(-) diff --git a/src/update-done/update-done.c b/src/update-done/update-done.c index 06e2d7b..ec467f1 100644 --- a/src/update-done/update-done.c +++ b/src/update-done/update-done.c @@ -18,10 +18,7 @@ ***/ #include "alloc-util.h" -#include "fd-util.h" -#include "fileio.h" -#include "fs-util.h" -#include "io-util.h" +#include "fileio-label.h" #include "selinux-util.h" #include "util.h" @@ -31,64 +28,25 @@ "# was updated. See man:systemd-update-done.service(8).\n" static int apply_timestamp(const char *path, struct timespec *ts) { - struct timespec twice[2] = { - *ts, - *ts - }; - _cleanup_fclose_ FILE *f = NULL; - int fd = -1; + _cleanup_free_ char *message = NULL; int r; - _cleanup_(unlink_and_freep) char *tmp = NULL; - - assert(path); - assert(ts); /* * We store the timestamp both as mtime of the file and in the file itself, * to support filesystems which cannot store nanosecond-precision timestamps. - * Hence, don't bother updating the file, let's just rewrite it. */ - r = mac_selinux_create_file_prepare(path, S_IFREG); - if (r < 0) - return log_error_errno(r, "Failed to set SELinux context for %s: %m", path); - - fd = open_tmpfile_linkable(path, O_WRONLY|O_CLOEXEC, &tmp); - mac_selinux_create_file_clear(); - - if (fd < 0) { - if (errno == EROFS) - return log_debug("Can't create temporary timestamp file %s, file system is read-only.", tmp); - - return log_error_errno(errno, "Failed to create/open temporary timestamp file %s: %m", tmp); - } - - f = fdopen(fd, "we"); - if (!f) { - safe_close(fd); - return log_error_errno(errno, "Failed to fdopen() timestamp file %s: %m", tmp); - } - - (void) fprintf(f, - MESSAGE - "TIMESTAMP_NSEC=" NSEC_FMT "\n", - timespec_load_nsec(ts)); + if (asprintf(&message, + MESSAGE + "TIMESTAMP_NSEC=" NSEC_FMT "\n", + timespec_load_nsec(ts)) < 0) + return log_oom(); - r = fflush_and_check(f); + r = write_string_file_atomic_label_ts(path, message, ts); + if (r == -EROFS) + return log_debug("Cannot create \"%s\", file system is read-only.", path); if (r < 0) - return log_error_errno(r, "Failed to write timestamp file: %m"); - - if (futimens(fd, twice) < 0) - return log_error_errno(errno, "Failed to update timestamp on %s: %m", tmp); - - /* fix permissions */ - (void) fchmod(fd, 0644); - r = link_tmpfile(fd, tmp, path); - if (r < 0) - return log_error_errno(r, "Failed to move \"%s\" to \"%s\": %m", tmp, path); - - tmp = mfree(tmp); - + return log_error_errno(r, "Failed to write \"%s\": %m", path); return 0; } -- 2.7.4