提交 b97c24b2 编写于 作者: C Chris Lalancette 提交者: Daniel Veillard

Better error reporting for failed migration

If the hostname as returned by "gethostname" resolves
to "localhost" (as it does with the broken Fedora-12
installer), then live migration will fail because the
source will try to migrate to itself.  Detect this
situation up-front and abort the live migration before
we do any real work.

* src/util/util.h src/util/util.c: add a new virGetHostnameLocalhost
  with an optional localhost check, and rewire virGetHostname() to use
  it
* src/libvirt_private.syms: expose the new function
* src/qemu/qemu_driver.c: use it in qemudDomainMigratePrepare2()
上级 8ba9e794
......@@ -565,6 +565,7 @@ virExecDaemonize;
virSetCloseExec;
virSetNonBlock;
virFormatMacAddr;
virGetHostnameLocalhost;
virGetHostname;
virParseMacAddr;
virFileDeletePid;
......
......@@ -7748,7 +7748,7 @@ qemudDomainMigratePrepare2 (virConnectPtr dconn,
if (port == QEMUD_MIGRATION_NUM_PORTS) port = 0;
/* Get hostname */
if ((hostname = virGetHostname(dconn)) == NULL)
if ((hostname = virGetHostnameLocalhost(0)) == NULL)
goto cleanup;
/* XXX this really should have been a properly well-formed
......
......@@ -2263,11 +2263,11 @@ char *virIndexToDiskName(int idx, const char *prefix)
#define AI_CANONIDN 0
#endif
char *virGetHostname(virConnectPtr conn ATTRIBUTE_UNUSED)
char *virGetHostnameLocalhost(int allow_localhost)
{
int r;
char hostname[HOST_NAME_MAX+1], *result;
struct addrinfo hints, *info;
struct addrinfo hints, *info, *res;
r = gethostname (hostname, sizeof(hostname));
if (r == -1) {
......@@ -2287,6 +2287,34 @@ char *virGetHostname(virConnectPtr conn ATTRIBUTE_UNUSED)
hostname, gai_strerror(r));
return NULL;
}
/* if we aren't allowing localhost, then we iterate through the
* list and make sure none of the IPv4 addresses are 127.0.0.1 and
* that none of the IPv6 addresses are ::1
*/
if (!allow_localhost) {
res = info;
while (res) {
if (res->ai_family == AF_INET) {
if (htonl(((struct sockaddr_in *)res->ai_addr)->sin_addr.s_addr) == INADDR_LOOPBACK) {
virUtilError(VIR_ERR_INTERNAL_ERROR, "%s",
_("canonical hostname pointed to localhost, but this is not allowed"));
freeaddrinfo(info);
return NULL;
}
}
else if (res->ai_family == AF_INET6) {
if (IN6_IS_ADDR_LOOPBACK(&((struct sockaddr_in6 *)res->ai_addr)->sin6_addr)) {
virUtilError(VIR_ERR_INTERNAL_ERROR, "%s",
_("canonical hostname pointed to localhost, but this is not allowed"));
freeaddrinfo(info);
return NULL;
}
}
res = res->ai_next;
}
}
if (info->ai_canonname == NULL) {
virUtilError(VIR_ERR_INTERNAL_ERROR,
"%s", _("could not determine canonical host name"));
......@@ -2303,6 +2331,11 @@ char *virGetHostname(virConnectPtr conn ATTRIBUTE_UNUSED)
return result;
}
char *virGetHostname(virConnectPtr conn ATTRIBUTE_UNUSED)
{
return virGetHostnameLocalhost(1);
}
/* send signal to a single process */
int virKillProcess(pid_t pid, int sig)
{
......
......@@ -233,6 +233,7 @@ static inline int getuid (void) { return 0; }
static inline int getgid (void) { return 0; }
#endif
char *virGetHostnameLocalhost(int allow_localhost);
char *virGetHostname(virConnectPtr conn);
int virKillProcess(pid_t pid, int sig);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册