=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/session.c,v retrieving revision 1.51 retrieving revision 1.52 diff -c -r1.51 -r1.52 *** src/usr.bin/tmux/session.c 2015/08/28 13:01:03 1.51 --- src/usr.bin/tmux/session.c 2015/08/28 13:12:20 1.52 *************** *** 1,4 **** ! /* $OpenBSD: session.c,v 1.51 2015/08/28 13:01:03 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott --- 1,4 ---- ! /* $OpenBSD: session.c,v 1.52 2015/08/28 13:12:20 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott *************** *** 33,38 **** --- 33,40 ---- void session_free(int, short, void *); + void session_lock_timer(int, short, void *); + struct winlink *session_next_alert(struct winlink *); struct winlink *session_previous_alert(struct winlink *); *************** *** 108,114 **** struct session *s; struct winlink *wl; ! s = xmalloc(sizeof *s); s->references = 1; s->flags = 0; --- 110,116 ---- struct session *s; struct winlink *wl; ! s = xcalloc(1, sizeof *s); s->references = 1; s->flags = 0; *************** *** 149,154 **** --- 151,160 ---- } RB_INSERT(sessions, &sessions, s); + if (gettimeofday(&s->creation_time, NULL) != 0) + fatal("gettimeofday failed"); + session_update_activity(s, &s->creation_time); + if (argc >= 0) { wl = session_new(s, NULL, argc, argv, path, cwd, idx, cause); if (wl == NULL) { *************** *** 200,205 **** --- 206,214 ---- free(s->tio); + if (event_initialized(&s->lock_timer)) + event_del(&s->lock_timer); + session_group_remove(s); environ_free(&s->environ); options_free(&s->options); *************** *** 224,240 **** --- 233,278 ---- return (*name != '\0' && name[strcspn(name, ":.")] == '\0'); } + /* Lock session if it has timed out. */ + void + session_lock_timer(unused int fd, unused short events, void *arg) + { + struct session *s = arg; + + if (s->flags & SESSION_UNATTACHED) + return; + + log_debug("session %s locked, activity time %lld", s->name, + (long long)s->activity_time.tv_sec); + + server_lock_session(s); + recalculate_sizes(); + } + /* Update activity time. */ void session_update_activity(struct session *s, struct timeval *from) { struct timeval *last = &s->last_activity_time; + struct timeval tv; memcpy(last, &s->activity_time, sizeof *last); if (from == NULL) gettimeofday(&s->activity_time, NULL); else memcpy(&s->activity_time, from, sizeof s->activity_time); + + if (evtimer_initialized(&s->lock_timer)) + evtimer_del(&s->lock_timer); + else + evtimer_set(&s->lock_timer, session_lock_timer, s); + + if (~s->flags & SESSION_UNATTACHED) { + timerclear(&tv); + tv.tv_sec = options_get_number(&s->options, "lock-after-time"); + if (tv.tv_sec != 0) + evtimer_add(&s->lock_timer, &tv); + } } /* Find the next usable session. */