sockets: Make port specification optional in inet_parse From: Bharata B Rao <bhar...@linux.vnet.ibm.com>
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 <bhar...@linux.vnet.ibm.com> --- 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"); }