mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-09 01:18:00 +03:00
driver: use normal error reporting APIs when loading modules
The driver module loading code is one of the few places that still uses VIR_ERROR for reporting failures. Convert it to normal error reporting APIs. Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
This commit is contained in:
parent
d94640ddad
commit
078d168d15
34
src/driver.c
34
src/driver.c
@ -33,6 +33,7 @@
|
||||
|
||||
VIR_LOG_INIT("driver");
|
||||
|
||||
#define VIR_FROM_THIS VIR_FROM_NONE
|
||||
|
||||
/* XXX re-implement this for other OS, or use libtools helper lib ? */
|
||||
#define DEFAULT_DRIVER_DIR LIBDIR "/libvirt/connection-driver"
|
||||
@ -55,8 +56,11 @@ virDriverLoadModuleFile(const char *file)
|
||||
|
||||
virUpdateSelfLastChanged(file);
|
||||
|
||||
if (!(handle = dlopen(file, flags)))
|
||||
VIR_ERROR(_("failed to load module %s %s"), file, dlerror());
|
||||
if (!(handle = dlopen(file, flags))) {
|
||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("Failed to load module '%s': %s"), file, dlerror());
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return handle;
|
||||
}
|
||||
@ -64,14 +68,19 @@ virDriverLoadModuleFile(const char *file)
|
||||
|
||||
static void *
|
||||
virDriverLoadModuleFunc(void *handle,
|
||||
const char *file,
|
||||
const char *funcname)
|
||||
{
|
||||
void *regsym;
|
||||
|
||||
VIR_DEBUG("Lookup function '%s'", funcname);
|
||||
|
||||
if (!(regsym = dlsym(handle, funcname)))
|
||||
VIR_ERROR(_("Missing module registration symbol %s"), funcname);
|
||||
if (!(regsym = dlsym(handle, funcname))) {
|
||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("Failed to find symbol '%s' in module '%s': %s"),
|
||||
funcname, file, dlerror());
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return regsym;
|
||||
}
|
||||
@ -108,11 +117,18 @@ virDriverLoadModuleFull(const char *path,
|
||||
if (!(rethandle = virDriverLoadModuleFile(path)))
|
||||
goto cleanup;
|
||||
|
||||
if (!(regsym = virDriverLoadModuleFunc(rethandle, regfunc)))
|
||||
if (!(regsym = virDriverLoadModuleFunc(rethandle, path, regfunc)))
|
||||
goto cleanup;
|
||||
|
||||
if ((*regsym)() < 0) {
|
||||
VIR_ERROR(_("Failed module registration %s"), regfunc);
|
||||
/* regsym() should report an error itself, but lets
|
||||
* just make sure */
|
||||
virErrorPtr err = virGetLastError();
|
||||
if (err == NULL) {
|
||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("Failed to execute symbol '%s' in module '%s'"),
|
||||
regfunc, path);
|
||||
}
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
@ -131,7 +147,11 @@ virDriverLoadModuleFull(const char *path ATTRIBUTE_UNUSED,
|
||||
const char *regfunc ATTRIBUTE_UNUSED)
|
||||
{
|
||||
VIR_DEBUG("dlopen not available on this platform");
|
||||
return -1;
|
||||
/* Since we have no dlopen(), but definition we have no
|
||||
* loadable modules on disk, so we can resaonably
|
||||
* return '1' instead of an error.
|
||||
*/
|
||||
return 1;
|
||||
}
|
||||
#endif /* ! HAVE_DLFCN_H */
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user