discover: Separate temporary and permanent device data
authorJeremy Kerr <jk@ozlabs.org>
Mon, 11 Mar 2013 09:08:57 +0000 (17:08 +0800)
committerJeremy Kerr <jk@ozlabs.org>
Tue, 16 Apr 2013 04:57:15 +0000 (12:57 +0800)
At present, we keep both permanent (eg links/n_links) and temporary
(event) data in struct discover_context.

This change makes discover_context a temporary structure, just used
during actual device discovery. Once discovery is complete, the
permanent data (discover_device) is "committed" to the device handler.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
discover/device-handler.c
discover/device-handler.h
discover/event-parser.c
discover/grub2-parser.c
discover/kboot-parser.c
discover/parser-conf.c
discover/parser-utils.c
discover/parser.c
discover/parser.h
discover/yaboot-parser.c
test/parser/parser-test.c

index 4ba7405f2de73f29ded296340ec310104393a8d6..08e3d74651e7e1426ed3c8e6c8032955917379d1 100644 (file)
 #include "boot.h"
 
 struct device_handler {
-       struct discover_server *server;
-       int dry_run;
+       struct discover_server  *server;
+       int                     dry_run;
 
-       struct device **devices;
-       unsigned int n_devices;
-
-       struct list contexts;
+       struct discover_device  **devices;
+       unsigned int            n_devices;
 };
 
 /**
- * device_handler_add - Add a device to the handler device array.
+ * context_commit - Commit a temporary discovery context to the handler,
+ * and notify the clients about any new options / devices
  */
+static void context_commit(struct device_handler *handler,
+               struct discover_context *ctx)
+{
+       struct discover_device *dev = ctx->device;
+       unsigned int i, existing_device;
+       struct boot_option *opt, *tmp;
+
+       /* do we already have this device? */
+       for (i = 0; i < handler->n_devices; i++) {
+               if (ctx->device == handler->devices[i]) {
+                       existing_device = 1;
+                       break;
+               }
+       }
+
+       /* if not already present, add the device to the handler's array */
+       if (!existing_device) {
+               handler->n_devices++;
+               handler->devices = talloc_realloc(handler, handler->devices,
+                       struct discover_device *, handler->n_devices);
+               handler->devices[handler->n_devices - 1] = dev;
+               talloc_steal(handler, dev);
+
+               discover_server_notify_device_add(handler->server, dev->device);
+       }
+
 
-static void device_handler_add(struct device_handler *handler,
-       struct device *device)
+       /* move boot options from the context to the device */
+       list_for_each_entry_safe(&ctx->boot_options, opt, tmp, list) {
+               list_remove(&opt->list);
+               list_add(&dev->device->boot_options, &opt->list);
+               dev->device->n_options++;
+               discover_server_notify_boot_option_add(handler->server, opt);
+       }
+}
+
+void discover_context_add_boot_option(struct discover_context *ctx,
+               struct boot_option *boot_option)
 {
-       handler->n_devices++;
-       handler->devices = talloc_realloc(handler, handler->devices,
-               struct device *, handler->n_devices);
-       handler->devices[handler->n_devices - 1] = device;
+       list_add(&ctx->boot_options, &boot_option->list);
+       talloc_steal(ctx, boot_option);
 }
 
 /**
@@ -49,7 +81,7 @@ static void device_handler_add(struct device_handler *handler,
  */
 
 static void device_handler_remove(struct device_handler *handler,
-       struct device *device)
+       struct discover_device *device)
 {
        unsigned int i;
 
@@ -66,27 +98,11 @@ static void device_handler_remove(struct device_handler *handler,
        memmove(&handler->devices[i], &handler->devices[i + 1],
                (handler->n_devices - i) * sizeof(handler->devices[0]));
        handler->devices = talloc_realloc(handler, handler->devices,
-               struct device *, handler->n_devices);
-}
+               struct discover_device *, handler->n_devices);
 
-/**
- * device_handler_find - Find a handler device by id.
- */
-
-static struct device *device_handler_find(struct device_handler *handler,
-       const char *id)
-{
-       unsigned int i;
-
-       assert(id);
+       discover_server_notify_device_remove(handler->server, device->device);
 
-       for (i = 0; i < handler->n_devices; i++)
-               if (handler->devices[i]->id
-                       && streq(handler->devices[i]->id, id))
-                       return handler->devices[i];
-
-       pb_log("%s: unknown device: %s\n", __func__, id);
-       return NULL;
+       talloc_free(device);
 }
 
 /**
@@ -110,11 +126,12 @@ const struct device *device_handler_get_device(
                return NULL;
        }
 
-       return handler->devices[index];
+       return handler->devices[index]->device;
 }
 
 static void setup_device_links(struct discover_context *ctx)
 {
+       struct discover_device *dev = ctx->device;
        struct link {
                char *env, *dir;
        } *link, links[] = {
@@ -141,21 +158,21 @@ static void setup_device_links(struct discover_context *ctx)
 
                enc = encode_label(ctx, value);
                dir = join_paths(ctx, mount_base(), link->dir);
-               path = join_paths(ctx, dir, value);
+               path = join_paths(dev, dir, value);
 
                if (!pb_mkdir_recursive(dir)) {
                        unlink(path);
-                       if (symlink(ctx->mount_path, path)) {
+                       if (symlink(dev->mount_path, path)) {
                                pb_log("symlink(%s,%s): %s\n",
-                                               ctx->mount_path, path,
+                                               dev->mount_path, path,
                                                strerror(errno));
                                talloc_free(path);
                        } else {
-                               int i = ctx->n_links++;
-                               ctx->links = talloc_realloc(ctx,
-                                               ctx->links, char *,
-                                               ctx->n_links);
-                               ctx->links[i] = path;
+                               int i = dev->n_links++;
+                               dev->links = talloc_realloc(dev,
+                                               dev->links, char *,
+                                               dev->n_links);
+                               dev->links[i] = path;
                        }
 
                }
@@ -165,31 +182,32 @@ static void setup_device_links(struct discover_context *ctx)
        }
 }
 
-static void remove_device_links(struct discover_context *ctx)
+static void remove_device_links(struct discover_device *dev)
 {
        int i;
 
-       for (i = 0; i < ctx->n_links; i++)
-               unlink(ctx->links[i]);
+       for (i = 0; i < dev->n_links; i++)
+               unlink(dev->links[i]);
 }
 
 static int mount_device(struct discover_context *ctx)
 {
+       struct discover_device *dev = ctx->device;
        const char *mountpoint;
        const char *argv[6];
 
-       if (!ctx->mount_path) {
-               mountpoint = mountpoint_for_device(ctx->device_path);
-               ctx->mount_path = talloc_strdup(ctx, mountpoint);
+       if (!dev->mount_path) {
+               mountpoint = mountpoint_for_device(dev->device_path);
+               dev->mount_path = talloc_strdup(dev, mountpoint);
        }
 
-       if (pb_mkdir_recursive(ctx->mount_path))
+       if (pb_mkdir_recursive(dev->mount_path))
                pb_log("couldn't create mount directory %s: %s\n",
-                               ctx->mount_path, strerror(errno));
+                               dev->mount_path, strerror(errno));
 
        argv[0] = pb_system_apps.mount;
-       argv[1] = ctx->device_path;
-       argv[2] = ctx->mount_path;
+       argv[1] = dev->device_path;
+       argv[2] = dev->mount_path;
        argv[3] = "-o";
        argv[4] = "ro";
        argv[5] = NULL;
@@ -199,8 +217,8 @@ static int mount_device(struct discover_context *ctx)
                /* Retry mount without ro option. */
 
                argv[0] = pb_system_apps.mount;
-               argv[1] = ctx->device_path;
-               argv[2] = ctx->mount_path;
+               argv[1] = dev->device_path;
+               argv[2] = dev->mount_path;
                argv[3] = NULL;
 
                if (pb_run_cmd(argv, 1, 0))
@@ -211,16 +229,16 @@ static int mount_device(struct discover_context *ctx)
        return 0;
 
 out_rmdir:
-       pb_rmdir_recursive(mount_base(), ctx->mount_path);
+       pb_rmdir_recursive(mount_base(), dev->mount_path);
        return -1;
 }
 
-static int umount_device(struct discover_context *ctx)
+static int umount_device(struct discover_device *dev)
 {
        int status;
        pid_t pid;
 
-       remove_device_links(ctx);
+       remove_device_links(dev);
 
        pid = fork();
        if (pid == -1) {
@@ -230,7 +248,7 @@ static int umount_device(struct discover_context *ctx)
 
        if (pid == 0) {
                execl(pb_system_apps.umount, pb_system_apps.umount,
-                                               ctx->mount_path, NULL);
+                                               dev->mount_path, NULL);
                exit(EXIT_FAILURE);
        }
 
@@ -243,54 +261,78 @@ static int umount_device(struct discover_context *ctx)
        if (!WIFEXITED(status) || WEXITSTATUS(status) != 0)
                return -1;
 
-       pb_rmdir_recursive(mount_base(), ctx->mount_path);
+       pb_rmdir_recursive(mount_base(), dev->mount_path);
 
        return 0;
 }
 
-static struct discover_context *find_context(struct device_handler *handler,
+static struct discover_device *find_device(struct device_handler *handler,
                const char *id)
 {
-       struct discover_context *ctx;
+       struct discover_device *dev;
+       unsigned int i;
 
-       list_for_each_entry(&handler->contexts, ctx, list) {
-               if (!strcmp(ctx->id, id))
-                       return ctx;
+       for (i = 0; i < handler->n_devices; i++) {
+               dev = handler->devices[i];
+               if (!strcmp(dev->device->id, id))
+                       return dev;
        }
 
        return NULL;
 }
 
-static int destroy_context(void *arg)
+static int destroy_device(void *arg)
 {
-       struct discover_context *ctx = arg;
+       struct discover_device *dev = arg;
 
-       list_remove(&ctx->list);
-       umount_device(ctx);
+       umount_device(dev);
 
        return 0;
 }
 
+static struct discover_device *discover_device_create(
+               struct device_handler *handler,
+               struct discover_context *ctx,
+               struct event *event)
+{
+       struct discover_device *dev;
+       const char *devname;
+
+       dev = find_device(handler, event->device);
+       if (dev)
+               return dev;
+
+       dev = talloc_zero(ctx, struct discover_device);
+       dev->device = talloc_zero(dev, struct device);
+       list_init(&dev->device->boot_options);
+
+       devname = event_get_param(ctx->event, "DEVNAME");
+       if (devname)
+               dev->device_path = talloc_strdup(dev, devname);
+
+       dev->device->id = talloc_strdup(dev, event->device);
+
+       talloc_set_destructor(dev, destroy_device);
+
+       return dev;
+}
+
 static int handle_add_udev_event(struct device_handler *handler,
                struct event *event)
 {
        struct discover_context *ctx;
-       struct boot_option *opt;
-       const char *devname;
+       struct discover_device *dev;
        int rc;
 
        /* create our context */
        ctx = talloc(handler, struct discover_context);
        ctx->event = event;
-       ctx->mount_path = NULL;
-       ctx->links = NULL;
-       ctx->n_links = 0;
+       list_init(&ctx->boot_options);
 
-       ctx->id = talloc_strdup(ctx, event->device);
+       /* create our top-level device */
+       dev = discover_device_create(handler, ctx, event);
 
-       devname = event_get_param(ctx->event, "DEVNAME");
-       assert(devname);
-       ctx->device_path = talloc_strdup(ctx, devname);
+       ctx->device = dev;
 
        rc = mount_device(ctx);
        if (rc) {
@@ -298,24 +340,13 @@ static int handle_add_udev_event(struct device_handler *handler,
                return 0;
        }
 
-       list_add(&handler->contexts, &ctx->list);
-       talloc_set_destructor(ctx, destroy_context);
-
-       /* set up the top-level device */
-       ctx->device = talloc_zero(ctx, struct device);
-       ctx->device->id = talloc_strdup(ctx->device, ctx->id);
-       list_init(&ctx->device->boot_options);
-
-       /* run the parsers */
+       /* run the parsers. This will populate the ctx's boot_option list. */
        iterate_parsers(ctx);
 
-       /* add device to handler device array */
-       device_handler_add(handler, ctx->device);
+       /* add discovered stuff to the handler */
+       context_commit(handler, ctx);
 
-       discover_server_notify_device_add(handler->server, ctx->device);
-
-       list_for_each_entry(&ctx->device->boot_options, opt, list)
-               discover_server_notify_boot_option_add(handler->server, opt);
+       talloc_free(ctx);
 
        return 0;
 }
@@ -323,18 +354,14 @@ static int handle_add_udev_event(struct device_handler *handler,
 static int handle_remove_udev_event(struct device_handler *handler,
                struct event *event)
 {
-       struct discover_context *ctx;
+       struct discover_device *dev;
 
-       ctx = find_context(handler, event->device);
-       if (!ctx)
+       dev = find_device(handler, event->device);
+       if (!dev)
                return 0;
 
-       discover_server_notify_device_remove(handler->server, ctx->device);
-
        /* remove device from handler device array */
-       device_handler_remove(handler, ctx->device);
-
-       talloc_free(ctx);
+       device_handler_remove(handler, dev);
 
        return 0;
 }
@@ -342,52 +369,38 @@ static int handle_remove_udev_event(struct device_handler *handler,
 static int handle_add_user_event(struct device_handler *handler,
                struct event *event)
 {
-       struct boot_option *opt;
-       struct device *device;
+       struct discover_context *ctx;
+       struct discover_device *dev;
+       int rc;
 
        assert(event->device);
 
-       device = device_handler_find(handler, event->device);
-
-       if (!device) {
-               device = talloc_zero(handler, struct device);
-
-               if (!device)
-                       goto fail;
-
-               device->id = talloc_strdup(device, event->device);
-               list_init(&device->boot_options);
-
-               /* add device to handler device array */
-               device_handler_add(handler, device);
+       ctx = talloc(handler, struct discover_context);
+       ctx->event = event;
+       list_init(&ctx->boot_options);
 
-               discover_server_notify_device_add(handler->server, device);
-       }
+       dev = discover_device_create(handler, ctx, event);
+       ctx->device = dev;
 
-       opt = parse_user_event(device, event);
-       discover_server_notify_boot_option_add(handler->server, opt);
+       rc = parse_user_event(ctx, event);
 
-       return 0;
+       if (!rc)
+               context_commit(handler, ctx);
 
-fail:
-       talloc_free(device);
-       return 0;
+       return rc;
 }
 
 static int handle_remove_user_event(struct device_handler *handler,
                struct event *event)
 {
-       struct device *device = device_handler_find(handler, event->device);
+       struct discover_device *dev = find_device(handler, event->device);
 
-       if (!device)
+       if (!dev)
                return 0;
 
-       discover_server_notify_device_remove(handler->server, device);
-
        /* remove device from handler device array */
-       device_handler_remove(handler, device);
+       device_handler_remove(handler, dev);
 
-       talloc_free(device);
        return 0;
 }
 
@@ -429,8 +442,6 @@ struct device_handler *device_handler_init(struct discover_server *server,
        handler->server = server;
        handler->dry_run = dry_run;
 
-       list_init(&handler->contexts);
-
        /* set up our mount point base */
        pb_mkdir_recursive(mount_base());
 
@@ -450,10 +461,10 @@ static struct boot_option *find_boot_option_by_id(
        unsigned int i;
 
        for (i = 0; i < handler->n_devices; i++) {
-               struct device *dev = handler->devices[i];
+               struct discover_device *dev = handler->devices[i];
                struct boot_option *opt;
 
-               list_for_each_entry(&dev->boot_options, opt, list)
+               list_for_each_entry(&dev->device->boot_options, opt, list)
                        if (!strcmp(opt->id, id))
                                return opt;
        }
index 4cf7d7dadb5bd8256a7284a464a89fc51104fb64..809f88ee727ac1e16e9891c0714121fc802aa6d0 100644 (file)
@@ -4,21 +4,27 @@
 #include <list/list.h>
 
 struct device_handler;
+struct discover_device;
 struct discover_server;
+struct boot_option;
 struct boot_command;
 struct event;
 struct device;
 
+struct discover_device {
+       struct device           *device;
+
+       char                    **links;
+       int                     n_links;
+
+       char                    *mount_path;
+       char                    *device_path;
+};
+
 struct discover_context {
-       char *id;
-       char *device_path;
-       char *mount_path;
-       struct event *event;
-       struct device *device;
-       char **links;
-       int n_links;
-
-       struct list_item list;
+       struct event            *event;
+       struct discover_device  *device;
+       struct list             boot_options;
 };
 
 struct device_handler *device_handler_init(struct discover_server *server,
@@ -30,6 +36,10 @@ int device_handler_get_device_count(const struct device_handler *handler);
 const struct device *device_handler_get_device(
        const struct device_handler *handler, unsigned int index);
 
+struct device *discover_context_device(struct discover_context *ctx);
+void discover_context_add_boot_option(struct discover_context *ctx,
+               struct boot_option *opt);
+
 int device_handler_event(struct device_handler *handler, struct event *event);
 
 void device_handler_boot(struct device_handler *handler,
index c09c5babc27a1e44d642c31f523688b55b652ff4..d7c0820083ff8a098383992939d357b2377e6cfc 100644 (file)
@@ -6,6 +6,7 @@
 #include "talloc/talloc.h"
 #include "event.h"
 #include "parser-utils.h"
+#include "device-handler.h"
 
 /**
  * parse_user_event - Parse a user event.
  * Understands params: name, image, args.
  */
 
-struct boot_option *parse_user_event(struct device *device, struct event *event)
+int parse_user_event(struct discover_context *ctx, struct event *event)
 {
        struct boot_option *opt;
+       struct device *dev;
        const char *p;
 
-       opt = talloc_zero(device, struct boot_option);
+       dev = ctx->device->device;
+
+       opt = talloc_zero(dev, struct boot_option);
 
        if (!opt)
                goto fail;
@@ -30,8 +34,8 @@ struct boot_option *parse_user_event(struct device *device, struct event *event)
                goto fail;
        }
 
-       opt->id = talloc_asprintf(opt, "%s#%s", device->id, p);
-       opt->device_id = talloc_strdup(opt, device->id);
+       opt->id = talloc_asprintf(opt, "%s#%s", dev->id, p);
+       opt->device_id = talloc_strdup(opt, dev->id);
        opt->name = talloc_strdup(opt, p);
 
        p = event_get_param(event, "image");
@@ -52,11 +56,11 @@ struct boot_option *parse_user_event(struct device *device, struct event *event)
        opt->description = talloc_asprintf(opt, "%s %s", opt->boot_image_file,
                opt->boot_args);
 
-       device_add_boot_option(device, opt);
+       discover_context_add_boot_option(ctx, opt);
 
-       return opt;
+       return 0;
 
 fail:
        talloc_free(opt);
-       return NULL;
+       return -1;
 }
index df1b755715d776acf93b37e8095afcdddcdeba22..fa7b9507348a217d0576adfcd3c33d9fdffc839c 100644 (file)
@@ -41,11 +41,11 @@ struct grub2_state {
 
 static void grub2_finish(struct conf_context *conf)
 {
+       struct device *dev = conf->dc->device->device;
        struct grub2_state *state = conf->parser_info;
 
        if (!state->desc_image) {
-               pb_log("%s: %s: no image found\n", __func__,
-                       conf->dc->device->id);
+               pb_log("%s: %s: no image found\n", __func__, dev->id);
                return;
        }
 
@@ -66,8 +66,9 @@ static void grub2_finish(struct conf_context *conf)
 
        /* opt is persistent, so must be associated with device */
 
-       device_add_boot_option(conf->dc->device, state->opt);
-       state->opt = talloc_zero(conf->dc->device, struct boot_option);
+       discover_context_add_boot_option(conf->dc, state->opt);
+
+       state->opt = talloc_zero(conf->dc, struct boot_option);
        state->opt->boot_args = talloc_strdup(state->opt, "");
 
        talloc_free(state->desc_image);
@@ -77,6 +78,7 @@ static void grub2_finish(struct conf_context *conf)
 static void grub2_process_pair(struct conf_context *conf, const char *name,
                char *value)
 {
+       struct device *dev = conf->dc->device->device;
        struct grub2_state *state = conf->parser_info;
 
        if (!name || !conf_param_in_list(state->known_names, name))
@@ -95,7 +97,7 @@ static void grub2_process_pair(struct conf_context *conf, const char *name,
                        *sep = 0;
 
                state->opt->id = talloc_asprintf(state->opt, "%s#%s",
-                       conf->dc->device->id, value);
+                       dev->id, value);
                state->opt->name = talloc_strdup(state->opt, value);
 
                return;
@@ -110,7 +112,7 @@ static void grub2_process_pair(struct conf_context *conf, const char *name,
                        *sep = 0;
 
                state->opt->boot_image_file = resolve_path(state->opt,
-                       value, conf->dc->device_path);
+                       value, conf->dc->device->device_path);
                state->desc_image = talloc_strdup(state->opt, value);
 
                if (sep)
@@ -122,7 +124,7 @@ static void grub2_process_pair(struct conf_context *conf, const char *name,
 
        if (streq(name, "initrd")) {
                state->opt->initrd_file = resolve_path(state->opt,
-                       value, conf->dc->device_path);
+                       value, conf->dc->device->device_path);
                state->desc_initrd = talloc_asprintf(state, "initrd=%s",
                        value);
                return;
index 2954d89d44c013c500ce634e7ef51bb22a2247c5..5d5090b46003c509c666b10584b2a996eddcd9a4 100644 (file)
@@ -15,6 +15,7 @@ static void kboot_process_pair(struct conf_context *conf, const char *name,
                char *value)
 {
        const char *const *ignored_names = conf->parser_info;
+       struct device *dev;
        char *pos;
        char *args;
        const char *initrd;
@@ -34,12 +35,13 @@ static void kboot_process_pair(struct conf_context *conf, const char *name,
 
        /* opt must be associated with dc */
 
-       opt = talloc_zero(conf->dc->device, struct boot_option);
+       dev = conf->dc->device->device;
+       opt = talloc_zero(dev, struct boot_option);
 
        if (!opt)
                return;
 
-       opt->id = talloc_asprintf(opt, "%s#%s", conf->dc->device->id, name);
+       opt->id = talloc_asprintf(opt, "%s#%s", dev->id, name);
        opt->name = talloc_strdup(opt, name);
 
        args = talloc_strdup(opt, "");
@@ -79,7 +81,8 @@ static void kboot_process_pair(struct conf_context *conf, const char *name,
        }
 
 out_add:
-       opt->boot_image_file = resolve_path(opt, value, conf->dc->device_path);
+       opt->boot_image_file = resolve_path(opt, value,
+                       conf->dc->device->device_path);
 
        if (root) {
                opt->boot_args = talloc_asprintf(opt, "root=%s %s", root, args);
@@ -89,7 +92,7 @@ out_add:
 
        if (initrd) {
                opt->initrd_file = resolve_path(opt, initrd,
-                               conf->dc->device_path);
+                               conf->dc->device->device_path);
 
                opt->description = talloc_asprintf(opt, "%s initrd=%s %s",
                        value, initrd, opt->boot_args);
@@ -100,7 +103,7 @@ out_add:
        conf_strip_str(opt->boot_args);
        conf_strip_str(opt->description);
 
-       device_add_boot_option(conf->dc->device, opt);
+       discover_context_add_boot_option(conf->dc, opt);
 }
 
 static struct conf_global_option kboot_global_options[] = {
index be19932c68c566dac92b9f915d3ec2680613dc4c..247e29d734fdea083ee508216271a6103b62b019 100644 (file)
@@ -255,6 +255,7 @@ static void conf_parse_buf(struct conf_context *conf)
 
 int conf_parse(struct conf_context *conf)
 {
+       struct device *dev;
        int fd, rc;
        unsigned int i;
        struct stat stat;
@@ -269,7 +270,7 @@ int conf_parse(struct conf_context *conf)
 
        for (i = 0; conf->conf_files[i]; i++) {
                char *filepath = resolve_path(conf->dc,
-                       conf->conf_files[i], conf->dc->device_path);
+                       conf->conf_files[i], conf->dc->device->device_path);
 
                pb_log("%s: try: %s\n", __func__, filepath);
 
@@ -309,8 +310,9 @@ int conf_parse(struct conf_context *conf)
        if (len <= 0)
                goto out;
 
-       if (!conf->dc->device->icon_file)
-               conf->dc->device->icon_file = talloc_strdup(conf->dc,
+       dev = conf->dc->device->device;
+       if (!dev->icon_file)
+               dev->icon_file = talloc_strdup(dev,
                        generic_icon_file(guess_device_type(conf->dc)));
 
        conf_parse_buf(conf);
index 5792f0a1d587a790814bd449af1f8d00aaf1f4cc..f4a35a752c8a46f28f3da39f809ddf2c7b4ffc0e 100644 (file)
 #include "device-handler.h"
 #include "parser-utils.h"
 
-void device_add_boot_option(struct device *device,
-               struct boot_option *boot_option)
-{
-       pb_log("%s: %s\n", __func__, device->id);
-       pb_log(" id     '%s'\n", boot_option->id);
-       pb_log(" name   '%s'\n", boot_option->name);
-       pb_log(" descr  '%s'\n", boot_option->description);
-       pb_log(" icon   '%s'\n", boot_option->icon_file);
-       pb_log(" image  '%s'\n", boot_option->boot_image_file);
-       pb_log(" initrd '%s'\n", boot_option->initrd_file);
-       pb_log(" args   '%s'\n", boot_option->boot_args);
-       list_add(&device->boot_options, &boot_option->list);
-       talloc_steal(device, boot_option);
-}
-
 const char *generic_icon_file(enum generic_icon_type type)
 {
        switch (type) {
index d0b0477ff5389050713005d4d582de98d16e17e0..5f4e5149557678c6e0c34c59c02a42f5b5b46317 100644 (file)
@@ -26,7 +26,7 @@ void iterate_parsers(struct discover_context *ctx)
        int i;
        unsigned int count = 0;
 
-       pb_log("trying parsers for %s\n", ctx->device_path);
+       pb_log("trying parsers for %s\n", ctx->device->device->id);
 
        for (i = 0; parsers[i]; i++) {
                pb_log("\ttrying parser '%s'\n", parsers[i]->name);
index a80d1b5b8df43ccf4cee400ce125395212446025..9f98368b5ca417640e9c097d50674f3a71c924e5 100644 (file)
@@ -21,7 +21,6 @@ enum generic_icon_type {
 void parser_init(void);
 
 void iterate_parsers(struct discover_context *ctx);
-struct boot_option *parse_user_event(struct device *device,
-               struct event *event);
+int parse_user_event(struct discover_context *ctx, struct event *event);
 
 #endif /* _PARSER_H */
index 59e52b82ac9f0315de5ee62118a063b9da59169d..b287817a6727c1d0838661675cf70209430121ce 100644 (file)
@@ -22,10 +22,10 @@ struct yaboot_state {
 static void yaboot_finish(struct conf_context *conf)
 {
        struct yaboot_state *state = conf->parser_info;
+       struct device *dev = conf->dc->device->device;
 
        if (!state->desc_image) {
-               pb_log("%s: %s: no image found\n", __func__,
-                       conf->dc->device->id);
+               pb_log("%s: %s: no image found\n", __func__, dev->id);
                return;
        }
 
@@ -46,8 +46,9 @@ static void yaboot_finish(struct conf_context *conf)
 
        /* opt is persistent, so must be associated with device */
 
-       device_add_boot_option(conf->dc->device, state->opt);
-       state->opt = talloc_zero(conf->dc->device, struct boot_option);
+       discover_context_add_boot_option(conf->dc, state->opt);
+
+       state->opt = talloc_zero(conf->dc, struct boot_option);
        state->opt->boot_args = talloc_strdup(state->opt, "");
 }
 
@@ -111,7 +112,7 @@ static void yaboot_process_pair(struct conf_context *conf, const char *name,
                                "%s%s", g_boot, value);
                } else {
                        state->opt->boot_image_file = resolve_path(state->opt,
-                               value, conf->dc->device_path);
+                               value, conf->dc->device->device_path);
                        state->desc_image = talloc_strdup(state->opt, value);
                }
 
@@ -137,16 +138,16 @@ static void yaboot_process_pair(struct conf_context *conf, const char *name,
 
                if (*value == '/') {
                        state->opt->boot_image_file = resolve_path(state->opt,
-                               value, conf->dc->device_path);
+                               value, conf->dc->device->device_path);
                        state->desc_image = talloc_strdup(state->opt, value);
                } else {
                        state->opt->boot_image_file = resolve_path(state->opt,
-                               suse_fp->image, conf->dc->device_path);
+                               suse_fp->image, conf->dc->device->device_path);
                        state->desc_image = talloc_strdup(state->opt,
                                suse_fp->image);
 
                        state->opt->initrd_file = resolve_path(state->opt,
-                               suse_fp->initrd, conf->dc->device_path);
+                               suse_fp->initrd, conf->dc->device->device_path);
                        state->desc_initrd = talloc_asprintf(state, "initrd=%s",
                                suse_fp->initrd);
                }
@@ -181,7 +182,7 @@ static void yaboot_process_pair(struct conf_context *conf, const char *name,
                                "initrd=%s%s", g_boot, value);
                } else {
                        state->opt->initrd_file = resolve_path(state->opt,
-                               value, conf->dc->device_path);
+                               value, conf->dc->device->device_path);
                        state->desc_initrd = talloc_asprintf(state, "initrd=%s",
                                value);
                }
@@ -192,7 +193,7 @@ static void yaboot_process_pair(struct conf_context *conf, const char *name,
 
        if (streq(name, "label")) {
                state->opt->id = talloc_asprintf(state->opt, "%s#%s",
-                       conf->dc->device->id, value);
+                       conf->dc->device->device->id, value);
                state->opt->name = talloc_strdup(state->opt, value);
                return;
        }
index 75533e3a116dd41ba0355851d793baeb4dfc50af..d8ec75ba02f6220829e7768083958b2e2313132f 100644 (file)
 
 static FILE *testf;
 
-void device_add_boot_option(struct device *device,
+struct device *discover_context_device(struct discover_context *ctx)
+{
+       return ctx->device->device;
+}
+
+void discover_context_add_boot_option(struct discover_context *ctx,
                struct boot_option *boot_option)
 {
-       fprintf(testf, "%s: %s\n", __func__, device->id);
+       fprintf(testf, "%s: %s\n", __func__, ctx->device->device->id);
        fprintf(testf, " id     '%s'\n", boot_option->id);
        fprintf(testf, " name   '%s'\n", boot_option->name);
        fprintf(testf, " descr  '%s'\n", boot_option->description);
@@ -62,9 +67,11 @@ int main(int argc, char **argv)
 
        ctx = talloc_zero(NULL, struct discover_context);
 
-       ctx->device_path = talloc_asprintf(ctx, "%s/%s", argv[1], argv[2]);
-       ctx->device = talloc_zero(ctx, struct device);
-       ctx->device->id = talloc_strdup(ctx->device, argv[2]);
+       ctx->device = talloc_zero(ctx, struct discover_device);
+       ctx->device->device = talloc_zero(ctx->device, struct device);
+       ctx->device->device_path = talloc_asprintf(ctx, "%s/%s",
+                                                       argv[1], argv[2]);
+       ctx->device->device->id = talloc_strdup(ctx->device->device, argv[2]);
 
        iterate_parsers(ctx);