]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
serialize: add common deserialize_read_line() helper and use it everywhere
authorLennart Poettering <lennart@poettering.net>
Fri, 8 Sep 2023 15:02:11 +0000 (17:02 +0200)
committerLuca Boccassi <luca.boccassi@gmail.com>
Fri, 8 Sep 2023 19:59:44 +0000 (20:59 +0100)
This introduces a common helper replacing three very similar uses.

Prompted by review of: #27890

src/core/job.c
src/core/manager-serialize.c
src/core/unit-serialize.c
src/shared/serialize.c
src/shared/serialize.h

index acf8a78f41363bc1fdfc719739ca76c7b1688909..e7d1f65dbccd8481b05562f479b732f7c00efcd3 100644 (file)
@@ -1233,21 +1233,15 @@ int job_deserialize(Job *j, FILE *f) {
         assert(f);
 
         for (;;) {
-                _cleanup_free_ char *line = NULL;
-                char *l, *v;
+                _cleanup_free_ char *l = NULL;
                 size_t k;
+                char *v;
 
-                r = read_line(f, LONG_LINE_MAX, &line);
+                r = deserialize_read_line(f, &l);
                 if (r < 0)
-                        return log_error_errno(r, "Failed to read serialization line: %m");
-                if (r == 0)
-                        return 0;
-
-                l = strstrip(line);
-
-                /* End marker */
-                if (isempty(l))
-                        return 0;
+                        return r;
+                if (r == 0) /* eof or end marker */
+                        break;
 
                 k = strcspn(l, "=");
 
@@ -1326,6 +1320,8 @@ int job_deserialize(Job *j, FILE *f) {
                 } else
                         log_debug("Unknown job serialization key: %s", l);
         }
+
+        return 0;
 }
 
 int job_coldplug(Job *j) {
index f4ad9b0642bcab67803bcd4762be1fc9944d4582..71234ae9362f7b8f15940d7bbaac8fa4cdb8ec8b 100644 (file)
@@ -338,17 +338,13 @@ int manager_deserialize(Manager *m, FILE *f, FDSet *fds) {
         _cleanup_(manager_reloading_stopp) _unused_ Manager *reloading = manager_reloading_start(m);
 
         for (;;) {
-                _cleanup_free_ char *line = NULL;
-                const char *val, *l;
+                _cleanup_free_ char *l = NULL;
+                const char *val;
 
-                r = read_line(f, LONG_LINE_MAX, &line);
+                r = deserialize_read_line(f, &l);
                 if (r < 0)
-                        return log_error_errno(r, "Failed to read serialization line: %m");
-                if (r == 0)
-                        break;
-
-                l = strstrip(line);
-                if (isempty(l)) /* end marker */
+                        return r;
+                if (r == 0) /* eof or end marker */
                         break;
 
                 if ((val = startswith(l, "current-job-id="))) {
index cb209c5bde8ee64fbf63815579fdda97682c3fdf..f0030d3211bcf3f2e2c4ec233dbfe862c578bc77 100644 (file)
@@ -272,19 +272,15 @@ int unit_deserialize(Unit *u, FILE *f, FDSet *fds) {
         assert(fds);
 
         for (;;) {
-                _cleanup_free_ char *line = NULL;
-                char *l, *v;
+                _cleanup_free_ char *l  = NULL;
                 ssize_t m;
                 size_t k;
+                char *v;
 
-                r = read_line(f, LONG_LINE_MAX, &line);
+                r = deserialize_read_line(f, &l);
                 if (r < 0)
-                        return log_error_errno(r, "Failed to read serialization line: %m");
-                if (r == 0) /* eof */
-                        break;
-
-                l = strstrip(line);
-                if (isempty(l)) /* End marker */
+                        return r;
+                if (r == 0) /* eof or end marker */
                         break;
 
                 k = strcspn(l, "=");
index 5396062a8be026dd37cb2aacd673768d4ab2d4a5..669071dbd8ea14ac100c6e55565f658277429b38 100644 (file)
@@ -131,6 +131,34 @@ int serialize_strv(FILE *f, const char *key, char **l) {
         return ret;
 }
 
+int deserialize_read_line(FILE *f, char **ret) {
+        _cleanup_free_ char *line = NULL;
+        int r;
+
+        assert(f);
+        assert(ret);
+
+        r = read_line(f, LONG_LINE_MAX, &line);
+        if (r < 0)
+                return log_error_errno(r, "Failed to read serialization line: %m");
+        if (r == 0) { /* eof */
+                *ret = NULL;
+                return 0;
+        }
+
+        const char *l = strstrip(line);
+        if (isempty(l)) { /* End marker */
+                *ret = NULL;
+                return 0;
+        }
+
+        if (free_and_strdup(&line, l) < 0)
+                return log_oom();
+
+        *ret = TAKE_PTR(line);
+        return 1;
+}
+
 int deserialize_strv(char ***l, const char *value) {
         ssize_t unescaped_len;
         char *unescaped;
index 8b6e0999f1faca85443f16005b81f932d75f0e37..fa1731acb57f75e7abea0ef8e12cba47cec34b7d 100644 (file)
@@ -23,6 +23,8 @@ static inline int serialize_bool_elide(FILE *f, const char *key, bool b) {
         return b ? serialize_item(f, key, yes_no(b)) : 0;
 }
 
+int deserialize_read_line(FILE *f, char **ret);
+
 int deserialize_usec(const char *value, usec_t *timestamp);
 int deserialize_dual_timestamp(const char *value, dual_timestamp *t);
 int deserialize_environment(const char *value, char ***environment);