X-Git-Url: https://jfr.im/git/solanum.git/blobdiff_plain/b2f0da886e87529bd835e30da680d5c4284367ef..5a606a8f8c5c92f29b15ba017abd240b1136ab74:/src/packet.c diff --git a/src/packet.c b/src/packet.c index 98bace1b..f1d87cdc 100644 --- a/src/packet.c +++ b/src/packet.c @@ -24,8 +24,6 @@ * $Id: packet.c 3446 2007-05-14 22:21:16Z jilles $ */ #include "stdinc.h" -#include "tools.h" -#include "commio.h" #include "s_conf.h" #include "s_serv.h" #include "client.h" @@ -34,7 +32,6 @@ #include "parse.h" #include "packet.h" #include "irc_string.h" -#include "memory.h" #include "hook.h" #include "send.h" @@ -61,7 +58,7 @@ parse_client_queued(struct Client *client_p) if(client_p->localClient->sent_parsed >= client_p->localClient->allow_read) break; - dolen = linebuf_get(&client_p->localClient-> + dolen = rb_linebuf_get(&client_p->localClient-> buf_recvq, readBuf, READBUF_SIZE, LINEBUF_COMPLETE, LINEBUF_PARSED); @@ -91,7 +88,7 @@ parse_client_queued(struct Client *client_p) if(IsAnyServer(client_p) || IsExemptFlood(client_p)) { - while (!IsAnyDead(client_p) && (dolen = linebuf_get(&client_p->localClient->buf_recvq, + while (!IsAnyDead(client_p) && (dolen = rb_linebuf_get(&client_p->localClient->buf_recvq, readBuf, READBUF_SIZE, LINEBUF_COMPLETE, LINEBUF_PARSED)) > 0) { @@ -135,7 +132,7 @@ parse_client_queued(struct Client *client_p) else if(client_p->localClient->sent_parsed >= (4 * client_p->localClient->allow_read)) break; - dolen = linebuf_get(&client_p->localClient-> + dolen = rb_linebuf_get(&client_p->localClient-> buf_recvq, readBuf, READBUF_SIZE, LINEBUF_COMPLETE, LINEBUF_PARSED); @@ -168,43 +165,63 @@ flood_endgrace(struct Client *client_p) client_p->localClient->sent_parsed = 0; } -/* - * flood_recalc - * - * recalculate the number of allowed flood lines. this should be called - * once a second on any given client. We then attempt to flush some data. - */ -void -flood_recalc(int fd, void *data) -{ - struct Client *client_p = data; - struct LocalUser *lclient_p = client_p->localClient; - - /* This can happen in the event that the client detached. */ - if(!lclient_p) - return; - - /* allow a bursting client their allocation per second, allow - * a client whos flooding an extra 2 per second - */ - if(IsFloodDone(client_p)) - lclient_p->sent_parsed -= 2; - else - lclient_p->sent_parsed = 0; - - if(lclient_p->sent_parsed < 0) - lclient_p->sent_parsed = 0; - - if(--lclient_p->actually_read < 0) - lclient_p->actually_read = 0; - - parse_client_queued(client_p); - - if(IsAnyDead(client_p)) - return; - - /* and finally, reset the flood check */ - rb_setflush(fd, 1000, flood_recalc, client_p); +/* + * flood_recalc + * + * recalculate the number of allowed flood lines. this should be called + * once a second on any given client. We then attempt to flush some data. + */ +void +flood_recalc(void *unused) +{ + rb_dlink_node *ptr, *next; + struct Client *client_p; + + RB_DLINK_FOREACH_SAFE(ptr, next, lclient_list.head) + { + client_p = ptr->data; + + if(unlikely(IsMe(client_p))) + continue; + + if(unlikely(client_p->localClient == NULL)) + continue; + + if(IsFloodDone(client_p)) + client_p->localClient->sent_parsed -= 2; + else + client_p->localClient->sent_parsed = 0; + + if(client_p->localClient->sent_parsed < 0) + client_p->localClient->sent_parsed = 0; + + if(--client_p->localClient->actually_read < 0) + client_p->localClient->actually_read = 0; + + parse_client_queued(client_p); + + if(unlikely(IsAnyDead(client_p))) + continue; + + } + + RB_DLINK_FOREACH_SAFE(ptr, next, unknown_list.head) + { + client_p = ptr->data; + + if(client_p->localClient == NULL) + continue; + + client_p->localClient->sent_parsed--; + + if(client_p->localClient->sent_parsed < 0) + client_p->localClient->sent_parsed = 0; + + if(--client_p->localClient->actually_read < 0) + client_p->localClient->actually_read = 0; + + parse_client_queued(client_p); + } } /* @@ -285,7 +302,7 @@ read_ctrl_packet(int fd, void *data) reply->datalen |= *len; reply->gotdatalen++; if(reply->datalen > 0) - reply->data = MyMalloc(reply->datalen); + reply->data = rb_malloc(reply->datalen); } if(reply->gotdatalen < 2) @@ -322,7 +339,7 @@ read_ctrl_packet(int fd, void *data) /* reset SlinkRpl */ if(reply->datalen > 0) - MyFree(reply->data); + rb_free(reply->data); reply->command = 0; if(IsAnyDead(server)) @@ -377,8 +394,8 @@ read_packet(int fd, void *data) call_hook(h_iorecv_id, &hdata); #endif - if(client_p->localClient->lasttime < CurrentTime) - client_p->localClient->lasttime = CurrentTime; + if(client_p->localClient->lasttime < rb_current_time()) + client_p->localClient->lasttime = rb_current_time(); client_p->flags &= ~FLAGS_PINGSENT; /* @@ -389,7 +406,7 @@ read_packet(int fd, void *data) if(IsHandshake(client_p) || IsUnknown(client_p)) binary = 1; - lbuf_len = linebuf_parse(&client_p->localClient->buf_recvq, readBuf, length, binary); + lbuf_len = rb_linebuf_parse(&client_p->localClient->buf_recvq, readBuf, length, binary); lclient_p->actually_read += lbuf_len; @@ -404,7 +421,7 @@ read_packet(int fd, void *data) /* Check to make sure we're not flooding */ if(!IsAnyServer(client_p) && - (linebuf_alloclen(&client_p->localClient->buf_recvq) > ConfigFileEntry.client_flood)) + (rb_linebuf_alloclen(&client_p->localClient->buf_recvq) > ConfigFileEntry.client_flood)) { if(!(ConfigFileEntry.no_oper_flood && IsOper(client_p))) {