提交 078d168d 编写于 作者: D Daniel P. Berrangé

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: NDaniel P. Berrangé <berrange@redhat.com>
上级 d94640dd
......@@ -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 */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册