1
0
mirror of https://github.com/tmate-io/tmate-ssh-server.git synced 2020-11-18 19:53:51 -08:00

dispatch message from master

This commit is contained in:
Nicolas Viennot 2015-09-19 22:29:43 -04:00
parent dd1078d183
commit b203e3f9b9
7 changed files with 49 additions and 16 deletions

View File

@ -359,10 +359,9 @@ static void tmate_write_copy_mode(struct tmate_session *session,
void tmate_dispatch_daemon_message(struct tmate_session *session, void tmate_dispatch_daemon_message(struct tmate_session *session,
struct tmate_unpacker *uk) struct tmate_unpacker *uk)
{ {
#define dispatch(c, f) case c: f(session, uk); break
int cmd = unpack_int(uk); int cmd = unpack_int(uk);
switch (cmd) { switch (cmd) {
#define dispatch(c, f) case c: f(session, uk); break
dispatch(TMATE_OUT_HEADER, tmate_header); dispatch(TMATE_OUT_HEADER, tmate_header);
dispatch(TMATE_OUT_SYNC_LAYOUT, tmate_sync_layout); dispatch(TMATE_OUT_SYNC_LAYOUT, tmate_sync_layout);
dispatch(TMATE_OUT_PTY_DATA, tmate_pty_data); dispatch(TMATE_OUT_PTY_DATA, tmate_pty_data);

View File

@ -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); sprintf(cmd, "select-pane -t %d.%d", win_idx, pane_id);
tmate_client_cmd(client_id, cmd); tmate_client_cmd(client_id, cmd);
} }
void tmate_send_mc_obj(msgpack_object *obj)
{
pack(object, *obj);
}

View File

@ -6,6 +6,25 @@
#include "tmate.h" #include "tmate.h"
#include "tmate-protocol.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__) #define pack(what, ...) _pack(&tmate_session->master_encoder, what, __VA_ARGS__)
void tmate_send_master_keyframe(struct tmate_session *session) void tmate_send_master_keyframe(struct tmate_session *session)

View File

@ -44,7 +44,7 @@ void tmate_encoder_init(struct tmate_encoder *encoder,
encoder->ev_active = false; encoder->ev_active = false;
} }
static void decoder_error(void) void tmate_decoder_error(void)
{ {
tmate_print_stack_trace(); tmate_print_stack_trace();
tmate_fatal("Received a bad message"); 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) void init_unpacker(struct tmate_unpacker *uk, msgpack_object obj)
{ {
if (obj.type != MSGPACK_OBJECT_ARRAY) if (obj.type != MSGPACK_OBJECT_ARRAY)
decoder_error(); tmate_decoder_error();
uk->argv = obj.via.array.ptr; uk->argv = obj.via.array.ptr;
uk->argc = obj.via.array.size; uk->argc = obj.via.array.size;
@ -64,11 +64,11 @@ int64_t unpack_int(struct tmate_unpacker *uk)
int64_t val; int64_t val;
if (uk->argc == 0) if (uk->argc == 0)
decoder_error(); tmate_decoder_error();
if (uk->argv[0].type != MSGPACK_OBJECT_POSITIVE_INTEGER && if (uk->argv[0].type != MSGPACK_OBJECT_POSITIVE_INTEGER &&
uk->argv[0].type != MSGPACK_OBJECT_NEGATIVE_INTEGER) uk->argv[0].type != MSGPACK_OBJECT_NEGATIVE_INTEGER)
decoder_error(); tmate_decoder_error();
val = uk->argv[0].via.i64; 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) void unpack_buffer(struct tmate_unpacker *uk, const char **buf, size_t *len)
{ {
if (uk->argc == 0) if (uk->argc == 0)
decoder_error(); tmate_decoder_error();
#if NEW_MSGPACK_API #if NEW_MSGPACK_API
if (uk->argv[0].type != MSGPACK_OBJECT_STR && if (uk->argv[0].type != MSGPACK_OBJECT_STR &&
uk->argv[0].type != MSGPACK_OBJECT_BIN) uk->argv[0].type != MSGPACK_OBJECT_BIN)
decoder_error(); tmate_decoder_error();
*len = uk->argv[0].via.str.size; *len = uk->argv[0].via.str.size;
*buf = uk->argv[0].via.str.ptr; *buf = uk->argv[0].via.str.ptr;
#else #else
if (uk->argv[0].type != MSGPACK_OBJECT_RAW) if (uk->argv[0].type != MSGPACK_OBJECT_RAW)
decoder_error(); tmate_decoder_error();
*len = uk->argv[0].via.raw.size; *len = uk->argv[0].via.raw.size;
*buf = uk->argv[0].via.raw.ptr; *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) void unpack_array(struct tmate_unpacker *uk, struct tmate_unpacker *nested)
{ {
if (uk->argc == 0) if (uk->argc == 0)
decoder_error(); tmate_decoder_error();
init_unpacker(nested, uk->argv[0]); init_unpacker(nested, uk->argv[0]);

View File

@ -8,12 +8,16 @@
/* TODO document each msg */ /* TODO document each msg */
enum tmate_control_msg_types { enum tmate_control_out_msg_types {
TMATE_CTL_AUTH, TMATE_CTL_AUTH,
TMATE_CTL_DEAMON_OUT_MSG, TMATE_CTL_DEAMON_OUT_MSG,
TMATE_CTL_KEYFRAME, TMATE_CTL_KEYFRAME,
}; };
enum tmate_control_in_msg_types {
TMATE_CTL_DEAMON_FWD_MSG,
};
enum tmate_daemon_out_msg_types { enum tmate_daemon_out_msg_types {
TMATE_OUT_HEADER, TMATE_OUT_HEADER,
TMATE_OUT_SYNC_LAYOUT, TMATE_OUT_SYNC_LAYOUT,

View File

@ -3,8 +3,8 @@
static void on_master_decoder_read(void *userdata, struct tmate_unpacker *uk) static void on_master_decoder_read(void *userdata, struct tmate_unpacker *uk)
{ {
/* struct tmate_session *session = userdata; */ struct tmate_session *session = userdata;
tmate_info("Received master data!"); tmate_dispatch_master_message(session, uk);
} }
static void on_master_read(struct bufferevent *bev, void *_session) 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); master_in = bufferevent_get_input(session->bev_master);
while (evbuffer_get_length(master_in)) { 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) if (len == 0)
tmate_fatal("No more room in client decoder. Message too big?"); 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); written = evbuffer_remove(master_in, buf, len);
if (written < 0) if (written < 0)
tmate_fatal("Cannot read master buffer"); 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) if (evbuffer_add_buffer(master_out, buffer) < 0)
tmate_fatal("Cannot write to master buffer"); tmate_fatal("Cannot write to master buffer");
} }
static void on_master_event(struct bufferevent *bev, short events, void *_session) static void on_master_event(struct bufferevent *bev, short events, void *_session)

View File

@ -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); extern void tmate_decoder_commit(struct tmate_decoder *decoder, size_t len);
struct tmate_unpacker { struct tmate_unpacker {
msgpack_object *argv;
int argc; int argc;
msgpack_object *argv;
}; };
extern void init_unpacker(struct tmate_unpacker *uk, msgpack_object obj); 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 int64_t unpack_int(struct tmate_unpacker *uk);
extern void unpack_buffer(struct tmate_unpacker *uk, const char **buf, size_t *len); extern void unpack_buffer(struct tmate_unpacker *uk, const char **buf, size_t *len);
extern char *unpack_string(struct tmate_unpacker *uk); 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 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_env(const char *name, const char *value);
extern void tmate_send_client_ready(void); extern void tmate_send_client_ready(void);
extern void tmate_send_mc_obj(msgpack_object *obj);
/* tmate-daemon-decoder.c */ /* tmate-daemon-decoder.c */
@ -240,6 +242,9 @@ extern void tmate_spawn_slave(struct tmate_session *session);
/* tmate-master.c */ /* 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_keyframe(struct tmate_session *session);
extern void tmate_send_master_daemon_msg(struct tmate_session *session, extern void tmate_send_master_daemon_msg(struct tmate_session *session,
struct tmate_unpacker *uk); struct tmate_unpacker *uk);