X-Git-Url: https://jfr.im/git/irc/rqf/shadowircd.git/blobdiff_plain/cee7d8576df097061e13113381db8f9b1610343e..8db00894ab7750513d8750290e508b5802bc1fc5:/src/hash.c diff --git a/src/hash.c b/src/hash.c index 561c7dc..ccc74d6 100644 --- a/src/hash.c +++ b/src/hash.c @@ -39,6 +39,10 @@ #include "cache.h" #include "s_newconf.h" +#define hash_cli_fd(x) (x % CLI_FD_MAX) + +static rb_dlink_list clientbyfdTable[U_MAX]; + rb_dlink_list *clientTable; rb_dlink_list *channelTable; rb_dlink_list *idTable; @@ -660,6 +664,37 @@ clear_resv_hash(void) HASH_WALK_END } +void +add_to_cli_fd_hash(struct Client *client_p) +{ + rb_dlinkAddAlloc(client_p, &clientbyfdTable[hash_cli_fd(rb_get_fd(client_p->localClient->F))]); +} + + +void +del_from_cli_fd_hash(struct Client *client_p) +{ + unsigned int hashv; + hashv = hash_cli_fd(rb_get_fd(client_p->localClient->F)); + rb_dlinkFindDestroy(client_p, &clientbyfdTable[hashv]); +} + +struct Client * +find_cli_fd_hash(int fd) +{ + struct Client *target_p; + rb_dlink_node *ptr; + unsigned int hashv; + hashv = hash_cli_fd(fd); + RB_DLINK_FOREACH(ptr, clientbyfdTable[hashv].head) + { + target_p = ptr->data; + if(rb_get_fd(target_p->localClient->F) == fd) + return target_p; + } + return NULL; +} + static void output_hash(struct Client *source_p, const char *name, int length, int *counts, int deepest) {