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);
}
}
if (!found) {
- cd = Memory_safeMalloc(1, sizeof(codec_t));
- memset(cd, 0, sizeof(codec_t));
+ cd = Memory_safeCalloc(1, sizeof(codec_t));
init_list_entry(&cd->node);
cd->codec = codec_itr->codec;
cd->count = 1;
SSLi_free(client->ssl);
close(client->tcpfd);
clientcount--;
- if (client->release)
- free(client->release);
- if (client->os)
- free(client->os);
- if (client->os_version)
- free(client->os_version);
- if (client->username)
- free(client->username);
- if (client->context)
- free(client->context);
+
+ free(client->release);
+ free(client->os);
+ free(client->os_version);
+ free(client->username);
+ free(client->context);
free(client);
if (authenticatedLeft)
}
}
-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
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
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;
}
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;
}
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)