From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:54044) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TG4OF-00048o-EH for qemu-devel@nongnu.org; Mon, 24 Sep 2012 04:51:49 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1TG4O9-0001Jv-9X for qemu-devel@nongnu.org; Mon, 24 Sep 2012 04:51:43 -0400 Received: from e28smtp04.in.ibm.com ([122.248.162.4]:51298) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TG4O8-0001Je-Ju for qemu-devel@nongnu.org; Mon, 24 Sep 2012 04:51:37 -0400 Received: from /spool/local by e28smtp04.in.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Mon, 24 Sep 2012 14:21:34 +0530 Received: from d28av03.in.ibm.com (d28av03.in.ibm.com [9.184.220.65]) by d28relay04.in.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id q8O8pITb4260166 for ; Mon, 24 Sep 2012 14:21:19 +0530 Received: from d28av03.in.ibm.com (loopback [127.0.0.1]) by d28av03.in.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id q8O8pHhb025239 for ; Mon, 24 Sep 2012 18:51:18 +1000 Date: Mon, 24 Sep 2012 14:23:18 +0530 From: Bharata B Rao Message-ID: <20120924085318.GE18470@in.ibm.com> References: <20120924085127.GC18470@in.ibm.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20120924085127.GC18470@in.ibm.com> Subject: [Qemu-devel] [PATCH v8 2/6] sockets: Make port specification optional in inet_parse Reply-To: bharata@linux.vnet.ibm.com List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Kevin Wolf , Anthony Liguori , Anand Avati , Vijay Bellur , Stefan Hajnoczi , Harsh Bora , Amar Tumballi , Markus Armbruster , Blue Swirl , Avi Kivity , Paolo Bonzini sockets: Make port specification optional in inet_parse From: Bharata B Rao Change inet_parse() to work without explicit port specification. Add a default_port argument to be used when port isn't specified. Signed-off-by: Bharata B Rao --- qemu-sockets.c | 43 ++++++++++++++++++++++++++++++++++--------- 1 files changed, 34 insertions(+), 9 deletions(-) diff --git a/qemu-sockets.c b/qemu-sockets.c index b292311..25285f2 100644 --- a/qemu-sockets.c +++ b/qemu-sockets.c @@ -406,26 +406,36 @@ err: return -1; } -/* compatibility wrapper */ -static int inet_parse(QemuOpts *opts, const char *str) +/* + * Converts inet address and port specification in @str to QemuOpts + * options. + * + * If port isn't specified in @str, @default_port will be set in the + * port option of @opts. If default_port is -1, then the parser will + * look for the port specification in @str mandatorily. + */ +static int inet_parse(QemuOpts *opts, const char *str, int default_port) { const char *optstr, *h; char addr[64]; char port[33]; - int pos; + int ret, pos, addr_pos = -1, port_pos = -1; /* parse address */ if (str[0] == ':') { /* no host given */ addr[0] = '\0'; - if (1 != sscanf(str,":%32[^,]%n",port,&pos)) { + ret = sscanf(str, ":%32[^,]%n", port, &port_pos); + if (port_pos == -1 || ret == EOF) { fprintf(stderr, "%s: portonly parse error (%s)\n", __FUNCTION__, str); return -1; } } else if (str[0] == '[') { /* IPv6 addr */ - if (2 != sscanf(str,"[%64[^]]]:%32[^,]%n",addr,port,&pos)) { + ret = sscanf(str, "[%64[^]]]%n:%32[^,]%n", addr, &addr_pos, + port, &port_pos); + if (addr_pos == -1 || ret == EOF) { fprintf(stderr, "%s: ipv6 parse error (%s)\n", __FUNCTION__, str); return -1; @@ -433,7 +443,9 @@ static int inet_parse(QemuOpts *opts, const char *str) qemu_opt_set(opts, "ipv6", "on"); } else if (qemu_isdigit(str[0])) { /* IPv4 addr */ - if (2 != sscanf(str,"%64[0-9.]:%32[^,]%n",addr,port,&pos)) { + ret = sscanf(str, "%64[0-9.]%n:%32[^,]%n", addr, &addr_pos, + port, &port_pos); + if (addr_pos == -1 || ret == EOF) { fprintf(stderr, "%s: ipv4 parse error (%s)\n", __FUNCTION__, str); return -1; @@ -441,12 +453,25 @@ static int inet_parse(QemuOpts *opts, const char *str) qemu_opt_set(opts, "ipv4", "on"); } else { /* hostname */ - if (2 != sscanf(str,"%64[^:]:%32[^,]%n",addr,port,&pos)) { + ret = sscanf(str, "%64[^:]%n:%32[^,]%n", addr, &addr_pos, + port, &port_pos); + if (addr_pos == -1 || ret == EOF) { fprintf(stderr, "%s: hostname parse error (%s)\n", __FUNCTION__, str); return -1; } } + + if (port_pos != -1) { + pos = port_pos; + } else { + pos = addr_pos; + if (default_port == -1) { + return -1; + } + snprintf(port, 33, "%d", default_port); + } + qemu_opt_set(opts, "host", addr); qemu_opt_set(opts, "port", port); @@ -470,7 +495,7 @@ int inet_listen(const char *str, char *ostr, int olen, int sock = -1; opts = qemu_opts_create(&socket_opts, NULL, 0, NULL); - if (inet_parse(opts, str) == 0) { + if (inet_parse(opts, str, -1) == 0) { sock = inet_listen_opts(opts, port_offset, errp); if (sock != -1 && ostr) { optstr = strchr(str, ','); @@ -499,7 +524,7 @@ int inet_connect(const char *str, bool block, bool *in_progress, Error **errp) int sock = -1; opts = qemu_opts_create(&socket_opts, NULL, 0, NULL); - if (inet_parse(opts, str) == 0) { + if (inet_parse(opts, str, -1) == 0) { if (block) { qemu_opt_set(opts, "block", "on"); }