version 1.51, 2015/08/28 13:01:03 |
version 1.52, 2015/08/28 13:12:20 |
|
|
|
|
void session_free(int, short, void *); |
void session_free(int, short, void *); |
|
|
|
void session_lock_timer(int, short, void *); |
|
|
struct winlink *session_next_alert(struct winlink *); |
struct winlink *session_next_alert(struct winlink *); |
struct winlink *session_previous_alert(struct winlink *); |
struct winlink *session_previous_alert(struct winlink *); |
|
|
|
|
struct session *s; |
struct session *s; |
struct winlink *wl; |
struct winlink *wl; |
|
|
s = xmalloc(sizeof *s); |
s = xcalloc(1, sizeof *s); |
s->references = 1; |
s->references = 1; |
s->flags = 0; |
s->flags = 0; |
|
|
|
|
} |
} |
RB_INSERT(sessions, &sessions, s); |
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) { |
if (argc >= 0) { |
wl = session_new(s, NULL, argc, argv, path, cwd, idx, cause); |
wl = session_new(s, NULL, argc, argv, path, cwd, idx, cause); |
if (wl == NULL) { |
if (wl == NULL) { |
|
|
|
|
free(s->tio); |
free(s->tio); |
|
|
|
if (event_initialized(&s->lock_timer)) |
|
event_del(&s->lock_timer); |
|
|
session_group_remove(s); |
session_group_remove(s); |
environ_free(&s->environ); |
environ_free(&s->environ); |
options_free(&s->options); |
options_free(&s->options); |
|
|
return (*name != '\0' && name[strcspn(name, ":.")] == '\0'); |
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. */ |
/* Update activity time. */ |
void |
void |
session_update_activity(struct session *s, struct timeval *from) |
session_update_activity(struct session *s, struct timeval *from) |
{ |
{ |
struct timeval *last = &s->last_activity_time; |
struct timeval *last = &s->last_activity_time; |
|
struct timeval tv; |
|
|
memcpy(last, &s->activity_time, sizeof *last); |
memcpy(last, &s->activity_time, sizeof *last); |
if (from == NULL) |
if (from == NULL) |
gettimeofday(&s->activity_time, NULL); |
gettimeofday(&s->activity_time, NULL); |
else |
else |
memcpy(&s->activity_time, from, sizeof s->activity_time); |
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. */ |
/* Find the next usable session. */ |