[libvirt] [PATCH 5/6] qemu: Use virNetSocket for tunneled migration

Jiri Denemark jdenemar at redhat.com
Mon Aug 15 07:58:15 UTC 2011


---
 src/qemu/qemu_migration.c |   50 +++++++-------------------------------------
 1 files changed, 8 insertions(+), 42 deletions(-)

diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
index 1cabbe0..c29ea9e 100644
--- a/src/qemu/qemu_migration.c
+++ b/src/qemu/qemu_migration.c
@@ -42,6 +42,7 @@
 #include "fdstream.h"
 #include "uuid.h"
 #include "locking/domain_lock.h"
+#include "rpc/virnetsocket.h"
 
 
 #define VIR_FROM_THIS VIR_FROM_QEMU
@@ -1618,9 +1619,8 @@ static int doTunnelMigrate(struct qemud_driver *driver,
                            unsigned long resource)
 {
     qemuDomainObjPrivatePtr priv = vm->privateData;
-    int qemu_sock = -1;
-    struct sockaddr_un sa_qemu;
     char *unixfile = NULL;
+    virNetSocketPtr sock = NULL;
     int ret = -1;
     qemuMigrationSpec spec;
 
@@ -1642,45 +1642,14 @@ static int doTunnelMigrate(struct qemud_driver *driver,
         goto cleanup;
     }
 
-    qemu_sock = socket(AF_UNIX, SOCK_STREAM, 0);
-    if (qemu_sock < 0) {
-        virReportSystemError(errno, "%s",
-                             _("cannot open tunnelled migration socket"));
-        goto cleanup;
-    }
-    memset(&sa_qemu, 0, sizeof(sa_qemu));
-    sa_qemu.sun_family = AF_UNIX;
-    if (virStrcpy(sa_qemu.sun_path, unixfile,
-                  sizeof(sa_qemu.sun_path)) == NULL) {
-        qemuReportError(VIR_ERR_INTERNAL_ERROR,
-                        _("Unix socket '%s' too big for destination"),
-                        unixfile);
+    if (virNetSocketNewListenUNIX(unixfile, 0700,
+                                  driver->user, driver->group, &sock) < 0 ||
+        virNetSocketListen(sock, 1) < 0)
         goto cleanup;
-    }
-    unlink(unixfile);
-    if (bind(qemu_sock, (struct sockaddr *)&sa_qemu, sizeof(sa_qemu)) < 0) {
-        virReportSystemError(errno,
-                             _("Cannot bind to unix socket '%s' for tunnelled migration"),
-                             unixfile);
-        goto cleanup;
-    }
-    if (listen(qemu_sock, 1) < 0) {
-        virReportSystemError(errno,
-                             _("Cannot listen on unix socket '%s' for tunnelled migration"),
-                             unixfile);
-        goto cleanup;
-    }
-
-    if (chown(unixfile, driver->user, driver->group) < 0) {
-        virReportSystemError(errno,
-                             _("Cannot change unix socket '%s' owner"),
-                             unixfile);
-        goto cleanup;
-    }
 
     spec.destType = MIGRATION_DEST_UNIX;
     spec.dest.unics.file = unixfile;
-    spec.dest.unics.sock = qemu_sock;
+    spec.dest.unics.sock = virNetSocketGetFD(sock);
     spec.fwdType = MIGRATION_FWD_STREAM;
     spec.fwd.stream = st;
 
@@ -1688,11 +1657,8 @@ static int doTunnelMigrate(struct qemud_driver *driver,
                            cookieoutlen, flags, resource, &spec);
 
 cleanup:
-    VIR_FORCE_CLOSE(qemu_sock);
-    if (unixfile) {
-        unlink(unixfile);
-        VIR_FREE(unixfile);
-    }
+    virNetSocketFree(sock);
+    VIR_FREE(unixfile);
 
     return ret;
 }
-- 
1.7.6




More information about the libvir-list mailing list