chiark / gitweb /
networkd: be more defensive when writing to ipv4/ipv6 forwarding settings
[elogind.git] / src / shared / fileio.c
index f4efc4c9f1a21e19713da4b6eec05ad07ace5c72..00fb6f8b5cce1b6f75190bcb992383a7fdc563a8 100644 (file)
@@ -66,7 +66,7 @@ int write_string_file_no_create(const char *fn, const char *line) {
         assert(line);
 
         /* We manually build our own version of fopen(..., "we") that
-         * without O_CREAT */
+         * works without O_CREAT */
         fd = open(fn, O_WRONLY|O_CLOEXEC|O_NOCTTY);
         if (fd < 0)
                 return -errno;
@@ -94,20 +94,10 @@ int write_string_file_atomic(const char *fn, const char *line) {
 
         fchmod_umask(fileno(f), 0644);
 
-        errno = 0;
-        fputs(line, f);
-        if (!endswith(line, "\n"))
-                fputc('\n', f);
-
-        fflush(f);
-
-        if (ferror(f))
-                r = errno ? -errno : -EIO;
-        else {
+        r = write_string_stream(f, line);
+        if (r >= 0) {
                 if (rename(p, fn) < 0)
                         r = -errno;
-                else
-                        r = 0;
         }
 
         if (r < 0)
@@ -144,6 +134,17 @@ int read_one_line_file(const char *fn, char **line) {
         return 0;
 }
 
+int verify_one_line_file(const char *fn, const char *line) {
+        _cleanup_free_ char *value = NULL;
+        int r;
+
+        r = read_one_line_file(fn, &value);
+        if (r < 0)
+                return r;
+
+        return streq(value, line);
+}
+
 int read_full_stream(FILE *f, char **contents, size_t *size) {
         size_t n, l;
         _cleanup_free_ char *buf = NULL;