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.
This commit is contained in:
Tiago Cunha 2010-10-09 14:29:32 +00:00
parent 7874b00d4c
commit b5349ab5d9
8 changed files with 47 additions and 13 deletions

View File

@ -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 <nicm@users.sourceforge.net>
@ -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 },

View File

@ -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 <nicm@users.sourceforge.net>
@ -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);

View File

@ -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 <nicm@users.sourceforge.net>
@ -184,6 +184,7 @@ server_client_lost(struct client *c)
c->flags |= CLIENT_DEAD;
recalculate_sizes();
server_check_unattached();
server_update_socket();
}

View File

@ -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 <nicm@users.sourceforge.net>
@ -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)
{

View File

@ -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 <nicm@users.sourceforge.net>
@ -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)

10
tmux.1
View File

@ -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 <nicm@users.sourceforge.net>
.\"
@ -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.

4
tmux.c
View File

@ -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 <nicm@users.sourceforge.net>
@ -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);

3
tmux.h
View File

@ -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 <nicm@users.sourceforge.net>
@ -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 *);