From: Paolo Bonzini <pbonzini@redhat.com>
To: qemu-devel@nongnu.org
Cc: Corey Minyard <cminyard@mvista.com>
Subject: [Qemu-devel] [PULL 02/28] qemu-char: Rework qemu_chr_open_socket() for reconnect
Date: Thu, 9 Oct 2014 12:10:12 +0200 [thread overview]
Message-ID: <1412849438-12274-3-git-send-email-pbonzini@redhat.com> (raw)
In-Reply-To: <1412849438-12274-1-git-send-email-pbonzini@redhat.com>
From: Corey Minyard <cminyard@mvista.com>
Move all socket configuration to qmp_chardev_open_socket().
qemu_chr_open_socket_fd() just opens the socket. This is getting ready
for the reconnect code, which will call open_sock_fd() on a reconnect
attempt.
Signed-off-by: Corey Minyard <cminyard@mvista.com>
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
qemu-char.c | 118 ++++++++++++++++++++++++++++++++++--------------------------
1 file changed, 68 insertions(+), 50 deletions(-)
diff --git a/qemu-char.c b/qemu-char.c
index f9d2a02..dcfeb73 100644
--- a/qemu-char.c
+++ b/qemu-char.c
@@ -2891,13 +2891,11 @@ static void tcp_chr_close(CharDriverState *chr)
qemu_chr_be_event(chr, CHR_EVENT_CLOSED);
}
-static CharDriverState *qemu_chr_open_socket_fd(int fd, bool do_nodelay,
- bool is_listen, bool is_telnet,
- bool is_waitconnect,
- Error **errp)
+static bool qemu_chr_finish_socket_connection(CharDriverState *chr, int fd,
+ bool is_listen, bool is_telnet,
+ Error **errp)
{
- CharDriverState *chr = NULL;
- TCPCharDriver *s = NULL;
+ TCPCharDriver *s = chr->opaque;
char host[NI_MAXHOST], serv[NI_MAXSERV];
const char *left = "", *right = "";
struct sockaddr_storage ss;
@@ -2905,26 +2903,14 @@ static CharDriverState *qemu_chr_open_socket_fd(int fd, bool do_nodelay,
memset(&ss, 0, ss_len);
if (getsockname(fd, (struct sockaddr *) &ss, &ss_len) != 0) {
+ closesocket(fd);
error_setg_errno(errp, errno, "getsockname");
- return NULL;
+ return false;
}
- chr = qemu_chr_alloc();
- s = g_malloc0(sizeof(TCPCharDriver));
-
- s->connected = 0;
- s->fd = -1;
- s->listen_fd = -1;
- s->read_msgfds = 0;
- s->read_msgfds_num = 0;
- s->write_msgfds = 0;
- s->write_msgfds_num = 0;
-
- chr->filename = g_malloc(CHR_MAX_FILENAME_SIZE);
switch (ss.ss_family) {
#ifndef _WIN32
case AF_UNIX:
- s->is_unix = 1;
snprintf(chr->filename, CHR_MAX_FILENAME_SIZE, "unix:%s%s",
((struct sockaddr_un *)(&ss))->sun_path,
is_listen ? ",server" : "");
@@ -2935,7 +2921,6 @@ static CharDriverState *qemu_chr_open_socket_fd(int fd, bool do_nodelay,
right = "]";
/* fall through */
case AF_INET:
- s->do_nodelay = do_nodelay;
getnameinfo((struct sockaddr *) &ss, ss_len, host, sizeof(host),
serv, sizeof(serv), NI_NUMERICHOST | NI_NUMERICSERV);
snprintf(chr->filename, CHR_MAX_FILENAME_SIZE, "%s:%s%s%s:%s%s",
@@ -2945,25 +2930,11 @@ static CharDriverState *qemu_chr_open_socket_fd(int fd, bool do_nodelay,
break;
}
- chr->opaque = s;
- chr->chr_write = tcp_chr_write;
- chr->chr_sync_read = tcp_chr_sync_read;
- chr->chr_close = tcp_chr_close;
- chr->get_msgfds = tcp_get_msgfds;
- chr->set_msgfds = tcp_set_msgfds;
- chr->chr_add_client = tcp_chr_add_client;
- chr->chr_add_watch = tcp_chr_add_watch;
- chr->chr_update_read_handler = tcp_chr_update_read_handler;
- /* be isn't opened until we get a connection */
- chr->explicit_be_open = true;
-
if (is_listen) {
s->listen_fd = fd;
s->listen_chan = io_channel_from_socket(s->listen_fd);
- s->listen_tag = g_io_add_watch(s->listen_chan, G_IO_IN, tcp_chr_accept, chr);
- if (is_telnet) {
- s->do_telnetopt = 1;
- }
+ s->listen_tag = g_io_add_watch(s->listen_chan, G_IO_IN,
+ tcp_chr_accept, chr);
} else {
s->connected = 1;
s->fd = fd;
@@ -2972,13 +2943,26 @@ static CharDriverState *qemu_chr_open_socket_fd(int fd, bool do_nodelay,
tcp_chr_connect(chr);
}
- if (is_listen && is_waitconnect) {
- fprintf(stderr, "QEMU waiting for connection on: %s\n",
- chr->filename);
- tcp_chr_accept(s->listen_chan, G_IO_IN, chr);
- qemu_set_nonblock(s->listen_fd);
+ return true;
+}
+
+static bool qemu_chr_open_socket_fd(CharDriverState *chr, SocketAddress *addr,
+ bool is_listen, bool is_telnet,
+ Error **errp)
+{
+ int fd;
+
+ if (is_listen) {
+ fd = socket_listen(addr, errp);
+ } else {
+ fd = socket_connect(addr, errp, NULL, NULL);
}
- return chr;
+ if (fd < 0) {
+ return false;
+ }
+
+ return qemu_chr_finish_socket_connection(chr, fd, is_listen, is_telnet,
+ errp);
}
/*********************************************************/
@@ -3969,23 +3953,57 @@ static CharDriverState *qmp_chardev_open_parallel(ChardevHostdev *parallel,
static CharDriverState *qmp_chardev_open_socket(ChardevSocket *sock,
Error **errp)
{
+ CharDriverState *chr;
+ TCPCharDriver *s;
SocketAddress *addr = sock->addr;
bool do_nodelay = sock->has_nodelay ? sock->nodelay : false;
bool is_listen = sock->has_server ? sock->server : true;
bool is_telnet = sock->has_telnet ? sock->telnet : false;
bool is_waitconnect = sock->has_wait ? sock->wait : false;
- int fd;
+
+ chr = qemu_chr_alloc();
+ s = g_malloc0(sizeof(TCPCharDriver));
+
+ s->fd = -1;
+ s->listen_fd = -1;
+ s->is_unix = addr->kind == SOCKET_ADDRESS_KIND_UNIX;
+ s->do_nodelay = do_nodelay;
+
+ chr->opaque = s;
+ chr->chr_write = tcp_chr_write;
+ chr->chr_sync_read = tcp_chr_sync_read;
+ chr->chr_close = tcp_chr_close;
+ chr->get_msgfds = tcp_get_msgfds;
+ chr->set_msgfds = tcp_set_msgfds;
+ chr->chr_add_client = tcp_chr_add_client;
+ chr->chr_add_watch = tcp_chr_add_watch;
+ chr->chr_update_read_handler = tcp_chr_update_read_handler;
+ /* be isn't opened until we get a connection */
+ chr->explicit_be_open = true;
+
+ chr->filename = g_malloc(CHR_MAX_FILENAME_SIZE);
if (is_listen) {
- fd = socket_listen(addr, errp);
- } else {
- fd = socket_connect(addr, errp, NULL, NULL);
+ if (is_telnet) {
+ s->do_telnetopt = 1;
+ }
}
- if (fd < 0) {
+
+ if (!qemu_chr_open_socket_fd(chr, addr, is_listen, is_telnet, errp)) {
+ g_free(s);
+ g_free(chr->filename);
+ g_free(chr);
return NULL;
}
- return qemu_chr_open_socket_fd(fd, do_nodelay, is_listen,
- is_telnet, is_waitconnect, errp);
+
+ if (is_listen && is_waitconnect) {
+ fprintf(stderr, "QEMU waiting for connection on: %s\n",
+ chr->filename);
+ tcp_chr_accept(s->listen_chan, G_IO_IN, chr);
+ qemu_set_nonblock(s->listen_fd);
+ }
+
+ return chr;
}
static CharDriverState *qmp_chardev_open_udp(ChardevUdp *udp,
--
1.8.3.1
next prev parent reply other threads:[~2014-10-09 10:11 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-10-09 10:10 [Qemu-devel] [PULL 00/28] Changes for 2014-10-09 Paolo Bonzini
2014-10-09 10:10 ` [Qemu-devel] [PULL 01/28] qemu-char: Make the filename size for a chardev a #define Paolo Bonzini
2014-10-09 10:10 ` Paolo Bonzini [this message]
2014-10-09 10:10 ` [Qemu-devel] [PULL 03/28] qemu-char: Move some items into TCPCharDriver Paolo Bonzini
2014-10-09 10:10 ` [Qemu-devel] [PULL 04/28] qemu-char: set socket filename to disconnected when not connected Paolo Bonzini
2014-10-09 10:10 ` [Qemu-devel] [PULL 05/28] qemu-char: Add reconnecting to client sockets Paolo Bonzini
2014-10-09 10:10 ` [Qemu-devel] [PULL 06/28] qemu-char: Print the remote and local addresses for a socket Paolo Bonzini
2014-10-09 10:17 ` [Qemu-devel] [PULL 08/28] accel: Move accel code to accel.c Paolo Bonzini
2014-10-09 10:17 ` [Qemu-devel] [PULL 09/28] accel: Create AccelType typedef Paolo Bonzini
2014-10-09 10:17 ` [Qemu-devel] [PULL 10/28] accel: Simplify configure_accelerator() using AccelType *acc variable Paolo Bonzini
2014-10-09 10:17 ` [Qemu-devel] [PULL 11/28] accel: Move accel name lookup to separate function Paolo Bonzini
2014-10-09 10:17 ` [Qemu-devel] [PULL 12/28] accel: Use QOM classes for accel types Paolo Bonzini
2014-10-09 10:17 ` [Qemu-devel] [PULL 13/28] accel: Make AccelClass.available() optional Paolo Bonzini
2014-10-09 10:17 ` [Qemu-devel] [PULL 14/28] accel: Report unknown accelerator as "not found" instead of "does not exist" Paolo Bonzini
2014-10-09 10:17 ` [Qemu-devel] [PULL 15/28] accel: Move KVM accel registration to kvm-all.c Paolo Bonzini
2014-10-09 10:17 ` [Qemu-devel] [PULL 16/28] accel: Move Xen registration code to xen-common.c Paolo Bonzini
2014-10-09 10:17 ` [Qemu-devel] [PULL 17/28] accel: Move qtest accel registration to qtest.c Paolo Bonzini
2014-10-09 10:17 ` [Qemu-devel] [PULL 18/28] accel: Remove tcg_available() function Paolo Bonzini
2014-10-09 10:17 ` [Qemu-devel] [PULL 19/28] accel: Move accel init/allowed code to separate function Paolo Bonzini
2014-10-09 10:17 ` [Qemu-devel] [PULL 20/28] accel: Rename 'init' method to 'init_machine' Paolo Bonzini
2014-10-09 10:17 ` [Qemu-devel] [PULL 21/28] accel: Pass MachineState object to accel init functions Paolo Bonzini
2014-10-09 10:17 ` [Qemu-devel] [PULL 22/28] accel: Create accel object when initializing machine Paolo Bonzini
2014-10-09 10:17 ` [Qemu-devel] [PULL 23/28] kvm: Make KVMState be the TYPE_KVM_ACCEL instance struct Paolo Bonzini
2014-10-10 8:47 ` Cornelia Huck
2014-10-10 9:11 ` Cornelia Huck
2014-10-10 10:09 ` Paolo Bonzini
2014-10-10 10:12 ` Cornelia Huck
2014-10-10 9:19 ` Gonglei
2014-10-09 10:17 ` [Qemu-devel] [PULL 24/28] linuxboot: compute initrd loading address Paolo Bonzini
2014-10-09 10:17 ` [Qemu-devel] [PULL 25/28] virtio-scsi: fix use-after-free of VirtIOSCSIReq Paolo Bonzini
2014-10-09 10:17 ` [Qemu-devel] [PULL 26/28] qemu-error: Add error_vreport() Paolo Bonzini
2014-10-09 10:17 ` [Qemu-devel] [PULL 27/28] qemu-sockets: Add error to non-blocking connect handler Paolo Bonzini
2014-10-09 10:17 ` [Qemu-devel] [PULL 28/28] qemu-char: Fix reconnect socket error reporting Paolo Bonzini
2014-10-09 10:21 ` [Qemu-devel] [PULL 07/28] vl.c: Small coding style fix Paolo Bonzini
2014-10-09 10:55 ` [Qemu-devel] [PULL 00/28] Changes for 2014-10-09 Peter Maydell
2014-10-09 10:59 ` Paolo Bonzini
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=1412849438-12274-3-git-send-email-pbonzini@redhat.com \
--to=pbonzini@redhat.com \
--cc=cminyard@mvista.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).