diff options
author | Kenny Levinsen <kl@kl.wtf> | 2020-04-09 15:30:02 +0200 |
---|---|---|
committer | Kenny Levinsen <kl@kl.wtf> | 2020-04-30 19:42:53 +0200 |
commit | 30520492604bad0bb1e346b538119dcb37525d37 (patch) | |
tree | d0220aa70486260b4faa5a9f13af73842438e6ec | |
parent | cb5a46b84504006196e4415266c1a6414c07c9b3 (diff) | |
download | systemd-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.c | 43 | ||||
-rw-r--r-- | src/core/service.h | 1 |
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); }; |