From: Paolo Bonzini <pbonzini@redhat.com>
To: qemu-devel@nongnu.org
Cc: Corey Minyard <cminyard@mvista.com>
Subject: [Qemu-devel] [PULL 04/28] qemu-char: set socket filename to disconnected when not connected
Date: Thu, 9 Oct 2014 12:10:14 +0200 [thread overview]
Message-ID: <1412849438-12274-5-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>
This way we can tell if the socket is connected or not. It also splits
the string conversions out into separate functions to make this more
convenient.
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 | 110 +++++++++++++++++++++++++++++++++++++++---------------------
1 file changed, 72 insertions(+), 38 deletions(-)
diff --git a/qemu-char.c b/qemu-char.c
index a671d6b..549ebd8 100644
--- a/qemu-char.c
+++ b/qemu-char.c
@@ -117,6 +117,60 @@ static void qapi_copy_SocketAddress(SocketAddress **p_dest,
qobject_decref(obj);
}
+static int SocketAddress_to_str(char *dest, int max_len,
+ const char *prefix, SocketAddress *addr,
+ bool is_listen, bool is_telnet)
+{
+ switch (addr->kind) {
+ case SOCKET_ADDRESS_KIND_INET:
+ return snprintf(dest, max_len, "%s%s:%s:%s%s", prefix,
+ is_telnet ? "telnet" : "tcp", addr->inet->host,
+ addr->inet->port, is_listen ? ",server" : "");
+ break;
+ case SOCKET_ADDRESS_KIND_UNIX:
+ return snprintf(dest, max_len, "%sunix:%s%s", prefix,
+ addr->q_unix->path, is_listen ? ",server" : "");
+ break;
+ case SOCKET_ADDRESS_KIND_FD:
+ return snprintf(dest, max_len, "%sfd:%s%s", prefix, addr->fd->str,
+ is_listen ? ",server" : "");
+ break;
+ default:
+ abort();
+ }
+}
+
+static int sockaddr_to_str(char *dest, int max_len,
+ struct sockaddr_storage *ss, socklen_t ss_len,
+ bool is_listen, bool is_telnet)
+{
+ char host[NI_MAXHOST], serv[NI_MAXSERV];
+ const char *left = "", *right = "";
+
+ switch (ss->ss_family) {
+#ifndef _WIN32
+ case AF_UNIX:
+ return snprintf(dest, max_len, "unix:%s%s",
+ ((struct sockaddr_un *)(ss))->sun_path,
+ is_listen ? ",server" : "");
+#endif
+ case AF_INET6:
+ left = "[";
+ right = "]";
+ /* fall through */
+ case AF_INET:
+ getnameinfo((struct sockaddr *) ss, ss_len, host, sizeof(host),
+ serv, sizeof(serv), NI_NUMERICHOST | NI_NUMERICSERV);
+ return snprintf(dest, max_len, "%s:%s%s%s:%s%s",
+ is_telnet ? "telnet" : "tcp",
+ left, host, right, serv,
+ is_listen ? ",server" : "");
+
+ default:
+ return snprintf(dest, max_len, "unknown");
+ }
+}
+
/***********************************************************/
/* character device */
@@ -2727,6 +2781,8 @@ static void tcp_chr_disconnect(CharDriverState *chr)
s->chan = NULL;
closesocket(s->fd);
s->fd = -1;
+ SocketAddress_to_str(chr->filename, CHR_MAX_FILENAME_SIZE,
+ "disconnected:", s->addr, s->is_listen, s->is_telnet);
qemu_chr_be_event(chr, CHR_EVENT_CLOSED);
}
@@ -2798,6 +2854,17 @@ static void tcp_chr_connect(void *opaque)
{
CharDriverState *chr = opaque;
TCPCharDriver *s = chr->opaque;
+ struct sockaddr_storage ss;
+ socklen_t ss_len = sizeof(ss);
+
+ memset(&ss, 0, ss_len);
+ if (getsockname(s->fd, (struct sockaddr *) &ss, &ss_len) != 0) {
+ snprintf(chr->filename, CHR_MAX_FILENAME_SIZE,
+ "Error in getsockname: %s\n", strerror(errno));
+ } else {
+ sockaddr_to_str(chr->filename, CHR_MAX_FILENAME_SIZE, &ss, ss_len,
+ s->is_listen, s->is_telnet);
+ }
s->connected = 1;
if (s->chan) {
@@ -2928,43 +2995,9 @@ static void tcp_chr_close(CharDriverState *chr)
qemu_chr_be_event(chr, CHR_EVENT_CLOSED);
}
-static bool qemu_chr_finish_socket_connection(CharDriverState *chr, int fd,
- Error **errp)
+static void qemu_chr_finish_socket_connection(CharDriverState *chr, int fd)
{
TCPCharDriver *s = chr->opaque;
- char host[NI_MAXHOST], serv[NI_MAXSERV];
- const char *left = "", *right = "";
- struct sockaddr_storage ss;
- socklen_t ss_len = sizeof(ss);
-
- memset(&ss, 0, ss_len);
- if (getsockname(fd, (struct sockaddr *) &ss, &ss_len) != 0) {
- closesocket(fd);
- error_setg_errno(errp, errno, "getsockname");
- return false;
- }
-
- switch (ss.ss_family) {
-#ifndef _WIN32
- case AF_UNIX:
- snprintf(chr->filename, CHR_MAX_FILENAME_SIZE, "unix:%s%s",
- ((struct sockaddr_un *)(&ss))->sun_path,
- s->is_listen ? ",server" : "");
- break;
-#endif
- case AF_INET6:
- left = "[";
- right = "]";
- /* fall through */
- case AF_INET:
- 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",
- s->is_telnet ? "telnet" : "tcp",
- left, host, right, serv,
- s->is_listen ? ",server" : "");
- break;
- }
if (s->is_listen) {
s->listen_fd = fd;
@@ -2978,8 +3011,6 @@ static bool qemu_chr_finish_socket_connection(CharDriverState *chr, int fd,
s->chan = io_channel_from_socket(s->fd);
tcp_chr_connect(chr);
}
-
- return true;
}
static bool qemu_chr_open_socket_fd(CharDriverState *chr, Error **errp)
@@ -2996,7 +3027,8 @@ static bool qemu_chr_open_socket_fd(CharDriverState *chr, Error **errp)
return false;
}
- return qemu_chr_finish_socket_connection(chr, fd, errp);
+ qemu_chr_finish_socket_connection(chr, fd);
+ return true;
}
/*********************************************************/
@@ -4019,6 +4051,8 @@ static CharDriverState *qmp_chardev_open_socket(ChardevSocket *sock,
chr->explicit_be_open = true;
chr->filename = g_malloc(CHR_MAX_FILENAME_SIZE);
+ SocketAddress_to_str(chr->filename, CHR_MAX_FILENAME_SIZE, "disconnected:",
+ addr, is_listen, is_telnet);
if (is_listen) {
if (is_telnet) {
--
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 ` [Qemu-devel] [PULL 02/28] qemu-char: Rework qemu_chr_open_socket() for reconnect Paolo Bonzini
2014-10-09 10:10 ` [Qemu-devel] [PULL 03/28] qemu-char: Move some items into TCPCharDriver Paolo Bonzini
2014-10-09 10:10 ` Paolo Bonzini [this message]
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-5-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).