From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:35968) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZXWcx-0004tx-Pt for qemu-devel@nongnu.org; Thu, 03 Sep 2015 11:40:40 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZXWcw-0007tY-DS for qemu-devel@nongnu.org; Thu, 03 Sep 2015 11:40:39 -0400 Received: from mx1.redhat.com ([209.132.183.28]:57350) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZXWcw-0007tD-7J for qemu-devel@nongnu.org; Thu, 03 Sep 2015 11:40:38 -0400 Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id E649D8EA5F for ; Thu, 3 Sep 2015 15:40:37 +0000 (UTC) From: "Daniel P. Berrange" Date: Thu, 3 Sep 2015 16:39:06 +0100 Message-Id: <1441294768-8712-25-git-send-email-berrange@redhat.com> In-Reply-To: <1441294768-8712-1-git-send-email-berrange@redhat.com> References: <1441294768-8712-1-git-send-email-berrange@redhat.com> Subject: [Qemu-devel] [PATCH FYI 24/46] qemu-nbd: convert to use the QAPI SocketAddress object List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Juan Quintela , "Dr. David Alan Gilbert" , Gerd Hoffmann , Amit Shah , Paolo Bonzini The qemu-nbd program currently uses a QemuOpts objects when setting up sockets. Switch it over to use the QAPI SocketAddress objects instead. Signed-off-by: Daniel P. Berrange --- qemu-nbd.c | 102 +++++++++++++++++++++++-------------------------------------- 1 file changed, 38 insertions(+), 64 deletions(-) diff --git a/qemu-nbd.c b/qemu-nbd.c index d9644b2..67ef811 100644 --- a/qemu-nbd.c +++ b/qemu-nbd.c @@ -49,7 +49,7 @@ static NBDExport *exp; static int verbose; static char *srcpath; -static char *sockpath; +static SocketAddress *saddr; static int persistent = 0; static enum { RUNNING, TERMINATE, TERMINATING, TERMINATED } state; static int shared = 1; @@ -213,52 +213,6 @@ static void termsig_handler(int signum) qemu_notify_event(); } -static void combine_addr(char *buf, size_t len, const char* address, - uint16_t port) -{ - /* If the address-part contains a colon, it's an IPv6 IP so needs [] */ - if (strstr(address, ":")) { - snprintf(buf, len, "[%s]:%u", address, port); - } else { - snprintf(buf, len, "%s:%u", address, port); - } -} - -static int tcp_socket_incoming(const char *address, uint16_t port) -{ - char address_and_port[128]; - Error *local_err = NULL; - - combine_addr(address_and_port, 128, address, port); - int fd = inet_listen(address_and_port, NULL, 0, SOCK_STREAM, 0, &local_err); - - if (local_err != NULL) { - error_report_err(local_err); - } - return fd; -} - -static int unix_socket_incoming(const char *path) -{ - Error *local_err = NULL; - int fd = unix_listen(path, NULL, 0, &local_err); - - if (local_err != NULL) { - error_report_err(local_err); - } - return fd; -} - -static int unix_socket_outgoing(const char *path) -{ - Error *local_err = NULL; - int fd = unix_connect(path, &local_err); - - if (local_err != NULL) { - error_report_err(local_err); - } - return fd; -} static void *show_parts(void *arg) { @@ -287,8 +241,10 @@ static void *nbd_client_thread(void *arg) pthread_t show_parts_thread; Error *local_error = NULL; - sock = unix_socket_outgoing(sockpath); + + sock = socket_connect(saddr, &local_error, NULL, NULL); if (sock < 0) { + error_report_err(local_error); goto out; } @@ -399,6 +355,33 @@ static void nbd_update_server_fd_handler(int fd) } } + +static SocketAddress *nbd_build_socket_address(const char *sockpath, + const char *bindto, + const char *port) +{ + SocketAddress *saddr; + + saddr = g_new0(SocketAddress, 1); + if (sockpath) { + saddr->kind = SOCKET_ADDRESS_KIND_UNIX; + saddr->q_unix = g_new0(UnixSocketAddress, 1); + saddr->q_unix->path = g_strdup(sockpath); + } else { + saddr->kind = SOCKET_ADDRESS_KIND_INET; + saddr->inet = g_new0(InetSocketAddress, 1); + saddr->inet->host = g_strdup(bindto); + if (port) { + saddr->inet->port = g_strdup(port); + } else { + saddr->inet->port = g_strdup_printf("%d", NBD_DEFAULT_PORT); + } + } + + return saddr; +} + + int main(int argc, char **argv) { BlockBackend *blk; @@ -407,8 +390,9 @@ int main(int argc, char **argv) uint32_t nbdflags = 0; bool disconnect = false; const char *bindto = "0.0.0.0"; + const char *port = NULL; + char *sockpath = NULL; char *device = NULL; - int port = NBD_DEFAULT_PORT; off_t fd_size; QemuOpts *sn_opts = NULL; const char *sn_id_or_name = NULL; @@ -441,7 +425,6 @@ int main(int argc, char **argv) }; int ch; int opt_ind = 0; - int li; char *end; int flags = BDRV_O_RDWR; int partition = -1; @@ -529,14 +512,7 @@ int main(int argc, char **argv) bindto = optarg; break; case 'p': - li = strtol(optarg, &end, 0); - if (*end) { - errx(EXIT_FAILURE, "Invalid port `%s'", optarg); - } - if (li < 1 || li > 65535) { - errx(EXIT_FAILURE, "Port out of range `%s'", optarg); - } - port = (uint16_t)li; + port = optarg; break; case 'o': dev_offset = strtoll (optarg, &end, 0); @@ -695,6 +671,8 @@ int main(int argc, char **argv) snprintf(sockpath, 128, SOCKET_PATH, basename(device)); } + saddr = nbd_build_socket_address(sockpath, bindto, port); + if (qemu_init_main_loop(&local_err)) { error_report_err(local_err); exit(EXIT_FAILURE); @@ -752,13 +730,9 @@ int main(int argc, char **argv) errx(EXIT_FAILURE, "%s", error_get_pretty(local_err)); } - if (sockpath) { - fd = unix_socket_incoming(sockpath); - } else { - fd = tcp_socket_incoming(bindto, port); - } - + fd = socket_listen(saddr, &local_err); if (fd < 0) { + error_report_err(local_err); return 1; } -- 2.4.3