X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;f=discover%2Fdevice-handler.c;h=89aa67d5e342b66dafdea013b7534e50eed6b089;hb=397dc244bfdc2a57fc3e8fd191b0ef60c8a4b66b;hp=7533cfa1d514b0b6f80048ad7362b5b932b3f94f;hpb=3b29ff8c2a6489b9517d61c0f63256a1ad0c36f7;p=petitboot 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) {