From: Paolo Bonzini <pbonzini@redhat.com>
To: qemu-devel@nongnu.org
Cc: lcapitulino@redhat.com
Subject: [Qemu-devel] [PATCH 21/25] qemu-sockets: return IPSocketAddress from inet_parse
Date: Wed, 10 Oct 2012 16:03:02 +0200 [thread overview]
Message-ID: <1349877786-23514-22-git-send-email-pbonzini@redhat.com> (raw)
In-Reply-To: <1349877786-23514-1-git-send-email-pbonzini@redhat.com>
Reviewed-by: Luiz Capitulino <lcapitulino@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
qemu-sockets.c | 119 +++++++++++++++++++++++++++++++++++++--------------------
1 file modificato, 78 inserzioni(+), 41 rimozioni(-)
diff --git a/qemu-sockets.c b/qemu-sockets.c
index a37f35d..5946962 100644
--- a/qemu-sockets.c
+++ b/qemu-sockets.c
@@ -480,54 +480,91 @@ err:
}
/* compatibility wrapper */
-static void inet_parse(QemuOpts *opts, const char *str, Error **errp)
+static IPSocketAddress *inet_parse(const char *str, Error **errp)
{
+ IPSocketAddress *addr;
const char *optstr, *h;
- char addr[64];
+ char host[64];
char port[33];
+ int to;
int pos;
+ addr = g_new(IPSocketAddress, 1);
+
/* parse address */
if (str[0] == ':') {
/* no host given */
- addr[0] = '\0';
+ host[0] = '\0';
if (1 != sscanf(str,":%32[^,]%n",port,&pos)) {
error_setg(errp, "error parsing port in address '%s'", str);
- return;
+ goto fail;
}
} else if (str[0] == '[') {
/* IPv6 addr */
- if (2 != sscanf(str,"[%64[^]]]:%32[^,]%n",addr,port,&pos)) {
+ if (2 != sscanf(str,"[%64[^]]]:%32[^,]%n",host,port,&pos)) {
error_setg(errp, "error parsing IPv6 address '%s'", str);
- return;
+ goto fail;
}
- qemu_opt_set(opts, "ipv6", "on");
+ addr->ipv6 = addr->has_ipv6 = true;
} else if (qemu_isdigit(str[0])) {
/* IPv4 addr */
- if (2 != sscanf(str,"%64[0-9.]:%32[^,]%n",addr,port,&pos)) {
+ if (2 != sscanf(str,"%64[0-9.]:%32[^,]%n",host,port,&pos)) {
error_setg(errp, "error parsing IPv4 address '%s'", str);
- return;
+ goto fail;
}
- qemu_opt_set(opts, "ipv4", "on");
+ addr->ipv4 = addr->has_ipv4 = true;
} else {
/* hostname */
- if (2 != sscanf(str,"%64[^:]:%32[^,]%n",addr,port,&pos)) {
+ if (2 != sscanf(str,"%64[^:]:%32[^,]%n",host,port,&pos)) {
error_setg(errp, "error parsing address '%s'", str);
- return;
+ goto fail;
}
}
- qemu_opt_set(opts, "host", addr);
- qemu_opt_set(opts, "port", port);
+
+ addr->host = g_strdup(host);
+ addr->port = g_strdup(port);
/* parse options */
optstr = str + pos;
h = strstr(optstr, ",to=");
- if (h)
- qemu_opt_set(opts, "to", h+4);
- if (strstr(optstr, ",ipv4"))
- qemu_opt_set(opts, "ipv4", "on");
- if (strstr(optstr, ",ipv6"))
- qemu_opt_set(opts, "ipv6", "on");
+ if (h) {
+ if (1 != sscanf(str, "%d%n", &to, &pos) ||
+ (str[pos] != '\0' && str[pos] != ',')) {
+ error_setg(errp, "error parsing to= argument");
+ goto fail;
+ }
+ addr->has_to = true;
+ addr->to = to;
+ }
+ if (strstr(optstr, ",ipv4")) {
+ addr->ipv4 = addr->has_ipv4 = true;
+ }
+ if (strstr(optstr, ",ipv6")) {
+ addr->ipv6 = addr->has_ipv6 = true;
+ }
+ return addr;
+
+fail:
+ qapi_free_IPSocketAddress(addr);
+ return NULL;
+}
+
+static void inet_addr_to_opts(QemuOpts *opts, IPSocketAddress *addr)
+{
+ bool ipv4 = addr->ipv4 || !addr->has_ipv4;
+ bool ipv6 = addr->ipv6 || !addr->has_ipv6;
+
+ if (!ipv4 || !ipv6) {
+ qemu_opt_set_bool(opts, "ipv4", ipv4);
+ qemu_opt_set_bool(opts, "ipv6", ipv6);
+ }
+ if (addr->has_to) {
+ char to[20];
+ snprintf(to, sizeof(to), "%d", addr->to);
+ qemu_opt_set(opts, "to", to);
+ }
+ qemu_opt_set(opts, "host", addr->host);
+ qemu_opt_set(opts, "port", addr->port);
}
int inet_listen(const char *str, char *ostr, int olen,
@@ -536,11 +573,13 @@ int inet_listen(const char *str, char *ostr, int olen,
QemuOpts *opts;
char *optstr;
int sock = -1;
- Error *local_err = NULL;
+ IPSocketAddress *addr;
- opts = qemu_opts_create(&dummy_opts, NULL, 0, NULL);
- inet_parse(opts, str, &local_err);
- if (local_err == NULL) {
+ addr = inet_parse(str, errp);
+ if (addr != NULL) {
+ opts = qemu_opts_create(&dummy_opts, NULL, 0, NULL);
+ inet_addr_to_opts(opts, addr);
+ qapi_free_IPSocketAddress(addr);
sock = inet_listen_opts(opts, port_offset, errp);
if (sock != -1 && ostr) {
optstr = strchr(str, ',');
@@ -556,10 +595,8 @@ int inet_listen(const char *str, char *ostr, int olen,
optstr ? optstr : "");
}
}
- } else {
- error_propagate(errp, local_err);
+ qemu_opts_del(opts);
}
- qemu_opts_del(opts);
return sock;
}
@@ -575,16 +612,16 @@ int inet_connect(const char *str, Error **errp)
{
QemuOpts *opts;
int sock = -1;
- Error *local_err = NULL;
+ IPSocketAddress *addr;
- opts = qemu_opts_create(&dummy_opts, NULL, 0, NULL);
- inet_parse(opts, str, &local_err);
- if (local_err == NULL) {
+ addr = inet_parse(str, errp);
+ if (addr != NULL) {
+ opts = qemu_opts_create(&dummy_opts, NULL, 0, NULL);
+ inet_addr_to_opts(opts, addr);
+ qapi_free_IPSocketAddress(addr);
sock = inet_connect_opts(opts, errp, NULL, NULL);
- } else {
- error_propagate(errp, local_err);
+ qemu_opts_del(opts);
}
- qemu_opts_del(opts);
return sock;
}
@@ -607,18 +644,18 @@ int inet_nonblocking_connect(const char *str,
{
QemuOpts *opts;
int sock = -1;
- Error *local_err = NULL;
+ IPSocketAddress *addr;
g_assert(callback != NULL);
- opts = qemu_opts_create(&dummy_opts, NULL, 0, NULL);
- inet_parse(opts, str, &local_err);
- if (local_err == NULL) {
+ addr = inet_parse(str, errp);
+ if (addr != NULL) {
+ opts = qemu_opts_create(&dummy_opts, NULL, 0, NULL);
+ inet_addr_to_opts(opts, addr);
+ qapi_free_IPSocketAddress(addr);
sock = inet_connect_opts(opts, errp, callback, opaque);
- } else {
- error_propagate(errp, local_err);
+ qemu_opts_del(opts);
}
- qemu_opts_del(opts);
return sock;
}
--
1.7.12.1
next prev parent reply other threads:[~2012-10-10 14:04 UTC|newest]
Thread overview: 72+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-10-10 14:02 [Qemu-devel] [PULL for Luiz 00/25] Combined qemu-sockets cleanup v2 + NBD server Paolo Bonzini
2012-10-10 14:02 ` [Qemu-devel] [PATCH 01/25] error: add error_set_errno and error_setg_errno Paolo Bonzini
2012-10-10 14:02 ` [Qemu-devel] [PATCH 02/25] qemu-sockets: add Error ** to all functions Paolo Bonzini
2012-10-10 14:02 ` [Qemu-devel] [PATCH 03/25] qemu-sockets: unix_listen and unix_connect are portable Paolo Bonzini
2012-10-10 14:02 ` [Qemu-devel] [PATCH 04/25] qemu-sockets: add nonblocking connect for Unix sockets Paolo Bonzini
2012-10-17 13:33 ` Markus Armbruster
2012-10-17 13:44 ` Paolo Bonzini
2012-10-10 14:02 ` [Qemu-devel] [PATCH 05/25] migration: avoid using error_is_set and thus relying on errp != NULL Paolo Bonzini
2012-10-17 13:36 ` Markus Armbruster
2012-10-17 13:37 ` Paolo Bonzini
2012-10-17 15:44 ` Markus Armbruster
2012-10-10 14:02 ` [Qemu-devel] [PATCH 06/25] migration: centralize call to migrate_fd_error() Paolo Bonzini
2012-10-10 14:02 ` [Qemu-devel] [PATCH 07/25] migration: use qemu-sockets to establish Unix sockets Paolo Bonzini
2012-10-17 14:30 ` Markus Armbruster
2012-10-10 14:02 ` [Qemu-devel] [PATCH 08/25] migration (outgoing): add error propagation for all protocols Paolo Bonzini
2012-10-17 14:43 ` Markus Armbruster
2012-10-17 14:50 ` Paolo Bonzini
2012-10-17 15:43 ` Markus Armbruster
2012-10-10 14:02 ` [Qemu-devel] [PATCH 09/25] migration (incoming): add error propagation to fd and exec protocols Paolo Bonzini
2012-10-10 14:02 ` [Qemu-devel] [PATCH 10/25] qemu-char: ask and print error information from qemu-sockets Paolo Bonzini
2012-10-10 14:02 ` [Qemu-devel] [PATCH 11/25] nbd: " Paolo Bonzini
2012-10-17 14:51 ` Markus Armbruster
2012-10-17 14:53 ` Paolo Bonzini
2012-10-10 14:02 ` [Qemu-devel] [PATCH 12/25] qemu-ga: " Paolo Bonzini
2012-10-10 14:02 ` [Qemu-devel] [PATCH 13/25] vnc: add error propagation to vnc_display_open Paolo Bonzini
2012-10-17 15:17 ` Markus Armbruster
2012-10-17 15:48 ` Paolo Bonzini
2012-10-19 7:49 ` Markus Armbruster
2012-10-19 8:40 ` Paolo Bonzini
2012-10-10 14:02 ` [Qemu-devel] [PATCH 14/25] qemu-sockets: include strerror or gai_strerror output in error messages Paolo Bonzini
2012-10-10 14:02 ` [Qemu-devel] [PATCH 15/25] qemu-sockets: add error propagation to inet_connect_addr Paolo Bonzini
2012-10-16 12:53 ` Luiz Capitulino
2012-10-17 15:40 ` Markus Armbruster
2012-10-17 15:50 ` Paolo Bonzini
2012-10-19 7:59 ` Markus Armbruster
2012-10-19 8:50 ` Paolo Bonzini
2012-10-10 14:02 ` [Qemu-devel] [PATCH 16/25] qemu-sockets: add error propagation to inet_dgram_opts Paolo Bonzini
2012-10-10 14:02 ` [Qemu-devel] [PATCH 17/25] qemu-sockets: add error propagation to inet_parse Paolo Bonzini
2012-10-10 14:02 ` [Qemu-devel] [PATCH 18/25] qemu-sockets: add error propagation to Unix socket functions Paolo Bonzini
2012-10-10 14:03 ` [Qemu-devel] [PATCH 19/25] build: add QAPI files to the tools Paolo Bonzini
2012-10-10 14:03 ` [Qemu-devel] [PATCH 20/25] qapi: add socket address types Paolo Bonzini
2012-10-17 16:43 ` Markus Armbruster
2012-10-17 16:48 ` Paolo Bonzini
2012-10-17 16:50 ` Luiz Capitulino
2012-10-19 8:10 ` Markus Armbruster
2012-10-19 8:39 ` Paolo Bonzini
2012-10-10 14:03 ` Paolo Bonzini [this message]
2012-10-17 16:49 ` [Qemu-devel] [PATCH 21/25] qemu-sockets: return IPSocketAddress from inet_parse Markus Armbruster
2012-10-10 14:03 ` [Qemu-devel] [PATCH 22/25] qemu-sockets: add socket_listen, socket_connect, socket_parse Paolo Bonzini
2012-10-19 8:15 ` Markus Armbruster
2012-10-19 8:37 ` Paolo Bonzini
2012-10-10 14:03 ` [Qemu-devel] [PATCH 23/25] block: add close notifiers Paolo Bonzini
2012-10-19 8:21 ` Markus Armbruster
2012-10-19 9:38 ` Paolo Bonzini
2012-10-19 8:26 ` Markus Armbruster
2012-10-10 14:03 ` [Qemu-devel] [PATCH 24/25] qmp: add NBD server commands Paolo Bonzini
2012-10-10 20:41 ` Eric Blake
2012-10-11 13:06 ` Paolo Bonzini
2012-10-11 13:14 ` Eric Blake
2012-10-11 13:22 ` Paolo Bonzini
2012-10-19 8:31 ` Markus Armbruster
2012-10-10 14:03 ` [Qemu-devel] [PATCH 25/25] hmp: " Paolo Bonzini
2012-10-19 8:34 ` Markus Armbruster
2012-10-19 8:58 ` Paolo Bonzini
2012-10-19 12:44 ` Luiz Capitulino
2012-10-19 12:44 ` Markus Armbruster
2012-10-19 13:11 ` Paolo Bonzini
2012-10-19 13:53 ` Markus Armbruster
2012-10-19 13:57 ` Paolo Bonzini
2012-10-16 13:09 ` [Qemu-devel] [PULL for Luiz 00/25] Combined qemu-sockets cleanup v2 + NBD server Luiz Capitulino
2012-10-16 13:10 ` Paolo Bonzini
2012-10-17 17:02 ` Markus Armbruster
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1349877786-23514-22-git-send-email-pbonzini@redhat.com \
--to=pbonzini@redhat.com \
--cc=lcapitulino@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).