Merged from silc_1_0_branch.
[silc.git] / lib / silcutil / win32 / silcwin32sockconn.c
index 44115731d1865fb38923db403bfde363122a2811..55f37e56fa6307f6feab57c5471fb9ed4d3a35e8 100644 (file)
@@ -33,6 +33,11 @@ int silc_socket_write(SilcSocketConnection sock)
   SOCKET fd = sock->sock;
   SilcBuffer src = sock->outbuf;
 
+  if (!src)
+    return -2;
+  if (SILC_IS_DISABLED(sock))
+    return -1;
+
   SILC_LOG_DEBUG(("Writing data to socket %d", fd));
 
   if (src->len > 0) {
@@ -44,9 +49,17 @@ int silc_socket_write(SilcSocketConnection sock)
        return -2;
       }
       SILC_LOG_ERROR(("Cannot write to socket: %d", (int)fd));
+      sock->sock_error = err;
       return -1;
     }
 
+    if (ret < src->len) {
+      SILC_LOG_DEBUG(("Wrote data %d of %d bytes, will write rest later",
+                     ret, src->len));
+      silc_buffer_pull(src, ret);
+      return -2;
+    }
+
     silc_buffer_pull(src, ret);
   }
 
@@ -67,6 +80,9 @@ int silc_socket_read(SilcSocketConnection sock)
   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(). */
@@ -88,6 +104,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;
   }
 
@@ -110,3 +127,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;
+}