X-Git-Url: https://jfr.im/git/irc/rqf/shadowircd.git/blobdiff_plain/788813d6f3e942cc1d411d9dc366650b65ee7e1f..83251205659e33e5a21fc504db0e8495fabeed28:/src/client.c diff --git a/src/client.c b/src/client.c index a359069..b715333 100644 --- a/src/client.c +++ b/src/client.c @@ -40,7 +40,7 @@ #include "s_auth.h" #include "s_conf.h" #include "s_newconf.h" -#include "s_log.h" +#include "logger.h" #include "s_serv.h" #include "s_stats.h" #include "send.h" @@ -118,7 +118,7 @@ init_client(void) * start off the check ping event .. -- adrian * Every 30 seconds is plenty -- db */ - client_heap = rb_bh_create(sizeof(struct Client), CLIENT_HEAP_SIZE, "client_heap"); + client_heap = rb_bh_create(sizeof(struct Client), CLIENT_HEAP_SIZE, "client_heap"); lclient_heap = rb_bh_create(sizeof(struct LocalUser), LCLIENT_HEAP_SIZE, "lclient_heap"); pclient_heap = rb_bh_create(sizeof(struct PreClient), PCLIENT_HEAP_SIZE, "pclient_heap"); away_heap = rb_bh_create(AWAYLEN, AWAY_HEAP_SIZE, "away_heap"); @@ -126,6 +126,7 @@ init_client(void) rb_event_addish("check_pings", check_pings, NULL, 30); rb_event_addish("free_exited_clients", &free_exited_clients, NULL, 4); rb_event_addish("exit_aborted_clients", exit_aborted_clients, NULL, 1); + rb_event_add("flood_recalc", flood_recalc, NULL, 1); nd_dict = irc_dictionary_create(irccmp); } @@ -160,7 +161,7 @@ make_client(struct Client *from) client_p->localClient->lasttime = client_p->localClient->firsttime = rb_current_time(); client_p->localClient->F = NULL; - client_p->localClient->ctrlfd = -1; + client_p->localClient->ctrlF = NULL; client_p->preClient = (struct PreClient *) rb_bh_alloc(pclient_heap); @@ -456,7 +457,7 @@ check_banned_lines(void) continue; /* if there is a returned struct ConfItem then kill it */ - if((aconf = find_dline((struct sockaddr *)&client_p->localClient->ip))) + if((aconf = find_dline((struct sockaddr *)&client_p->localClient->ip, client_p->localClient->ip.ss_family))) { if(aconf->status & CONF_EXEMPTDLINE) continue; @@ -540,7 +541,7 @@ check_banned_lines(void) { client_p = ptr->data; - if((aconf = find_dline((struct sockaddr *)&client_p->localClient->ip))) + if((aconf = find_dline((struct sockaddr *)&client_p->localClient->ip,client_p->localClient->ip.ss_family))) { if(aconf->status & CONF_EXEMPTDLINE) continue; @@ -675,7 +676,7 @@ check_dlines(void) if(IsMe(client_p)) continue; - if((aconf = find_dline((struct sockaddr *)&client_p->localClient->ip) != NULL) + if((aconf = find_dline((struct sockaddr *)&client_p->localClient->ip,client_p->localClient->ip.ss_family)) != NULL) { if(aconf->status & CONF_EXEMPTDLINE) continue; @@ -694,7 +695,7 @@ check_dlines(void) { client_p = ptr->data; - if((aconf = find_dline((struct sockaddr *)&client_p->localClient->ip)) != NULL) + if((aconf = find_dline((struct sockaddr *)&client_p->localClient->ip,client_p->localClient->ip.ss_family)) != NULL) { if(aconf->status & CONF_EXEMPTDLINE) continue; @@ -1401,6 +1402,7 @@ exit_unknown_client(struct Client *client_p, struct Client *source_p, struct Cli const char *comment) { delete_auth_queries(source_p); + del_unknown_ip(source_p); rb_dlinkDelete(&source_p->localClient->tnode, &unknown_list); if(!IsIOError(source_p)) @@ -1710,8 +1712,8 @@ exit_client(struct Client *client_p, /* The local client originating the void count_local_client_memory(size_t * count, size_t * local_client_memory_used) { - size_t lusage; - rb_bh_usage(lclient_heap, count, NULL, &lusage, NULL); + size_t lusage; + rb_bh_usage(lclient_heap, count, NULL, &lusage, NULL); *local_client_memory_used = lusage + (*count * (sizeof(void *) + sizeof(struct Client))); } @@ -1721,10 +1723,10 @@ count_local_client_memory(size_t * count, size_t * local_client_memory_used) void count_remote_client_memory(size_t * count, size_t * remote_client_memory_used) { - size_t lcount, rcount; - rb_bh_usage(lclient_heap, &lcount, NULL, NULL, NULL); - rb_bh_usage(client_heap, &rcount, NULL, NULL, NULL); - *count = rcount - lcount; + size_t lcount, rcount; + rb_bh_usage(lclient_heap, &lcount, NULL, NULL, NULL); + rb_bh_usage(client_heap, &rcount, NULL, NULL, NULL); + *count = rcount - lcount; *remote_client_memory_used = *count * (sizeof(void *) + sizeof(struct Client)); } @@ -1951,7 +1953,7 @@ allocate_away(struct Client *client_p) void free_away(struct Client *client_p) { - if(client_p->user->away != NULL) { + if(client_p->user != NULL && client_p->user->away != NULL) { rb_bh_free(away_heap, client_p->user->away); client_p->user->away = NULL; } @@ -2083,15 +2085,20 @@ close_connection(struct Client *client_p) else ServerStats.is_ni++; - /* XXX ctrlFd was here!!! */ - if(client_p->localClient->F != NULL) - { - /* attempt to flush any pending linebufs. Evil, but .. -- adrian */ - if(!IsIOError(client_p)) - send_pop_queue(client_p); - del_from_cli_fd_hash(client_p); - rb_close(client_p->localClient->F); - client_p->localClient->F = NULL; + if(client_p->localClient->F) + { + /* attempt to flush any pending dbufs. Evil, but .. -- adrian */ + if(!IsIOError(client_p)) + send_queued(client_p); + + rb_close(client_p->localClient->F); + client_p->localClient->F = NULL; + } + + if(client_p->localClient->ctrlF) + { + rb_close(client_p->localClient->ctrlF); + client_p->localClient->ctrlF = NULL; } rb_linebuf_donebuf(&client_p->localClient->buf_sendq);