#include "IOSSLBackend.h"
#ifdef WIN32
+#ifdef _WIN32_WINNT
+#undef _WIN32_WINNT
+#endif
#define _WIN32_WINNT 0x501
-#include <windows.h>
#include <winsock2.h>
+#include <windows.h>
#include <ws2tcpip.h>
#else
#include <sys/socket.h>
void _init_sockets() {
#ifdef WIN32
WSADATA wsaData;
- int iResult;
+ int iResult;
//Initialize Winsock
- iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
- if(iResult != 0){
- iolog_trigger(IOLOG_ERROR, "WSAStartup returned error code: %d", iResult);
- }
+ iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
+ if(iResult != 0){
+ iolog_trigger(IOLOG_ERROR, "WSAStartup returned error code: %d", iResult);
+ }
#endif
iosockets_init_engine();\r
if((iosock->socket_flags & IOSOCKETFLAG_IPV6SOCKET)) {
struct sockaddr_in6 *ip6bind = (void*) iosock->bind.addr.address;
ip6bind->sin6_family = AF_INET6;
- ip6bind->sin6_port = htons(0);
+ ip6bind->sin6_port = htons(iosock->port);
int opt = 1;
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (const char*)&opt, sizeof(opt));
} else {
struct sockaddr_in *ip4bind = (void*) iosock->bind.addr.address;
ip4bind->sin_family = AF_INET;
- ip4bind->sin_port = htons(0);
+ ip4bind->sin_port = htons(iosock->port);
int opt = 1;
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (const char*)&opt, sizeof(opt));
}
new_iosocket->iosocket = new_iosock;
new_iosocket->status = IOSOCKET_CONNECTED;
+ new_iosocket->data = iosock;
new_iosock->parent = new_iosocket;
new_iosock->socket_flags |= IOSOCKETFLAG_PARENT_PUBLIC | IOSOCKETFLAG_INCOMING | (iosock->socket_flags & IOSOCKETFLAG_IPV6SOCKET);
struct IOSocket *iosocket_listen_ssl_flags(const char *hostname, unsigned int port, const char *certfile, const char *keyfile, iosocket_callback *callback, int flags) {
struct IOSocket *iosocket = iosocket_listen_flags(hostname, port, callback, flags);\r
struct _IOSocket *iosock = iosocket->iosocket;\r
- iosock->socket_flags |= IOSOCKETFLAG_SSLSOCKET | IOSOCKETFLAG_SSL_HANDSHAKE;\r
+ iosock->socket_flags |= IOSOCKETFLAG_SSLSOCKET;\r
iossl_listen(iosock, certfile, keyfile);
return iosocket;
}
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;
}
+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)
//incoming SSL connection accepted\r
iosock->socket_flags &= ~IOSOCKETFLAG_SSL_HANDSHAKE;\r
callback_event.type = IOSOCKETEVENT_ACCEPT;\r
- callback_event.data.accept_socket = iosock->parent;\r
+ callback_event.data.accept_socket = iosock->parent;
+ struct _IOSocket *parent_socket = iosocket->data;
+ callback_event.socket = parent_socket->parent;
+
+ //initialize readbuf
+ iosocket_increase_buffer(&iosock->readbuf, 1024);\r
} else {\r
//incoming SSL connection failed, simply drop\r
iosock->socket_flags |= IOSOCKETFLAG_DEAD;\r
else if((iosock->socket_flags & IOSOCKETFLAG_SSL_WRITEHS))\r
ssl_rehandshake = 2;\r
}
+ 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) {\r
if((iosock->socket_flags & (IOSOCKETFLAG_SSLSOCKET | IOSOCKETFLAG_SSL_READHS)) == (IOSOCKETFLAG_SSLSOCKET | IOSOCKETFLAG_SSL_READHS)) {\r
ssl_rehandshake = 1;\r
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) {
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) {