-/* Copyright (C) 2009-2011, Martin Johansson <martin@fatbob.nu>
- Copyright (C) 2005-2011, Thorvald Natvig <thorvald@natvig.com>
+/* Copyright (C) 2009-2014, Martin Johansson <martin@fatbob.nu>
+ Copyright (C) 2005-2014, Thorvald Natvig <thorvald@natvig.com>
All rights reserved.
#ifndef CLIENT_H_45786678
#define CLIENT_H_45786678
-#include <config.h>
+#include "config.h"
#include <stdint.h>
#include <unistd.h> /* close() */
#include <sys/types.h>
#define BUFSIZE 8192
#define UDP_BUFSIZE 512
-#define INACTICITY_TIMEOUT 15 /* Seconds */
+#define INACTIVITY_TIMEOUT 15 /* Seconds */
#define MAX_CODECS 10
#define MAX_TOKENSIZE 64
#define MAX_TOKENS 32
+#define KEY_LENGTH sizeof(uint16_t) + 4 * sizeof(in_addr_t)
#define IS_AUTH(_a_) ((_a_)->authenticated)
+struct channel;
+
typedef struct {
- int tcpfd;
SSL_handle_t *ssl;
- bool_t SSLready;
- bool_t shutdown_wait;
- cryptState_t cryptState;
- bool_t readBlockedOnWrite, writeBlockedOnRead;
-
- struct sockaddr_in remote_tcp;
- struct sockaddr_in remote_udp;
- uint8_t rxbuf[BUFSIZE], txbuf[BUFSIZE];
- uint32_t rxcount, msgsize, drainleft, txcount, txsize;
- int sessionId;
- uint64_t key;
+ struct dlist node;
char *username;
- bool_t bUDP, authenticated, deaf, mute, recording;
char *os, *release, *os_version;
+ uint32_t rxcount, msgsize, drainleft, txcount, txsize;
+ int sessionId;
uint32_t version;
int codec_count;
struct dlist codecs;
- int availableBandwidth;
etimer_t lastActivity, connectTime, idleTime;
- struct dlist node;
struct dlist txMsgQueue;
int txQueueCount;
- void *channel; /* Ugly... */
+ int availableBandwidth;
+ struct channel *channel;
char *context;
struct dlist chan_node;
struct dlist voicetargets;
struct dlist tokens;
int tokencount;
- uint8_t hash[20];
- bool_t isAdmin;
+ int tcpfd;
float UDPPingAvg, UDPPingVar, TCPPingAvg, TCPPingVar;
uint32_t UDPPackets, TCPPackets;
+
+ bool_t SSLready;
+ bool_t shutdown_wait;
+ bool_t readBlockedOnWrite, writeBlockedOnRead;
+ bool_t bUDP, authenticated, deaf, mute, self_deaf, self_mute, recording, bOpus;
+ bool_t isAdmin;
+ bool_t isSuppressed;
+
+ struct sockaddr_storage remote_tcp;
+ struct sockaddr_storage remote_udp;
+
+ uint8_t key[KEY_LENGTH];
+ uint8_t hash[20];
+ cryptState_t cryptState;
+ uint8_t rxbuf[BUFSIZE], txbuf[BUFSIZE];
} client_t;
typedef struct {
void Client_init();
int Client_getfds(struct pollfd *pollfds);
void Client_janitor();
-int Client_add(int fd, struct sockaddr_in *remote);
+int Client_add(int fd, struct sockaddr_storage *remote);
int Client_read_fd(int fd);
int Client_write_fd(int fd);
int Client_send_message(client_t *client, message_t *msg);
void Client_close(client_t *client);
client_t *Client_iterate(client_t **client);
int Client_send_message_except(client_t *client, message_t *msg);
-int Client_read_udp(void);
+int Client_read_udp(int udpsock);
void Client_disconnect_all();
int Client_voiceMsg(client_t *client, uint8_t *data, int len);
-void recheckCodecVersions();
+void recheckCodecVersions(client_t *connectingClient);
void Client_codec_add(client_t *client, int codec);
void Client_codec_free(client_t *client);
codec_t *Client_codec_iterate(client_t *client, codec_t **codec_itr);
+void Client_textmessage(client_t *client, const char *text);
+bool_t Client_token_match(client_t *client, char const *str);
+void Client_token_free(client_t *client);
+void Client_token_add(client_t *client, char *token_string);
+
+/**
+ * Retrieve the client that matches the given session ID.
+ * Returns NULL if there's no such client.
+ */
+client_t *Client_find_by_session(int session_id);
#endif