Send channel links info at client connect
[umurmur.git] / src / messages.c
index 2f85b9a3ba0b93a06fe47e37cbfd76f6b1ff0a0e..06a72eb4fae8c696fb1493594a9b0077b3835c0e 100644 (file)
 #include "pds.h"
 #include "log.h"
 
+#define PREAMBLE_SIZE 6
 
-void dumpmsg(uint8_t *data, int size);
+static 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)
+static void Msg_addPreamble(uint8_t *buffer, uint16_t type, uint32_t len)
 {
        type = htons(type);
        len = htonl(len);
@@ -68,11 +69,11 @@ static void Msg_getPreamble(uint8_t *buffer, int *type, int *len)
        *len = (int)ntohl(msgLen);
 }
 
-#define MAX_MSGSIZE (BUFSIZE - 6)
+#define MAX_MSGSIZE (BUFSIZE - PREAMBLE_SIZE)
 int Msg_messageToNetwork(message_t *msg, uint8_t *buffer)
 {
        int len;
-       uint8_t *bufptr = buffer + 6;
+       uint8_t *bufptr = buffer + PREAMBLE_SIZE;
                
        Log_debug("To net: msg type %d", msg->messageType);
        switch (msg->messageType) {
@@ -83,8 +84,6 @@ int Msg_messageToNetwork(message_t *msg, uint8_t *buffer)
                        break;
                }
                Msg_addPreamble(buffer, msg->messageType, len);
-               Log_debug("To net: Version->release: %s Version->os: %s",
-                                 msg->payload.version->release, msg->payload.version->os);
                mumble_proto__version__pack(msg->payload.version, bufptr);
                break;
        case UDPTunnel: /* Non-standard handling of tunneled voice traffic. */
@@ -92,6 +91,7 @@ int Msg_messageToNetwork(message_t *msg, uint8_t *buffer)
                        Log_warn("Too big tx message. Discarding");
                        break;
                }
+               len = msg->payload.UDPTunnel->packet.len;
                Msg_addPreamble(buffer, msg->messageType, msg->payload.UDPTunnel->packet.len);
                memcpy(bufptr, msg->payload.UDPTunnel->packet.data, msg->payload.UDPTunnel->packet.len);
                break;
@@ -176,6 +176,15 @@ int Msg_messageToNetwork(message_t *msg, uint8_t *buffer)
                Msg_addPreamble(buffer, msg->messageType, len);
                mumble_proto__user_state__pack(msg->payload.userState, bufptr);
                break;
+       case UserRemove:
+               len = mumble_proto__user_remove__get_packed_size(msg->payload.userRemove);
+               if (len > MAX_MSGSIZE) {
+                       Log_warn("Too big tx message. Discarding");
+                       break;
+                       }
+               Msg_addPreamble(buffer, msg->messageType, len);
+               mumble_proto__user_remove__pack(msg->payload.userRemove, bufptr);
+               break;
        case ChannelState:
                len = mumble_proto__channel_state__get_packed_size(msg->payload.channelState);
                if (len > MAX_MSGSIZE) {
@@ -223,13 +232,13 @@ int Msg_messageToNetwork(message_t *msg, uint8_t *buffer)
                break;
 
        default:
-               Log_warn("Unsupported message %d", msg->messageType);
+               Log_warn("Msg_MessageToNetwork: Unsupported message %d", msg->messageType);
                return 0;
        }
-       return len + 6;
+       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));
 
@@ -427,8 +436,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;
@@ -492,6 +505,23 @@ void dumpmsg(uint8_t *data, int size)
        } 
 }
 
+message_t *Msg_CreateVoiceMsg(uint8_t *data, int size)
+{
+       message_t *msg = NULL;
+       
+       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)
 {
        message_t *msg = NULL;
@@ -509,20 +539,13 @@ message_t *Msg_networkToMessage(uint8_t *data, int size)
                msg = Msg_create_nopayload(Version);
                msg->unpacked = true;
                msg->payload.version = mumble_proto__version__unpack(NULL, msgLen, msgData);
+               if (msg->payload.version == NULL)
+                       goto err_out;
                break;
        }
        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:
@@ -530,6 +553,8 @@ message_t *Msg_networkToMessage(uint8_t *data, int size)
                msg = Msg_create_nopayload(Authenticate);
                msg->unpacked = true;
                msg->payload.authenticate = mumble_proto__authenticate__unpack(NULL, msgLen, msgData);
+               if (msg->payload.authenticate == NULL)
+                       goto err_out;
                break;
        }
        case Ping:
@@ -537,6 +562,8 @@ message_t *Msg_networkToMessage(uint8_t *data, int size)
                msg = Msg_create_nopayload(Ping);
                msg->unpacked = true;
                msg->payload.ping = mumble_proto__ping__unpack(NULL, msgLen, msgData);
+               if (msg->payload.ping == NULL)
+                       goto err_out;
                break;
        }
        case Reject:
@@ -544,6 +571,8 @@ message_t *Msg_networkToMessage(uint8_t *data, int size)
                msg = Msg_create_nopayload(Reject);
                msg->unpacked = true;
                msg->payload.reject = mumble_proto__reject__unpack(NULL, msgLen, msgData);
+               if (msg->payload.reject == NULL)
+                       goto err_out;
                break;
        }
        case ServerSync:
@@ -551,6 +580,8 @@ message_t *Msg_networkToMessage(uint8_t *data, int size)
                msg = Msg_create_nopayload(ServerSync);
                msg->unpacked = true;
                msg->payload.serverSync = mumble_proto__server_sync__unpack(NULL, msgLen, msgData);
+               if (msg->payload.serverSync == NULL)
+                       goto err_out;
                break;
        }
        case TextMessage:
@@ -558,6 +589,8 @@ message_t *Msg_networkToMessage(uint8_t *data, int size)
                msg = Msg_create_nopayload(TextMessage);
                msg->unpacked = true;
                msg->payload.textMessage = mumble_proto__text_message__unpack(NULL, msgLen, msgData);
+               if (msg->payload.textMessage == NULL)
+                       goto err_out;
                break;
        }
        case PermissionDenied:
@@ -565,6 +598,8 @@ message_t *Msg_networkToMessage(uint8_t *data, int size)
                msg = Msg_create_nopayload(PermissionDenied);
                msg->unpacked = true;
                msg->payload.permissionDenied = mumble_proto__permission_denied__unpack(NULL, msgLen, msgData);
+               if (msg->payload.permissionDenied == NULL)
+                       goto err_out;
                break;
        }
        case CryptSetup:
@@ -572,6 +607,8 @@ message_t *Msg_networkToMessage(uint8_t *data, int size)
                msg = Msg_create_nopayload(CryptSetup);
                msg->unpacked = true;
                msg->payload.cryptSetup = mumble_proto__crypt_setup__unpack(NULL, msgLen, msgData);
+               if (msg->payload.cryptSetup == NULL)
+                       goto err_out;
                break;
        }
        case UserList:
@@ -579,6 +616,8 @@ message_t *Msg_networkToMessage(uint8_t *data, int size)
                msg = Msg_create_nopayload(UserList);
                msg->unpacked = true;
                msg->payload.userList = mumble_proto__user_list__unpack(NULL, msgLen, msgData);
+               if (msg->payload.userList == NULL)
+                       goto err_out;
                break;
        }
        case UserState:
@@ -586,6 +625,8 @@ message_t *Msg_networkToMessage(uint8_t *data, int size)
                msg = Msg_create_nopayload(UserState);
                msg->unpacked = true;
                msg->payload.userState = mumble_proto__user_state__unpack(NULL, msgLen, msgData);
+               if (msg->payload.userState == NULL)
+                       goto err_out;
                break;
        }
        case ChannelState:
@@ -593,6 +634,8 @@ message_t *Msg_networkToMessage(uint8_t *data, int size)
                msg = Msg_create_nopayload(ChannelState);
                msg->unpacked = true;
                msg->payload.channelState = mumble_proto__channel_state__unpack(NULL, msgLen, msgData);
+               if (msg->payload.channelState == NULL)
+                       goto err_out;
                break;
        }
        case VoiceTarget:
@@ -600,6 +643,8 @@ message_t *Msg_networkToMessage(uint8_t *data, int size)
                msg = Msg_create_nopayload(VoiceTarget);
                msg->unpacked = true;
                msg->payload.voiceTarget = mumble_proto__voice_target__unpack(NULL, msgLen, msgData);
+               if (msg->payload.voiceTarget == NULL)
+                       goto err_out;
                break;
        }
        case CodecVersion:
@@ -607,6 +652,8 @@ message_t *Msg_networkToMessage(uint8_t *data, int size)
                msg = Msg_create_nopayload(CodecVersion);
                msg->unpacked = true;
                msg->payload.codecVersion = mumble_proto__codec_version__unpack(NULL, msgLen, msgData);
+               if (msg->payload.codecVersion == NULL)
+                       goto err_out;
                break;
        }
        case PermissionQuery:
@@ -614,6 +661,8 @@ message_t *Msg_networkToMessage(uint8_t *data, int size)
                msg = Msg_create_nopayload(PermissionQuery);
                msg->unpacked = true;
                msg->payload.permissionQuery = mumble_proto__permission_query__unpack(NULL, msgLen, msgData);
+               if (msg->payload.permissionQuery == NULL)
+                       goto err_out;
                break;
        }
        case ChannelRemove:
@@ -621,6 +670,8 @@ message_t *Msg_networkToMessage(uint8_t *data, int size)
                msg = Msg_create_nopayload(ChannelRemove);
                msg->unpacked = true;
                msg->payload.channelRemove = mumble_proto__channel_remove__unpack(NULL, msgLen, msgData);
+               if (msg->payload.channelRemove == NULL)
+                       goto err_out;
                break;
        }
 
@@ -629,4 +680,8 @@ message_t *Msg_networkToMessage(uint8_t *data, int size)
                break;
        }
        return msg;
+       
+err_out:
+       free(msg);
+       return NULL;
 }