提交 6c5c4b8d 编写于 作者: P Peter Krempa

qemu: Refactor error reporting in qemu driver configuration parser

This patch adds two labels and gets rid of a ton of duplicated code.
This patch also fixes some error message and switches most of them to
proper error reporting functions.
上级 7aba113c
...@@ -74,10 +74,11 @@ void qemuDriverUnlock(virQEMUDriverPtr driver) ...@@ -74,10 +74,11 @@ void qemuDriverUnlock(virQEMUDriverPtr driver)
int qemuLoadDriverConfig(virQEMUDriverPtr driver, int qemuLoadDriverConfig(virQEMUDriverPtr driver,
const char *filename) { const char *filename) {
virConfPtr conf; virConfPtr conf = NULL;
virConfValuePtr p; virConfValuePtr p;
char *user; char *user = NULL;
char *group; char *group = NULL;
int ret = -1;
int i; int i;
/* Setup critical defaults */ /* Setup critical defaults */
...@@ -86,28 +87,21 @@ int qemuLoadDriverConfig(virQEMUDriverPtr driver, ...@@ -86,28 +87,21 @@ int qemuLoadDriverConfig(virQEMUDriverPtr driver,
driver->dynamicOwnership = 1; driver->dynamicOwnership = 1;
driver->clearEmulatorCapabilities = 1; driver->clearEmulatorCapabilities = 1;
if (!(driver->vncListen = strdup("127.0.0.1"))) { if (!(driver->vncListen = strdup("127.0.0.1")))
virReportOOMError(); goto no_memory;
return -1;
}
driver->remotePortMin = QEMU_REMOTE_PORT_MIN; driver->remotePortMin = QEMU_REMOTE_PORT_MIN;
driver->remotePortMax = QEMU_REMOTE_PORT_MAX; driver->remotePortMax = QEMU_REMOTE_PORT_MAX;
if (!(driver->vncTLSx509certdir = strdup(SYSCONFDIR "/pki/libvirt-vnc"))) { if (!(driver->vncTLSx509certdir = strdup(SYSCONFDIR "/pki/libvirt-vnc")))
virReportOOMError(); goto no_memory;
return -1;
} if (!(driver->spiceListen = strdup("127.0.0.1")))
goto no_memory;
if (!(driver->spiceListen = strdup("127.0.0.1"))) {
virReportOOMError();
return -1;
}
if (!(driver->spiceTLSx509certdir if (!(driver->spiceTLSx509certdir
= strdup(SYSCONFDIR "/pki/libvirt-spice"))) { = strdup(SYSCONFDIR "/pki/libvirt-spice")))
virReportOOMError(); goto no_memory;
return -1;
}
#if defined HAVE_MNTENT_H && defined HAVE_GETMNTENT_R #if defined HAVE_MNTENT_H && defined HAVE_GETMNTENT_R
/* For privileged driver, try and find hugepage mount automatically. /* For privileged driver, try and find hugepage mount automatically.
...@@ -118,14 +112,13 @@ int qemuLoadDriverConfig(virQEMUDriverPtr driver, ...@@ -118,14 +112,13 @@ int qemuLoadDriverConfig(virQEMUDriverPtr driver,
if (errno != ENOENT) { if (errno != ENOENT) {
virReportSystemError(errno, "%s", virReportSystemError(errno, "%s",
_("unable to find hugetlbfs mountpoint")); _("unable to find hugetlbfs mountpoint"));
return -1; goto cleanup;
} }
} }
#endif #endif
if (!(driver->lockManager = if (!(driver->lockManager = virLockManagerPluginNew("nop", NULL, 0)))
virLockManagerPluginNew("nop", NULL, 0))) goto cleanup;
return -1;
driver->keepAliveInterval = 5; driver->keepAliveInterval = 5;
driver->keepAliveCount = 5; driver->keepAliveCount = 5;
...@@ -136,22 +129,19 @@ int qemuLoadDriverConfig(virQEMUDriverPtr driver, ...@@ -136,22 +129,19 @@ int qemuLoadDriverConfig(virQEMUDriverPtr driver,
*/ */
if (access(filename, R_OK) == -1) { if (access(filename, R_OK) == -1) {
VIR_INFO("Could not read qemu config file %s", filename); VIR_INFO("Could not read qemu config file %s", filename);
return 0; ret = 0;
} goto cleanup;
conf = virConfReadFile(filename, 0);
if (!conf) {
return -1;
} }
if (!(conf = virConfReadFile(filename, 0)))
goto cleanup;
#define CHECK_TYPE(name,typ) \ #define CHECK_TYPE(name,typ) \
if (p && p->type != (typ)) { \ if (p && p->type != (typ)) { \
virReportError(VIR_ERR_INTERNAL_ERROR, \ virReportError(VIR_ERR_INTERNAL_ERROR, \
"%s: %s: expected type " #typ, \ "%s: %s: expected type " #typ, \
filename, (name)); \ filename, (name)); \
virConfFree(conf); \ goto cleanup; \
return -1; \
} }
#define GET_VALUE_LONG(NAME, VAR) \ #define GET_VALUE_LONG(NAME, VAR) \
...@@ -165,11 +155,8 @@ int qemuLoadDriverConfig(virQEMUDriverPtr driver, ...@@ -165,11 +155,8 @@ int qemuLoadDriverConfig(virQEMUDriverPtr driver,
CHECK_TYPE(NAME, VIR_CONF_STRING); \ CHECK_TYPE(NAME, VIR_CONF_STRING); \
if (p && p->str) { \ if (p && p->str) { \
VIR_FREE(VAR); \ VIR_FREE(VAR); \
if (!(VAR = strdup(p->str))) { \ if (!(VAR = strdup(p->str))) \
virReportOOMError(); \ goto no_memory; \
virConfFree(conf); \
return -1; \
} \
} }
GET_VALUE_LONG("vnc_auto_unix_socket", driver->vncAutoUnixSocket); GET_VALUE_LONG("vnc_auto_unix_socket", driver->vncAutoUnixSocket);
...@@ -190,36 +177,27 @@ int qemuLoadDriverConfig(virQEMUDriverPtr driver, ...@@ -190,36 +177,27 @@ int qemuLoadDriverConfig(virQEMUDriverPtr driver,
/* Calc length and check items */ /* Calc length and check items */
for (len = 0, pp = p->list; pp; len++, pp = pp->next) { for (len = 0, pp = p->list; pp; len++, pp = pp->next) {
if (pp->type != VIR_CONF_STRING) { if (pp->type != VIR_CONF_STRING) {
VIR_ERROR(_("security_driver be a list of strings")); virReportError(VIR_ERR_CONF_SYNTAX, "%s",
virConfFree(conf); _("security_driver must be a list of strings"));
return -1; goto cleanup;
} }
} }
if (VIR_ALLOC_N(driver->securityDriverNames, len + 1) < 0) { if (VIR_ALLOC_N(driver->securityDriverNames, len + 1) < 0)
virReportOOMError(); goto no_memory;
virConfFree(conf);
return -1;
}
for (i = 0, pp = p->list; pp; i++, pp = pp->next) { for (i = 0, pp = p->list; pp; i++, pp = pp->next) {
driver->securityDriverNames[i] = strdup(pp->str); if (!(driver->securityDriverNames[i] = strdup(pp->str)))
if (driver->securityDriverNames == NULL) { goto no_memory;
virReportOOMError();
virConfFree(conf);
return -1;
}
} }
driver->securityDriverNames[len] = NULL; driver->securityDriverNames[len] = NULL;
} else { } else {
CHECK_TYPE("security_driver", VIR_CONF_STRING); CHECK_TYPE("security_driver", VIR_CONF_STRING);
if (p && p->str) { if (p && p->str) {
if (VIR_ALLOC_N(driver->securityDriverNames, 2) < 0 || if (VIR_ALLOC_N(driver->securityDriverNames, 2) < 0 ||
!(driver->securityDriverNames[0] = strdup(p->str))) { !(driver->securityDriverNames[0] = strdup(p->str)))
virReportOOMError(); goto no_memory;
virConfFree(conf);
return -1;
}
driver->securityDriverNames[1] = NULL; driver->securityDriverNames[1] = NULL;
} }
} }
...@@ -242,8 +220,7 @@ int qemuLoadDriverConfig(virQEMUDriverPtr driver, ...@@ -242,8 +220,7 @@ int qemuLoadDriverConfig(virQEMUDriverPtr driver,
_("%s: remote_display_port_min: port must be greater " _("%s: remote_display_port_min: port must be greater "
"than or equal to %d"), "than or equal to %d"),
filename, QEMU_REMOTE_PORT_MIN); filename, QEMU_REMOTE_PORT_MIN);
virConfFree(conf); goto cleanup;
return -1;
} }
GET_VALUE_LONG("remote_display_port_max", driver->remotePortMax); GET_VALUE_LONG("remote_display_port_max", driver->remotePortMax);
...@@ -253,8 +230,7 @@ int qemuLoadDriverConfig(virQEMUDriverPtr driver, ...@@ -253,8 +230,7 @@ int qemuLoadDriverConfig(virQEMUDriverPtr driver,
_("%s: remote_display_port_max: port must be between " _("%s: remote_display_port_max: port must be between "
"the minimal port and %d"), "the minimal port and %d"),
filename, QEMU_REMOTE_PORT_MAX); filename, QEMU_REMOTE_PORT_MAX);
virConfFree(conf); goto cleanup;
return -1;
} }
/* increasing the value by 1 makes all the loops going through /* increasing the value by 1 makes all the loops going through
the bitmap (i = remotePortMin; i < remotePortMax; i++), work as the bitmap (i = remotePortMin; i < remotePortMax; i++), work as
...@@ -265,38 +241,24 @@ int qemuLoadDriverConfig(virQEMUDriverPtr driver, ...@@ -265,38 +241,24 @@ int qemuLoadDriverConfig(virQEMUDriverPtr driver,
virReportError(VIR_ERR_INTERNAL_ERROR, virReportError(VIR_ERR_INTERNAL_ERROR,
_("%s: remote_display_port_min: min port must not be " _("%s: remote_display_port_min: min port must not be "
"greater than max port"), filename); "greater than max port"), filename);
virConfFree(conf); goto cleanup;
return -1;
} }
p = virConfGetValue(conf, "user"); p = virConfGetValue(conf, "user");
CHECK_TYPE("user", VIR_CONF_STRING); CHECK_TYPE("user", VIR_CONF_STRING);
if (!(user = strdup(p && p->str ? p->str : QEMU_USER))) { if (!(user = strdup(p && p->str ? p->str : QEMU_USER)))
virReportOOMError(); goto no_memory;
virConfFree(conf);
return -1;
}
if (virGetUserID(user, &driver->user) < 0) {
VIR_FREE(user);
virConfFree(conf);
return -1;
}
VIR_FREE(user);
if (virGetUserID(user, &driver->user) < 0)
goto cleanup;
p = virConfGetValue(conf, "group"); p = virConfGetValue(conf, "group");
CHECK_TYPE("group", VIR_CONF_STRING); CHECK_TYPE("group", VIR_CONF_STRING);
if (!(group = strdup(p && p->str ? p->str : QEMU_GROUP))) { if (!(group = strdup(p && p->str ? p->str : QEMU_GROUP)))
virReportOOMError(); goto no_memory;
virConfFree(conf);
return -1; if (virGetGroupID(group, &driver->group) < 0)
} goto cleanup;
if (virGetGroupID(group, &driver->group) < 0) {
VIR_FREE(group);
virConfFree(conf);
return -1;
}
VIR_FREE(group);
GET_VALUE_LONG("dynamic_ownership", driver->dynamicOwnership); GET_VALUE_LONG("dynamic_ownership", driver->dynamicOwnership);
...@@ -307,15 +269,16 @@ int qemuLoadDriverConfig(virQEMUDriverPtr driver, ...@@ -307,15 +269,16 @@ int qemuLoadDriverConfig(virQEMUDriverPtr driver,
for (i = 0, pp = p->list; pp; ++i, pp = pp->next) { for (i = 0, pp = p->list; pp; ++i, pp = pp->next) {
int ctl; int ctl;
if (pp->type != VIR_CONF_STRING) { if (pp->type != VIR_CONF_STRING) {
VIR_ERROR(_("cgroup_controllers must be a list of strings")); virReportError(VIR_ERR_CONF_SYNTAX, "%s",
virConfFree(conf); _("cgroup_controllers must be a "
return -1; "list of strings"));
goto cleanup;
} }
ctl = virCgroupControllerTypeFromString(pp->str);
if (ctl < 0) { if ((ctl = virCgroupControllerTypeFromString(pp->str)) < 0) {
VIR_ERROR(_("Unknown cgroup controller '%s'"), pp->str); virReportError(VIR_ERR_CONF_SYNTAX,
virConfFree(conf); _("Unknown cgroup controller '%s'"), pp->str);
return -1; goto cleanup;
} }
driver->cgroupControllers |= (1 << ctl); driver->cgroupControllers |= (1 << ctl);
} }
...@@ -342,24 +305,18 @@ int qemuLoadDriverConfig(virQEMUDriverPtr driver, ...@@ -342,24 +305,18 @@ int qemuLoadDriverConfig(virQEMUDriverPtr driver,
virConfValuePtr pp; virConfValuePtr pp;
for (pp = p->list; pp; pp = pp->next) for (pp = p->list; pp; pp = pp->next)
len++; len++;
if (VIR_ALLOC_N(driver->cgroupDeviceACL, 1+len) < 0) { if (VIR_ALLOC_N(driver->cgroupDeviceACL, 1+len) < 0)
virReportOOMError(); goto no_memory;
virConfFree(conf);
return -1;
}
for (i = 0, pp = p->list; pp; ++i, pp = pp->next) { for (i = 0, pp = p->list; pp; ++i, pp = pp->next) {
if (pp->type != VIR_CONF_STRING) { if (pp->type != VIR_CONF_STRING) {
VIR_ERROR(_("cgroup_device_acl must be a list of strings")); virReportError(VIR_ERR_CONF_SYNTAX, "%s",
virConfFree(conf); _("cgroup_device_acl must be a "
return -1; "list of strings"));
goto cleanup;
} }
driver->cgroupDeviceACL[i] = strdup(pp->str); if (!(driver->cgroupDeviceACL[i] = strdup(pp->str)))
if (driver->cgroupDeviceACL[i] == NULL) { goto no_memory;
virReportOOMError();
virConfFree(conf);
return -1;
}
} }
driver->cgroupDeviceACL[i] = NULL; driver->cgroupDeviceACL[i] = NULL;
} }
...@@ -381,16 +338,14 @@ int qemuLoadDriverConfig(virQEMUDriverPtr driver, ...@@ -381,16 +338,14 @@ int qemuLoadDriverConfig(virQEMUDriverPtr driver,
virReportSystemError(errno, virReportSystemError(errno,
_("failed to enable mac filter in '%s'"), _("failed to enable mac filter in '%s'"),
__FILE__); __FILE__);
virConfFree(conf); goto cleanup;
return -1;
} }
if ((errno = networkDisableAllFrames(driver))) { if ((errno = networkDisableAllFrames(driver))) {
virReportSystemError(errno, virReportSystemError(errno,
_("failed to add rule to drop all frames in '%s'"), _("failed to add rule to drop all frames in '%s'"),
__FILE__); __FILE__);
virConfFree(conf); goto cleanup;
return -1;
} }
} }
...@@ -406,11 +361,9 @@ int qemuLoadDriverConfig(virQEMUDriverPtr driver, ...@@ -406,11 +361,9 @@ int qemuLoadDriverConfig(virQEMUDriverPtr driver,
if (p && p->str) { if (p && p->str) {
char *lockConf; char *lockConf;
virLockManagerPluginUnref(driver->lockManager); virLockManagerPluginUnref(driver->lockManager);
if (virAsprintf(&lockConf, "%s/libvirt/qemu-%s.conf", SYSCONFDIR, p->str) < 0) { if (virAsprintf(&lockConf, "%s/libvirt/qemu-%s.conf", SYSCONFDIR, p->str) < 0)
virReportOOMError(); goto no_memory;
virConfFree(conf);
return -1;
}
if (!(driver->lockManager = if (!(driver->lockManager =
virLockManagerPluginNew(p->str, lockConf, 0))) virLockManagerPluginNew(p->str, lockConf, 0)))
VIR_ERROR(_("Failed to load lock manager %s"), p->str); VIR_ERROR(_("Failed to load lock manager %s"), p->str);
...@@ -422,8 +375,17 @@ int qemuLoadDriverConfig(virQEMUDriverPtr driver, ...@@ -422,8 +375,17 @@ int qemuLoadDriverConfig(virQEMUDriverPtr driver,
GET_VALUE_LONG("keepalive_count", driver->keepAliveCount); GET_VALUE_LONG("keepalive_count", driver->keepAliveCount);
GET_VALUE_LONG("seccomp_sandbox", driver->seccompSandbox); GET_VALUE_LONG("seccomp_sandbox", driver->seccompSandbox);
ret = 0;
cleanup:
VIR_FREE(user);
VIR_FREE(group);
virConfFree(conf); virConfFree(conf);
return 0; return ret;
no_memory:
virReportOOMError();
goto cleanup;
} }
#undef GET_VALUE_LONG #undef GET_VALUE_LONG
#undef GET_VALUE_STRING #undef GET_VALUE_STRING
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册