diff options
Diffstat (limited to 'src/include')
-rw-r--r-- | src/include/array.h | 24 | ||||
-rw-r--r-- | src/include/better_string.h | 24 | ||||
-rw-r--r-- | src/include/hash_table.h | 43 | ||||
-rw-r--r-- | src/include/helpers.h | 17 | ||||
-rw-r--r-- | src/include/opcodes.h | 47 | ||||
-rw-r--r-- | src/include/protocol.h | 68 | ||||
-rw-r--r-- | src/include/tsv.h | 16 |
7 files changed, 239 insertions, 0 deletions
diff --git a/src/include/array.h b/src/include/array.h new file mode 100644 index 0000000..d3004e3 --- /dev/null +++ b/src/include/array.h @@ -0,0 +1,24 @@ +#ifndef ARRAY_H +#define ARRAY_H + +#include <stdlib.h> +#define DEFAULT_ARR_LEN 10 + +typedef struct { + void **items; + size_t size; + size_t capacity; +} array_t; + +array_t *init_array(); + +void array_push(array_t *a, void *item); + +void *array_pop(array_t *a); + +void *array_del(array_t *a, unsigned int ind); + +void array_free(void *a, void (*freefunc)(void *)); + +array_t *array_reverse(array_t *a); +#endif diff --git a/src/include/better_string.h b/src/include/better_string.h new file mode 100644 index 0000000..41c0cfd --- /dev/null +++ b/src/include/better_string.h @@ -0,0 +1,24 @@ +#ifndef STRING_H +#define STRING_H + +#include <stdlib.h> +#define DEFAULT_STR_SIZE 10 + +typedef struct { + char *buf; + size_t len; + size_t size; +} string_t; + +string_t *init_string(const char *source); + +void string_push(string_t *s, char c); + +void string_concat(string_t *s1, string_t *s2); + +void string_concat_const(string_t *s, const char *src); + +char string_pop(string_t *s); + +void string_free(void *s); +#endif diff --git a/src/include/hash_table.h b/src/include/hash_table.h new file mode 100644 index 0000000..ea21e37 --- /dev/null +++ b/src/include/hash_table.h @@ -0,0 +1,43 @@ +#ifndef HASH_TABLE_H +#define HASH_TABLE_H + +#include <stdlib.h> +#define DEFAULT_HT_SIZE 500 + +typedef struct PAIR_STRUCT { + char *key; + void *v; +} pair_t; + +typedef struct NODE_STRUCT { + char *key; + void *v; + struct NODE_STRUCT *next; +} node_t; + +typedef struct { + node_t *head; + node_t *tail; +} sll_t; + +typedef struct { + sll_t **buckets; + size_t size; +} ht_t; + +node_t *init_node(char *key, void *v); + +void sll_push(sll_t *sll, char *key, void *v); + +void sll_delete(sll_t *sll, char *key); + +sll_t *sll_free(void *x, void (*freefunc)(void *)); + +void ht_insert(ht_t *ht, char *key, void *value); + +void ht_delete(ht_t *ht, char *key); + +void *ht_get(ht_t *ht, char *key); + +ht_t *init_ht(size_t size); +#endif diff --git a/src/include/helpers.h b/src/include/helpers.h new file mode 100644 index 0000000..5d46909 --- /dev/null +++ b/src/include/helpers.h @@ -0,0 +1,17 @@ +#ifndef HELPERS_H +#define HELPERS_H + +#include <stdlib.h> + +void die_lz(int code, const char *msg); + +void die(const char *msg); + +void *safe_calloc(unsigned int i, size_t size); + +void *safe_realloc(void *x, size_t size); + +void alloc_zero(void *ptr, size_t size); + +void nothing(void *); +#endif diff --git a/src/include/opcodes.h b/src/include/opcodes.h new file mode 100644 index 0000000..ff8400f --- /dev/null +++ b/src/include/opcodes.h @@ -0,0 +1,47 @@ +#ifndef OPCODES_H +#define OPCODES_H + +typedef enum { + CO_NOP, + CO_JN, /* join */ + CO_DM, + CO_PST, /* post */ + CO_MSG, + CO_REG, + CO_NCK, /* nick */ + CO_PNG, /* pong */ + CO_LVE, /* leave */ + CO_QT, /* quit*/ + + CO_CLM, /* claim channel */ + CO_DESC, /* change description */ + CO_TRSFR, /* ownership transfer of admin */ + CO_KCK, /* kick */ + CO_BAN, + CO_KNGT, /* knight */ + CO_DMT, /* demote */ + + CO_LOGS, /* allows users to download log file from date specified in unix time */ + + CO_UNRECOGNIZED +} copcode_t; + +typedef enum { + SO_SUCCESS, + SO_FAIL_PARSE, + SO_FAIL_NOPERM, + SO_FAIL_USER_TAKEN, + SO_FAIL_RATE, /* rate limit */ + SO_PNG, /* ping */ + SO_BYE, +} sopcode_t; + +char *decode_client_opcode(int op); + +char *decode_server_opcode(int op); + +int encode_client_opcode(char *c); + +int encode_server_opcode(char *c); + +#endif diff --git a/src/include/protocol.h b/src/include/protocol.h new file mode 100644 index 0000000..204a507 --- /dev/null +++ b/src/include/protocol.h @@ -0,0 +1,68 @@ +#ifndef PROTOCOL_H +#define PROTOCOL_H + +#include <time.h> +#include <stdbool.h> + +#include "array.h" +#include "better_string.h" +#include "hash_table.h" +#include <openssl/sha.h> + +#define MAX_OP_LEN 10 +#define MAX_ARG_LEN 50 +#define MAX_ARGS 5 +#define MAX_BUFSIZE 4096 +#define DEFAULT_PORT 11111 +#define MAX_CONNECTIONS 32768 +#define DEFAULT_TIMEOUT 6000 +#define USERNAME_SIZE 30 +#define KEYLEN 512 + +typedef struct { + string_t *nick; + bool is_guest; + int fd; + + /* list of channels where user is in */ + array_t *channels; + array_t *dms; + array_t *autojoin; + unsigned char passhash[SHA256_DIGEST_LENGTH]; +} user_t; + +typedef struct { + string_t *nick; + string_t *msg; + time_t time; +} message_t; + +typedef struct { + array_t *messages; + + user_t *admin; + array_t *mods; + + bool registered_only; + + bool invite_only; + array_t *allowed_users; + + array_t *users; + + string_t *chan_name; + string_t *desc; +} channel_t; + +typedef struct { + user_t *user1; + user_t *user2; + + array_t *messages; +} dm_t; + +string_t *encode_chanstate(ht_t *chans); + +string_t *encode_usersstate(ht_t *u); + +#endif diff --git a/src/include/tsv.h b/src/include/tsv.h new file mode 100644 index 0000000..57bb70a --- /dev/null +++ b/src/include/tsv.h @@ -0,0 +1,16 @@ +#ifndef TSV_H +#define TSV_H + +#include "better_string.h" + +typedef struct { + char *source; + unsigned int i; + char c; +} tsv_t; + +tsv_t *init_tsv(char *source); + +string_t *tsv_next(tsv_t *tsv); + +#endif |