From d91ce397babb7a30a284d8163cf08c5379e2f0cd Mon Sep 17 00:00:00 2001 From: Valery Yatsko Date: Wed, 2 Apr 2008 21:23:29 +0400 Subject: [PATCH] packet.c fixed --- src/packet.c | 121 ++++++++++++++++++++++++++------------------------- 1 file changed, 62 insertions(+), 59 deletions(-) diff --git a/src/packet.c b/src/packet.c index f7779ac3..054f4167 100644 --- a/src/packet.c +++ b/src/packet.c @@ -228,7 +228,7 @@ flood_recalc(void *unused) * read_packet - Read a 'packet' of data from a connection and process it. */ void -read_packet(int fd, void *data) +read_packet(rb_fde_t * F, void *data) { struct Client *client_p = data; struct LocalUser *lclient_p = client_p->localClient; @@ -239,82 +239,85 @@ read_packet(int fd, void *data) #ifdef USE_IODEBUG_HOOKS hook_data_int hdata; #endif - if(IsAnyDead(client_p)) - return; - /* - * Read some data. We *used to* do anti-flood protection here, but - * I personally think it makes the code too hairy to make sane. - * -- adrian - */ - length = client_p->localClient->F->read_impl(client_p->localClient->F, readBuf, READBUF_SIZE); - - if(length <= 0) + while(1) { - if((length == -1) && ignoreErrno(errno)) + if(IsAnyDead(client_p)) + return; + + /* + * Read some data. We *used to* do anti-flood protection here, but + * I personally think it makes the code too hairy to make sane. + * -- adrian + */ + length = rb_read(client_p->localClient->F, readBuf, READBUF_SIZE); + + if(length <= 0) { - rb_setselect(client_p->localClient->F->fd, FDLIST_IDLECLIENT, - COMM_SELECT_READ, read_packet, client_p, 0); + if(rb_ignore_errno(errno)) + { + rb_setselect(client_p->localClient->F, + RB_SELECT_READ, read_packet, client_p); + } else + error_exit_client(client_p, length); + return; + } + if(length == 0) + { + error_exit_client(client_p, length); return; } - error_exit_client(client_p, length); - return; - } #ifdef USE_IODEBUG_HOOKS - hdata.client = client_p; - hdata.arg1 = readBuf; - hdata.arg2 = length; - call_hook(h_iorecv_id, &hdata); + hdata.client = client_p; + hdata.arg1 = readBuf; + hdata.arg2 = length; + call_hook(h_iorecv_id, &hdata); #endif - if(client_p->localClient->lasttime < rb_current_time()) - client_p->localClient->lasttime = rb_current_time(); - client_p->flags &= ~FLAGS_PINGSENT; + if(client_p->localClient->lasttime < rb_current_time()) + client_p->localClient->lasttime = rb_current_time(); + client_p->flags &= ~FLAGS_PINGSENT; - /* - * Before we even think of parsing what we just read, stick - * it on the end of the receive queue and do it when its - * turn comes around. - */ - if(IsHandshake(client_p) || IsUnknown(client_p)) - binary = 1; + /* + * Before we even think of parsing what we just read, stick + * it on the end of the receive queue and do it when its + * turn comes around. + */ + if(IsHandshake(client_p) || IsUnknown(client_p)) + binary = 1; - lbuf_len = rb_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; + lclient_p->actually_read += lbuf_len; - if(IsAnyDead(client_p)) - return; - - /* Attempt to parse what we have */ - parse_client_queued(client_p); + if(IsAnyDead(client_p)) + return; + + /* Attempt to parse what we have */ + parse_client_queued(client_p); - if(IsAnyDead(client_p)) - return; - - /* Check to make sure we're not flooding */ - if(!IsAnyServer(client_p) && - (rb_linebuf_alloclen(&client_p->localClient->buf_recvq) > ConfigFileEntry.client_flood)) - { - if(!(ConfigFileEntry.no_oper_flood && IsOper(client_p))) + if(IsAnyDead(client_p)) + return; + + /* Check to make sure we're not flooding */ + if(!IsAnyServer(client_p) && + (rb_linebuf_alloclen(&client_p->localClient->buf_recvq) > ConfigFileEntry.client_flood)) { - exit_client(client_p, client_p, client_p, "Excess Flood"); + if(!(ConfigFileEntry.no_oper_flood && IsOper(client_p))) + { + exit_client(client_p, client_p, client_p, "Excess Flood"); + return; + } + } + + /* bail if short read */ + if(length < READBUF_SIZE) + { + rb_setselect(client_p->localClient->F, RB_SELECT_READ, read_packet, client_p); return; } } - - /* If we get here, we need to register for another COMM_SELECT_READ */ - if(PARSE_AS_SERVER(client_p)) - { - rb_setselect(client_p->localClient->F->fd, FDLIST_SERVER, COMM_SELECT_READ, - read_packet, client_p, 0); - } - else - { - rb_setselect(client_p->localClient->F->fd, FDLIST_IDLECLIENT, - COMM_SELECT_READ, read_packet, client_p, 0); - } } /*