mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-18 18:45:16 +00: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");
|
VIR_LOG_INIT("driver");
|
||||||
|
|
||||||
|
#define VIR_FROM_THIS VIR_FROM_NONE
|
||||||
|
|
||||||
/* XXX re-implement this for other OS, or use libtools helper lib ? */
|
/* XXX re-implement this for other OS, or use libtools helper lib ? */
|
||||||
#define DEFAULT_DRIVER_DIR LIBDIR "/libvirt/connection-driver"
|
#define DEFAULT_DRIVER_DIR LIBDIR "/libvirt/connection-driver"
|
||||||
@ -55,8 +56,11 @@ virDriverLoadModuleFile(const char *file)
|
|||||||
|
|
||||||
virUpdateSelfLastChanged(file);
|
virUpdateSelfLastChanged(file);
|
||||||
|
|
||||||
if (!(handle = dlopen(file, flags)))
|
if (!(handle = dlopen(file, flags))) {
|
||||||
VIR_ERROR(_("failed to load module %s %s"), file, dlerror());
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
|
_("Failed to load module '%s': %s"), file, dlerror());
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
return handle;
|
return handle;
|
||||||
}
|
}
|
||||||
@ -64,14 +68,19 @@ virDriverLoadModuleFile(const char *file)
|
|||||||
|
|
||||||
static void *
|
static void *
|
||||||
virDriverLoadModuleFunc(void *handle,
|
virDriverLoadModuleFunc(void *handle,
|
||||||
|
const char *file,
|
||||||
const char *funcname)
|
const char *funcname)
|
||||||
{
|
{
|
||||||
void *regsym;
|
void *regsym;
|
||||||
|
|
||||||
VIR_DEBUG("Lookup function '%s'", funcname);
|
VIR_DEBUG("Lookup function '%s'", funcname);
|
||||||
|
|
||||||
if (!(regsym = dlsym(handle, funcname)))
|
if (!(regsym = dlsym(handle, funcname))) {
|
||||||
VIR_ERROR(_("Missing module registration symbol %s"), funcname);
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
|
_("Failed to find symbol '%s' in module '%s': %s"),
|
||||||
|
funcname, file, dlerror());
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
return regsym;
|
return regsym;
|
||||||
}
|
}
|
||||||
@ -108,11 +117,18 @@ virDriverLoadModuleFull(const char *path,
|
|||||||
if (!(rethandle = virDriverLoadModuleFile(path)))
|
if (!(rethandle = virDriverLoadModuleFile(path)))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
if (!(regsym = virDriverLoadModuleFunc(rethandle, regfunc)))
|
if (!(regsym = virDriverLoadModuleFunc(rethandle, path, regfunc)))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
if ((*regsym)() < 0) {
|
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;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -131,7 +147,11 @@ virDriverLoadModuleFull(const char *path ATTRIBUTE_UNUSED,
|
|||||||
const char *regfunc ATTRIBUTE_UNUSED)
|
const char *regfunc ATTRIBUTE_UNUSED)
|
||||||
{
|
{
|
||||||
VIR_DEBUG("dlopen not available on this platform");
|
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 */
|
#endif /* ! HAVE_DLFCN_H */
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user