From: Sameeh Jubran <sameeh@daynix.com>
To: qemu-devel@nongnu.org, mdroth@linux.vnet.ibm.com
Cc: yan@daynix.com
Subject: [Qemu-devel] [PATCH 1/3] qga: Channel: Add functions for checking serial status
Date: Sun, 13 Aug 2017 18:58:47 +0300 [thread overview]
Message-ID: <20170813155849.11368-2-sameeh@daynix.com> (raw)
In-Reply-To: <20170813155849.11368-1-sameeh@daynix.com>
From: Sameeh Jubran <sjubran@redhat.com>
This commit adds functions to check if the serial is
connected/disconnected or else if it has been attached or detached.
Signed-off-by: Sameeh Jubran <sjubran@redhat.com>
---
qga/channel-posix.c | 54 +++++++++++++++++++++++++++++++++++++++++++++++
qga/channel-win32.c | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++++
qga/channel.h | 9 ++++++++
3 files changed, 123 insertions(+)
diff --git a/qga/channel-posix.c b/qga/channel-posix.c
index 3f34465..d307cf4 100644
--- a/qga/channel-posix.c
+++ b/qga/channel-posix.c
@@ -295,3 +295,57 @@ void ga_channel_free(GAChannel *c)
}
g_free(c);
}
+
+static bool is_serial_present(GAChannelMethod method, const gchar *path,
+ int *error_code)
+{
+ int fd = -1;
+ bool ret = true;
+
+ assert(error_code);
+ *error_code = 0;
+
+ switch (method) {
+ case GA_CHANNEL_VIRTIO_SERIAL:
+ fd = qemu_open(path, O_RDWR | O_NONBLOCK
+#ifndef CONFIG_SOLARIS
+ | O_ASYNC
+#endif
+ );
+ break;
+ case GA_CHANNEL_ISA_SERIAL:
+ fd = qemu_open(path, O_RDWR | O_NOCTTY | O_NONBLOCK);
+ break;
+ default:
+ ret = false;
+ }
+ if (fd < 0) {
+ *error_code = errno;
+ ret = false;
+ } else {
+ close(fd);
+ }
+ return ret;
+}
+
+bool ga_channel_serial_is_present(GAChannelMethod method, const gchar *path)
+{
+ int error_code = 0;
+ return is_serial_present(method, path, &error_code) ||
+ error_code == EBUSY;
+}
+
+bool ga_channel_was_serial_attached(GAChannelMethod method, const gchar *path,
+ bool is_serial_attached)
+{
+ int error_code = 0;
+ return !is_serial_attached &&
+ is_serial_present(method, path, &error_code);
+}
+bool ga_channel_was_serial_detached(GAChannelMethod method, const gchar *path,
+ bool is_serial_attached)
+{
+ int error_code = 0;
+ return is_serial_attached && !is_serial_present(method, path, &error_code)
+ && error_code == ENOENT;
+}
diff --git a/qga/channel-win32.c b/qga/channel-win32.c
index 7e6dc4d..2d51bee 100644
--- a/qga/channel-win32.c
+++ b/qga/channel-win32.c
@@ -354,3 +354,63 @@ void ga_channel_free(GAChannel *c)
g_free(c->rstate.buf);
g_free(c);
}
+
+static bool is_serial_present(GAChannelMethod method, const gchar *path,
+ DWORD *err)
+{
+ gchar newpath[MAXPATHLEN] = { 0 };
+ bool ret = false;
+
+ assert(err);
+
+ if (method != GA_CHANNEL_VIRTIO_SERIAL && method != GA_CHANNEL_ISA_SERIAL) {
+ g_critical("unsupported communication method");
+ return false;
+ }
+
+ if (method == GA_CHANNEL_ISA_SERIAL) {
+ snprintf(newpath, sizeof(newpath), "\\\\.\\%s", path);
+ } else {
+ g_strlcpy(newpath, path, sizeof(newpath));
+ }
+
+ HANDLE handle = CreateFile(newpath, GENERIC_READ | GENERIC_WRITE, 0, NULL,
+ OPEN_EXISTING,
+ FILE_FLAG_NO_BUFFERING | FILE_FLAG_OVERLAPPED, NULL);
+
+ if (handle == INVALID_HANDLE_VALUE) {
+ *err = GetLastError();
+ ret = false;
+ } else {
+ ret = true;
+ }
+
+ CloseHandle(handle);
+ return ret;
+}
+
+bool ga_channel_serial_is_present(GAChannelMethod method, const gchar *path)
+{
+ DWORD err_code;
+ return is_serial_present(method, path, &err_code) ||
+ err_code == ERROR_ACCESS_DENIED;
+}
+
+bool ga_channel_was_serial_attached(GAChannelMethod method, const gchar *path,
+ bool is_serial_attached)
+{
+ DWORD err_code;
+ return !is_serial_attached && is_serial_present(method, path, &err_code);
+}
+
+bool ga_channel_was_serial_detached(GAChannelMethod method, const gchar *path,
+ bool is_serial_attached)
+{
+ DWORD err_code = NO_ERROR;
+ /* In order to make sure the serial that qemu-ga uses is the one that
+ * was detached. We'll get the error ERROR_FILE_NOT_FOUND when
+ * attempting to call CreateFile with the serial path.
+ */
+ return is_serial_attached && !is_serial_present(method, path, &err_code)
+ && err_code == ERROR_FILE_NOT_FOUND;
+}
diff --git a/qga/channel.h b/qga/channel.h
index 1778416..acb3d73 100644
--- a/qga/channel.h
+++ b/qga/channel.h
@@ -12,6 +12,10 @@
#ifndef QGA_CHANNEL_H
#define QGA_CHANNEL_H
+#ifndef _WIN32
+#define SUBSYSTEM_VIRTIO_SERIAL "virtio-ports";
+#define SUBSYSTEM_ISA_SERIAL "isa-serial";
+#endif
typedef struct GAChannel GAChannel;
@@ -30,5 +34,10 @@ GAChannel *ga_channel_new(GAChannelMethod method, const gchar *path,
void ga_channel_free(GAChannel *c);
GIOStatus ga_channel_read(GAChannel *c, gchar *buf, gsize size, gsize *count);
GIOStatus ga_channel_write_all(GAChannel *c, const gchar *buf, gsize size);
+bool ga_channel_serial_is_present(GAChannelMethod method, const gchar *path);
+bool ga_channel_was_serial_attached(GAChannelMethod method, const gchar *path,
+ bool is_serial_attached);
+bool ga_channel_was_serial_detached(GAChannelMethod method, const gchar *path,
+ bool is_serial_attached);
#endif
--
2.9.4
next prev parent reply other threads:[~2017-08-13 15:59 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-08-13 15:58 [Qemu-devel] [PATCH 0/3] Sameeh Jubran
2017-08-13 15:58 ` Sameeh Jubran [this message]
2017-08-13 15:58 ` [Qemu-devel] [PATCH 2/3] qga: main: make qga config and socket activation global Sameeh Jubran
2017-08-13 15:58 ` [Qemu-devel] [PATCH 3/3] qga: Prevent qemu-ga exit if serial doesn't exist Sameeh Jubran
2017-08-22 11:18 ` [Qemu-devel] [PATCH 0/3] Sameeh Jubran
2017-09-04 13:48 ` Sameeh Jubran
2017-10-02 13:02 ` Sameeh Jubran
2017-10-26 23:51 ` Michael Roth
2017-10-27 8:08 ` Sameeh Jubran
2018-01-22 14:24 ` Sameeh Jubran
2018-01-25 23:49 ` Michael Roth
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=20170813155849.11368-2-sameeh@daynix.com \
--to=sameeh@daynix.com \
--cc=mdroth@linux.vnet.ibm.com \
--cc=qemu-devel@nongnu.org \
--cc=yan@daynix.com \
/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).