X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;f=discover%2Fdevice-handler.c;h=3ef48ada77394e2252249b4495af81c8efe94291;hb=2914110af0cc490566446f18c929452368121b98;hp=ec4a6f611ff289ee9d4bc61182401897c41ff1ba;hpb=2713a008a6b7fb9e63d5b8004fc39dae22e1abf7;p=petitboot diff --git a/discover/device-handler.c b/discover/device-handler.c index ec4a6f6..3ef48ad 100644 --- a/discover/device-handler.c +++ b/discover/device-handler.c @@ -84,6 +84,9 @@ struct device_handler { struct list progress; unsigned int n_progress; + + struct plugin_option **plugins; + unsigned int n_plugins; }; static int mount_device(struct discover_device *dev); @@ -126,6 +129,28 @@ const struct discover_device *device_handler_get_device( return handler->devices[index]; } +/** + * device_handler_get_plugin_count - Get the count of current handler plugins. + */ +int device_handler_get_plugin_count(const struct device_handler *handler) +{ + return handler->n_plugins; +} + +/** + * discover_handler_get_plugin - Get a handler plugin by index. + */ +const struct plugin_option *device_handler_get_plugin( + const struct device_handler *handler, unsigned int index) +{ + if (index >= handler->n_plugins) { + assert(0 && "bad index"); + return NULL; + } + + return handler->plugins[index]; +} + struct network *device_handler_get_network( const struct device_handler *handler) { @@ -385,6 +410,15 @@ void device_handler_reinit(struct device_handler *handler) handler->ramdisks = NULL; handler->n_ramdisks = 0; + /* drop any known plugins */ + for (i = 0; i < handler->n_plugins; i++) + talloc_free(handler->plugins[i]); + talloc_free(handler->plugins); + handler->plugins = NULL; + handler->n_plugins = 0; + + discover_server_notify_plugins_remove(handler->server); + device_handler_reinit_sources(handler); } @@ -1408,6 +1442,36 @@ void device_handler_discover_context_commit(struct device_handler *handler, } } +void device_handler_add_plugin_option(struct device_handler *handler, + struct plugin_option *opt) +{ + struct plugin_option *tmp; + unsigned int i; + + for (i = 0; i < handler->n_plugins; i++) { + tmp = handler->plugins[i]; + /* If both id and version match, ignore */ + if (strncmp(opt->id, tmp->id, strlen(opt->id)) == 0 && + strncmp(opt->version, tmp->version, + strlen(opt->version) == 0)) { + pb_log("discover: Plugin '%s' already exists, ignoring\n", + opt->id); + return; + } + } + + handler->plugins = talloc_realloc(handler, handler->plugins, + struct plugin_option *, handler->n_plugins + 1); + if (!handler->plugins) { + pb_log("Failed to allocate memory for new plugin\n"); + handler->n_plugins = 0; + return; + } + + handler->plugins[handler->n_plugins++] = opt; + discover_server_notify_plugin_option_add(handler->server, opt); +} + static void device_handler_update_lang(const char *lang) { const char *cur_lang;