From b203e3f9b950f06f99470af8fd5bc12f04393245 Mon Sep 17 00:00:00 2001 From: Nicolas Viennot Date: Sat, 19 Sep 2015 22:29:43 -0400 Subject: [PATCH] dispatch message from master --- tmate-daemon-decoder.c | 3 +-- tmate-daemon-encoder.c | 5 +++++ tmate-master.c | 19 +++++++++++++++++++ tmate-msgpack.c | 16 ++++++++-------- tmate-protocol.h | 6 +++++- tmate-ssh-daemon.c | 9 +++++---- tmate.h | 7 ++++++- 7 files changed, 49 insertions(+), 16 deletions(-) diff --git a/tmate-daemon-decoder.c b/tmate-daemon-decoder.c index f372fc01..bfa25764 100644 --- a/tmate-daemon-decoder.c +++ b/tmate-daemon-decoder.c @@ -359,10 +359,9 @@ static void tmate_write_copy_mode(struct tmate_session *session, void tmate_dispatch_daemon_message(struct tmate_session *session, struct tmate_unpacker *uk) { -#define dispatch(c, f) case c: f(session, uk); break - int cmd = unpack_int(uk); switch (cmd) { +#define dispatch(c, f) case c: f(session, uk); break dispatch(TMATE_OUT_HEADER, tmate_header); dispatch(TMATE_OUT_SYNC_LAYOUT, tmate_sync_layout); dispatch(TMATE_OUT_PTY_DATA, tmate_pty_data); diff --git a/tmate-daemon-encoder.c b/tmate-daemon-encoder.c index 56c9bb94..9f0dab61 100644 --- a/tmate-daemon-encoder.c +++ b/tmate-daemon-encoder.c @@ -172,3 +172,8 @@ void tmate_client_set_active_pane(int client_id, int win_idx, int pane_id) sprintf(cmd, "select-pane -t %d.%d", win_idx, pane_id); tmate_client_cmd(client_id, cmd); } + +void tmate_send_mc_obj(msgpack_object *obj) +{ + pack(object, *obj); +} diff --git a/tmate-master.c b/tmate-master.c index cb7c15c1..e156fe13 100644 --- a/tmate-master.c +++ b/tmate-master.c @@ -6,6 +6,25 @@ #include "tmate.h" #include "tmate-protocol.h" +static void ctl_daemon_fwd_msg(struct tmate_session *session, + struct tmate_unpacker *uk) +{ + if (uk->argc != 1) + tmate_decoder_error(); + tmate_send_mc_obj(&uk->argv[0]); +} + +void tmate_dispatch_master_message(struct tmate_session *session, + struct tmate_unpacker *uk) +{ + int cmd = unpack_int(uk); + switch (cmd) { +#define dispatch(c, f) case c: f(session, uk); break + dispatch(TMATE_CTL_DEAMON_FWD_MSG, ctl_daemon_fwd_msg); + default: tmate_fatal("Bad master message type: %d", cmd); + } +} + #define pack(what, ...) _pack(&tmate_session->master_encoder, what, __VA_ARGS__) void tmate_send_master_keyframe(struct tmate_session *session) diff --git a/tmate-msgpack.c b/tmate-msgpack.c index 6c7dac9a..02d2f3a6 100644 --- a/tmate-msgpack.c +++ b/tmate-msgpack.c @@ -44,7 +44,7 @@ void tmate_encoder_init(struct tmate_encoder *encoder, encoder->ev_active = false; } -static void decoder_error(void) +void tmate_decoder_error(void) { tmate_print_stack_trace(); tmate_fatal("Received a bad message"); @@ -53,7 +53,7 @@ static void decoder_error(void) void init_unpacker(struct tmate_unpacker *uk, msgpack_object obj) { if (obj.type != MSGPACK_OBJECT_ARRAY) - decoder_error(); + tmate_decoder_error(); uk->argv = obj.via.array.ptr; uk->argc = obj.via.array.size; @@ -64,11 +64,11 @@ int64_t unpack_int(struct tmate_unpacker *uk) int64_t val; if (uk->argc == 0) - decoder_error(); + tmate_decoder_error(); if (uk->argv[0].type != MSGPACK_OBJECT_POSITIVE_INTEGER && uk->argv[0].type != MSGPACK_OBJECT_NEGATIVE_INTEGER) - decoder_error(); + tmate_decoder_error(); val = uk->argv[0].via.i64; @@ -81,18 +81,18 @@ int64_t unpack_int(struct tmate_unpacker *uk) void unpack_buffer(struct tmate_unpacker *uk, const char **buf, size_t *len) { if (uk->argc == 0) - decoder_error(); + tmate_decoder_error(); #if NEW_MSGPACK_API if (uk->argv[0].type != MSGPACK_OBJECT_STR && uk->argv[0].type != MSGPACK_OBJECT_BIN) - decoder_error(); + tmate_decoder_error(); *len = uk->argv[0].via.str.size; *buf = uk->argv[0].via.str.ptr; #else if (uk->argv[0].type != MSGPACK_OBJECT_RAW) - decoder_error(); + tmate_decoder_error(); *len = uk->argv[0].via.raw.size; *buf = uk->argv[0].via.raw.ptr; @@ -120,7 +120,7 @@ char *unpack_string(struct tmate_unpacker *uk) void unpack_array(struct tmate_unpacker *uk, struct tmate_unpacker *nested) { if (uk->argc == 0) - decoder_error(); + tmate_decoder_error(); init_unpacker(nested, uk->argv[0]); diff --git a/tmate-protocol.h b/tmate-protocol.h index dc50c1ee..81a846a2 100644 --- a/tmate-protocol.h +++ b/tmate-protocol.h @@ -8,12 +8,16 @@ /* TODO document each msg */ -enum tmate_control_msg_types { +enum tmate_control_out_msg_types { TMATE_CTL_AUTH, TMATE_CTL_DEAMON_OUT_MSG, TMATE_CTL_KEYFRAME, }; +enum tmate_control_in_msg_types { + TMATE_CTL_DEAMON_FWD_MSG, +}; + enum tmate_daemon_out_msg_types { TMATE_OUT_HEADER, TMATE_OUT_SYNC_LAYOUT, diff --git a/tmate-ssh-daemon.c b/tmate-ssh-daemon.c index 8ca04dc4..e4297be4 100644 --- a/tmate-ssh-daemon.c +++ b/tmate-ssh-daemon.c @@ -3,8 +3,8 @@ static void on_master_decoder_read(void *userdata, struct tmate_unpacker *uk) { - /* struct tmate_session *session = userdata; */ - tmate_info("Received master data!"); + struct tmate_session *session = userdata; + tmate_dispatch_master_message(session, uk); } static void on_master_read(struct bufferevent *bev, void *_session) @@ -18,7 +18,7 @@ static void on_master_read(struct bufferevent *bev, void *_session) master_in = bufferevent_get_input(session->bev_master); while (evbuffer_get_length(master_in)) { - tmate_decoder_get_buffer(&session->daemon_decoder, &buf, &len); + tmate_decoder_get_buffer(&session->master_decoder, &buf, &len); if (len == 0) tmate_fatal("No more room in client decoder. Message too big?"); @@ -26,6 +26,8 @@ static void on_master_read(struct bufferevent *bev, void *_session) written = evbuffer_remove(master_in, buf, len); if (written < 0) tmate_fatal("Cannot read master buffer"); + + tmate_decoder_commit(&session->master_decoder, written); } } @@ -49,7 +51,6 @@ static void on_master_encoder_write(void *userdata, struct evbuffer *buffer) if (evbuffer_add_buffer(master_out, buffer) < 0) tmate_fatal("Cannot write to master buffer"); - } static void on_master_event(struct bufferevent *bev, short events, void *_session) diff --git a/tmate.h b/tmate.h index 724f9b4d..417b0ee1 100644 --- a/tmate.h +++ b/tmate.h @@ -88,11 +88,12 @@ extern void tmate_decoder_get_buffer(struct tmate_decoder *decoder, char **buf, extern void tmate_decoder_commit(struct tmate_decoder *decoder, size_t len); struct tmate_unpacker { - msgpack_object *argv; int argc; + msgpack_object *argv; }; extern void init_unpacker(struct tmate_unpacker *uk, msgpack_object obj); +extern void tmate_decoder_error(void); extern int64_t unpack_int(struct tmate_unpacker *uk); extern void unpack_buffer(struct tmate_unpacker *uk, const char **buf, size_t *len); extern char *unpack_string(struct tmate_unpacker *uk); @@ -119,6 +120,7 @@ extern void tmate_client_set_active_pane(int client_id, int win_idx, int pane_id extern int tmate_should_exec_cmd_locally(const struct cmd_entry *cmd); extern void tmate_send_env(const char *name, const char *value); extern void tmate_send_client_ready(void); +extern void tmate_send_mc_obj(msgpack_object *obj); /* tmate-daemon-decoder.c */ @@ -240,6 +242,9 @@ extern void tmate_spawn_slave(struct tmate_session *session); /* tmate-master.c */ +extern void tmate_dispatch_master_message(struct tmate_session *session, + struct tmate_unpacker *uk); + extern void tmate_send_master_keyframe(struct tmate_session *session); extern void tmate_send_master_daemon_msg(struct tmate_session *session, struct tmate_unpacker *uk);