[spice-gtk,v1,5/6] channel-main: migration: set target session info early

Submitted by Victor Toso on Sept. 24, 2019, 9:15 a.m.

Details

Message ID 20190924091502.16038-6-victortoso@redhat.com
State New
Headers show
Series "migration object" ( rev: 2 1 ) in Spice

Not browsing as part of any series.

Commit Message

Victor Toso Sept. 24, 2019, 9:15 a.m.
From: Victor Toso <me@victortoso.com>

There is no need to wait till migrate_connect() being called to set
information about target host. We create new SpiceSession and can set
related info similar place.

Moved to a utility function.
This is a preparatory patch on refactoring migration code.

Signed-off-by: Victor Toso <victortoso@redhat.com>
---
 src/channel-main.c | 56 +++++++++++++++++++++++++---------------------
 1 file changed, 31 insertions(+), 25 deletions(-)

Patch hide | download patch | download mbox

diff --git a/src/channel-main.c b/src/channel-main.c
index 3fe8d64..3dba399 100644
--- a/src/channel-main.c
+++ b/src/channel-main.c
@@ -2284,8 +2284,6 @@  static gboolean migrate_connect(gpointer data)
 {
     spice_migrate *mig = data;
     SpiceChannelPrivate  *c;
-    int port, sport;
-    const char *host;
 
     g_return_val_if_fail(mig != NULL, FALSE);
     g_return_val_if_fail(mig->info != NULL, FALSE);
@@ -2299,43 +2297,49 @@  static gboolean migrate_connect(gpointer data)
     SpiceMigrationDstInfo *info = mig->info;
     SPICE_DEBUG("migrate_begin %u %s %d %d",
                 info->host_size, info->host_data, info->port, info->sport);
-    port = info->port;
-    sport = info->sport;
-    host = (char*)info->host_data;
+
+    g_signal_connect(mig->session, "channel-new",
+                     G_CALLBACK(migrate_channel_new_cb), mig);
+
+    g_signal_emit(mig->src_channel, signals[SPICE_MIGRATION_STARTED], 0,
+                  mig->session);
+
+    /* the migration process is in 2 steps, first the main channel and
+       then the rest of the channels */
+    migrate_channel_connect(mig, SPICE_CHANNEL_MAIN, 0);
+
+    return FALSE;
+}
+
+static void
+migration_session_set_destination_info(SpiceSession *target_session,
+                                       SpiceMigrationDstInfo *info)
+{
+    const char *host = (const char *) info->host_data;
+
+    if (g_getenv("SPICE_MIG_HOST")) {
+        host = g_getenv("SPICE_MIG_HOST");
+    }
+
+    g_object_set(target_session, "host", host, NULL);
+    spice_session_set_port(target_session, info->port, FALSE);
+    spice_session_set_port(target_session, info->sport, TRUE);
 
     if (info->cert_subject_size == 0 ||
                strlen((const char*)info->cert_subject_data) == 0) {
         /* only verify hostname if no cert subject */
-        g_object_set(mig->session, "verify", SPICE_SESSION_VERIFY_HOSTNAME, NULL);
+        g_object_set(target_session, "verify", SPICE_SESSION_VERIFY_HOSTNAME, NULL);
     } else {
         gchar *subject = g_alloca(info->cert_subject_size + 1);
         strncpy(subject, (const char*)info->cert_subject_data, info->cert_subject_size);
         subject[info->cert_subject_size] = '\0';
 
         // session data are already copied
-        g_object_set(mig->session,
+        g_object_set(target_session,
                      "cert-subject", subject,
                      "verify", SPICE_SESSION_VERIFY_SUBJECT,
                      NULL);
     }
-
-    if (g_getenv("SPICE_MIG_HOST"))
-        host = g_getenv("SPICE_MIG_HOST");
-
-    g_object_set(mig->session, "host", host, NULL);
-    spice_session_set_port(mig->session, port, FALSE);
-    spice_session_set_port(mig->session, sport, TRUE);
-    g_signal_connect(mig->session, "channel-new",
-                     G_CALLBACK(migrate_channel_new_cb), mig);
-
-    g_signal_emit(mig->src_channel, signals[SPICE_MIGRATION_STARTED], 0,
-                  mig->session);
-
-    /* the migration process is in 2 steps, first the main channel and
-       then the rest of the channels */
-    migrate_channel_connect(mig, SPICE_CHANNEL_MAIN, 0);
-
-    return FALSE;
 }
 
 /* coroutine context */
@@ -2363,6 +2367,8 @@  static void main_migrate_connect(SpiceChannel *channel,
         goto end;
     }
 
+    migration_session_set_destination_info(mig.session, dst_info);
+
     main_priv->migrate_data = &mig;
 
     /* no need to track idle, call is sync for this coroutine */