diff --git a/rtty.proto b/rtty.proto index a26c63c..a8ba1e7 100644 --- a/rtty.proto +++ b/rtty.proto @@ -11,6 +11,7 @@ message rtty_message { UPFILE = 5; DOWNFILE = 6; COMMAND = 7; + WINSIZE = 8; } enum LoginCode { @@ -61,4 +62,6 @@ message rtty_message { repeated string params = 14; map env = 15; repeated File filelist = 16; + uint32 cols = 17; + uint32 rows = 18; } diff --git a/src/main.c b/src/main.c index 4d77ad6..ec3f89c 100644 --- a/src/main.c +++ b/src/main.c @@ -365,6 +365,18 @@ static void handle_downfile(struct uwsc_client *cl, RttyMessage *msg) } } +static void change_winsize(RttyMessage *msg) +{ + struct tty_session *tty = find_tty_session(msg->sid); + struct winsize size = { + .ws_col = msg->cols, + .ws_row = msg->rows + }; + + if(ioctl(tty->pty, TIOCSWINSZ, &size) < 0) + uwsc_log_err("ioctl TIOCSWINSZ error\n"); +} + static void uwsc_onmessage(struct uwsc_client *cl, void *data, uint64_t len, enum websocket_op op) { RttyMessage *msg = rtty_message__unpack(NULL, len, data); @@ -388,6 +400,9 @@ static void uwsc_onmessage(struct uwsc_client *cl, void *data, uint64_t len, enu case RTTY_MESSAGE__TYPE__COMMAND: run_command(cl, msg, data, len); break; + case RTTY_MESSAGE__TYPE__WINSIZE: + change_winsize(msg); + break; default: break; } diff --git a/src/rtty.pb-c.c b/src/rtty.pb-c.c index a5068ad..abdb20c 100644 --- a/src/rtty.pb-c.c +++ b/src/rtty.pb-c.c @@ -190,7 +190,7 @@ const ProtobufCMessageDescriptor rtty_message__env_entry__descriptor = (ProtobufCMessageInit) rtty_message__env_entry__init, NULL,NULL,NULL /* reserved[123] */ }; -static const ProtobufCEnumValue rtty_message__type__enum_values_by_number[8] = +static const ProtobufCEnumValue rtty_message__type__enum_values_by_number[9] = { { "UNKNOWN", "RTTY_MESSAGE__TYPE__UNKNOWN", 0 }, { "LOGIN", "RTTY_MESSAGE__TYPE__LOGIN", 1 }, @@ -200,11 +200,12 @@ static const ProtobufCEnumValue rtty_message__type__enum_values_by_number[8] = { "UPFILE", "RTTY_MESSAGE__TYPE__UPFILE", 5 }, { "DOWNFILE", "RTTY_MESSAGE__TYPE__DOWNFILE", 6 }, { "COMMAND", "RTTY_MESSAGE__TYPE__COMMAND", 7 }, + { "WINSIZE", "RTTY_MESSAGE__TYPE__WINSIZE", 8 }, }; static const ProtobufCIntRange rtty_message__type__value_ranges[] = { -{0, 0},{0, 8} +{0, 0},{0, 9} }; -static const ProtobufCEnumValueIndex rtty_message__type__enum_values_by_name[8] = +static const ProtobufCEnumValueIndex rtty_message__type__enum_values_by_name[9] = { { "COMMAND", 7 }, { "DOWNFILE", 6 }, @@ -214,6 +215,7 @@ static const ProtobufCEnumValueIndex rtty_message__type__enum_values_by_name[8] { "TTY", 4 }, { "UNKNOWN", 0 }, { "UPFILE", 5 }, + { "WINSIZE", 8 }, }; const ProtobufCEnumDescriptor rtty_message__type__descriptor = { @@ -222,9 +224,9 @@ const ProtobufCEnumDescriptor rtty_message__type__descriptor = "Type", "RttyMessage__Type", "", - 8, + 9, rtty_message__type__enum_values_by_number, - 8, + 9, rtty_message__type__enum_values_by_name, 1, rtty_message__type__value_ranges, @@ -334,7 +336,7 @@ const ProtobufCEnumDescriptor rtty_message__command_err__descriptor = rtty_message__command_err__value_ranges, NULL,NULL,NULL,NULL /* reserved[1234] */ }; -static const ProtobufCFieldDescriptor rtty_message__field_descriptors[16] = +static const ProtobufCFieldDescriptor rtty_message__field_descriptors[18] = { { "version", @@ -528,9 +530,34 @@ static const ProtobufCFieldDescriptor rtty_message__field_descriptors[16] = 0, /* flags */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, + { + "cols", + 17, + PROTOBUF_C_LABEL_OPTIONAL, + PROTOBUF_C_TYPE_UINT32, + offsetof(RttyMessage, has_cols), + offsetof(RttyMessage, cols), + NULL, + NULL, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "rows", + 18, + PROTOBUF_C_LABEL_OPTIONAL, + PROTOBUF_C_TYPE_UINT32, + offsetof(RttyMessage, has_rows), + offsetof(RttyMessage, rows), + NULL, + NULL, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, }; static const unsigned rtty_message__field_indices_by_name[] = { 3, /* field[3] = code */ + 16, /* field[16] = cols */ 4, /* field[4] = data */ 14, /* field[14] = env */ 8, /* field[8] = err */ @@ -539,6 +566,7 @@ static const unsigned rtty_message__field_indices_by_name[] = { 5, /* field[5] = name */ 13, /* field[13] = params */ 10, /* field[10] = password */ + 17, /* field[17] = rows */ 2, /* field[2] = sid */ 6, /* field[6] = size */ 12, /* field[12] = std_err */ @@ -550,7 +578,7 @@ static const unsigned rtty_message__field_indices_by_name[] = { static const ProtobufCIntRange rtty_message__number_ranges[1 + 1] = { { 1, 0 }, - { 0, 16 } + { 0, 18 } }; const ProtobufCMessageDescriptor rtty_message__descriptor = { @@ -560,7 +588,7 @@ const ProtobufCMessageDescriptor rtty_message__descriptor = "RttyMessage", "", sizeof(RttyMessage), - 16, + 18, rtty_message__field_descriptors, rtty_message__field_indices_by_name, 1, rtty_message__number_ranges, diff --git a/src/rtty.pb-c.h b/src/rtty.pb-c.h index 3b5531e..fe13141 100644 --- a/src/rtty.pb-c.h +++ b/src/rtty.pb-c.h @@ -30,7 +30,8 @@ typedef enum _RttyMessage__Type { RTTY_MESSAGE__TYPE__TTY = 4, RTTY_MESSAGE__TYPE__UPFILE = 5, RTTY_MESSAGE__TYPE__DOWNFILE = 6, - RTTY_MESSAGE__TYPE__COMMAND = 7 + RTTY_MESSAGE__TYPE__COMMAND = 7, + RTTY_MESSAGE__TYPE__WINSIZE = 8 PROTOBUF_C__FORCE_ENUM_TO_BE_INT_SIZE(RTTY_MESSAGE__TYPE) } RttyMessage__Type; typedef enum _RttyMessage__LoginCode { @@ -117,10 +118,14 @@ struct _RttyMessage RttyMessage__EnvEntry **env; size_t n_filelist; RttyMessage__File **filelist; + protobuf_c_boolean has_cols; + uint32_t cols; + protobuf_c_boolean has_rows; + uint32_t rows; }; #define RTTY_MESSAGE__INIT \ { PROTOBUF_C_MESSAGE_INIT (&rtty_message__descriptor) \ - , 0,0, 0,0, NULL, 0,0, 0,{0,NULL}, NULL, 0,0, 0,0, 0,0, NULL, NULL, NULL, NULL, 0,NULL, 0,NULL, 0,NULL } + , 0,0, 0,0, NULL, 0,0, 0,{0,NULL}, NULL, 0,0, 0,0, 0,0, NULL, NULL, NULL, NULL, 0,NULL, 0,NULL, 0,NULL, 0,0, 0,0 } /* RttyMessage__File methods */