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:
parent
dd1078d183
commit
b203e3f9b9
@ -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);
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
|
@ -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)
|
||||||
|
@ -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]);
|
||||||
|
|
||||||
|
@ -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,
|
||||||
|
@ -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)
|
||||||
|
7
tmate.h
7
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);
|
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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user