From b5349ab5d94569e63b8446352f243e0cd9617030 Mon Sep 17 00:00:00 2001 From: Tiago Cunha Date: Sat, 9 Oct 2010 14:29:32 +0000 Subject: [PATCH] Sync OpenBSD patchset 766: Two new options: - server option "exit-unattached" makes the server exit when no clients are attached, even if sessions are present; - session option "destroy-unattached" destroys a session once no clients are attached to it. These are useful for preventing tmux remaining in the background where it is undesirable and when using tmux as a login shell to keep a limit on new sessions. --- cmd-set-option.c | 4 +++- cmd-switch-client.c | 3 ++- server-client.c | 3 ++- server-fn.c | 21 ++++++++++++++++++++- server.c | 12 +++++++----- tmux.1 | 10 ++++++++-- tmux.c | 4 +++- tmux.h | 3 ++- 8 files changed, 47 insertions(+), 13 deletions(-) diff --git a/cmd-set-option.c b/cmd-set-option.c index ebf6c8a8..25000165 100644 --- a/cmd-set-option.c +++ b/cmd-set-option.c @@ -1,4 +1,4 @@ -/* $Id: cmd-set-option.c,v 1.99 2010-09-07 13:20:28 tcunha Exp $ */ +/* $Id: cmd-set-option.c,v 1.100 2010-10-09 14:29:32 tcunha Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -75,6 +75,7 @@ const char *set_option_bell_action_list[] = { const struct set_option_entry set_option_table[] = { { "escape-time", SET_OPTION_NUMBER, 0, INT_MAX, NULL }, + { "exit-unattached", SET_OPTION_FLAG, 0, 0, NULL }, { "quiet", SET_OPTION_FLAG, 0, 0, NULL }, { NULL, 0, 0, 0, NULL } }; @@ -87,6 +88,7 @@ const struct set_option_entry set_session_option_table[] = { { "default-path", SET_OPTION_STRING, 0, 0, NULL }, { "default-shell", SET_OPTION_STRING, 0, 0, NULL }, { "default-terminal", SET_OPTION_STRING, 0, 0, NULL }, + { "destroy-unattached", SET_OPTION_FLAG, 0, 0, NULL }, { "detach-on-destroy", SET_OPTION_FLAG, 0, 0, NULL }, { "display-panes-colour", SET_OPTION_COLOUR, 0, 0, NULL }, { "display-panes-active-colour", SET_OPTION_COLOUR, 0, 0, NULL }, diff --git a/cmd-switch-client.c b/cmd-switch-client.c index ac1eef62..3fb8fc87 100644 --- a/cmd-switch-client.c +++ b/cmd-switch-client.c @@ -1,4 +1,4 @@ -/* $Id: cmd-switch-client.c,v 1.20 2010-09-10 13:36:17 tcunha Exp $ */ +/* $Id: cmd-switch-client.c,v 1.21 2010-10-09 14:29:32 tcunha Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -152,6 +152,7 @@ cmd_switch_client_exec(struct cmd *self, struct cmd_ctx *ctx) c->session = s; recalculate_sizes(); + server_check_unattached(); server_redraw_client(c); return (0); diff --git a/server-client.c b/server-client.c index 91bb9b9d..27367972 100644 --- a/server-client.c +++ b/server-client.c @@ -1,4 +1,4 @@ -/* $Id: server-client.c,v 1.41 2010-09-07 13:19:53 tcunha Exp $ */ +/* $Id: server-client.c,v 1.42 2010-10-09 14:29:32 tcunha Exp $ */ /* * Copyright (c) 2009 Nicholas Marriott @@ -184,6 +184,7 @@ server_client_lost(struct client *c) c->flags |= CLIENT_DEAD; recalculate_sizes(); + server_check_unattached(); server_update_socket(); } diff --git a/server-fn.c b/server-fn.c index 5865c332..ffdaa934 100644 --- a/server-fn.c +++ b/server-fn.c @@ -1,4 +1,4 @@ -/* $Id: server-fn.c,v 1.110 2010-08-11 22:16:43 tcunha Exp $ */ +/* $Id: server-fn.c,v 1.111 2010-10-09 14:29:32 tcunha Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -404,6 +404,25 @@ server_destroy_session(struct session *s) recalculate_sizes(); } +void +server_check_unattached (void) +{ + struct session *s; + u_int i; + + /* + * If any sessions are no longer attached and have destroy-unattached + * set, collect them. + */ + for (i = 0; i < ARRAY_LENGTH(&sessions); i++) { + s = ARRAY_ITEM(&sessions, i); + if (s == NULL || !(s->flags & SESSION_UNATTACHED)) + continue; + if (options_get_number (&s->options, "destroy-unattached")) + session_destroy(s); + } +} + void server_set_identify(struct client *c) { diff --git a/server.c b/server.c index 2cee2f29..c1d11e99 100644 --- a/server.c +++ b/server.c @@ -1,4 +1,4 @@ -/* $Id: server.c,v 1.244 2010-10-09 14:26:29 tcunha Exp $ */ +/* $Id: server.c,v 1.245 2010-10-09 14:29:32 tcunha Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -226,15 +226,17 @@ server_loop(void) } } -/* Check if the server should be shutting down (no more clients or windows). */ +/* Check if the server should be shutting down (no more clients or sessions). */ int server_should_shutdown(void) { u_int i; - for (i = 0; i < ARRAY_LENGTH(&sessions); i++) { - if (ARRAY_ITEM(&sessions, i) != NULL) - return (0); + if (!options_get_number(&global_options, "exit-unattached")) { + for (i = 0; i < ARRAY_LENGTH(&sessions); i++) { + if (ARRAY_ITEM(&sessions, i) != NULL) + return (0); + } } for (i = 0; i < ARRAY_LENGTH(&clients); i++) { if (ARRAY_ITEM(&clients, i) != NULL) diff --git a/tmux.1 b/tmux.1 index 498a01f0..4adb7529 100644 --- a/tmux.1 +++ b/tmux.1 @@ -1,4 +1,4 @@ -.\" $Id: tmux.1,v 1.266 2010-10-09 14:25:40 tcunha Exp $ +.\" $Id: tmux.1,v 1.267 2010-10-09 14:29:32 tcunha Exp $ .\" .\" Copyright (c) 2007 Nicholas Marriott .\" @@ -14,7 +14,7 @@ .\" IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING .\" OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" -.Dd $Mdocdate: September 25 2010 $ +.Dd $Mdocdate: September 26 2010 $ .Dt TMUX 1 .Os .Sh NAME @@ -1587,6 +1587,9 @@ Set the time in milliseconds for which waits after an escape is input to determine if it is part of a function or meta key sequences. The default is 500 milliseconds. +.It Ic exit-unattached +If enabled, the server will exit when there are no attached clients, rather +than when there are no attached sessions. .It Ic quiet Enable or disable the display of various informational messages (see also the .Fl q @@ -1659,6 +1662,9 @@ to work correctly, this be set to .Ql screen or a derivative of it. +.It Ic destroy-unattached +If enabled and the session is no longer attached to any clients, it is +destroyed. .It Ic detach-on-destroy If on (the default), the client is detached when the session it is attached to is destroyed. diff --git a/tmux.c b/tmux.c index 412e913e..2e44d0f4 100644 --- a/tmux.c +++ b/tmux.c @@ -1,4 +1,4 @@ -/* $Id: tmux.c,v 1.215 2010-08-29 14:42:11 tcunha Exp $ */ +/* $Id: tmux.c,v 1.216 2010-10-09 14:29:32 tcunha Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -334,6 +334,7 @@ main(int argc, char **argv) oo = &global_options; options_set_number(oo, "quiet", quiet); options_set_number(oo, "escape-time", 500); + options_set_number(oo, "exit-unattached", 0); options_init(&global_s_options, NULL); so = &global_s_options; @@ -344,6 +345,7 @@ main(int argc, char **argv) options_set_string(so, "default-path", "%s", ""); options_set_string(so, "default-shell", "%s", getshell()); options_set_string(so, "default-terminal", "screen"); + options_set_number(so, "destroy-unattached", 0); options_set_number(so, "detach-on-destroy", 1); options_set_number(so, "display-panes-active-colour", 1); options_set_number(so, "display-panes-colour", 4); diff --git a/tmux.h b/tmux.h index 951617e6..8662cb6d 100644 --- a/tmux.h +++ b/tmux.h @@ -1,4 +1,4 @@ -/* $Id: tmux.h,v 1.577 2010-09-18 15:43:53 tcunha Exp $ */ +/* $Id: tmux.h,v 1.578 2010-10-09 14:29:32 tcunha Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -1659,6 +1659,7 @@ void server_unlink_window(struct session *, struct winlink *); void server_destroy_pane(struct window_pane *); void server_destroy_session_group(struct session *); void server_destroy_session(struct session *); +void server_check_unattached (void); void server_set_identify(struct client *); void server_clear_identify(struct client *); void server_update_event(struct client *);