diff options
Diffstat (limited to 'discover')
-rw-r--r-- | discover/Makefile.am | 4 | ||||
-rw-r--r-- | discover/boot.c | 28 | ||||
-rw-r--r-- | discover/boot.h | 2 | ||||
-rw-r--r-- | discover/device-handler.c | 71 | ||||
-rw-r--r-- | discover/device-handler.h | 4 | ||||
-rw-r--r-- | discover/grub2-parser.c | 20 | ||||
-rw-r--r-- | discover/kboot-parser.c | 17 | ||||
-rw-r--r-- | discover/parser.c | 21 | ||||
-rw-r--r-- | discover/parser.h | 23 | ||||
-rw-r--r-- | discover/paths.c | 131 | ||||
-rw-r--r-- | discover/paths.h | 39 | ||||
-rw-r--r-- | discover/yaboot-parser.c | 154 |
12 files changed, 154 insertions, 360 deletions
diff --git a/discover/Makefile.am b/discover/Makefile.am index a8d07b2..a3087ef 100644 --- a/discover/Makefile.am +++ b/discover/Makefile.am @@ -30,6 +30,8 @@ libparser_la_SOURCES = \ parser-utils.h \ paths.c \ paths.h \ + resource.c \ + resource.h \ kboot-parser.c \ grub2-parser.c \ yaboot-parser.c @@ -54,8 +56,6 @@ pb_discover_SOURCES = \ params.h \ pb-discover.c \ pb-discover.h \ - resource.c \ - resource.h \ udev.c \ udev.h \ user-event.c \ diff --git a/discover/boot.c b/discover/boot.c index e67ed00..804425c 100644 --- a/discover/boot.c +++ b/discover/boot.c @@ -5,9 +5,12 @@ #include <pb-protocol/pb-protocol.h> #include <system/system.h> #include <talloc/talloc.h> +#include <url/url.h> +#include "device-handler.h" #include "boot.h" #include "paths.h" +#include "resource.h" /** * kexec_load - kexec load helper. @@ -94,13 +97,14 @@ static int kexec_reboot(int dry_run) return result; } -int boot(void *ctx, struct boot_option *opt, struct boot_command *cmd, +int boot(void *ctx, struct discover_boot_option *opt, struct boot_command *cmd, int dry_run) { char *local_image, *local_initrd; unsigned int clean_image = 0; unsigned int clean_initrd = 0; - char *image, *initrd, *args; + struct pb_url *image, *initrd; + char *args; int result; local_initrd = NULL; @@ -109,34 +113,34 @@ int boot(void *ctx, struct boot_option *opt, struct boot_command *cmd, args = NULL; if (cmd->boot_image_file) { - image = talloc_strdup(ctx, cmd->boot_image_file); - } else if (opt && opt->boot_image_file) { - image = talloc_strdup(ctx, opt->boot_image_file); + image = pb_url_parse(opt, cmd->boot_image_file); + } else if (opt && opt->boot_image) { + image = opt->boot_image->url; } else { pb_log("%s: no image specified", __func__); return -1; } if (cmd->initrd_file) { - initrd = talloc_strdup(ctx, cmd->initrd_file); - } else if (opt && opt->initrd_file) { - initrd = talloc_strdup(ctx, opt->initrd_file); + initrd = pb_url_parse(opt, cmd->initrd_file); + } else if (opt && opt->initrd) { + initrd = opt->initrd->url; } if (cmd->boot_args) { args = talloc_strdup(ctx, cmd->boot_args); - } else if (opt && opt->boot_args) { - args = talloc_strdup(ctx, opt->boot_args); + } else if (opt && opt->option->boot_args) { + args = talloc_strdup(ctx, opt->option->boot_args); } result = -1; - local_image = load_file(NULL, image, &clean_image); + local_image = load_url(NULL, image, &clean_image); if (!local_image) goto no_load; if (initrd) { - local_initrd = load_file(NULL, initrd, &clean_initrd); + local_initrd = load_url(NULL, initrd, &clean_initrd); if (!local_initrd) goto no_load; } diff --git a/discover/boot.h b/discover/boot.h index be2ca57..1dc5767 100644 --- a/discover/boot.h +++ b/discover/boot.h @@ -4,7 +4,7 @@ struct boot_option; struct boot_command; -int boot(void *ctx, struct boot_option *opt, struct boot_command *cmd, +int boot(void *ctx, struct discover_boot_option *opt, struct boot_command *cmd, int dry_run); #endif /* _BOOT_H */ diff --git a/discover/device-handler.c b/discover/device-handler.c index 2b16b2e..950e730 100644 --- a/discover/device-handler.c +++ b/discover/device-handler.c @@ -130,73 +130,13 @@ const struct discover_device *device_handler_get_device( return handler->devices[index]; } -static void setup_device_links(struct discover_device *dev) -{ - struct link { - const char *dir, *val; - } *link, links[] = { - { - .dir = "disk/by-uuid", - .val = dev->uuid, - }, - { - .dir = "disk/by-label", - .val = dev->label, - }, - { - .dir = NULL - } - }; - - for (link = links; link->dir; link++) { - char *enc, *dir, *path; - - if (!link->val || !*link->val) - continue; - - enc = encode_label(dev, link->val); - dir = join_paths(dev, mount_base(), link->dir); - path = join_paths(dev, dir, enc); - - if (!pb_mkdir_recursive(dir)) { - unlink(path); - if (symlink(dev->mount_path, path)) { - pb_log("symlink(%s,%s): %s\n", - dev->mount_path, path, - strerror(errno)); - talloc_free(path); - } else { - int i = dev->n_links++; - dev->links = talloc_realloc(dev, - dev->links, char *, - dev->n_links); - dev->links[i] = path; - } - - } - - talloc_free(dir); - talloc_free(enc); - } -} - -static void remove_device_links(struct discover_device *dev) -{ - int i; - - for (i = 0; i < dev->n_links; i++) - unlink(dev->links[i]); -} - static int mount_device(struct discover_device *dev) { - const char *mountpoint; const char *argv[6]; - if (!dev->mount_path) { - mountpoint = mountpoint_for_device(dev->device_path); - dev->mount_path = talloc_strdup(dev, mountpoint); - } + if (!dev->mount_path) + dev->mount_path = join_paths(dev, mount_base(), + dev->device_path); if (pb_mkdir_recursive(dev->mount_path)) pb_log("couldn't create mount directory %s: %s\n", @@ -222,7 +162,6 @@ static int mount_device(struct discover_device *dev) goto out_rmdir; } - setup_device_links(dev); return 0; out_rmdir: @@ -235,8 +174,6 @@ static int umount_device(struct discover_device *dev) int status; pid_t pid; - remove_device_links(dev); - if (!dev->mount_path) return 0; @@ -590,5 +527,5 @@ void device_handler_boot(struct device_handler *handler, opt = find_boot_option_by_id(handler, cmd->option_id); - boot(handler, opt->option, cmd, handler->dry_run); + boot(handler, opt, cmd, handler->dry_run); } diff --git a/discover/device-handler.h b/discover/device-handler.h index 3c4574b..5dead24 100644 --- a/discover/device-handler.h +++ b/discover/device-handler.h @@ -30,6 +30,10 @@ struct discover_boot_option { struct discover_device *device; struct boot_option *option; struct list_item list; + + struct resource *boot_image; + struct resource *initrd; + struct resource *icon; }; diff --git a/discover/grub2-parser.c b/discover/grub2-parser.c index 8a0868a..eaf3cd3 100644 --- a/discover/grub2-parser.c +++ b/discover/grub2-parser.c @@ -30,7 +30,7 @@ #include "types/types.h" #include "parser-conf.h" #include "parser-utils.h" -#include "paths.h" +#include "resource.h" struct grub2_state { struct discover_boot_option *opt; @@ -85,7 +85,7 @@ static void grub2_process_pair(struct conf_context *conf, const char *name, { struct device *dev = conf->dc->device->device; struct grub2_state *state = conf->parser_info; - struct boot_option *opt = state->opt->option; + struct discover_boot_option *opt = state->opt; if (!name || !conf_param_in_list(state->known_names, name)) return; @@ -102,8 +102,9 @@ static void grub2_process_pair(struct conf_context *conf, const char *name, if (sep) *sep = 0; - opt->id = talloc_asprintf(opt, "%s#%s", dev->id, value); - opt->name = talloc_strdup(opt, value); + opt->option->id = talloc_asprintf(opt->option, + "%s#%s", dev->id, value); + opt->option->name = talloc_strdup(opt->option, value); return; } @@ -116,20 +117,19 @@ static void grub2_process_pair(struct conf_context *conf, const char *name, if (sep) *sep = 0; - opt->boot_image_file = resolve_path(opt, value, - conf->dc->device->device_path); + opt->boot_image = create_devpath_resource(opt, + conf->dc->device, value); state->desc_image = talloc_strdup(opt, value); if (sep) - opt->boot_args = talloc_strdup(opt, - sep + 1); + opt->option->boot_args = talloc_strdup(opt, sep + 1); return; } if (streq(name, "initrd")) { - opt->initrd_file = resolve_path(opt, - value, conf->dc->device->device_path); + opt->initrd = create_devpath_resource(opt, + conf->dc->device, value); state->desc_initrd = talloc_asprintf(state, "initrd=%s", value); return; diff --git a/discover/kboot-parser.c b/discover/kboot-parser.c index cb6a248..e602dc4 100644 --- a/discover/kboot-parser.c +++ b/discover/kboot-parser.c @@ -9,7 +9,7 @@ #include "types/types.h" #include "parser-conf.h" #include "parser-utils.h" -#include "paths.h" +#include "resource.h" static void kboot_process_pair(struct conf_context *conf, const char *name, char *value) @@ -83,8 +83,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->device_path); + d_opt->boot_image = create_devpath_resource(opt, + conf->dc->device, value); if (root) { opt->boot_args = talloc_asprintf(opt, "root=%s %s", root, args); @@ -93,8 +93,8 @@ out_add: opt->boot_args = args; if (initrd) { - opt->initrd_file = resolve_path(opt, initrd, - conf->dc->device->device_path); + d_opt->initrd = create_devpath_resource(opt, + conf->dc->device, initrd); opt->description = talloc_asprintf(opt, "%s initrd=%s %s", value, initrd, opt->boot_args); @@ -158,7 +158,8 @@ static int kboot_parse(struct discover_context *dc, char *buf, int len) } struct parser __kboot_parser = { - .name = "kboot", - .parse = kboot_parse, - .filenames = kboot_conf_files, + .name = "kboot", + .parse = kboot_parse, + .filenames = kboot_conf_files, + .resolve_resource = resolve_devpath_resource, }; diff --git a/discover/parser.c b/discover/parser.c index 1f3674d..462d614 100644 --- a/discover/parser.c +++ b/discover/parser.c @@ -77,12 +77,17 @@ err_close: return -1; } +static char *local_path(struct discover_context *ctx, + const char *filename) +{ + return join_paths(ctx, ctx->device->mount_path, filename); +} + static void iterate_parser_files(struct discover_context *ctx, const struct parser *parser) { const char * const *filename; - const char *path, *url; - unsigned int tempfile; + const char *path; if (!parser->filenames) return; @@ -91,12 +96,7 @@ static void iterate_parser_files(struct discover_context *ctx, int rc, len; char *buf; - url = resolve_path(ctx, *filename, ctx->device->device_path); - if (!url) - continue; - - path = load_file(ctx, url, &tempfile); - + path = local_path(ctx, *filename); if (!path) continue; @@ -105,12 +105,7 @@ static void iterate_parser_files(struct discover_context *ctx, parser->parse(ctx, buf, len); talloc_free(buf); } - - if (tempfile) - unlink(path); - } - } void iterate_parsers(struct discover_context *ctx) diff --git a/discover/parser.h b/discover/parser.h index 18c9963..03ba8d4 100644 --- a/discover/parser.h +++ b/discover/parser.h @@ -1,13 +1,36 @@ #ifndef _PARSER_H #define _PARSER_H +#include <stdbool.h> + struct discover_context; +struct device_handler; +struct resource; +/** + * Our config parser. + * + * Each parser is responsible for creating discover_boot_options from config + * files found on new devices. The boot items discovered during parse will have + * 'resources' attached (see @discover_boot_option), which may already be + * resolved (in the case of a device-local filename, or a URL), or unresolved + * (in the case of a filename on another device). + * + * If the boot option contains references to unresolved resources, the + * device handler will not inform clients about the boot options, as + * they're not properly "available" at this stage. The handler will attempt to + * resolve them whenever new devices are discovered, by calling the parser's + * resolve_resource function. Once a boot option's resources are full resolved, + * the option can be sent to clients. + */ struct parser { char *name; const char * const *filenames; int (*parse)(struct discover_context *ctx, char *buf, int len); + bool (*resolve_resource)( + struct device_handler *handler, + struct resource *res); }; enum generic_icon_type { diff --git a/discover/paths.c b/discover/paths.c index ef8a45f..d95e359 100644 --- a/discover/paths.c +++ b/discover/paths.c @@ -13,135 +13,11 @@ #define DEVICE_MOUNT_BASE (LOCAL_STATE_DIR "/petitboot/mnt") -struct mount_map { - char *dev, *mnt; -}; - -static struct mount_map *mount_map; -static int mount_map_size; - -static int is_prefix(const char *str, const char *prefix) -{ - return !strncmp(str, prefix, strlen(prefix)); -} - -static int is_prefix_ignorecase(const char *str, const char *prefix) -{ - return !strncasecmp(str, prefix, strlen(prefix)); -} - const char *mount_base(void) { return DEVICE_MOUNT_BASE; } -char *encode_label(void *alloc_ctx, const char *label) -{ - char *str, *c; - unsigned int i; - - /* the label can be expanded by up to four times */ - str = talloc_size(alloc_ctx, strlen(label) * 4 + 1); - c = str; - - for (i = 0; i < strlen(label); i++) { - - if (label[i] == '/' || label[i] == '\\') { - sprintf(c, "\\x%02x", label[i]); - c += 4; - continue; - } - - *(c++) = label[i]; - } - - *c = '\0'; - - return str; -} - -char *parse_device_path(void *alloc_ctx, - const char *dev_str, const char __attribute__((unused)) *cur_dev) -{ - char *dev, *enc; - - if (is_prefix_ignorecase(dev_str, "uuid=")) { - dev = talloc_asprintf(alloc_ctx, "/dev/disk/by-uuid/%s", - dev_str + strlen("uuid=")); - return dev; - } - - if (is_prefix_ignorecase(dev_str, "label=")) { - enc = encode_label(NULL, dev_str + strlen("label=")); - dev = talloc_asprintf(alloc_ctx, "/dev/disk/by-label/%s", enc); - talloc_free(enc); - return dev; - } - - /* normalise '/dev/foo' to 'foo' for easy comparisons, we'll expand - * back before returning. - */ - if (is_prefix(dev_str, "/dev/")) - dev_str += strlen("/dev/"); - - return join_paths(alloc_ctx, "/dev", dev_str); -} - -const char *mountpoint_for_device(const char *dev) -{ - int i; - - if (is_prefix(dev, "/dev/")) - dev += strlen("/dev/"); - - /* check existing entries in the map */ - for (i = 0; i < mount_map_size; i++) - if (!strcmp(mount_map[i].dev, dev)) - return mount_map[i].mnt; - - /* no existing entry, create a new one */ - i = mount_map_size++; - mount_map = talloc_realloc(NULL, mount_map, - struct mount_map, mount_map_size); - - mount_map[i].dev = talloc_strdup(mount_map, dev); - mount_map[i].mnt = join_paths(mount_map, DEVICE_MOUNT_BASE, dev); - return mount_map[i].mnt; -} - -char *resolve_path(void *alloc_ctx, const char *path, const char *current_dev) -{ - static const char s_file[] = "file://"; - char *ret; - const char *devpath, *sep; - - /* test for urls */ - - if (!strncasecmp(path, s_file, sizeof(s_file) - 1)) - path += sizeof(s_file) - 1; - else if (strstr(path, "://")) - return talloc_strdup(alloc_ctx, path); - - sep = strchr(path, ':'); - if (!sep) { - devpath = mountpoint_for_device(current_dev); - ret = join_paths(alloc_ctx, devpath, path); - } else { - /* parse just the device name into dev */ - char *tmp, *dev; - tmp = talloc_strndup(NULL, path, sep - path); - dev = parse_device_path(NULL, tmp, current_dev); - - devpath = mountpoint_for_device(dev); - ret = join_paths(alloc_ctx, devpath, sep + 1); - - talloc_free(dev); - talloc_free(tmp); - } - - return ret; -} - char *join_paths(void *alloc_ctx, const char *a, const char *b) { char *full_path; @@ -376,10 +252,10 @@ fail: } /** - * pb_load_file - Loads a (possibly) remote file and returns the local file + * load_url - Loads a (possibly) remote URL and returns the local file * path. * @ctx: The talloc context to associate with the returned string. - * @remote: The remote file URL. + * @URL: The remote file URL. * @tempfile: An optional variable pointer to be set when a temporary local * file is created. * @@ -387,9 +263,8 @@ fail: * or NULL on error. */ -char *load_file(void *ctx, const char *remote, unsigned int *tempfile) +char *load_url(void *ctx, struct pb_url *url, unsigned int *tempfile) { - struct pb_url *url = pb_url_parse(ctx, remote); char *local; int tmp = 0; diff --git a/discover/paths.h b/discover/paths.h index 34de79a..20a2249 100644 --- a/discover/paths.h +++ b/discover/paths.h @@ -1,37 +1,7 @@ #ifndef PATHS_H #define PATHS_H -/** - * Given a string (eg /dev/sda1, sda1 or UUID=B8E53381CA9EA0E3), parse the - * device path (eg /dev/sda1). Any device descriptions read from config files - * should be parsed into the path first. - * - * The cur_dev is provided for some remapping situations. If NULL is provided, - * no remapping will be done. - * - * Returns a newly-allocated string. - */ -char *parse_device_path(void *alloc_ctx, - const char *dev_str, const char *current_device); - -/** - * Get the mountpoint for a device. - */ -const char *mountpoint_for_device(const char *dev); - -/** - * Resolve a path given in a config file, to a path in the local filesystem. - * Paths may be of the form: - * device:path (eg /dev/sda:/boot/vmlinux) - * - * or just a path: - * /boot/vmlinux - * - in this case, the current mountpoint is used. - * - * Returns a newly-allocated string containing a full path to the file in path - */ -char *resolve_path(void *alloc_ctx, - const char *path, const char *current_device); +#include <url/url.h> /** * Utility function for joining two paths. Adds a / between a and b if @@ -42,16 +12,11 @@ char *resolve_path(void *alloc_ctx, char *join_paths(void *alloc_ctx, const char *a, const char *b); /** - * encode a disk label (or uuid) for use in a symlink. - */ -char *encode_label(void *alloc_ctx, const char *label); - -/** * Returns the base path for mount points */ const char *mount_base(void); /* Load a (potentially remote) file, and return a guaranteed-local name */ -char *load_file(void *ctx, const char *remote, unsigned int *tempfile); +char *load_url(void *ctx, struct pb_url *url, unsigned int *tempfile); #endif /* PATHS_H */ diff --git a/discover/yaboot-parser.c b/discover/yaboot-parser.c index 7fedf20..0a66e8d 100644 --- a/discover/yaboot-parser.c +++ b/discover/yaboot-parser.c @@ -9,11 +9,11 @@ #include "types/types.h" #include "parser-conf.h" #include "parser-utils.h" -#include "paths.h" +#include "resource.h" struct yaboot_state { struct discover_boot_option *opt; - const char *desc_image; + char *desc_image; char *desc_initrd; int globals_done; const char *const *known_names; @@ -56,11 +56,40 @@ static void yaboot_finish(struct conf_context *conf) state->opt->option->boot_args = talloc_strdup(state->opt->option, ""); } +static struct resource *create_yaboot_devpath_resource( + struct conf_context *conf, + const char *path, char **desc_str) +{ + const char *g_boot = conf_get_global_option(conf, "boot"); + const char *g_part = conf_get_global_option(conf, "partition"); + struct resource *res; + char *devpath; + + if (g_boot && g_part) { + devpath = talloc_asprintf(conf, + "%s%s:%s", g_boot, g_part, path); + } else if (g_boot) { + devpath = talloc_asprintf(conf, "%s:%s", g_boot, path); + } else { + devpath = talloc_strdup(conf, path); + } + + res = create_devpath_resource(conf->dc, conf->dc->device, devpath); + + if (desc_str) + *desc_str = devpath; + else + talloc_free(devpath); + + return res; +} + + static void yaboot_process_pair(struct conf_context *conf, const char *name, char *value) { struct yaboot_state *state = conf->parser_info; - struct boot_option *opt = state->opt->option; + struct discover_boot_option *opt = state->opt; struct fixed_pair { const char *image; const char *initrd; @@ -91,35 +120,14 @@ static void yaboot_process_pair(struct conf_context *conf, const char *name, /* image */ if (streq(name, "image")) { - const char *g_boot = conf_get_global_option(conf, "boot"); - const char *g_part = conf_get_global_option(conf, "partition"); /* First finish any previous image. */ - - if (opt->boot_image_file) + if (opt->boot_image) yaboot_finish(conf); /* Then start the new image. */ - - if (g_boot && g_part) { - char* dev = talloc_asprintf(NULL, "%s%s", g_boot, - g_part); - - opt->boot_image_file = resolve_path(opt, - value, dev); - state->desc_image = talloc_asprintf(opt, - "%s%s", dev, value); - talloc_free(dev); - } else if (g_boot) { - opt->boot_image_file = resolve_path(opt, - value, g_boot); - state->desc_image = talloc_asprintf(opt, - "%s%s", g_boot, value); - } else { - opt->boot_image_file = resolve_path(opt, - value, conf->dc->device->device_path); - state->desc_image = talloc_strdup(opt, value); - } + opt->boot_image = create_yaboot_devpath_resource(conf, + value, &state->desc_image); return; } @@ -136,31 +144,33 @@ static void yaboot_process_pair(struct conf_context *conf, const char *name, if (suse_fp) { /* First finish any previous image. */ - if (opt->boot_image_file) + if (opt->boot_image) yaboot_finish(conf); /* Then start the new image. */ if (*value == '/') { - opt->boot_image_file = resolve_path(opt, - value, conf->dc->device->device_path); - state->desc_image = talloc_strdup(opt, value); + opt->boot_image = create_yaboot_devpath_resource( + conf, value, &state->desc_image); } else { - opt->boot_image_file = resolve_path(opt, - suse_fp->image, conf->dc->device->device_path); - state->desc_image = talloc_strdup(opt, - suse_fp->image); - - opt->initrd_file = resolve_path(opt, - suse_fp->initrd, conf->dc->device->device_path); - state->desc_initrd = talloc_asprintf(state, "initrd=%s", - suse_fp->initrd); + char *tmp; + + opt->boot_image = create_yaboot_devpath_resource( + conf, suse_fp->image, + &state->desc_image); + + opt->initrd = create_yaboot_devpath_resource( + conf, suse_fp->initrd, &tmp); + + state->desc_initrd = talloc_asprintf(opt, + "initrd=%s", tmp); + talloc_free(tmp); } return; } - if (!opt->boot_image_file) { + if (!opt->boot_image) { pb_log("%s: unknown name: %s\n", __func__, name); return; } @@ -168,86 +178,66 @@ static void yaboot_process_pair(struct conf_context *conf, const char *name, /* initrd */ if (streq(name, "initrd")) { - const char *g_boot = conf_get_global_option(conf, "boot"); - const char *g_part = conf_get_global_option(conf, "partition"); - - if (g_boot && g_part) { - char* dev = talloc_asprintf(NULL, "%s%s", g_boot, - g_part); - - opt->initrd_file = resolve_path(opt, - value, dev); - state->desc_initrd = talloc_asprintf(state, - "initrd=%s%s", dev, value); - talloc_free(dev); - } else if (g_boot) { - opt->initrd_file = resolve_path(opt, - value, g_boot); - state->desc_initrd = talloc_asprintf(state, - "initrd=%s%s", g_boot, value); - } else { - opt->initrd_file = resolve_path(opt, - value, conf->dc->device->device_path); - state->desc_initrd = talloc_asprintf(state, "initrd=%s", - value); - } + opt->initrd = create_yaboot_devpath_resource(conf, + value, &state->desc_image); + return; } /* label */ if (streq(name, "label")) { - opt->id = talloc_asprintf(opt, "%s#%s", + opt->option->id = talloc_asprintf(opt->option, "%s#%s", conf->dc->device->device->id, value); - opt->name = talloc_strdup(opt, value); + opt->option->name = talloc_strdup(opt->option, value); return; } /* args */ if (streq(name, "append")) { - opt->boot_args = talloc_asprintf_append( - opt->boot_args, "%s ", value); + opt->option->boot_args = talloc_asprintf_append( + opt->option->boot_args, "%s ", value); return; } if (streq(name, "initrd-size")) { - opt->boot_args = talloc_asprintf_append( - opt->boot_args, "ramdisk_size=%s ", value); + opt->option->boot_args = talloc_asprintf_append( + opt->option->boot_args, "ramdisk_size=%s ", value); return; } if (streq(name, "literal")) { - if (*opt->boot_args) { + if (*opt->option->boot_args) { pb_log("%s: literal over writes '%s'\n", __func__, - opt->boot_args); - talloc_free(opt->boot_args); + opt->option->boot_args); + talloc_free(opt->option->boot_args); } - talloc_asprintf(opt, "%s ", value); + talloc_asprintf(opt->option, "%s ", value); return; } if (streq(name, "ramdisk")) { - opt->boot_args = talloc_asprintf_append( - opt->boot_args, "ramdisk=%s ", value); + opt->option->boot_args = talloc_asprintf_append( + opt->option->boot_args, "ramdisk=%s ", value); return; } if (streq(name, "read-only")) { - opt->boot_args = talloc_asprintf_append( - opt->boot_args, "ro "); + opt->option->boot_args = talloc_asprintf_append( + opt->option->boot_args, "ro "); return; } if (streq(name, "read-write")) { - opt->boot_args = talloc_asprintf_append( - opt->boot_args, "rw "); + opt->option->boot_args = talloc_asprintf_append( + opt->option->boot_args, "rw "); return; } if (streq(name, "root")) { - opt->boot_args = talloc_asprintf_append( - opt->boot_args, "root=%s ", value); + opt->option->boot_args = talloc_asprintf_append( + opt->option->boot_args, "root=%s ", value); return; } |