Use Client_find_by_session() instead of a few open-coded loops.
[umurmur.git] / src / client.c
index d61de2b00a0297adda0f300a2ed750395998bac4..8f5fb7316b3e365a6afdf5ee51581eadab9ef025 100644 (file)
@@ -427,6 +427,21 @@ void Client_disconnect_all()
        }
 }
 
+client_t *Client_find_by_session(int session_id)
+{
+       struct dlist *itr;
+
+       list_iterate(itr, &clients) {
+               client_t *client = list_get_entry(itr, client_t, node);
+
+               if (client->sessionId == session_id) {
+                       return client;
+               }
+       }
+
+       return NULL;
+}
+
 client_t *Client_find_by_fd(int fd)
 {
        struct dlist *itr;
@@ -664,20 +679,24 @@ client_t *Client_iterate(client_t **client_itr)
        return c;
 }
 
-void Client_textmessage(client_t *client, char *text)
+void Client_textmessage(client_t *client, const char *text)
 {
        char *message;
        uint32_t *tree_id;
        message_t *sendmsg = NULL;
 
-       message = Memory_safeMalloc(1, strlen(text) + 1);
+       message = strdup(text);
+
+       if (message == NULL)
+               Log_fatal("Out of memory");
+
        tree_id = Memory_safeMalloc(1, sizeof(uint32_t));
        *tree_id = 0;
        sendmsg = Msg_create(TextMessage);
        sendmsg->payload.textMessage->message = message;
        sendmsg->payload.textMessage->n_tree_id = 1;
        sendmsg->payload.textMessage->tree_id = tree_id;
-       strcpy(message, text);
+
        Client_send_message(client, sendmsg);
 }
 
@@ -979,14 +998,14 @@ int Client_voiceMsg(client_t *client, uint8_t *data, int len)
                }
                /* Sessions */
                for (i = 0; i < TARGET_MAX_SESSIONS && vt->sessions[i] != -1; i++) {
-                       client_t *c;
+                       client_t *c = NULL;
                        buffer[0] = (uint8_t) (type | 2);
                        Log_debug("Whisper session %d", vt->sessions[i]);
-                       while (Client_iterate(&c) != NULL) {
-                               if (c->sessionId == vt->sessions[i]) {
-                                       Client_send_voice(client, c, buffer, pds->offset + 1, poslen);
-                                       break;
-                               }
+
+                       c = Client_find_by_session(vt->sessions[i]);
+
+                       if (c != NULL) {
+                               Client_send_voice(client, c, buffer, pds->offset + 1, poslen);
                        }
                }
        }