diff --git a/proc.c b/proc.c index fc2ff2da..729ffa15 100644 --- a/proc.c +++ b/proc.c @@ -225,6 +225,12 @@ proc_loop(struct tmuxproc *tp, int (*loopcb)(void)) do event_loop(EVLOOP_ONCE); while (!tp->exit && (loopcb == NULL || !loopcb ())); + +#ifdef TMATE_SLAVE + /* flush data on sockets */ + event_loop(EVLOOP_ONCE | EVLOOP_NONBLOCK); +#endif + log_debug("%s loop exit", tp->name); } diff --git a/tmate-daemon-decoder.c b/tmate-daemon-decoder.c index 66d988f5..4f3ae723 100644 --- a/tmate-daemon-decoder.c +++ b/tmate-daemon-decoder.c @@ -368,6 +368,18 @@ static void tmate_fin(__unused struct tmate_session *session, request_server_termination(); } +static void tmate_reconnect(__unused struct tmate_session *session, + __unused struct tmate_unpacker *uk) +{ + /* Used by the proxy */ +} + +static void tmate_snapshot(__unused struct tmate_session *session, + __unused struct tmate_unpacker *uk) +{ + /* TODO copy info back */ +} + void tmate_dispatch_daemon_message(struct tmate_session *session, struct tmate_unpacker *uk) { @@ -384,6 +396,8 @@ void tmate_dispatch_daemon_message(struct tmate_session *session, dispatch(TMATE_OUT_WRITE_COPY_MODE, tmate_write_copy_mode); dispatch(TMATE_OUT_FIN, tmate_fin); dispatch(TMATE_OUT_READY, tmate_ready); + dispatch(TMATE_OUT_RECONNECT, tmate_reconnect); + dispatch(TMATE_OUT_SNAPSHOT, tmate_snapshot); default: tmate_fatal("Bad message type: %d", cmd); } } diff --git a/tmate-protocol.h b/tmate-protocol.h index 969696d2..f7ad149a 100644 --- a/tmate-protocol.h +++ b/tmate-protocol.h @@ -33,6 +33,7 @@ enum tmate_control_in_msg_types { TMATE_CTL_PANE_KEYS, TMATE_CTL_RESIZE, TMATE_CTL_EXEC_RESPONSE, + TMATE_CTL_RENAME_SESSION, }; /* @@ -41,6 +42,7 @@ enum tmate_control_in_msg_types { [TMATE_CTL_PANE_KEYS, int: pane_id, string: keys] [TMATE_CTL_RESIZE, int: sx, int: sy] // sx == -1: no clients [TMATE_CTL_EXEC_RESPONSE, int: exit_code, string: message] +[TMATE_CTL_RENAME_SESSION, string: stoken, string: stoken_ro] */ enum tmate_daemon_out_msg_types { @@ -54,6 +56,8 @@ enum tmate_daemon_out_msg_types { TMATE_OUT_WRITE_COPY_MODE, TMATE_OUT_FIN, TMATE_OUT_READY, + TMATE_OUT_RECONNECT, + TMATE_OUT_SNAPSHOT, }; /* diff --git a/tmate-proxy.c b/tmate-proxy.c index 1033bd97..c3e45768 100644 --- a/tmate-proxy.c +++ b/tmate-proxy.c @@ -158,6 +158,18 @@ static void ctl_ssh_exec_response(struct tmate_session *session, free(message); } +static void ctl_rename_session(struct tmate_session *session, + struct tmate_unpacker *uk) +{ + char *stoken = unpack_string(uk); + char *stoken_ro = unpack_string(uk); + + set_session_token(session, stoken); + + free(stoken); + free(stoken_ro); +} + static void tmate_dispatch_proxy_message(struct tmate_session *session, struct tmate_unpacker *uk) { @@ -169,6 +181,7 @@ static void tmate_dispatch_proxy_message(struct tmate_session *session, dispatch(TMATE_CTL_PANE_KEYS, ctl_pane_keys); dispatch(TMATE_CTL_RESIZE, ctl_resize); dispatch(TMATE_CTL_EXEC_RESPONSE, ctl_ssh_exec_response); + dispatch(TMATE_CTL_RENAME_SESSION, ctl_rename_session); default: tmate_warn("Bad proxy message type: %d", cmd); } } diff --git a/tmate-slave.c b/tmate-slave.c index 48291939..15c346a9 100644 --- a/tmate-slave.c +++ b/tmate-slave.c @@ -215,8 +215,8 @@ static char *get_random_token(void) return token; } -static void set_session_token(struct tmate_session *session, - const char *token) +void set_session_token(struct tmate_session *session, + const char *token) { char *path; session->session_token = xstrdup(token); diff --git a/tmate-ssh-server.c b/tmate-ssh-server.c index 1d3782c3..b3d821ef 100644 --- a/tmate-ssh-server.c +++ b/tmate-ssh-server.c @@ -116,7 +116,6 @@ static int auth_pubkey_cb(__unused ssh_session session, switch (signature_state) { case SSH_PUBLICKEY_STATE_VALID: client->username = xstrdup(user); - if (ssh_pki_export_pubkey_base64(pubkey, &client->pubkey) != SSH_OK) tmate_fatal("error getting public key"); return SSH_AUTH_SUCCESS; diff --git a/tmate.h b/tmate.h index 693d9cad..0c0394af 100644 --- a/tmate.h +++ b/tmate.h @@ -251,6 +251,7 @@ extern void tmate_get_random_bytes(void *buffer, ssize_t len); extern long tmate_get_random_long(void); extern void request_server_termination(void); extern void tmate_spawn_slave(struct tmate_session *session); +extern void set_session_token(struct tmate_session *session, const char *token); /* tmate-proxy.c */