Re: Help on terminate on disconnect feature needed

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 08/12/2012 05:10 PM, Alon Levy wrote:
> On Fri, Aug 10, 2012 at 03:57:05PM -0500, Jeremy White wrote:
>> I've got a need for an Xspice feature whereby the whole X server dies on
>> client disconnect.  Basically, we want the Xspice session to live
>> exactly once, and then die.
> 
> You are talking about the spice client?

Yes, right.  Having a spice server have exactly one client and
committing sepaku from grief if it's client vanishes :-/.

> 
>>
>> As I puzzle through the code, I don't have the feeling that there is an
>> obvious place to inject that logic.  I mean, I can shove an abort()
>> pretty much anywhere.  But I'd like to do it gracefully.
> 
> Look at server/red_channel.c; there is a per channel on_disconnect
> callback, you can add a parameter to it. Also, why abort, exit sounds
> like what you want.

Yes, definitely exit.  Would a patch like this make sense?

Cheers,

Jeremy
diff --git a/server/reds.c b/server/reds.c
index e3ea154..fab6114 100644
--- a/server/reds.c
+++ b/server/reds.c
@@ -118,6 +118,7 @@ void *red_tunnel = NULL;
 #endif
 int agent_mouse = TRUE;
 int agent_copypaste = TRUE;
+static bool exit_on_disconnect = FALSE;
 
 #define MIGRATE_TIMEOUT (1000 * 10) /* 10sec */
 #define MM_TIMER_GRANULARITY_MS (1000 / 30)
@@ -630,6 +631,12 @@ void reds_client_disconnect(RedClient *client)
 {
     RedsMigTargetClient *mig_client;
 
+    if (exit_on_disconnect)
+    {
+        spice_info("Exiting server because of client disconnect.\n");
+        exit(0);
+    }
+
     if (!client || client->disconnecting) {
         return;
     }
@@ -3570,6 +3577,13 @@ SPICE_GNUC_VISIBLE int spice_server_set_listen_socket_fd(SpiceServer *s, int lis
     return 0;
 }
 
+SPICE_GNUC_VISIBLE int spice_server_set_exit_on_disconnect(SpiceServer *s, int flag)
+{
+    spice_assert(reds == s);
+    exit_on_disconnect = !!flag;
+    return 0;
+}
+
 SPICE_GNUC_VISIBLE int spice_server_set_noauth(SpiceServer *s)
 {
     spice_assert(reds == s);
diff --git a/server/spice.h b/server/spice.h
index 3d70ec7..30f4a8d 100644
--- a/server/spice.h
+++ b/server/spice.h
@@ -425,6 +425,7 @@ int spice_server_set_compat_version(SpiceServer *s,
 int spice_server_set_port(SpiceServer *s, int port);
 void spice_server_set_addr(SpiceServer *s, const char *addr, int flags);
 int spice_server_set_listen_socket_fd(SpiceServer *s, int listen_fd);
+int spice_server_set_exit_on_disconnect(SpiceServer *s, int flag);
 int spice_server_set_noauth(SpiceServer *s);
 int spice_server_set_sasl(SpiceServer *s, int enabled);
 int spice_server_set_sasl_appname(SpiceServer *s, const char *appname);
_______________________________________________
Spice-devel mailing list
Spice-devel@xxxxxxxxxxxxxxxxxxxxx
http://lists.freedesktop.org/mailman/listinfo/spice-devel

[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux]     [Linux OMAP]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]     [Monitors]