From 0f7f5a477a28b19c5dd88c3a035184114b96c956 Mon Sep 17 00:00:00 2001 From: Nicolas Viennot Date: Sat, 3 Oct 2015 13:36:09 -0700 Subject: [PATCH] Bump to msgpack new lib --- tmate-daemon-decoder.c | 4 ++ tmate-master.c | 4 +- tmate-msgpack.c | 124 ++++++++++++++++++++++++++++++++++++++--- tmate.h | 31 ++--------- 4 files changed, 127 insertions(+), 36 deletions(-) diff --git a/tmate-daemon-decoder.c b/tmate-daemon-decoder.c index bfa25764..c0558a8b 100644 --- a/tmate-daemon-decoder.c +++ b/tmate-daemon-decoder.c @@ -15,6 +15,10 @@ static void tmate_header(struct tmate_session *session, char tmp[512]; session->client_protocol_version = unpack_int(uk); + if (session->client_protocol_version <= 4) { + session->daemon_encoder.mpac_version = 4; + } + if (session->client_protocol_version >= 3) { free(client_version); client_version = unpack_string(uk); diff --git a/tmate-master.c b/tmate-master.c index f0d2f86f..84880862 100644 --- a/tmate-master.c +++ b/tmate-master.c @@ -63,11 +63,11 @@ static void do_snapshot(struct tmate_unpacker *uk, str_len += utf8.size; } - pack(raw, str_len); + pack(str, str_len); for (i = 0; i < line->cellsize; i++) { cell = &line->celldata[i]; grid_cell_get(cell, &utf8); - pack(raw_body, utf8.data, utf8.size); + pack(str_body, utf8.data, utf8.size); } pack(array, line->cellsize); diff --git a/tmate-msgpack.c b/tmate-msgpack.c index 02d2f3a6..3d0962c9 100644 --- a/tmate-msgpack.c +++ b/tmate-msgpack.c @@ -24,11 +24,127 @@ static int on_encoder_write(void *userdata, const char *buf, unsigned int len) return 0; } +/* Really sad hack, but we can get away with it */ +#define tmate_encoder_from_pk(pk) ((struct tmate_encoder *)pk) + +void msgpack_pack_string(msgpack_packer *pk, const char *str) +{ + size_t len = strlen(str); + + if (tmate_encoder_from_pk(pk)->mpac_version >= 5) { + msgpack_pack_str(pk, len); + msgpack_pack_str_body(pk, str, len); + } else { + msgpack_pack_v4raw(pk, len); + msgpack_pack_v4raw_body(pk, str, len); + } +} + +/* Copy/pasted from msgpack sources, except we include the v4 support */ +int _msgpack_pack_object(msgpack_packer* pk, msgpack_object d) +{ + switch(d.type) { + case MSGPACK_OBJECT_NIL: + return msgpack_pack_nil(pk); + + case MSGPACK_OBJECT_BOOLEAN: + if(d.via.boolean) { + return msgpack_pack_true(pk); + } else { + return msgpack_pack_false(pk); + } + + case MSGPACK_OBJECT_POSITIVE_INTEGER: + return msgpack_pack_uint64(pk, d.via.u64); + + case MSGPACK_OBJECT_NEGATIVE_INTEGER: + return msgpack_pack_int64(pk, d.via.i64); + + case MSGPACK_OBJECT_FLOAT: + return msgpack_pack_double(pk, d.via.f64); + + case MSGPACK_OBJECT_STR: + { + if (tmate_encoder_from_pk(pk)->mpac_version >= 5) { + int ret = msgpack_pack_str(pk, d.via.str.size); + if(ret < 0) { return ret; } + return msgpack_pack_str_body(pk, d.via.str.ptr, d.via.str.size); + } else { + int ret = msgpack_pack_v4raw(pk, d.via.str.size); + if(ret < 0) { return ret; } + return msgpack_pack_v4raw_body(pk, d.via.str.ptr, d.via.str.size); + } + } + + case MSGPACK_OBJECT_BIN: + { + if (tmate_encoder_from_pk(pk)->mpac_version >= 5) { + int ret = msgpack_pack_bin(pk, d.via.bin.size); + if(ret < 0) { return ret; } + return msgpack_pack_bin_body(pk, d.via.bin.ptr, d.via.bin.size); + } else { + int ret = msgpack_pack_v4raw(pk, d.via.bin.size); + if(ret < 0) { return ret; } + return msgpack_pack_v4raw_body(pk, d.via.bin.ptr, d.via.bin.size); + } + } + + case MSGPACK_OBJECT_EXT: + { + int ret = msgpack_pack_ext(pk, d.via.ext.size, d.via.ext.type); + if(ret < 0) { return ret; } + return msgpack_pack_ext_body(pk, d.via.ext.ptr, d.via.ext.size); + } + + case MSGPACK_OBJECT_ARRAY: + { + int ret = msgpack_pack_array(pk, d.via.array.size); + if(ret < 0) { + return ret; + } + else { + msgpack_object* o = d.via.array.ptr; + msgpack_object* const oend = d.via.array.ptr + d.via.array.size; + for(; o != oend; ++o) { + ret = msgpack_pack_object(pk, *o); + if(ret < 0) { return ret; } + } + + return 0; + } + } + + case MSGPACK_OBJECT_MAP: + { + int ret = msgpack_pack_map(pk, d.via.map.size); + if(ret < 0) { + return ret; + } + else { + msgpack_object_kv* kv = d.via.map.ptr; + msgpack_object_kv* const kvend = d.via.map.ptr + d.via.map.size; + for(; kv != kvend; ++kv) { + ret = msgpack_pack_object(pk, kv->key); + if(ret < 0) { return ret; } + ret = msgpack_pack_object(pk, kv->val); + if(ret < 0) { return ret; } + } + + return 0; + } + } + + default: + return -1; + } +} + void tmate_encoder_init(struct tmate_encoder *encoder, tmate_encoder_write_cb *callback, void *userdata) { msgpack_packer_init(&encoder->pk, encoder, &on_encoder_write); + encoder->mpac_version = 5; encoder->buffer = evbuffer_new(); encoder->ready_callback = callback; encoder->userdata = userdata; @@ -83,20 +199,12 @@ void unpack_buffer(struct tmate_unpacker *uk, const char **buf, size_t *len) if (uk->argc == 0) tmate_decoder_error(); -#if NEW_MSGPACK_API if (uk->argv[0].type != MSGPACK_OBJECT_STR && uk->argv[0].type != MSGPACK_OBJECT_BIN) 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) - tmate_decoder_error(); - - *len = uk->argv[0].via.raw.size; - *buf = uk->argv[0].via.raw.ptr; -#endif uk->argv++; uk->argc--; diff --git a/tmate.h b/tmate.h index d5abceea..d2c7726e 100644 --- a/tmate.h +++ b/tmate.h @@ -32,6 +32,7 @@ typedef void tmate_encoder_write_cb(void *userdata, struct evbuffer *buffer); struct tmate_encoder { msgpack_packer pk; + int mpac_version; tmate_encoder_write_cb *ready_callback; void *userdata; struct evbuffer *buffer; @@ -43,32 +44,10 @@ extern void tmate_encoder_init(struct tmate_encoder *encoder, tmate_encoder_write_cb *callback, void *userdata); -#define NEW_MSGPACK_API 1 - -#if NEW_MSG_PACK -#define msgpack_pack_buffer(pk, buf, len) ({ \ - msgpack_pack_bin(pk, len); \ - msgpack_pack_bin_body(pk, buf, len); \ -}) - -#define msgpack_pack_string(pk, str) ({ \ - int __strlen = strlen(str); \ - msgpack_pack_str(pk, __strlen); \ - msgpack_pack_str_body(pk, str, __strlen); \ -}) -#else -/* old msgpack version */ -#define msgpack_pack_buffer(pk, buf, len) ({ \ - msgpack_pack_raw(pk, len); \ - msgpack_pack_raw_body(pk, buf, len); \ -}) - -#define msgpack_pack_string(pk, str) ({ \ - int __strlen = strlen(str); \ - msgpack_pack_raw(pk, __strlen); \ - msgpack_pack_raw_body(pk, str, __strlen); \ -}) -#endif +/* These functions deal with dual v4/v5 support through mpac_version */ +extern void msgpack_pack_string(msgpack_packer *pk, const char *str); +extern int _msgpack_pack_object(msgpack_packer *pk, msgpack_object d); +#define msgpack_pack_object _msgpack_pack_object #define _pack(enc, what, ...) msgpack_pack_##what(&(enc)->pk, __VA_ARGS__)