From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1Mkgjr-0007Rp-4B for qemu-devel@nongnu.org; Mon, 07 Sep 2009 12:06:43 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1Mkgjl-0007O5-Ie for qemu-devel@nongnu.org; Mon, 07 Sep 2009 12:06:42 -0400 Received: from [199.232.76.173] (port=34950 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Mkgjl-0007O1-Fw for qemu-devel@nongnu.org; Mon, 07 Sep 2009 12:06:37 -0400 Received: from mx1.redhat.com ([209.132.183.28]:10531) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1Mkgjk-0003V0-OR for qemu-devel@nongnu.org; Mon, 07 Sep 2009 12:06:37 -0400 Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id n87G6aDr013955 for ; Mon, 7 Sep 2009 12:06:36 -0400 From: Gerd Hoffmann Date: Mon, 7 Sep 2009 18:06:08 +0200 Message-Id: <1252339585-27797-7-git-send-email-kraxel@redhat.com> In-Reply-To: <1252339585-27797-1-git-send-email-kraxel@redhat.com> References: <1252339585-27797-1-git-send-email-kraxel@redhat.com> Subject: [Qemu-devel] [PATCH 06/23] sockets: add unix_listen_opts List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Gerd Hoffmann Add unix_listen_opts(). Does the same as unix_listen(), but uses QemuOpts. unix_listen() is a compatibility wrapper for unix_listen_opts() now and should go away some day. Signed-off-by: Gerd Hoffmann --- qemu-sockets.c | 47 +++++++++++++++++++++++++++++++++-------------- qemu_socket.h | 1 + 2 files changed, 34 insertions(+), 14 deletions(-) diff --git a/qemu-sockets.c b/qemu-sockets.c index 732d3e0..6e212fe 100644 --- a/qemu-sockets.c +++ b/qemu-sockets.c @@ -329,11 +329,11 @@ int inet_connect(const char *str, int socktype) #ifndef _WIN32 -int unix_listen(const char *str, char *ostr, int olen) +int unix_listen_opts(QemuOpts *opts) { struct sockaddr_un un; - char *path, *opts; - int sock, fd, len; + const char *path = qemu_opt_get(opts, "path"); + int sock, fd; sock = socket(PF_UNIX, SOCK_STREAM, 0); if (sock < 0) { @@ -341,14 +341,6 @@ int unix_listen(const char *str, char *ostr, int olen) return -1; } - opts = strchr(str, ','); - if (opts) { - len = opts - str; - path = qemu_malloc(len+1); - snprintf(path, len+1, "%.*s", len, str); - } else - path = qemu_strdup(str); - memset(&un, 0, sizeof(un)); un.sun_family = AF_UNIX; if (path && strlen(path)) { @@ -365,8 +357,8 @@ int unix_listen(const char *str, char *ostr, int olen) * worst case possible is bind() failing, i.e. a DoS attack. */ fd = mkstemp(un.sun_path); close(fd); + qemu_opt_set(opts, "path", un.sun_path); } - snprintf(ostr, olen, "%s%s", un.sun_path, opts ? opts : ""); unlink(un.sun_path); if (bind(sock, (struct sockaddr*) &un, sizeof(un)) < 0) { @@ -380,11 +372,9 @@ int unix_listen(const char *str, char *ostr, int olen) if (sockets_debug) fprintf(stderr, "bind(unix:%s): OK\n", un.sun_path); - qemu_free(path); return sock; err: - qemu_free(path); closesocket(sock); return -1; } @@ -420,6 +410,35 @@ int unix_connect_opts(QemuOpts *opts) } /* compatibility wrapper */ +int unix_listen(const char *str, char *ostr, int olen) +{ + QemuOpts *opts; + char *path, *optstr; + int sock, len; + + opts = qemu_opts_create(&dummy_opts, NULL, 0); + + optstr = strchr(str, ','); + if (optstr) { + len = optstr - str; + if (len) { + path = qemu_malloc(len+1); + snprintf(path, len+1, "%.*s", len, str); + qemu_opt_set(opts, "path", path); + qemu_free(path); + } + } else { + qemu_opt_set(opts, "path", str); + } + + sock = unix_listen_opts(opts); + + if (sock != -1 && ostr) + snprintf(ostr, olen, "%s%s", qemu_opt_get(opts, "path"), optstr ? optstr : ""); + qemu_opts_del(opts); + return sock; +} + int unix_connect(const char *path) { QemuOpts *opts; diff --git a/qemu_socket.h b/qemu_socket.h index 7ca4af7..354c114 100644 --- a/qemu_socket.h +++ b/qemu_socket.h @@ -40,6 +40,7 @@ int inet_listen(const char *str, char *ostr, int olen, int socktype, int port_offset); int inet_connect(const char *str, int socktype); +int unix_listen_opts(QemuOpts *opts); int unix_listen(const char *path, char *ostr, int olen); int unix_connect_opts(QemuOpts *opts); int unix_connect(const char *path); -- 1.6.2.5