summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2018-04-26 21:19:16 +0200
committerGitHub <noreply@github.com>2018-04-26 21:19:16 +0200
commitbe737420b7cd9489bfa2d518a577a0b56cb51862 (patch)
tree8cd872b185ce7f273f53d0a5fd0d57b925817d44
parentnetwork: recreate link if its interface name is changed (#8795) (diff)
parentcore: include Found state in device dumps (diff)
downloadsystemd-be737420b7cd9489bfa2d518a577a0b56cb51862.tar.xz
systemd-be737420b7cd9489bfa2d518a577a0b56cb51862.zip
Merge pull request #8798 from yuwata/follow-up-8675
device: fix serialization and deserialization of DeviceFound
-rw-r--r--src/core/device.c97
-rw-r--r--src/core/device.h3
2 files changed, 77 insertions, 23 deletions
diff --git a/src/core/device.c b/src/core/device.c
index 1441d08b97..565410fd36 100644
--- a/src/core/device.c
+++ b/src/core/device.c
@@ -17,7 +17,6 @@
#include "parse-util.h"
#include "path-util.h"
#include "stat-util.h"
-#include "string-table.h"
#include "string-util.h"
#include "swap.h"
#include "udev-util.h"
@@ -152,7 +151,71 @@ static int device_coldplug(Unit *u) {
return 0;
}
+static const struct {
+ DeviceFound flag;
+ const char *name;
+} device_found_map[] = {
+ { DEVICE_FOUND_UDEV, "found-udev" },
+ { DEVICE_FOUND_UDEV_DB, "found-udev-db" },
+ { DEVICE_FOUND_MOUNT, "found-mount" },
+ { DEVICE_FOUND_SWAP, "found-swap" },
+ {}
+};
+
+static int device_found_to_string_many(DeviceFound flags, char **ret) {
+ _cleanup_free_ char *s = NULL;
+ unsigned i;
+
+ assert(ret);
+
+ for (i = 0; device_found_map[i].name; i++) {
+ if ((flags & device_found_map[i].flag) != device_found_map[i].flag)
+ continue;
+
+ if (!strextend_with_separator(&s, ",", device_found_map[i].name, NULL))
+ return -ENOMEM;
+ }
+
+ *ret = TAKE_PTR(s);
+
+ return 0;
+}
+
+static int device_found_from_string_many(const char *name, DeviceFound *ret) {
+ DeviceFound flags = 0;
+ int r;
+
+ assert(ret);
+
+ for (;;) {
+ _cleanup_free_ char *word = NULL;
+ DeviceFound f = 0;
+ unsigned i;
+
+ r = extract_first_word(&name, &word, ",", 0);
+ if (r < 0)
+ return r;
+ if (r == 0)
+ break;
+
+ for (i = 0; device_found_map[i].name; i++)
+ if (streq(word, device_found_map[i].name)) {
+ f = device_found_map[i].flag;
+ break;
+ }
+
+ if (f == 0)
+ return -EINVAL;
+
+ flags |= f;
+ }
+
+ *ret = flags;
+ return 0;
+}
+
static int device_serialize(Unit *u, FILE *f, FDSet *fds) {
+ _cleanup_free_ char *s = NULL;
Device *d = DEVICE(u);
assert(u);
@@ -160,13 +223,16 @@ static int device_serialize(Unit *u, FILE *f, FDSet *fds) {
assert(fds);
unit_serialize_item(u, f, "state", device_state_to_string(d->state));
- unit_serialize_item(u, f, "found", device_found_to_string(d->found));
+
+ (void) device_found_to_string_many(d->found, &s);
+ unit_serialize_item(u, f, "found", s);
return 0;
}
static int device_deserialize_item(Unit *u, const char *key, const char *value, FDSet *fds) {
Device *d = DEVICE(u);
+ int r;
assert(u);
assert(key);
@@ -195,13 +261,9 @@ static int device_deserialize_item(Unit *u, const char *key, const char *value,
d->deserialized_state = state;
} else if (streq(key, "found")) {
- DeviceFound found;
-
- found = device_found_from_string(value);
- if (found < 0)
+ r = device_found_from_string_many(value, &d->found);
+ if (r < 0)
log_unit_debug(u, "Failed to parse found value: %s", value);
- else
- d->found = found;
} else
log_unit_debug(u, "Unknown serialization key: %s", key);
@@ -211,14 +273,19 @@ static int device_deserialize_item(Unit *u, const char *key, const char *value,
static void device_dump(Unit *u, FILE *f, const char *prefix) {
Device *d = DEVICE(u);
+ _cleanup_free_ char *s = NULL;
assert(d);
+ (void) device_found_to_string_many(d->found, &s);
+
fprintf(f,
"%sDevice State: %s\n"
- "%sSysfs Path: %s\n",
+ "%sSysfs Path: %s\n"
+ "%sFound: %s\n",
prefix, device_state_to_string(d->state),
- prefix, strna(d->sysfs));
+ prefix, strna(d->sysfs),
+ prefix, strna(s));
}
_pure_ static UnitActiveState device_active_state(Unit *u) {
@@ -934,16 +1001,6 @@ bool device_shall_be_bound_by(Unit *device, Unit *u) {
return DEVICE(device)->bind_mounts;
}
-static const char* const device_found_table[] = {
- [DEVICE_NOT_FOUND] = "not-found",
- [DEVICE_FOUND_UDEV] = "found-udev",
- [DEVICE_FOUND_UDEV_DB] = "found-udev-db",
- [DEVICE_FOUND_MOUNT] = "found-mount",
- [DEVICE_FOUND_SWAP] = "found-swap",
-};
-
-DEFINE_STRING_TABLE_LOOKUP(device_found, DeviceFound);
-
const UnitVTable device_vtable = {
.object_size = sizeof(Device),
.sections =
diff --git a/src/core/device.h b/src/core/device.h
index a96aa6d24d..d52700b66f 100644
--- a/src/core/device.h
+++ b/src/core/device.h
@@ -37,6 +37,3 @@ extern const UnitVTable device_vtable;
int device_found_node(Manager *m, const char *node, bool add, DeviceFound found, bool now);
bool device_shall_be_bound_by(Unit *device, Unit *u);
-
-const char *device_found_to_string(DeviceFound f) _const_;
-DeviceFound device_found_from_string(const char *s) _pure_;