diff options
author | Jeremy Kerr <jk@ozlabs.org> | 2013-02-28 17:16:57 +0800 |
---|---|---|
committer | Jeremy Kerr <jk@ozlabs.org> | 2013-04-29 14:31:20 +1000 |
commit | 397dc244bfdc2a57fc3e8fd191b0ef60c8a4b66b (patch) | |
tree | afad1d55a8d2b64eda25f398c686b05dac94d836 | |
parent | 3b29ff8c2a6489b9517d61c0f63256a1ad0c36f7 (diff) | |
download | petitboot-397dc244bfdc2a57fc3e8fd191b0ef60c8a4b66b.zip petitboot-397dc244bfdc2a57fc3e8fd191b0ef60c8a4b66b.tar.gz |
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.c | 87 | ||||
-rw-r--r-- | discover/device-handler.h | 11 |
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); |