X-Git-Url: http://git.code-monkey.de/?a=blobdiff_plain;f=src%2Fclient.c;h=240700e1253f1c270a6239c050289714dcbc8f70;hb=c4e1966b2719d116fa7f3ac1e31b5517c6568728;hp=1aea8e2fb5fadb32a66014f1182c761f2f84c875;hpb=0b2541420086a2e924ba5f192f36c137b958993c;p=umurmur.git diff --git a/src/client.c b/src/client.c index 1aea8e2..240700e 100644 --- a/src/client.c +++ b/src/client.c @@ -54,6 +54,7 @@ extern char system_string[], version_string[]; static int Client_read(client_t *client); static int Client_write(client_t *client); static int Client_send_udp(client_t *client, uint8_t *data, int len); +static client_t *Client_find_by_fd(int fd); void Client_free(client_t *client); declare_list(clients); @@ -426,17 +427,27 @@ void Client_disconnect_all() } } -int Client_read_fd(int fd) +client_t *Client_find_by_fd(int fd) { struct dlist *itr; - client_t *client = NULL; list_iterate(itr, &clients) { - if (fd == list_get_entry(itr, client_t, node)->tcpfd) { - client = list_get_entry(itr, client_t, node); - break; + client_t *client = list_get_entry(itr, client_t, node); + + if (client->tcpfd == fd) { + return client; } } + + return NULL; +} + +int Client_read_fd(int fd) +{ + client_t *client; + + client = Client_find_by_fd(fd); + if (client != NULL) return Client_read(client); else @@ -538,15 +549,10 @@ int Client_read(client_t *client) int Client_write_fd(int fd) { - struct dlist *itr; - client_t *client = NULL; + client_t *client; + + client = Client_find_by_fd(fd); - list_iterate(itr, &clients) { - if(fd == list_get_entry(itr, client_t, node)->tcpfd) { - client = list_get_entry(itr, client_t, node); - break; - } - } if (client != NULL) return Client_write(client); else @@ -658,20 +664,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); } @@ -679,22 +689,15 @@ void Client_textmessage(client_t *client, char *text) int Client_send_message_except(client_t *client, message_t *msg) { client_t *itr = NULL; - int count = 0; - Msg_inc_ref(msg); /* Make sure a reference is held during the whole iteration. */ while (Client_iterate(&itr) != NULL) { if (itr != client) { - if (count++ > 0) - Msg_inc_ref(msg); /* One extra reference for each new copy */ + Msg_inc_ref(msg); /* One extra reference for each new copy */ Log_debug("Msg %d to %s refcount %d", msg->messageType, itr->username, msg->refcount); Client_send_message(itr, msg); } } - Msg_free(msg); /* Free our reference to the message */ - - if (count == 0) - Msg_free(msg); /* If only 1 client is connected then no message is passed - * to Client_send_message(). Free it here. */ + Msg_free(msg); /* Consume caller's reference. */ return 0; } @@ -702,22 +705,15 @@ int Client_send_message_except(client_t *client, message_t *msg) int Client_send_message_except_ver(client_t *client, message_t *msg, uint32_t version) { client_t *itr = NULL; - int count = 0; - Msg_inc_ref(msg); /* Make sure a reference is held during the whole iteration. */ while (Client_iterate(&itr) != NULL) { if (itr != client) { - if (count++ > 0) - Msg_inc_ref(msg); /* One extra reference for each new copy */ + Msg_inc_ref(msg); /* One extra reference for each new copy */ Log_debug("Msg %d to %s refcount %d", msg->messageType, itr->username, msg->refcount); Client_send_message_ver(itr, msg, version); } } - Msg_free(msg); /* Free our reference to the message */ - - if (count == 0) - Msg_free(msg); /* If only 1 client is connected then no message is passed - * to Client_send_message(). Free it here. */ + Msg_free(msg); /* Consume caller's reference. */ return 0; } @@ -891,7 +887,7 @@ int Client_voiceMsg(client_t *client, uint8_t *data, int len) int offset, packetsize; voicetarget_t *vt; - channel_t *ch = (channel_t *)client->channel; + channel_t *ch = client->channel; struct dlist *itr; if (!client->authenticated || client->mute || client->self_mute || ch->silent) @@ -987,7 +983,7 @@ 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) {