[Qemu-devel] [PATCH 0/3]
cover [Qemu-devel] [PATCH 0/3]
From: Sameeh Jubran <[email protected]>
This series fixes qemu-ga's behaviour upon facing a missing serial/serial driver by listening to the serial device's events.
For more info on why this series is needed checkout the commit message
of the third patch and the following bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=990629.
Sameeh Jubran (3):
qga: Channel: Add functions for checking serial status
qga: main: make qga config and socket activation global
qga: Prevent qemu-ga exit if serial doesn't exist
Makefile | 4 + qga/channel-posix.c | 54 ++++++++++ qga/channel-win32.c | 60 +++++++++++ qga/channel.h | 9 ++ qga/main.c | 284 ++++++++++++++++++++++++++++++++++++++++++++++------ qga/service-win32.h | 4 + 6 files changed, 385 insertions(+), 30 deletions(-)
Signature · 1 line
2.9.4
PATCH 1/3 qga: Channel: Add functions for checking serial status
From: Sameeh Jubran <[email protected]>
This commit adds functions to check if the serial is connected/disconnected or else if it has been attached or detached.
--- qga/channel-posix.c | 54 +++++++++++++++++++++++++++++++++++++++++++++++ qga/channel-win32.c | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++++ qga/channel.h | 9 ++++++++ 3 files changed, 123 insertions(+)
qga/channel-posix.c +54 -0
@@ -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 ; +}
qga/channel-win32.c +60 -0
63 lines not on this page · raw message
qga/channel.h +9 -0
@@ -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
Signature · 1 line
2.9.4
PATCH 2/3 qga: main: make qga config and socket activation global
In reply to Sameeh JubranFrom: Sameeh Jubran <[email protected]>
--- qga/main.c | 44 +++++++++++++++++++++++--------------------- 1 file changed, 23 insertions(+), 21 deletions(-)
qga/main.c +23 -21
@@ -92,7 +92,28 @@ struct GAState {GAPersistentState pstate; }; +typedef struct GAConfig { +char *channel_path; +char *method; +char *log_filepath; +char *pid_filepath; +#ifdef CONFIG_FSFREEZE +char *fsfreeze_hook; +#endif +char *state_dir; +#ifdef _WIN32 +const char *service; +#endif +gchar *bliststr;/* blacklist may point to this string */ +GList *blacklist; +int daemonize; +GLogLevelFlags log_level; +int dumpconf; +}GAConfig ; +struct GAState *ga_state; +struct GAConfig *ga_config; +int ga_socket_activation;QmpCommandList ga_commands;/* commands that are safe to issue while filesystems are frozen */
@@ -942,25 +963,6 @@ static GList *split_list(const gchar *str, const gchar *delim)return list; } -typedef struct GAConfig { -char *channel_path; -char *method; -char *log_filepath; -char *pid_filepath; -#ifdef CONFIG_FSFREEZE -char *fsfreeze_hook; -#endif -char *state_dir; -#ifdef _WIN32 -const char *service; -#endif -gchar *bliststr;/* blacklist may point to this string */ -GList *blacklist; -int daemonize; -GLogLevelFlags log_level; -int dumpconf; -}GAConfig ; -static void config_load (GAConfig *config) {GError *gerr =NULL ;
@@ -1353,7 +1355,7 @@ int main(int argc, char **argv) {int ret =EXIT_SUCCESS ;GAState *s =g_new0 (GAState,1 ); -GAConfig *config =g_new0 (GAConfig,1 ); +GAConfig *config = ga_config =g_new0 (GAConfig,1 );int socket_activation; config->log_level =G_LOG_LEVEL_ERROR |G_LOG_LEVEL_CRITICAL ;
@@ -1376,7 +1378,7 @@ int main(int argc, char **argv) config->method =g_strdup ("virtio-serial" ); } - socket_activation =check_socket_activation (); + ga_socket_activation = socket_activation =check_socket_activation ();if (socket_activation >1 ) {g_critical ("qemu-ga only supports listening on one socket" ); ret =EXIT_FAILURE ;
Signature · 1 line
2.9.4
PATCH 3/3 qga: Prevent qemu-ga exit if serial doesn't exist
In reply to Sameeh JubranFrom: Sameeh Jubran <[email protected]>
Currently whenever the qemu-ga's service doesn't find the virtio-serial it terminates. This commit addresses this issue by listening to the serial events by registering for notifications for the chosen serial and it handles channel initialization accordingily.
A list of possible scenarios of which could lead to this behavour:
* qemu-ga's service is started while the virtio-serial driver hasn't been installed yet
* hotplug/ unplug of the virtio-serial device
* upgrading the virtio-serial driver
Note: This problem is much more common on Windows as the virtio-serial driver should be installed by the user and isn't shipped with the Windows OS.
--- Makefile | 4 + qga/main.c | 240 ++++++++++++++++++++++++++++++++++++++++++++++++++-- qga/service-win32.h | 4 + 3 files changed, 239 insertions(+), 9 deletions(-)
Makefile +4 -0
@@ -203,6 +203,10 @@ $(call set-vpath, $(SRC_PATH)) LIBS+=-lz $(LIBS_TOOLS) +ifndef CONFIG_WIN32 +LIBS_QGA+=-ludev +endif + HELPERS-$(CONFIG_LINUX) = qemu-bridge-helper$(EXESUF) ifdef BUILD_DOCS
qga/main.c +231 -9
330 lines not on this page · raw message
qga/service-win32.h +4 -0
@@ -20,9 +20,13 @@#define QGA_SERVICE_NAME "qemu-ga"#define QGA_SERVICE_DESCRIPTION "Enables integration with QEMU machine emulator and virtualizer." +static const GUID GUID_VIOSERIAL_PORT = {0x6fde7521 ,0x1b65 ,0x48ae , +{0xb6 ,0x28 ,0x80 ,0xbe ,0x62 ,0x1 ,0x60 ,0x26 } }; +typedef struct GAService {SERVICE_STATUS status;SERVICE_STATUS_HANDLE status_handle; +HDEVNOTIFY device_notification_handle; }GAService ; int ga_install_service(const char *path, const char *logfile,
Signature · 1 line
2.9.4
Ping.
Quoted 27 lines · Sameeh Jubran
From: Sameeh Jubran <[email protected]>
This series fixes qemu-ga's behaviour upon facing a missing serial/serial driver by listening to the serial device's events.
For more info on why this series is needed checkout the commit message of the third patch and the following bugzilla:
https://bugzilla.redhat.com/show_bug.cgi?id=990629.Sameeh Jubran (3):
qga: Channel: Add functions for checking serial status
qga: main: make qga config and socket activation global
qga: Prevent qemu-ga exit if serial doesn't existMakefile | 4 + qga/channel-posix.c | 54 ++++++++++ qga/channel-win32.c | 60 +++++++++++ qga/channel.h | 9 ++ qga/main.c | 284 ++++++++++++++++++++++++++++++ ++++++++++++++++------ qga/service-win32.h | 4 + 6 files changed, 385 insertions(+), 30 deletions(-)--
2.9.4
Signature · 4 lines
Respectfully, *Sameeh Jubran* *Linkedin <https://il.linkedin.com/pub/sameeh-jubran/87/747/a8a>* *Software Engineer @ Daynix <http://www.daynix.com>.*
Ping.
Quoted 39 lines · Sameeh Jubran
Ping.
Quoted 23 lines · Sameeh Jubran
From: Sameeh Jubran <[email protected]>
This series fixes qemu-ga's behaviour upon facing a missing serial/serial driver by listening to the serial device's events.
For more info on why this series is needed checkout the commit message of the third patch and the following bugzilla:
https://bugzilla.redhat.com/show_bug.cgi?id=990629.Sameeh Jubran (3):
qga: Channel: Add functions for checking serial status
qga: main: make qga config and socket activation global
qga: Prevent qemu-ga exit if serial doesn't existMakefile | 4 + qga/channel-posix.c | 54 ++++++++++ qga/channel-win32.c | 60 +++++++++++ qga/channel.h | 9 ++ qga/main.c | 284 ++++++++++++++++++++++++++++++ ++++++++++++++++------ qga/service-win32.h | 4 + 6 files changed, 385 insertions(+), 30 deletions(-)Quoted 4 lines
--
2.9.4--
Respectfully,
*Sameeh Jubran*
*Linkedin <https://il.linkedin.com/pub/sameeh-jubran/87/747/a8a>*
*Software Engineer @ Daynix <http://www.daynix.com>.*
Signature · 4 lines
Respectfully, *Sameeh Jubran* *Linkedin <https://il.linkedin.com/pub/sameeh-jubran/87/747/a8a>* *Software Engineer @ Daynix <http://www.daynix.com>.*
Pong.
Quoted 52 lines · Sameeh Jubran
Ping.
Quoted 33 lines · Sameeh Jubran
Ping.
Quoted 23 lines · Sameeh Jubran
From: Sameeh Jubran <[email protected]>
This series fixes qemu-ga's behaviour upon facing a missing serial/serial driver by listening to the serial device's events.
For more info on why this series is needed checkout the commit message of the third patch and the following bugzilla:
https://bugzilla.redhat.com/show_bug.cgi?id=990629.Sameeh Jubran (3):
qga: Channel: Add functions for checking serial status
qga: main: make qga config and socket activation global
qga: Prevent qemu-ga exit if serial doesn't existMakefile | 4 + qga/channel-posix.c | 54 ++++++++++ qga/channel-win32.c | 60 +++++++++++ qga/channel.h | 9 ++ qga/main.c | 284 ++++++++++++++++++++++++++++++ ++++++++++++++++------ qga/service-win32.h | 4 + 6 files changed, 385 insertions(+), 30 deletions(-)Quoted 4 lines
--
2.9.4Quoted 6 lines
--
Respectfully,
*Sameeh Jubran*
*Linkedin <https://il.linkedin.com/pub/sameeh-jubran/87/747/a8a>*
*Software Engineer @ Daynix <http://www.daynix.com>.*--
Respectfully,
*Sameeh Jubran*
*Linkedin <https://il.linkedin.com/pub/sameeh-jubran/87/747/a8a>*
*Software Engineer @ Daynix <http://www.daynix.com>.*
Signature · 4 lines
Respectfully, *Sameeh Jubran* *Linkedin <https://il.linkedin.com/pub/sameeh-jubran/87/747/a8a>* *Software Engineer @ Daynix <http://www.daynix.com>.*
Quoting Sameeh Jubran (2017-08-13 10:58:46)
Quoted 5 lines
From: Sameeh Jubran <[email protected]>
This series fixes qemu-ga's behaviour upon facing a missing serial/serial driver by listening to the serial device's events.
Quoted 7 lines
For more info on why this series is needed checkout the commit message
of the third patch and the following bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=990629.Sameeh Jubran (3):
qga: Channel: Add functions for checking serial status
qga: main: make qga config and socket activation global
qga: Prevent qemu-ga exit if serial doesn't exist
Hi Sameeh,
The event handling stuff is spiffy and could be useful for other use-cases (e.g. cpu/mem hotplug events that can be consumed by management), but since the actual bug here is somewhat of an edge case (we *could* just tell people that installing the agent before virtio-serial drivers is a bug, or that unplugging the agent's communication channel is a bad idea), I'm not too comfortable with adding this much complexity unless there's a stronger argument for it.
There's also a couple issues I had with this series as it stands, namely the lack of a ./configure check for udev (which could cause build breakage in some environments), and a lot of spillage of GAConfig into qga/channel-*, which I think could be avoided.
I've sent an alternative series that I think we should consider as it uses a much simpler mechanism to implement this support (basically just periodically retrying the channel if it doesn't exist, or if it disappears for whatever reason). I've tested it on Windows, but would be good to confirm that it adequately addresses the use-case you were looking at. Thanks!
Quoted 12 lines
Makefile | 4 + qga/channel-posix.c | 54 ++++++++++ qga/channel-win32.c | 60 +++++++++++ qga/channel.h | 9 ++ qga/main.c | 284 ++++++++++++++++++++++++++++++++++++++++++++++------ qga/service-win32.h | 4 + 6 files changed, 385 insertions(+), 30 deletions(-)Signature · 1 line
2.9.4
Quoted 17 lines · Michael Roth
Quoting Sameeh Jubran (2017-08-13 10:58:46)
Quoted 7 lines
From: Sameeh Jubran <[email protected]>
This series fixes qemu-ga's behaviour upon facing a missing serial/serial driver by listening to the serial device's events.
For more info on why this series is needed checkout the commit message of the third patch and the following bugzilla:
https://bugzilla.redhat.com/show_bug.cgi?id=990629.
Quoted 5 lines
Sameeh Jubran (3):
qga: Channel: Add functions for checking serial status
qga: main: make qga config and socket activation global
qga: Prevent qemu-ga exit if serial doesn't existHi Sameeh,
Quoted 8 lines
The event handling stuff is spiffy and could be useful for other use-cases (e.g. cpu/mem hotplug events that can be consumed by management), but since the actual bug here is somewhat of an edge case (we *could* just tell people that installing the agent before virtio-serial drivers is a bug, or that unplugging the agent's communication channel is a bad idea), I'm not too comfortable with adding this much complexity unless there's a stronger argument for it.
I can relate to your concerns, it is somehow an edge case but I think that this
is the elegant way to handle it instead of just polling forever. This patch series
is more related to Windows than Linux as this edge case is much more common on Windows since when the virtio-serial driver is installed sometimes usually
it requires a post-installation reboot and when the system is up, qemu-ga runs before
the virtio-serial driver is fully configured and it fails to load and then another reboot is needed.
Quoted 6 lines
There's also a couple issues I had with this series as it stands, namely the lack of a ./configure check for udev (which could cause build breakage in some environments), and a lot of spillage of GAConfig into qga/channel-*, which I think could be avoided.
I think we can use the --retry with linux clients and use the device notifications
API provided by Windows as it is supported since xp.
Quoted 8 lines
I've sent an alternative series that I think we should consider as it uses a much simpler mechanism to implement this support (basically just periodically retrying the channel if it doesn't exist, or if it disappears for whatever reason). I've tested it on Windows, but would be good to confirm that it adequately addresses the use-case you were looking at. Thanks!
I haven't tested it yet, but I think it might solve the issue. Your series is much
simpler and less intrusive to the code but I don't think this is the right approach.
Quoted 16 lines
Quoted 7 lines
Makefile | 4 + qga/channel-posix.c | 54 ++++++++++ qga/channel-win32.c | 60 +++++++++++ qga/channel.h | 9 ++ qga/main.c | 284 ++++++++++++++++++++++++++++++++++++++++++++++------
Quoted 6 lines
qga/service-win32.h | 4 + 6 files changed, 385 insertions(+), 30 deletions(-)--
2.9.4
Signature · 4 lines
Respectfully, *Sameeh Jubran* *Linkedin <https://il.linkedin.com/pub/sameeh-jubran/87/747/a8a>* *Software Engineer @ Daynix <http://www.daynix.com>.*
Ping.
Quoted 92 lines · Sameeh Jubran
Quoted 18 lines · Michael Roth
Quoting Sameeh Jubran (2017-08-13 10:58:46)
Quoted 3 lines
From: Sameeh Jubran <[email protected]>
This series fixes qemu-ga's behaviour upon facing a missing
serial/serial
Quoted 4 lines
driver by listening to the serial device's events.
For more info on why this series is needed checkout the commit message of the third patch and the following bugzilla:
https://bugzilla.redhat.com/show_bug.cgi?id=990629.
Quoted 5 lines
Sameeh Jubran (3):
qga: Channel: Add functions for checking serial status
qga: main: make qga config and socket activation global
qga: Prevent qemu-ga exit if serial doesn't existHi Sameeh,
Quoted 9 lines
The event handling stuff is spiffy and could be useful for other use-cases (e.g. cpu/mem hotplug events that can be consumed by management), but since
the actual bug here is somewhat of an edge case (we *could* just tell people that installing the agent before virtio-serial drivers is a bug, or that unplugging the agent's communication channel is a bad idea), I'm not too comfortable with adding this much complexity unless there's a stronger argument for it.I can relate to your concerns, it is somehow an edge case but I think that this
is the elegant way to handle it instead of just polling forever. This patch series
is more related to Windows than Linux as this edge case is much more common on Windows since when the virtio-serial driver is installed sometimes usually
it requires a post-installation reboot and when the system is up, qemu-ga runs before
the virtio-serial driver is fully configured and it fails to load and then another reboot is needed.Quoted 6 lines
There's also a couple issues I had with this series as it stands, namely the lack of a ./configure check for udev (which could cause build breakage in some environments), and a lot of spillage of GAConfig into qga/channel-*, which I think could be avoided.
I think we can use the --retry with linux clients and use the device notifications
API provided by Windows as it is supported since xp.Quoted 8 lines
I've sent an alternative series that I think we should consider as it uses a much simpler mechanism to implement this support (basically just periodically retrying the channel if it doesn't exist, or if it disappears for whatever reason). I've tested it on Windows, but would be good to confirm that it adequately addresses the use-case you were looking at. Thanks!
I haven't tested it yet, but I think it might solve the issue. Your series is much
simpler and less intrusive to the code but I don't think this is the right approach.Quoted 16 lines
Quoted 7 lines
Makefile | 4 + qga/channel-posix.c | 54 ++++++++++ qga/channel-win32.c | 60 +++++++++++ qga/channel.h | 9 ++ qga/main.c | 284 ++++++++++++++++++++++++++++++++++++++++++++++------
Quoted 6 lines
qga/service-win32.h | 4 + 6 files changed, 385 insertions(+), 30 deletions(-)--
2.9.4--
Respectfully,
*Sameeh Jubran*
*Linkedin <https://il.linkedin.com/pub/sameeh-jubran/87/747/a8a>*
*Software Engineer @ Daynix <http://www.daynix.com>.*
Signature · 4 lines
Respectfully, *Sameeh Jubran* *Linkedin <https://il.linkedin.com/pub/sameeh-jubran/87/747/a8a>* *Software Engineer @ Daynix <http://www.daynix.com>.*
Quoting Sameeh Jubran (2018-01-22 08:24:29)
Quoted 1 line
Ping.
I think I would still prefer the alternative series I sent. Your approach may be more correct/elegant but the asynchronous event-handling nature of it makes it inherently more different to debug than the boring synchronous loop in my series. There's also more work needed to get this in shape and I honestly don't think it's worth the extra effort it will take.
But if you feel strongly enough about it I wouldn't be opposed to a hybrid of the 2 approaches that basically boils down to the following:
1) Base your code on top of my full series here:
https://lists.gnu.org/archive/html/qemu-devel/2017-10/msg06157.html
2) Drop the udev side of your code and only implement the win32 side of your code.
3) Modify your handle_serial_device_events() logic to not actually manage closing/opening the Channel, but to simply set a global flag, e.g. ga_state->channel_path_available appropriately based on DBT_DEVICEARRIVAL/DBT_DEVICEREMOVECOMPLETE. And since it's a win32-only optimization make sure it's just set to true permanently for !win32.
Then use that flag as an optimization to the retry loop in run_agent() that was introduced in patch 4 of my series:
static int run_agent(GAState *s)
{
int ret = EXIT_SUCCESS; s->force_exit = false;
do {
ret = run_agent_once(s);
if (s->config->retry_path && !s->force_exit) {
g_warning("agent stopped unexpectedly, restarting...");
sleep(QGA_RETRY_INTERVAL);
}
} while (s->config->retry_path && !s->force_exit);
return ret;}
by having your code changes introduce something like this:
static int run_agent(GAState *s)
{
int ret = EXIT_SUCCESS; s->force_exit = false;
do {
ret = run_agent_once(s);
if (s->config->retry_path && !s->force_exit) {
g_warning("agent stopped unexpectedly, restarting...");
while (!ga_state->channel_path_available) {
g_warning("waiting for channel path...");
sleep(QGA_RETRY_INTERVAL);
}
}
} while (s->config->retry_path && !s->force_exit);
return ret;}
It's still a loop but at least it's not trial-and-error based. If you want to get fancy with it though you can use something based around WaitForSingleObject or SetEvent to avoid gratuitous looping.
I think that would be much easier to make sense of, and it also lets us handle this for POSIX without necessarily commiting to udev event loops (though it also leaves that option open if we really wanted to).
It should also allow you to drop all your changes to the Channel code since it's based around the changes I made to have Channel implementations exit cleanly if their underlying device dies.
Quoted 107 lines · Sameeh Jubran
On Fri, Oct 27, 2017 at 2:51 AM, Michael Roth <[email protected]> wrote:
Quoting Sameeh Jubran (2017-08-13 10:58:46)
> From: Sameeh Jubran <[email protected]>
>
> This series fixes qemu-ga's behaviour upon facing a missing serial/ serial
> driver by listening to the serial device's events.
>
> For more info on why this series is needed checkout the commit message
> of the third patch and the following bugzilla: https://
bugzilla.redhat.com/show_bug.cgi?id=990629.
>
> Sameeh Jubran (3):
> qga: Channel: Add functions for checking serial status > qga: main: make qga config and socket activation global > qga: Prevent qemu-ga exit if serial doesn't existHi Sameeh,
The event handling stuff is spiffy and could be useful for other use-cases
(e.g. cpu/mem hotplug events that can be consumed by management), but since
the actual bug here is somewhat of an edge case (we *could* just tell people that installing the agent before virtio-serial drivers is a bug, or that unplugging the agent's communication channel is a bad idea), I'm not too comfortable with adding this much complexity unless there's a stronger argument for it.I can relate to your concerns, it is somehow an edge case but I think that this
is the elegant way to handle it instead of just polling forever. This patch series
is more related to Windows than Linux as this edge case is much more common on Windows since when the virtio-serial driver is installed sometimes usually
it requires a post-installation reboot and when the system is up, qemu-ga runs before
the virtio-serial driver is fully configured and it fails to load and then another reboot is needed.There's also a couple issues I had with this series as it stands, namely
the lack of a ./configure check for udev (which could cause build breakage in some environments), and a lot of spillage of GAConfig into qga/channel-*, which I think could be avoided.I think we can use the --retry with linux clients and use the device notifications
API provided by Windows as it is supported since xp.I've sent an alternative series that I think we should consider as it uses a much simpler mechanism to implement this support (basically just periodically retrying the channel if it doesn't exist, or if it disappears for whatever reason). I've tested it on Windows, but would be good to confirm that it adequately addresses the use-case you were looking at. Thanks!
I haven't tested it yet, but I think it might solve the issue. Your series is much
simpler and less intrusive to the code but I don't think this is the right approach.>
> Makefile | 4 +
>qga/channel-posix.c| 54 ++++++++++
>qga/channel-win32.c| 60 +++++++++++
> qga/channel.h | 9 ++
> qga/main.c | 284 ++++++++++++++++++++++++++++++
++++++++++++++++------
>qga/service-win32.h| 4 +
> 6 files changed, 385 insertions(+), 30 deletions(-) >
> --
> 2.9.4
>--
Respectfully,
Sameeh Jubran
Software Engineer @ Daynix.--
Respectfully,
Sameeh Jubran
Software Engineer @ Daynix.