summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeremy Kerr <jk@ozlabs.org>2013-02-28 17:16:57 +0800
committerJeremy Kerr <jk@ozlabs.org>2013-04-29 14:31:20 +1000
commit397dc244bfdc2a57fc3e8fd191b0ef60c8a4b66b (patch)
treeafad1d55a8d2b64eda25f398c686b05dac94d836
parent3b29ff8c2a6489b9517d61c0f63256a1ad0c36f7 (diff)
downloadtalos-petitboot-397dc244bfdc2a57fc3e8fd191b0ef60c8a4b66b.tar.gz
talos-petitboot-397dc244bfdc2a57fc3e8fd191b0ef60c8a4b66b.zip
discover: Add device lookup functions
Add a few functions to find devices by various attributes: * device_lookup_by_name * device_lookup_by_path * device_lookup_by_uuid * device_lookup_by_label * device_lookup_by_id Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
-rw-r--r--discover/device-handler.c87
-rw-r--r--discover/device-handler.h11
2 files changed, 98 insertions, 0 deletions
diff --git a/discover/device-handler.c b/discover/device-handler.c
index 7533cfa..89aa67d 100644
--- a/discover/device-handler.c
+++ b/discover/device-handler.c
@@ -464,6 +464,93 @@ void device_handler_destroy(struct device_handler *handler)
talloc_free(handler);
}
+static int device_match_path(struct discover_device *dev, const char *path)
+{
+ return !strcmp(dev->device_path, path);
+}
+
+static int device_match_uuid(struct discover_device *dev, const char *uuid)
+{
+ return dev->uuid && !strcmp(dev->uuid, uuid);
+}
+
+static int device_match_label(struct discover_device *dev, const char *label)
+{
+ return dev->label && !strcmp(dev->label, label);
+}
+
+static int device_match_id(struct discover_device *dev, const char *id)
+{
+ return !strcmp(dev->device->id, id);
+}
+
+static struct discover_device *device_lookup(
+ struct device_handler *device_handler,
+ int (match_fn)(struct discover_device *, const char *),
+ const char *str)
+{
+ struct discover_device *dev;
+ unsigned int i;
+
+ if (!str)
+ return NULL;
+
+ for (i = 0; i < device_handler->n_devices; i++) {
+ dev = device_handler->devices[i];
+
+ if (match_fn(dev, str))
+ return dev;
+ }
+
+ return NULL;
+}
+
+struct discover_device *device_lookup_by_name(struct device_handler *handler,
+ const char *name)
+{
+ struct discover_device *dev;
+ char *path;
+
+ if (strncmp(name, "/dev/", strlen("/dev/")))
+ path = talloc_asprintf(NULL, "/dev/%s", name);
+ else
+ path = talloc_strdup(NULL, name);
+
+ dev = device_lookup_by_path(handler, path);
+
+ talloc_free(path);
+
+ return dev;
+}
+
+struct discover_device *device_lookup_by_path(
+ struct device_handler *device_handler,
+ const char *path)
+{
+ return device_lookup(device_handler, device_match_path, path);
+}
+
+struct discover_device *device_lookup_by_uuid(
+ struct device_handler *device_handler,
+ const char *uuid)
+{
+ return device_lookup(device_handler, device_match_uuid, uuid);
+}
+
+struct discover_device *device_lookup_by_label(
+ struct device_handler *device_handler,
+ const char *label)
+{
+ return device_lookup(device_handler, device_match_label, label);
+}
+
+struct discover_device *device_lookup_by_id(
+ struct device_handler *device_handler,
+ const char *id)
+{
+ return device_lookup(device_handler, device_match_id, id);
+}
+
static struct boot_option *find_boot_option_by_id(
struct device_handler *handler, const char *id)
{
diff --git a/discover/device-handler.h b/discover/device-handler.h
index e298fed..9a7cf6d 100644
--- a/discover/device-handler.h
+++ b/discover/device-handler.h
@@ -45,6 +45,17 @@ void discover_context_add_boot_option(struct discover_context *ctx,
int device_handler_event(struct device_handler *handler, struct event *event);
+struct discover_device *device_lookup_by_name(struct device_handler *handler,
+ const char *name);
+struct discover_device *device_lookup_by_path(struct device_handler *handler,
+ const char *path);
+struct discover_device *device_lookup_by_uuid(struct device_handler *handler,
+ const char *uuid);
+struct discover_device *device_lookup_by_label(struct device_handler *handler,
+ const char *label);
+struct discover_device *device_lookup_by_id(struct device_handler *handler,
+ const char *id);
+
void device_handler_boot(struct device_handler *handler,
struct boot_command *cmd);
OpenPOWER on IntegriCloud