X-Git-Url: http://git.code-monkey.de/?a=blobdiff_plain;f=src%2Fmessages.c;h=893708acec63a04ffeb40e4990dec1a3345821b5;hb=4c431fe65269e9b1d452855b9df8cfe80683b691;hp=09ec927378c603f6ae3ca29a115afa985b186242;hpb=893f97a3eab1da17bfa9f00edb081e4fba32548b;p=umurmur.git diff --git a/src/messages.c b/src/messages.c index 09ec927..893708a 100644 --- a/src/messages.c +++ b/src/messages.c @@ -1,5 +1,5 @@ -/* Copyright (C) 2009-2010, Martin Johansson - Copyright (C) 2005-2010, Thorvald Natvig +/* Copyright (C) 2009-2012, Martin Johansson + Copyright (C) 2005-2012, Thorvald Natvig All rights reserved. @@ -41,21 +41,17 @@ #define PREAMBLE_SIZE 6 -void dumpmsg(uint8_t *data, int size); static message_t *Msg_create_nopayload(messageType_t messageType); -void Msg_addPreamble(uint8_t *buffer, uint16_t type, uint32_t len) -{ - type = htons(type); - len = htonl(len); - - buffer[0] = (type) & 0xff; - buffer[1] = (type >> 8) & 0xff; +static void Msg_addPreamble(uint8_t *buffer, uint16_t type, uint32_t len) +{ + buffer[1] = (type) & 0xff; + buffer[0] = (type >> 8) & 0xff; - buffer[2] = (len) & 0xff; - buffer[3] = (len >> 8) & 0xff; - buffer[4] = (len >> 16) & 0xff; - buffer[5] = (len >> 24) & 0xff; + buffer[5] = (len) & 0xff; + buffer[4] = (len >> 8) & 0xff; + buffer[3] = (len >> 16) & 0xff; + buffer[2] = (len >> 24) & 0xff; } static void Msg_getPreamble(uint8_t *buffer, int *type, int *len) @@ -63,10 +59,10 @@ static void Msg_getPreamble(uint8_t *buffer, int *type, int *len) uint16_t msgType; uint32_t msgLen; - msgType = buffer[0] | (buffer[1] << 8); - msgLen = buffer[2] | (buffer[3] << 8) | (buffer[4] << 16) | (buffer[5] << 24); - *type = (int)ntohs(msgType); - *len = (int)ntohl(msgLen); + msgType = buffer[1] | (buffer[0] << 8); + msgLen = buffer[5] | (buffer[4] << 8) | (buffer[3] << 16) | (buffer[2] << 24); + *type = (int)msgType; + *len = (int)msgLen; } #define MAX_MSGSIZE (BUFSIZE - PREAMBLE_SIZE) @@ -230,15 +226,35 @@ int Msg_messageToNetwork(message_t *msg, uint8_t *buffer) Msg_addPreamble(buffer, msg->messageType, len); mumble_proto__channel_remove__pack(msg->payload.channelRemove, bufptr); break; + case UserStats: + { + len = mumble_proto__user_stats__get_packed_size(msg->payload.userStats); + if (len > MAX_MSGSIZE) { + Log_warn("Too big tx message. Discarding"); + break; + } + Msg_addPreamble(buffer, msg->messageType, len); + mumble_proto__user_stats__pack(msg->payload.userStats, bufptr); + break; + } + case ServerConfig: + len = mumble_proto__server_config__get_packed_size(msg->payload.serverConfig); + if (len > MAX_MSGSIZE) { + Log_warn("Too big tx message. Discarding"); + break; + } + Msg_addPreamble(buffer, msg->messageType, len); + mumble_proto__server_config__pack(msg->payload.serverConfig, bufptr); + break; default: - Log_warn("Msg_networkToMessage: Unsupported message %d", msg->messageType); + Log_warn("Msg_MessageToNetwork: Unsupported message %d", msg->messageType); return 0; } return len + PREAMBLE_SIZE; } -message_t *Msg_create_nopayload(messageType_t messageType) +static message_t *Msg_create_nopayload(messageType_t messageType) { message_t *msg = malloc(sizeof(message_t)); @@ -324,6 +340,27 @@ message_t *Msg_create(messageType_t messageType) msg->payload.channelRemove = malloc(sizeof(MumbleProto__ChannelRemove)); mumble_proto__channel_remove__init(msg->payload.channelRemove); break; + case UserStats: + msg->payload.userStats = malloc(sizeof(MumbleProto__UserStats)); + mumble_proto__user_stats__init(msg->payload.userStats); + + msg->payload.userStats->from_client = malloc(sizeof(MumbleProto__UserStats__Stats)); + mumble_proto__user_stats__stats__init(msg->payload.userStats->from_client); + + msg->payload.userStats->from_server = malloc(sizeof(MumbleProto__UserStats__Stats)); + mumble_proto__user_stats__stats__init(msg->payload.userStats->from_server); + + msg->payload.userStats->version = malloc(sizeof(MumbleProto__Version)); + mumble_proto__version__init(msg->payload.userStats->version); + + if (!msg->payload.userStats || !msg->payload.userStats->from_client || + !msg->payload.userStats->from_server || !msg->payload.userStats->version) + Log_fatal("Out of memory"); + break; + case ServerConfig: + msg->payload.serverConfig = malloc(sizeof(MumbleProto__ServerConfig)); + mumble_proto__server_config__init(msg->payload.serverConfig); + break; default: Log_warn("Msg_create: Unsupported message %d", msg->messageType); @@ -399,6 +436,14 @@ void Msg_free(message_t *msg) if (msg->unpacked) mumble_proto__text_message__free_unpacked(msg->payload.textMessage, NULL); else { + if (msg->payload.textMessage->message) + free(msg->payload.textMessage->message); + if (msg->payload.textMessage->session) + free(msg->payload.textMessage->session); + if (msg->payload.textMessage->channel_id) + free(msg->payload.textMessage->channel_id); + if (msg->payload.textMessage->tree_id) + free(msg->payload.textMessage->tree_id); free(msg->payload.textMessage); } break; @@ -436,8 +481,12 @@ void Msg_free(message_t *msg) if (msg->unpacked) mumble_proto__channel_state__free_unpacked(msg->payload.channelState, NULL); else { - free(msg->payload.channelState->name); - free(msg->payload.channelState->description); + if (msg->payload.channelState->name) + free(msg->payload.channelState->name); + if (msg->payload.channelState->description) + free(msg->payload.channelState->description); + if (msg->payload.channelState->links) + free(msg->payload.channelState->links); free(msg->payload.channelState); } break; @@ -476,6 +525,44 @@ void Msg_free(message_t *msg) free(msg->payload.channelRemove); } break; + case UserStats: + if (msg->unpacked) + mumble_proto__user_stats__free_unpacked(msg->payload.userStats, NULL); + else { + if (msg->payload.userStats->from_client) + free(msg->payload.userStats->from_client); + if (msg->payload.userStats->from_server) + free(msg->payload.userStats->from_server); + if (msg->payload.userStats->version) { + if (msg->payload.userStats->version->release) + free(msg->payload.userStats->version->release); + if (msg->payload.userStats->version->os) + free(msg->payload.userStats->version->os); + if (msg->payload.userStats->version->os_version) + free(msg->payload.userStats->version->os_version); + + free(msg->payload.userStats->version); + } + if (msg->payload.userStats->celt_versions) + free(msg->payload.userStats->celt_versions); + if (msg->payload.userStats->certificates) { + if (msg->payload.userStats->certificates->data) + free(msg->payload.userStats->certificates->data); + free(msg->payload.userStats->certificates); + } + if (msg->payload.userStats->address.data) + free(msg->payload.userStats->address.data); + + free(msg->payload.userStats); + } + break; + case ServerConfig: + if (msg->unpacked) + mumble_proto__server_config__free_unpacked(msg->payload.serverConfig, NULL); + else { + free(msg->payload.serverConfig); + } + break; default: Log_warn("Msg_free: Unsupported message %d", msg->messageType); @@ -484,21 +571,21 @@ void Msg_free(message_t *msg) free(msg); } -void dumpmsg(uint8_t *data, int size) +message_t *Msg_CreateVoiceMsg(uint8_t *data, int size) { - int i, r = 0, offset = 0; - char buf[512]; + message_t *msg = NULL; - while (r * 8 + i < size) { - for (i = 0; i < 8 && r * 8 + i < size; i++) { - offset += sprintf(buf + offset, "%x ", data[r * 8 + i]); - } - sprintf(buf + offset, "\n"); - printf(buf); - offset = 0; - r++; - i = 0; - } + msg = Msg_create_nopayload(UDPTunnel); + msg->unpacked = false; + msg->payload.UDPTunnel = malloc(sizeof(struct _MumbleProto__UDPTunnel)); + if (msg->payload.UDPTunnel == NULL) + Log_fatal("Out of memory"); + msg->payload.UDPTunnel->packet.data = malloc(size); + if (msg->payload.UDPTunnel->packet.data == NULL) + Log_fatal("Out of memory"); + memcpy(msg->payload.UDPTunnel->packet.data, data, size); + msg->payload.UDPTunnel->packet.len = size; + return msg; } message_t *Msg_networkToMessage(uint8_t *data, int size) @@ -524,16 +611,7 @@ message_t *Msg_networkToMessage(uint8_t *data, int size) } case UDPTunnel: /* Non-standard handling of tunneled voice data */ { - msg = Msg_create_nopayload(UDPTunnel); - msg->unpacked = false; - msg->payload.UDPTunnel = malloc(sizeof(struct _MumbleProto__UDPTunnel)); - if (msg->payload.UDPTunnel == NULL) - Log_fatal("Out of memory"); - msg->payload.UDPTunnel->packet.data = malloc(msgLen); - if (msg->payload.UDPTunnel->packet.data == NULL) - Log_fatal("Out of memory"); - memcpy(msg->payload.UDPTunnel->packet.data, msgData, msgLen); - msg->payload.UDPTunnel->packet.len = msgLen; + msg = Msg_CreateVoiceMsg(msgData, msgLen); break; } case Authenticate: @@ -662,6 +740,24 @@ message_t *Msg_networkToMessage(uint8_t *data, int size) goto err_out; break; } + case UserStats: + { + msg = Msg_create_nopayload(UserStats); + msg->unpacked = true; + msg->payload.userStats = mumble_proto__user_stats__unpack(NULL, msgLen, msgData); + if (msg->payload.userStats == NULL) + goto err_out; + break; + } + case UserRemove: + { + msg = Msg_create_nopayload(UserRemove); + msg->unpacked = true; + msg->payload.userRemove = mumble_proto__user_remove__unpack(NULL, msgLen, msgData); + if (msg->payload.userRemove == NULL) + goto err_out; + break; + } default: Log_warn("Unsupported message %d", messageType);