#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>
#include <stdarg.h>
#ifndef EWOULDBLOCK
-#define EWOULDBLOCK EAGAIN
+#define EWOULDBLOCK WSAEWOULDBLOCK
#endif
struct _IOSocket *iosocket_first = NULL;
#endif
}
+static void iosocket_update_parent(struct _IOSocket *iosock) {
+ if((iosock->socket_flags & IOSOCKETFLAG_PARENT_PUBLIC)) {
+ struct IOSocket *iosocket = iosock->parent;
+ iosocket->ipv6 = ((iosock->socket_flags & IOSOCKETFLAG_IPV6SOCKET) ? 1 : 0);
+ if(!(iosock->socket_flags & IOSOCKETFLAG_LISTENING))
+ iosocket->remoteaddr = &iosock->dest.addr;
+ iosocket->localaddr = &iosock->bind.addr;
+ if(iosock->bind.addr.addresslen && (iosock->socket_flags & IOSOCKETFLAG_DYNAMIC_BIND)) {
+ free(iosock->bind.addr.address);
+ iosock->bind.addr.addresslen = 0;
+ }
+ if(!iosock->bind.addr.addresslen) {
+ iosock->socket_flags |= IOSOCKETFLAG_DYNAMIC_BIND;
+ if(iosocket->ipv6)
+ iosock->bind.addr.addresslen = sizeof(struct sockaddr_in6);
+ else
+ iosock->bind.addr.addresslen = sizeof(struct sockaddr_in);
+ iosock->bind.addr.address = malloc(iosock->bind.addr.addresslen);
+ getsockname(iosock->fd, (struct sockaddr *)iosock->bind.addr.address, (socklen_t *)&iosock->bind.addr.addresslen);
+ }
+ }
+}
+
static void iosocket_connect_finish(struct _IOSocket *iosock) {
int sockfd;
if((iosock->socket_flags & IOSOCKETFLAG_IPV6SOCKET))
ip6->sin6_family = AF_INET6;
ip6->sin6_port = htons(iosock->port);
- if(iosock->bind.addr.addresslen) {
+ if(iosock->bind.addr.addresslen && !(iosock->socket_flags & IOSOCKETFLAG_DYNAMIC_BIND)) {
struct sockaddr_in6 *ip6bind = (void*) iosock->bind.addr.address;
ip6bind->sin6_family = AF_INET6;
ip6bind->sin6_port = htons(0);
ip4->sin_family = AF_INET;
ip4->sin_port = htons(iosock->port);
- if(iosock->bind.addr.addresslen) {
+ if(iosock->bind.addr.addresslen && !(iosock->socket_flags & IOSOCKETFLAG_DYNAMIC_BIND)) {
struct sockaddr_in *ip4bind = (void*) iosock->bind.addr.address;
ip4bind->sin_family = AF_INET;
ip4bind->sin_port = htons(0);
listen(sockfd, 1);
iosock->fd = sockfd;
+ iosocket_update_parent(iosock);
iosocket_activate(iosock);
}
new_iosock->socket_flags |= IOSOCKETFLAG_SSLSOCKET;
\r
iossl_client_accepted(iosock, new_iosock);
+ } else {
+ //initialize readbuf
+ iosocket_increase_buffer(&iosock->readbuf, 1024);
}
+ iosocket_update_parent(new_iosock);
iosocket_activate(new_iosock);
return new_iosock;
}
iogc_add(iosocket);
}
+struct IODNSAddress *iosocket_get_remote_addr(struct IOSocket *iosocket) {
+ struct _IOSocket *iosock = iosocket->iosocket;
+ if(iosock == NULL) {
+ iolog_trigger(IOLOG_WARNING, "called iosocket_get_remote_addr for destroyed IOSocket in %s:%d", __FILE__, __LINE__);
+ return NULL;
+ }
+ if(iosock->socket_flags & IOSOCKETFLAG_PENDING_DESTDNS)
+ return NULL;
+ if(!iosock->dest.addr.addresslen)
+ return NULL;
+ return &iosock->dest.addr;
+}
+
+struct IODNSAddress *iosocket_get_local_addr(struct IOSocket *iosocket) {
+ struct _IOSocket *iosock = iosocket->iosocket;
+ if(iosock == NULL) {
+ iolog_trigger(IOLOG_WARNING, "called iosocket_get_local_addr for destroyed IOSocket in %s:%d", __FILE__, __LINE__);
+ return NULL;
+ }
+ if(iosock->socket_flags & IOSOCKETFLAG_PENDING_BINDDNS)
+ return NULL;
+ if(!iosock->bind.addr.addresslen)
+ return NULL;
+ return &iosock->bind.addr;
+}
+
static int iosocket_try_write(struct _IOSocket *iosock) {
if(!iosock->writebuf.bufpos && !(iosock->socket_flags & IOSOCKETFLAG_SSL_WRITEHS)) \r
return 0;
callback_event.type = IOSOCKETEVENT_CONNECTED;
engine->update(iosock);
+ iosocket_update_parent(iosock);
+
//initialize readbuf
iosocket_increase_buffer(&iosock->readbuf, 1024);
}
iosocketevents_callback_retry_read:
if((readable && ssl_rehandshake == 0) || ssl_rehandshake == 1) {
int bytes;
- if(iosock->readbuf.buflen - iosock->readbuf.bufpos >= 128) {
+ if(iosock->readbuf.buflen - iosock->readbuf.bufpos <= 128) {
int addsize;
if(iosock->readbuf.buflen >= 2048)
addsize = 1024;
else
addsize = iosock->readbuf.buflen;
+ if(addsize == 0) {
+ iolog_trigger(IOLOG_WARNING, "readbuf length is 0 when trying to read from fd %d", iosock->fd);
+ addsize = 512;
+ }
iosocket_increase_buffer(&iosock->readbuf, iosock->readbuf.buflen + addsize);
}
if((iosock->socket_flags & IOSOCKETFLAG_SSLSOCKET))
else
bytes = recv(iosock->fd, iosock->readbuf.buffer + iosock->readbuf.bufpos, iosock->readbuf.buflen - iosock->readbuf.bufpos, 0);
- if(bytes <= 0) {\r
+ if(bytes <= 0) {
+ int errcode;
+ #ifdef WIN32
+ errcode = WSAGetLastError();
+ #else
+ errcode = errno;
+ #endif\r
if((iosock->socket_flags & (IOSOCKETFLAG_SSLSOCKET | IOSOCKETFLAG_SSL_READHS)) == (IOSOCKETFLAG_SSLSOCKET | IOSOCKETFLAG_SSL_READHS)) {\r
ssl_rehandshake = 1;\r
- } else if (errno != EAGAIN || errno != EWOULDBLOCK) {
+ } else if (errcode != EAGAIN && errcode != EWOULDBLOCK) {
iosock->socket_flags |= IOSOCKETFLAG_DEAD;
callback_event.type = IOSOCKETEVENT_CLOSED;
- callback_event.data.errid = errno;
+ callback_event.data.errid = errcode;
}
} else {
int i;