summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKenny Levinsen <kl@kl.wtf>2020-04-09 15:30:02 +0200
committerKenny Levinsen <kl@kl.wtf>2020-04-30 19:42:53 +0200
commit30520492604bad0bb1e346b538119dcb37525d37 (patch)
treed0220aa70486260b4faa5a9f13af73842438e6ec
parentcb5a46b84504006196e4415266c1a6414c07c9b3 (diff)
downloadsystemd-30520492604bad0bb1e346b538119dcb37525d37.tar.gz
core: (De-)Serialize poll flag for fds in fdstore
This replaces manual string splitting and unescaping with extract_first_word.
-rw-r--r--src/core/service.c43
-rw-r--r--src/core/service.h1
2 files changed, 26 insertions, 18 deletions
diff --git a/src/core/service.c b/src/core/service.c
index cc8b44f1c8..292df8d5e1 100644
--- a/src/core/service.c
+++ b/src/core/service.c
@@ -453,6 +453,7 @@ static int service_add_fd_store(Service *s, int fd, const char *name, bool do_po
fs->fd = fd;
fs->service = s;
+ fs->do_poll = do_poll;
fs->fdname = strdup(name ?: "stored");
if (!fs->fdname) {
free(fs);
@@ -2717,7 +2718,7 @@ static int service_serialize(Unit *u, FILE *f, FDSet *fds) {
if (!c)
return log_oom();
- (void) serialize_item_format(f, "fd-store-fd", "%i %s", copy, c);
+ (void) serialize_item_format(f, "fd-store-fd", "%i \"%s\" %i", copy, c, fs->do_poll);
}
if (s->main_exec_status.pid > 0) {
@@ -2946,30 +2947,36 @@ static int service_deserialize_item(Unit *u, const char *key, const char *value,
s->socket_fd = fdset_remove(fds, fd);
}
} else if (streq(key, "fd-store-fd")) {
- const char *fdv;
- size_t pf;
+ _cleanup_free_ char *fdv = NULL, *fdn = NULL, *fdp = NULL;
int fd;
+ int do_poll;
- pf = strcspn(value, WHITESPACE);
- fdv = strndupa(value, pf);
-
- if (safe_atoi(fdv, &fd) < 0 || fd < 0 || !fdset_contains(fds, fd))
+ r = extract_first_word(&value, &fdv, NULL, 0);
+ if (r <= 0 || safe_atoi(fdv, &fd) < 0 || fd < 0 || !fdset_contains(fds, fd)) {
log_unit_debug(u, "Failed to parse fd-store-fd value: %s", value);
- else {
- _cleanup_free_ char *t = NULL;
- const char *fdn;
+ return 0;
+ }
- fdn = value + pf;
- fdn += strspn(fdn, WHITESPACE);
- (void) cunescape(fdn, 0, &t);
+ r = extract_first_word(&value, &fdn, NULL, EXTRACT_CUNESCAPE | EXTRACT_UNQUOTE);
+ if (r <= 0) {
+ log_unit_debug_errno(u, r, "Failed to parse fd-store-fd value \"%s\": %m", value);
+ return 0;
+ }
- r = service_add_fd_store(s, fd, t, true);
- if (r < 0)
- log_unit_error_errno(u, r, "Failed to add fd to store: %m");
- else
- fdset_remove(fds, fd);
+ r = extract_first_word(&value, &fdp, NULL, 0);
+ if (r == 0) {
+ /* If the value is not present, we assume the default */
+ do_poll = 1;
+ } else if (r < 0 || safe_atoi(fdp, &do_poll) < 0) {
+ log_unit_debug_errno(u, r, "Failed to parse fd-store-fd value \"%s\": %m", value);
+ return 0;
}
+ r = service_add_fd_store(s, fd, fdn, do_poll);
+ if (r < 0)
+ log_unit_error_errno(u, r, "Failed to add fd to store: %m");
+ else
+ fdset_remove(fds, fd);
} else if (streq(key, "main-exec-status-pid")) {
pid_t pid;
diff --git a/src/core/service.h b/src/core/service.h
index 11e861a3d4..b9c8036f22 100644
--- a/src/core/service.h
+++ b/src/core/service.h
@@ -80,6 +80,7 @@ struct ServiceFDStore {
int fd;
char *fdname;
sd_event_source *event_source;
+ bool do_poll;
LIST_FIELDS(ServiceFDStore, fd_store);
};