From: pk910 Date: Fri, 14 Mar 2014 23:33:52 +0000 (+0100) Subject: [IOMultiplexerV2] moved iosocket_wants_reads && iosocket_wants_writes into own functions X-Git-Url: http://git.pk910.de/?p=NextIRCd.git;a=commitdiff_plain;h=fabcb01a858bd9a99346437f7cfb3a39f51214d1 [IOMultiplexerV2] moved iosocket_wants_reads && iosocket_wants_writes into own functions --- diff --git a/src/IOHandler/IOSockets.c b/src/IOHandler/IOSockets.c index b844d64..91e6926 100644 --- a/src/IOHandler/IOSockets.c +++ b/src/IOHandler/IOSockets.c @@ -809,7 +809,7 @@ static int iosocket_try_write(struct _IOSocket *iosock) { res = 0; } else { iosock->writebuf.bufpos -= res; - if((iosock->socket_flags & (IOSOCKETFLAG_ACTIVE & IOSOCKETFLAG_SHUTDOWN)) == IOSOCKETFLAG_ACTIVE) + if((iosock->socket_flags & (IOSOCKETFLAG_ACTIVE | IOSOCKETFLAG_SHUTDOWN)) == IOSOCKETFLAG_ACTIVE) engine->update(iosock); } return res; @@ -859,6 +859,28 @@ void iosocket_printf(struct IOSocket *iosocket, const char *text, ...) { } +int iosocket_wants_reads(struct _IOSocket *iosock) { + if((iosock->socket_flags & (IOSOCKETFLAG_SSL_READHS | IOSOCKETFLAG_SSL_WRITEHS))) + return ((iosock->socket_flags & IOSOCKETFLAG_SSL_WANTWRITE) ? 0 : 1); + if(!(iosock->socket_flags & IOSOCKETFLAG_OVERRIDE_WANT_RW)) + return 1; + else if((iosock->socket_flags & IOSOCKETFLAG_OVERRIDE_WANT_R)) + return 1; + return 0; +} +int iosocket_wants_writes(struct _IOSocket *iosock) { + if((iosock->socket_flags & (IOSOCKETFLAG_SSL_READHS | IOSOCKETFLAG_SSL_WRITEHS))) + return ((iosock->socket_flags & IOSOCKETFLAG_SSL_WANTWRITE) ? 1 : 0); + if(!(iosock->socket_flags & IOSOCKETFLAG_OVERRIDE_WANT_RW)) { + if(iosock->writebuf.bufpos || (iosock->socket_flags & IOSOCKETFLAG_CONNECTING)) + return 1; + else + return 0; + } else if((iosock->socket_flags & IOSOCKETFLAG_OVERRIDE_WANT_W)) + return 1; + return 0; +} + static void iosocket_trigger_event(struct IOSocketEvent *event) { if(!event->socket->callback) @@ -965,15 +987,22 @@ void iosocket_events_callback(struct _IOSocket *iosock, int readable, int writea else if((iosock->socket_flags & IOSOCKETFLAG_SSL_WRITEHS)) ssl_rehandshake = 2; } + iosocketevents_callback_retry_read: if((readable && ssl_rehandshake == 0) || ssl_rehandshake == 1) { int bytes; - if(iosock->readbuf.buflen - iosock->readbuf.bufpos >= 128) - iosocket_increase_buffer(&iosock->readbuf, iosock->readbuf.buflen + 1024); + if(iosock->readbuf.buflen - iosock->readbuf.bufpos >= 128) { + int addsize; + if(iosock->readbuf.buflen >= 2048) + addsize = 1024; + else + addsize = iosock->readbuf.buflen; + iosocket_increase_buffer(&iosock->readbuf, iosock->readbuf.buflen + addsize); + } if((iosock->socket_flags & IOSOCKETFLAG_SSLSOCKET)) bytes = iossl_read(iosock, iosock->readbuf.buffer + iosock->readbuf.bufpos, iosock->readbuf.buflen - iosock->readbuf.bufpos); else bytes = recv(iosock->fd, iosock->readbuf.buffer + iosock->readbuf.bufpos, iosock->readbuf.buflen - iosock->readbuf.bufpos, 0); - + if(bytes <= 0) { if((iosock->socket_flags & (IOSOCKETFLAG_SSLSOCKET | IOSOCKETFLAG_SSL_READHS)) == (IOSOCKETFLAG_SSLSOCKET | IOSOCKETFLAG_SSL_READHS)) { ssl_rehandshake = 1; @@ -987,6 +1016,7 @@ void iosocket_events_callback(struct _IOSocket *iosock, int readable, int writea int i; iolog_trigger(IOLOG_DEBUG, "received %d bytes (fd: %d). readbuf position: %d", bytes, iosock->fd, iosock->readbuf.bufpos); iosock->readbuf.bufpos += bytes; + int retry_read = (iosock->readbuf.bufpos == iosock->readbuf.buflen); callback_event.type = IOSOCKETEVENT_RECV; if(iosocket->parse_delimiter) { @@ -1035,6 +1065,8 @@ void iosocket_events_callback(struct _IOSocket *iosock, int readable, int writea callback_event.type = IOSOCKETEVENT_IGNORE; } else callback_event.data.recv_buf = &iosock->readbuf; + if(retry_read) + goto iosocketevents_callback_retry_read; } } if((writeable && ssl_rehandshake == 0) || ssl_rehandshake == 2) { diff --git a/src/IOHandler/IOSockets.h b/src/IOHandler/IOSockets.h index 50ed268..88be472 100644 --- a/src/IOHandler/IOSockets.h +++ b/src/IOHandler/IOSockets.h @@ -137,18 +137,8 @@ void iosocket_loop(int usec); void iosocket_lookup_callback(struct IOSocketDNSLookup *lookup, struct IODNSEvent *event); void iosocket_events_callback(struct _IOSocket *iosock, int readable, int writeable); -#define iosocket_wants_reads(IOSOCK) \ -(\ - ((IOSOCK->socket_flags & (IOSOCKETFLAG_SSL_READHS | IOSOCKETFLAG_SSL_WRITEHS)) && !(IOSOCK->socket_flags & IOSOCKETFLAG_SSL_WANTWRITE)) || \ - (!(IOSOCK->socket_flags & IOSOCKETFLAG_OVERRIDE_WANT_RW)) || \ - ((IOSOCK->socket_flags & (IOSOCKETFLAG_OVERRIDE_WANT_RW | IOSOCKETFLAG_OVERRIDE_WANT_R)) == (IOSOCKETFLAG_OVERRIDE_WANT_RW | IOSOCKETFLAG_OVERRIDE_WANT_R)) \ -) -#define iosocket_wants_writes(IOSOCK) \ -(\ - ((IOSOCK->socket_flags & (IOSOCKETFLAG_SSL_READHS | IOSOCKETFLAG_SSL_WRITEHS | IOSOCKETFLAG_SSL_WANTWRITE)) > IOSOCKETFLAG_SSL_WANTWRITE) || \ - (!(IOSOCK->socket_flags & IOSOCKETFLAG_OVERRIDE_WANT_RW) && (IOSOCK->writebuf.bufpos || (IOSOCK->socket_flags & IOSOCKETFLAG_CONNECTING))) || \ - ((IOSOCK->socket_flags & (IOSOCKETFLAG_OVERRIDE_WANT_RW | IOSOCKETFLAG_OVERRIDE_WANT_W)) == (IOSOCKETFLAG_OVERRIDE_WANT_RW | IOSOCKETFLAG_OVERRIDE_WANT_W)) \ -) +int iosocket_wants_reads(struct _IOSocket *iosock); +int iosocket_wants_writes(struct _IOSocket *iosock); #endif