]>
git.ipfire.org Git - thirdparty/systemd.git/blob - src/shared/serialize.c
1 /* SPDX-License-Identifier: LGPL-2.1+ */
3 #include "alloc-util.h"
7 #include "parse-util.h"
11 int serialize_item(FILE *f
, const char *key
, const char *value
) {
18 /* Make sure that anything we serialize we can also read back again with read_line() with a maximum line size
19 * of LONG_LINE_MAX. This is a safety net only. All code calling us should filter this out earlier anyway. */
20 if (strlen(key
) + 1 + strlen(value
) + 1 > LONG_LINE_MAX
) {
21 log_warning("Attempted to serialize overly long item '%s', refusing.", key
);
33 int serialize_item_escaped(FILE *f
, const char *key
, const char *value
) {
34 _cleanup_free_
char *c
= NULL
;
46 return serialize_item(f
, key
, c
);
49 int serialize_item_format(FILE *f
, const char *key
, const char *format
, ...) {
50 char buf
[LONG_LINE_MAX
];
59 k
= vsnprintf(buf
, sizeof(buf
), format
, ap
);
62 if (k
< 0 || (size_t) k
>= sizeof(buf
) || strlen(key
) + 1 + k
+ 1 > LONG_LINE_MAX
) {
63 log_warning("Attempted to serialize overly long item '%s', refusing.", key
);
75 int serialize_fd(FILE *f
, FDSet
*fds
, const char *key
, int fd
) {
84 copy
= fdset_put_dup(fds
, fd
);
86 return log_error_errno(copy
, "Failed to add file descriptor to serialization set: %m");
88 return serialize_item_format(f
, key
, "%i", copy
);
91 int serialize_usec(FILE *f
, const char *key
, usec_t usec
) {
95 if (usec
== USEC_INFINITY
)
98 return serialize_item_format(f
, key
, USEC_FMT
, usec
);
101 int serialize_dual_timestamp(FILE *f
, const char *name
, const dual_timestamp
*t
) {
106 if (!dual_timestamp_is_set(t
))
109 return serialize_item_format(f
, name
, USEC_FMT
" " USEC_FMT
, t
->realtime
, t
->monotonic
);
112 int serialize_strv(FILE *f
, const char *key
, char **l
) {
116 /* Returns the first error, or positive if anything was serialized, 0 otherwise. */
119 r
= serialize_item_escaped(f
, key
, *i
);
120 if ((ret
>= 0 && r
< 0) ||
128 int deserialize_usec(const char *value
, usec_t
*ret
) {
133 r
= safe_atou64(value
, ret
);
135 return log_debug_errno(r
, "Failed to parse usec value \"%s\": %m", value
);
140 int deserialize_dual_timestamp(const char *value
, dual_timestamp
*t
) {
147 pos
= strspn(value
, WHITESPACE
);
148 if (value
[pos
] == '-')
150 pos
+= strspn(value
+ pos
, DIGITS
);
151 pos
+= strspn(value
+ pos
, WHITESPACE
);
152 if (value
[pos
] == '-')
155 r
= sscanf(value
, "%" PRIu64
"%" PRIu64
"%n", &a
, &b
, &pos
);
157 log_debug("Failed to parse dual timestamp value \"%s\".", value
);
161 if (value
[pos
] != '\0')
162 /* trailing garbage */
171 int deserialize_environment(const char *value
, char ***list
) {
172 _cleanup_free_
char *unescaped
= NULL
;
178 /* Changes the *environment strv inline. */
180 r
= cunescape(value
, 0, &unescaped
);
182 return log_error_errno(r
, "Failed to unescape: %m");
184 r
= strv_env_replace(list
, unescaped
);
186 return log_error_errno(r
, "Failed to append environment variable: %m");
188 unescaped
= NULL
; /* now part of 'list' */