Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Leap:15.2:Update
virt-viewer
a724dff8-remote-viewer-add-handler-for-SIGINT-s...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File a724dff8-remote-viewer-add-handler-for-SIGINT-signal.patch of Package virt-viewer
Subject: remote-viewer: add handler for SIGINT signal From: Francesco Giudici fgiudici@redhat.com Fri Jan 17 16:06:13 2020 +0100 Date: Fri Jan 17 16:37:52 2020 +0000: Git: a724dff8a3ba6d5e8d3baf79b0041b1b73bd190d When remote-viewer is started from terminal, CTRL-C sends a SIGINT signal to the program causing immediate termination. On linux clients usb redirected devices are left without any kernel driver attached, causing them to appear as no more available to the host. Add a SIGINT handler to allow a clean exit, in particular to allow the kernel to attach back the host driver. The issue is present on linux only. To perform usb device redirection, virt-viewer leverages spice-gtk library, which in turn relies on usbredir library, which uses libusb. In order to take control of the usb device the auto-loaded kernel driver must be detached. This is achieved (in the very end) with libusb_detach_kernel_driver(). Then the device interfaces can be claimed with libusb_claim_interface() and get in control to the application. During normal application termination, the usb channel is teared down, performing a reset of the usb device and giving back the control of the device to the kernel (libusb_attach_kernel_driver()). If the application quits without doing this, the device interfaces will end up with no driver attached, making them not usable in the host system. Note that enabling libusb_set_auto_detach_kernel_driver() does not solve the issue, as this is just a convenient API from libusb: libusb will take care of detaching/attaching the driver to the interfaces of the usb device each time a call to libusb_release_interface() and libusb_claim_interface() is performed. An unexpected quit of the application will skip the libusb_release_interface() call too, leaving the interfaces without any driver attached. Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=1713311 Reviewed-by: Daniel P. Berrangé <berrange@redhat.com> Signed-off-by: Francesco Giudici <fgiudici@redhat.com> Index: virt-viewer-8.0/src/virt-viewer-app.c =================================================================== --- virt-viewer-8.0.orig/src/virt-viewer-app.c +++ virt-viewer-8.0/src/virt-viewer-app.c @@ -37,6 +37,10 @@ #include <glib/gi18n.h> #include <errno.h> +#ifndef G_OS_WIN32 +#include <glib-unix.h> +#endif + #ifdef HAVE_SYS_SOCKET_H #include <sys/socket.h> #endif @@ -1737,6 +1741,23 @@ static gboolean opt_fullscreen = FALSE; static gboolean opt_kiosk = FALSE; static gboolean opt_kiosk_quit = FALSE; +#ifndef G_OS_WIN32 +static gboolean +sigint_cb(gpointer data) +{ + VirtViewerApp *self = VIRT_VIEWER_APP(data); + VirtViewerAppPrivate *priv = self->priv; + + g_debug("got SIGINT, quitting\n"); + if (priv->started) + virt_viewer_app_quit(self); + else + exit(EXIT_SUCCESS); + + return G_SOURCE_CONTINUE; +} +#endif + static void title_maybe_changed(VirtViewerApp *self, GParamSpec* pspec G_GNUC_UNUSED, gpointer user_data G_GNUC_UNUSED) { @@ -1751,6 +1772,10 @@ virt_viewer_app_init(VirtViewerApp *self gtk_window_set_default_icon_name("virt-viewer"); +#ifndef G_OS_WIN32 + g_unix_signal_add (SIGINT, sigint_cb, self); +#endif + self->priv->displays = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, g_object_unref); self->priv->config = g_key_file_new(); self->priv->config_file = g_build_filename(g_get_user_config_dir(),
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor