No functional change. --- p2v/conversion.c | 14 +++++++++----- p2v/nbd.c | 35 ++++++++++++++++++----------------- p2v/p2v.h | 6 +++--- p2v/ssh.c | 6 ++++-- 4 files changed, 34 insertions(+), 27 deletions(-) diff --git a/p2v/conversion.c b/p2v/conversion.c index 26d321f..0c17ef2 100644 --- a/p2v/conversion.c +++ b/p2v/conversion.c @@ -235,6 +235,7 @@ start_conversion (struct config *config, /* Start the data connections and NBD server processes, one per disk. */ for (i = 0; config->disks[i] != NULL; ++i) { + const char *nbd_local_ipaddr; int nbd_local_port; CLEANUP_FREE char *device = NULL; @@ -262,14 +263,15 @@ start_conversion (struct config *config, } /* Start NBD server listening on the given port number. */ - data_conns[i].nbd_pid = start_nbd_server (&nbd_local_port, device); + data_conns[i].nbd_pid = + start_nbd_server (&nbd_local_ipaddr, &nbd_local_port, device); if (data_conns[i].nbd_pid == 0) { set_conversion_error ("NBD server error: %s", get_nbd_error ()); goto out; } /* Wait for NBD server to start up and listen. */ - if (wait_for_nbd_server_to_start (nbd_local_port) == -1) { + if (wait_for_nbd_server_to_start (nbd_local_ipaddr, nbd_local_port) == -1) { set_conversion_error ("NBD server error: %s", get_nbd_error ()); goto out; } @@ -286,7 +288,8 @@ start_conversion (struct config *config, /* Open the SSH data connection, with reverse port forwarding * back to the NBD server. */ - data_conns[i].h = open_data_connection (config, nbd_local_port, + data_conns[i].h = open_data_connection (config, + nbd_local_ipaddr, nbd_local_port, &data_conns[i].nbd_remote_port); if (data_conns[i].h == NULL) { const char *err = get_ssh_error (); @@ -297,9 +300,10 @@ start_conversion (struct config *config, #if DEBUG_STDERR fprintf (stderr, - "%s: data connection for %s: SSH remote port %d, local port %d\n", + "%s: data connection for %s: SSH remote port %d, local port %s:%d\n", getprogname (), device, - data_conns[i].nbd_remote_port, nbd_local_port); + data_conns[i].nbd_remote_port, + nbd_local_ipaddr, nbd_local_port); #endif } diff --git a/p2v/nbd.c b/p2v/nbd.c index ed6f9a1..92f864a 100644 --- a/p2v/nbd.c +++ b/p2v/nbd.c @@ -69,8 +69,8 @@ static const enum nbd_server standard_servers[] = */ static enum nbd_server use_server; -static pid_t start_qemu_nbd (int nbd_local_port, const char *device); -static pid_t start_nbdkit (int nbd_local_port, const char *device); +static pid_t start_qemu_nbd (const char *ipaddr, int nbd_local_port, const char *device); +static pid_t start_nbdkit (const char *ipaddr, int nbd_local_port, const char *device); static int connect_with_source_port (const char *hostname, int dest_port, int source_port); static int bind_source_port (int sockfd, int family, int source_port); @@ -229,7 +229,7 @@ test_nbd_servers (void) * Returns the process ID (E<gt> 0) or C<0> if there is an error. */ pid_t -start_nbd_server (int *port, const char *device) +start_nbd_server (const char **ipaddr, int *port, const char *device) { /* Choose a local port. */ *port = nbd_local_port; @@ -237,10 +237,12 @@ start_nbd_server (int *port, const char *device) switch (use_server) { case QEMU_NBD: - return start_qemu_nbd (*port, device); + *ipaddr = "localhost"; + return start_qemu_nbd (*ipaddr, *port, device); case NBDKIT: - return start_nbdkit (*port, device); + *ipaddr = "localhost"; + return start_nbdkit (*ipaddr, *port, device); default: abort (); @@ -253,7 +255,7 @@ start_nbd_server (int *port, const char *device) * Returns the process ID (E<gt> 0) or C<0> if there is an error. */ static pid_t -start_qemu_nbd (int port, const char *device) +start_qemu_nbd (const char *ipaddr, int port, const char *device) { pid_t pid; char port_str[64]; @@ -280,7 +282,7 @@ start_qemu_nbd (int port, const char *device) "-p", port_str, /* listening port */ "-t", /* persistent */ "-f", "raw", /* force raw format */ - "-b", "localhost", /* listen only on loopback interface */ + "-b", ipaddr, /* listen only on loopback interface */ "--cache=unsafe", /* use unsafe caching for speed */ device, /* a device like /dev/sda */ NULL); @@ -299,7 +301,7 @@ start_qemu_nbd (int port, const char *device) * Returns the process ID (E<gt> 0) or C<0> if there is an error. */ static pid_t -start_nbdkit (int port, const char *device) +start_nbdkit (const char *ipaddr, int port, const char *device) { pid_t pid; char port_str[64]; @@ -328,7 +330,7 @@ start_nbdkit (int port, const char *device) "nbdkit", "-r", /* readonly (vital!) */ "-p", port_str, /* listening port */ - "-i", "localhost", /* listen only on loopback interface */ + "-i", ipaddr , /* listen only on loopback interface */ "-f", /* don't fork */ "file", /* file plugin */ file_str, /* a device like file=/dev/sda */ @@ -346,7 +348,7 @@ start_nbdkit (int port, const char *device) * connections. */ int -wait_for_nbd_server_to_start (int nbd_local_port) +wait_for_nbd_server_to_start (const char *ipaddr, int port) { int sockfd = -1; int result = -1; @@ -368,15 +370,14 @@ wait_for_nbd_server_to_start (int nbd_local_port) } /* Source port for probing NBD server should be one greater than - * nbd_local_port. It's not guaranteed to always bind to this - * port, but it will hint the kernel to start there and try - * incrementally higher ports if needed. This avoids the case - * where the kernel selects nbd_local_port as our source port, and - * we immediately connect to ourself. See: + * port. It's not guaranteed to always bind to this port, but it + * will hint the kernel to start there and try incrementally + * higher ports if needed. This avoids the case where the kernel + * selects port as our source port, and we immediately connect to + * ourself. See: * https://bugzilla.redhat.com/show_bug.cgi?id=1167774#c9 */ - sockfd = connect_with_source_port ("localhost", nbd_local_port, - nbd_local_port+1); + sockfd = connect_with_source_port (ipaddr, port, port+1); if (sockfd >= 0) break; diff --git a/p2v/p2v.h b/p2v/p2v.h index 1cde808..5223aa2 100644 --- a/p2v/p2v.h +++ b/p2v/p2v.h @@ -125,7 +125,7 @@ extern int inhibit_power_saving (void); /* ssh.c */ extern int test_connection (struct config *); -extern mexp_h *open_data_connection (struct config *, int local_port, int *remote_port); +extern mexp_h *open_data_connection (struct config *, const char *local_ipaddr, int local_port, int *remote_port); extern mexp_h *start_remote_connection (struct config *, const char *remote_dir); extern const char *get_ssh_error (void); extern int scp_file (struct config *config, const char *localfile, const char *remotefile); @@ -133,8 +133,8 @@ extern int scp_file (struct config *config, const char *localfile, const char *r /* nbd.c */ extern void set_nbd_option (const char *opt); extern void test_nbd_servers (void); -extern pid_t start_nbd_server (int *nbd_local_port, const char *device); -extern int wait_for_nbd_server_to_start (int nbd_local_port); +extern pid_t start_nbd_server (const char **ipaddr, int *port, const char *device); +extern int wait_for_nbd_server_to_start (const char *ipaddr, int port); const char *get_nbd_error (void); /* utils.c */ diff --git a/p2v/ssh.c b/p2v/ssh.c index d29aa40..20acb03 100644 --- a/p2v/ssh.c +++ b/p2v/ssh.c @@ -1039,7 +1039,9 @@ compatible_version (const char *v2v_version) } mexp_h * -open_data_connection (struct config *config, int local_port, int *remote_port) +open_data_connection (struct config *config, + const char *local_ipaddr, int local_port, + int *remote_port) { mexp_h *h; char remote_arg[32]; @@ -1052,7 +1054,7 @@ open_data_connection (struct config *config, int local_port, int *remote_port) const int ovecsize = 12; int ovector[ovecsize]; - snprintf (remote_arg, sizeof remote_arg, "0:localhost:%d", local_port); + snprintf (remote_arg, sizeof remote_arg, "0:%s:%d", local_ipaddr, local_port); h = start_ssh (0, config, (char **) extra_args, 0); if (h == NULL) -- 2.9.3