This introduces a common helper replacing three very similar uses.
Prompted by review of: #27890
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, "=");
} else
log_debug("Unknown job serialization key: %s", l);
}
+
+ return 0;
}
int job_coldplug(Job *j) {
_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="))) {
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, "=");
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;
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);