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