@ -150,7 +150,7 @@ static uint64_t xorshift64star(uint64_t x)
return x * UINT64_C ( 2685821657736338717 ) ;
}
static int plugin_load ( struct qemu_plugin_desc * desc , const qemu_info_t * info )
static int plugin_load ( struct qemu_plugin_desc * desc , const qemu_info_t * info , Error * * errp )
{
qemu_plugin_install_func_t install ;
struct qemu_plugin_ctx * ctx ;
@ -163,37 +163,37 @@ static int plugin_load(struct qemu_plugin_desc *desc, const qemu_info_t *info)
ctx - > handle = g_module_open ( desc - > path , G_MODULE_BIND_LOCAL ) ;
if ( ctx - > handle = = NULL ) {
error_report ( " %s: %s " , __func__ , g_module_error ( ) ) ;
error_setg ( errp , " Could not load plugin %s: %s" , desc - > path , g_module_error ( ) ) ;
goto err_dlopen ;
}
if ( ! g_module_symbol ( ctx - > handle , " qemu_plugin_install " , & sym ) ) {
error_report ( " %s: %s " , __func__ , g_module_error ( ) ) ;
error_setg ( errp , " Could not load plugin %s: %s" , desc - > path , g_module_error ( ) ) ;
goto err_symbol ;
}
install = ( qemu_plugin_install_func_t ) sym ;
/* symbol was found; it could be NULL though */
if ( install = = NULL ) {
error_report ( " %s: %s: qemu_plugin_install is NULL " ,
__func__ , desc - > path ) ;
error_setg ( errp , " Could not load plugin %s: qemu_plugin_install is NULL " ,
desc - > path ) ;
goto err_symbol ;
}
if ( ! g_module_symbol ( ctx - > handle , " qemu_plugin_version " , & sym ) ) {
error_report ( " TCG plugin %s does not declare API version %s " ,
desc - > path , g_module_error ( ) ) ;
error_setg ( errp , " Could not load plugin %s: plugin does not declare API version %s " ,
desc - > path , g_module_error ( ) ) ;
goto err_symbol ;
} else {
int version = * ( int * ) sym ;
if ( version < QEMU_PLUGIN_MIN_VERSION ) {
error_report ( " TCG plugin %s requires API version %d, but "
" this QEMU supports only a minimum version of %d " ,
desc - > path , version , QEMU_PLUGIN_MIN_VERSION ) ;
error_setg ( errp , " Could not load plugin %s: plugin requires API version %d, but "
" this QEMU supports only a minimum version of %d " ,
desc - > path , version , QEMU_PLUGIN_MIN_VERSION ) ;
goto err_symbol ;
} else if ( version > QEMU_PLUGIN_VERSION ) {
error_report ( " TCG plugin %s requires API version %d, but "
" this QEMU supports only up to version %d " ,
desc - > path , version , QEMU_PLUGIN_VERSION ) ;
error_setg ( errp , " Could not load plugin %s: plugin requires API version %d, but "
" this QEMU supports only up to version %d " ,
desc - > path , version , QEMU_PLUGIN_VERSION ) ;
goto err_symbol ;
}
}
@ -220,8 +220,8 @@ static int plugin_load(struct qemu_plugin_desc *desc, const qemu_info_t *info)
rc = install ( ctx - > id , info , desc - > argc , desc - > argv ) ;
ctx - > installing = false ;
if ( rc ) {
error_report ( " %s: qemu_plugin_install returned error code %d " ,
__func__ , rc ) ;
error_setg ( errp , " Could not load plugin %s: qemu_plugin_install returned error code %d" ,
desc - > path , rc ) ;
/*
* we cannot rely on the plugin doing its own cleanup , so
* call a full uninstall if the plugin did not yet call it .
@ -263,7 +263,7 @@ static void plugin_desc_free(struct qemu_plugin_desc *desc)
* Note : the descriptor of each successfully installed plugin is removed
* from the list given by @ head .
*/
int qemu_plugin_load_list ( QemuPluginList * head )
int qemu_plugin_load_list ( QemuPluginList * head , Error * * errp )
{
struct qemu_plugin_desc * desc , * next ;
g_autofree qemu_info_t * info = g_new0 ( qemu_info_t , 1 ) ;
@ -283,7 +283,7 @@ int qemu_plugin_load_list(QemuPluginList *head)
QTAILQ_FOREACH_SAFE ( desc , head , entry , next ) {
int err ;
err = plugin_load ( desc , info ) ;
err = plugin_load ( desc , info , errp ) ;
if ( err ) {
return err ;
}