X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=lib%2Fsilcutil%2Fwin32%2Fsilcwin32sockconn.c;h=144eeba9acc998ac7f728b324c15c2c3a1a82c36;hb=a818c5b5411bbc4436d1c5f011236985c96bb787;hp=8ef70c8b0462a8a34f63f0b8c2379d7fdb700480;hpb=17c97c1222b60f0ab5f43090395ddad45ec202f3;p=silc.git diff --git a/lib/silcutil/win32/silcwin32sockconn.c b/lib/silcutil/win32/silcwin32sockconn.c index 8ef70c8b..144eeba9 100644 --- a/lib/silcutil/win32/silcwin32sockconn.c +++ b/lib/silcutil/win32/silcwin32sockconn.c @@ -33,10 +33,13 @@ int silc_socket_write(SilcSocketConnection sock) SOCKET fd = sock->sock; SilcBuffer src = sock->outbuf; + if (SILC_IS_DISABLED(sock)) + return -1; + SILC_LOG_DEBUG(("Writing data to socket %d", fd)); if (src->len > 0) { - ret = recv(fd, src->data, src->len, 0); + ret = send(fd, src->data, src->len, 0); if (ret == SOCKET_ERROR) { err = WSAGetLastError(); if (err == WSAEWOULDBLOCK) { @@ -44,6 +47,7 @@ int silc_socket_write(SilcSocketConnection sock) return -2; } SILC_LOG_ERROR(("Cannot write to socket: %d", (int)fd)); + sock->sock_error = err; return -1; } @@ -65,9 +69,23 @@ int silc_socket_read(SilcSocketConnection sock) int len = 0, err; unsigned char buf[SILC_SOCKET_READ_SIZE]; SOCKET fd = sock->sock; + int argp; + + if (SILC_IS_DISABLED(sock)) + return -1; SILC_LOG_DEBUG(("Reading data from socket %d", fd)); + /* Check whether there is data available, without calling recv(). */ + ioctlsocket(fd, FIONREAD, (unsigned long *)&argp); + if (argp == 0) { + /* Is this kludge or what? Without this thing this contraption + does not work at all!?. */ + SleepEx(1, TRUE); + SILC_LOG_DEBUG(("Could not read immediately, will do it later")); + return -2; + } + /* Read the data from the socket. */ len = recv(fd, buf, sizeof(buf), 0); if (len == SOCKET_ERROR) { @@ -77,6 +95,7 @@ int silc_socket_read(SilcSocketConnection sock) return -2; } SILC_LOG_ERROR(("Cannot read from socket: %d", (int)fd)); + sock->sock_error = err; return -1; } @@ -99,3 +118,12 @@ int silc_socket_read(SilcSocketConnection sock) return len; } + +/* Returns human readable socket error message */ + +bool silc_socket_get_error(SilcSocketConnection sock, char *error, + SilcUInt32 error_len) +{ + /* XXX TODO */ + return FALSE; +}