=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/server-fn.c,v retrieving revision 1.22 retrieving revision 1.23 diff -u -r1.22 -r1.23 --- src/usr.bin/tmux/server-fn.c 2009/09/23 06:18:47 1.22 +++ src/usr.bin/tmux/server-fn.c 2009/09/24 14:17:09 1.23 @@ -1,4 +1,4 @@ -/* $OpenBSD: server-fn.c,v 1.22 2009/09/23 06:18:47 nicm Exp $ */ +/* $OpenBSD: server-fn.c,v 1.23 2009/09/24 14:17:09 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -157,10 +157,8 @@ void server_lock(void) { - struct client *c; - const char *cmd; - struct msg_lock_data lockdata; - u_int i; + struct client *c; + u_int i; for (i = 0; i < ARRAY_LENGTH(&clients); i++) { c = ARRAY_ITEM(&clients, i); @@ -168,19 +166,44 @@ continue; if (c->flags & CLIENT_SUSPENDED) continue; + server_lock_client(c); + } +} - cmd = options_get_string(&c->session->options, "lock-command"); - if (strlcpy(lockdata.cmd, - cmd, sizeof lockdata.cmd) >= sizeof lockdata.cmd) +void +server_lock_session(struct session *s) +{ + struct client *c; + u_int i; + + for (i = 0; i < ARRAY_LENGTH(&clients); i++) { + c = ARRAY_ITEM(&clients, i); + if (c == NULL || c->session == NULL || c->session != s) continue; + if (c->flags & CLIENT_SUSPENDED) + continue; + server_lock_client(c); + } +} - tty_stop_tty(&c->tty); - tty_raw(&c->tty, tty_term_string(c->tty.term, TTYC_SMCUP)); - tty_raw(&c->tty, tty_term_string(c->tty.term, TTYC_CLEAR)); +void +server_lock_client(struct client *c) +{ + const char *cmd; + size_t cmdlen; + struct msg_lock_data lockdata; - c->flags |= CLIENT_SUSPENDED; - server_write_client(c, MSG_LOCK, &lockdata, sizeof lockdata); - } + cmd = options_get_string(&c->session->options, "lock-command"); + cmdlen = strlcpy(lockdata.cmd, cmd, sizeof lockdata.cmd); + if (cmdlen >= sizeof lockdata.cmd) + return; + + tty_stop_tty(&c->tty); + tty_raw(&c->tty, tty_term_string(c->tty.term, TTYC_SMCUP)); + tty_raw(&c->tty, tty_term_string(c->tty.term, TTYC_CLEAR)); + + c->flags |= CLIENT_SUSPENDED; + server_write_client(c, MSG_LOCK, &lockdata, sizeof lockdata); } void