summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--discover/device-handler.c277
-rw-r--r--discover/device-handler.h28
-rw-r--r--discover/event-parser.c18
-rw-r--r--discover/grub2-parser.c16
-rw-r--r--discover/kboot-parser.c13
-rw-r--r--discover/parser-conf.c8
-rw-r--r--discover/parser-utils.c15
-rw-r--r--discover/parser.c2
-rw-r--r--discover/parser.h3
-rw-r--r--discover/yaboot-parser.c21
-rw-r--r--test/parser/parser-test.c17
11 files changed, 221 insertions, 197 deletions
diff --git a/discover/device-handler.c b/discover/device-handler.c
index 4ba7405..08e3d74 100644
--- a/discover/device-handler.c
+++ b/discover/device-handler.c
@@ -22,26 +22,58 @@
#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;
}
diff --git a/discover/device-handler.h b/discover/device-handler.h
index 4cf7d7d..809f88e 100644
--- a/discover/device-handler.h
+++ b/discover/device-handler.h
@@ -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,
diff --git a/discover/event-parser.c b/discover/event-parser.c
index c09c5ba..d7c0820 100644
--- a/discover/event-parser.c
+++ b/discover/event-parser.c
@@ -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.
@@ -13,12 +14,15 @@
* 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;
}
diff --git a/discover/grub2-parser.c b/discover/grub2-parser.c
index df1b755..fa7b950 100644
--- a/discover/grub2-parser.c
+++ b/discover/grub2-parser.c
@@ -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;
diff --git a/discover/kboot-parser.c b/discover/kboot-parser.c
index 2954d89..5d5090b 100644
--- a/discover/kboot-parser.c
+++ b/discover/kboot-parser.c
@@ -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[] = {
diff --git a/discover/parser-conf.c b/discover/parser-conf.c
index be19932..247e29d 100644
--- a/discover/parser-conf.c
+++ b/discover/parser-conf.c
@@ -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);
diff --git a/discover/parser-utils.c b/discover/parser-utils.c
index 5792f0a..f4a35a7 100644
--- a/discover/parser-utils.c
+++ b/discover/parser-utils.c
@@ -10,21 +10,6 @@
#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) {
diff --git a/discover/parser.c b/discover/parser.c
index d0b0477..5f4e514 100644
--- a/discover/parser.c
+++ b/discover/parser.c
@@ -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);
diff --git a/discover/parser.h b/discover/parser.h
index a80d1b5..9f98368 100644
--- a/discover/parser.h
+++ b/discover/parser.h
@@ -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 */
diff --git a/discover/yaboot-parser.c b/discover/yaboot-parser.c
index 59e52b8..b287817 100644
--- a/discover/yaboot-parser.c
+++ b/discover/yaboot-parser.c
@@ -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;
}
diff --git a/test/parser/parser-test.c b/test/parser/parser-test.c
index 75533e3..d8ec75b 100644
--- a/test/parser/parser-test.c
+++ b/test/parser/parser-test.c
@@ -17,10 +17,15 @@
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);
OpenPOWER on IntegriCloud