From 31a9be2372eeef7357dc8c2fd95b1e96305c107d Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Thu, 20 Jun 2019 06:51:34 +0900 Subject: [PATCH] util: use extract_first_word() instead of strsep() --- src/basic/cgroup-util.c | 32 +++++++++++++++++++++----------- src/basic/virt.c | 26 +++++++++++++++----------- 2 files changed, 36 insertions(+), 22 deletions(-) diff --git a/src/basic/cgroup-util.c b/src/basic/cgroup-util.c index e6a8b0e0fb..156a360885 100644 --- a/src/basic/cgroup-util.c +++ b/src/basic/cgroup-util.c @@ -91,10 +91,9 @@ int cg_read_event( const char *controller, const char *path, const char *event, - char **val) { + char **ret) { _cleanup_free_ char *events = NULL, *content = NULL; - char *p, *line; int r; r = cg_get_path(controller, path, "cgroup.events", &events); @@ -105,22 +104,33 @@ int cg_read_event( if (r < 0) return r; - p = content; - while ((line = strsep(&p, "\n"))) { - char *key; + for (const char *p = content;;) { + _cleanup_free_ char *line = NULL, *key = NULL, *val = NULL; + const char *q; - key = strsep(&line, " "); - if (!key || !line) + r = extract_first_word(&p, &line, "\n", 0); + if (r < 0) + return r; + if (r == 0) + return -ENOENT; + + q = line; + r = extract_first_word(&q, &key, " ", 0); + if (r < 0) + return r; + if (r == 0) return -EINVAL; - if (strcmp(key, event)) + if (!streq(key, event)) continue; - *val = strdup(line); + val = strdup(q); + if (!val) + return -ENOMEM; + + *ret = TAKE_PTR(val); return 0; } - - return -ENOENT; } bool cg_ns_supported(void) { diff --git a/src/basic/virt.c b/src/basic/virt.c index 84b2d64b25..7a7400773b 100644 --- a/src/basic/virt.c +++ b/src/basic/virt.c @@ -198,7 +198,6 @@ static int detect_vm_xen(void) { /* Returns -errno, or 0 for domU, or 1 for dom0 */ static int detect_vm_xen_dom0(void) { _cleanup_free_ char *domcap = NULL; - char *cap, *i; int r; r = read_one_line_file(PATH_FEATURES, &domcap); @@ -229,17 +228,22 @@ static int detect_vm_xen_dom0(void) { if (r < 0) return r; - i = domcap; - while ((cap = strsep(&i, ","))) - if (streq(cap, "control_d")) - break; - if (!cap) { - log_debug("Virtualization XEN DomU found (/proc/xen/capabilities)"); - return 0; - } + for (const char *i = domcap;;) { + _cleanup_free_ char *cap = NULL; - log_debug("Virtualization XEN Dom0 ignored (/proc/xen/capabilities)"); - return 1; + r = extract_first_word(&i, &cap, ",", 0); + if (r < 0) + return r; + if (r == 0) { + log_debug("Virtualization XEN DomU found (/proc/xen/capabilities)"); + return 0; + } + + if (streq(cap, "control_d")) { + log_debug("Virtualization XEN Dom0 ignored (/proc/xen/capabilities)"); + return 1; + } + } } static int detect_vm_hypervisor(void) {