diff options
author | Nicholas Marriott <nicholas.marriott@gmail.com> | 2009-01-11 00:48:42 +0000 |
---|---|---|
committer | Nicholas Marriott <nicholas.marriott@gmail.com> | 2009-01-11 00:48:42 +0000 |
commit | e3feb067a503b53da253e4ed877d212d6d73842c (patch) | |
tree | f0ebedf15d81253ae1d0437b6dc9f47cbccdc291 /server-fn.c | |
parent | ee0a7cda880f01771470b2902839c5d6396057c3 (diff) | |
download | rtmux-e3feb067a503b53da253e4ed877d212d6d73842c.tar.gz rtmux-e3feb067a503b53da253e4ed877d212d6d73842c.tar.bz2 rtmux-e3feb067a503b53da253e4ed877d212d6d73842c.zip |
Server locking. set-password and lock-server commands, plus automatic locking.
Diffstat (limited to 'server-fn.c')
-rw-r--r-- | server-fn.c | 69 |
1 files changed, 66 insertions, 3 deletions
diff --git a/server-fn.c b/server-fn.c index fd158b9f..c24fc49a 100644 --- a/server-fn.c +++ b/server-fn.c @@ -1,4 +1,4 @@ -/* $Id: server-fn.c,v 1.52 2009-01-10 14:43:43 nicm Exp $ */ +/* $Id: server-fn.c,v 1.53 2009-01-11 00:48:42 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> @@ -24,6 +24,8 @@ #include "tmux.h" +int server_lock_callback(void *, const char *); + void server_set_client_message(struct client *c, const char *msg) { @@ -57,8 +59,8 @@ server_clear_client_message(struct client *c) } void -server_set_client_prompt( - struct client *c, const char *msg, void (*fn)(void *, char *), void *data) +server_set_client_prompt(struct client *c, + const char *msg, int (*fn)(void *, const char *), void *data, int hide) { c->prompt_string = xstrdup(msg); @@ -70,6 +72,8 @@ server_set_client_prompt( c->prompt_hindex = 0; + c->prompt_hidden = hide; + c->tty.flags |= (TTY_NOCURSOR|TTY_FREEZE); c->flags |= CLIENT_STATUS; } @@ -213,3 +217,62 @@ server_status_window(struct window *w) server_status_session(s); } } + +void +server_lock(void) +{ + struct client *c; + u_int i; + + if (server_locked) + return; + + for (i = 0; i < ARRAY_LENGTH(&clients); i++) { + c = ARRAY_ITEM(&clients, i); + if (c == NULL) + continue; + + server_clear_client_prompt(c); + server_set_client_prompt( + c, "Password: ", server_lock_callback, c, 1); + server_redraw_client(c); + } + server_locked = 1; +} + +int +server_lock_callback(unused void *data, const char *s) +{ + return (server_unlock(s)); +} + +int +server_unlock(const char *s) +{ + struct client *c; + u_int i; + char *out; + + if (!server_locked) + return (0); + + if (server_password != NULL) { + if (s == NULL) + return (-1); + out = crypt(s, server_password); + if (strcmp(out, server_password) != 0) + return (-1); + } + + for (i = 0; i < ARRAY_LENGTH(&clients); i++) { + c = ARRAY_ITEM(&clients, i); + if (c == NULL) + continue; + + server_clear_client_prompt(c); + server_redraw_client(c); + } + server_locked = 0; + + return (0); +} |