summaryrefslogtreecommitdiffstats
path: root/usr.bin/tmux/server.c
diff options
context:
space:
mode:
authornicm <nicm@openbsd.org>2009-10-10 09:46:11 +0000
committernicm <nicm@openbsd.org>2009-10-10 09:46:11 +0000
commitbe5c3bab5b05c6bc5de3ff980df60dcbabfe96f5 (patch)
treeacb172671d6b09d76963b6c8af06c6a8dd44b0f2 /usr.bin/tmux/server.c
parentInstead of passing a struct pollfd ** around through various functions, build (diff)
downloadwireguard-openbsd-be5c3bab5b05c6bc5de3ff980df60dcbabfe96f5.tar.xz
wireguard-openbsd-be5c3bab5b05c6bc5de3ff980df60dcbabfe96f5.zip
Support for individual session idle time locking. May be enabled by turning off
the lock-server option (it is on by default). When this is off, each session locks when it has been idle for the lock-after-time setting. When on, the entire server locks when ALL sessions have been idle for their individual lock-after-time settings. This replaces one global-only option (lock-after-time) with another (lock-server), but the default behaviour is usually preferable so there don't seem to be many alternatives. Diff/idea largely from Thomas Adam, tweaked by me.
Diffstat (limited to 'usr.bin/tmux/server.c')
-rw-r--r--usr.bin/tmux/server.c68
1 files changed, 54 insertions, 14 deletions
diff --git a/usr.bin/tmux/server.c b/usr.bin/tmux/server.c
index 50a1b7d2343..88e4f3d0dc1 100644
--- a/usr.bin/tmux/server.c
+++ b/usr.bin/tmux/server.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: server.c,v 1.45 2009/10/10 09:31:39 nicm Exp $ */
+/* $OpenBSD: server.c,v 1.46 2009/10/10 09:46:11 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -86,6 +86,8 @@ void server_check_window(struct window *);
void server_check_redraw(struct client *);
void server_set_title(struct client *);
void server_check_timers(struct client *);
+void server_lock_server(void);
+void server_lock_sessions(void);
void server_second_timers(void);
int server_update_socket(void);
@@ -249,8 +251,6 @@ server_start(char *path)
key_bindings_init();
utf8_build();
- server_activity = time(NULL);
-
start_time = time(NULL);
socket_path = path;
@@ -842,10 +842,10 @@ server_handle_client(struct client *c)
/* Process keys. */
keylist = options_get_data(&c->session->options, "prefix");
while (tty_keys_next(&c->tty, &key, mouse) == 0) {
- server_activity = time(NULL);
-
if (c->session == NULL)
return;
+
+ c->session->activity = time(NULL);
w = c->session->curw->window;
wp = w->active; /* could die */
@@ -1254,6 +1254,51 @@ server_check_window(struct window *w)
recalculate_sizes();
}
+/* Lock the server if ALL sessions have hit the time limit. */
+void
+server_lock_server(void)
+{
+ struct session *s;
+ u_int i;
+ int timeout;
+ time_t t;
+
+ t = time(NULL);
+ for (i = 0; i < ARRAY_LENGTH(&sessions); i++) {
+ if ((s = ARRAY_ITEM(&sessions, i)) == NULL)
+ continue;
+
+ timeout = options_get_number(&s->options, "lock-after-time");
+ if (timeout <= 0 || t <= s->activity + timeout)
+ return; /* not timed out */
+ }
+
+ server_lock();
+ recalculate_sizes();
+}
+
+/* Lock any sessions which have timed out. */
+void
+server_lock_sessions(void)
+{
+ struct session *s;
+ u_int i;
+ int timeout;
+ time_t t;
+
+ t = time(NULL);
+ for (i = 0; i < ARRAY_LENGTH(&sessions); i++) {
+ if ((s = ARRAY_ITEM(&sessions, i)) == NULL)
+ continue;
+
+ timeout = options_get_number(&s->options, "lock-after-time");
+ if (timeout > 0 && t > s->activity + timeout) {
+ server_lock_session(s);
+ recalculate_sizes();
+ }
+ }
+}
+
/* Call any once-per-second timers. */
void
server_second_timers(void)
@@ -1261,16 +1306,11 @@ server_second_timers(void)
struct window *w;
struct window_pane *wp;
u_int i;
- int xtimeout;
- time_t t;
-
- t = time(NULL);
- xtimeout = options_get_number(&global_s_options, "lock-after-time");
- if (xtimeout > 0 && t > server_activity + xtimeout) {
- server_lock();
- recalculate_sizes();
- }
+ if (options_get_number(&global_s_options, "lock-server"))
+ server_lock_server();
+ else
+ server_lock_sessions();
for (i = 0; i < ARRAY_LENGTH(&windows); i++) {
w = ARRAY_ITEM(&windows, i);