Merged from silc_1_0_branch (second merge).
[silc.git] / lib / silcutil / unix / silcunixsockconn.c
index 543fc833dc32a0b704ae2c518fbe2bf968c27a42..26d9dd73a15e362f138f25281288c11f059ae815 100644 (file)
@@ -33,6 +33,8 @@ int silc_socket_write(SilcSocketConnection sock)
   int fd = sock->sock;
   SilcBuffer src = sock->outbuf;
 
+  if (!src)
+    return -2;
   if (SILC_IS_DISABLED(sock))
     return -1;
 
@@ -41,7 +43,7 @@ int silc_socket_write(SilcSocketConnection sock)
   if (src->len > 0) {
     ret = write(fd, src->data, src->len);
     if (ret < 0) {
-      if (errno == EAGAIN) {
+      if (errno == EAGAIN || errno == EINTR) {
        SILC_LOG_DEBUG(("Could not write immediately, will do it later"));
        return -2;
       }
@@ -66,14 +68,15 @@ int silc_socket_write(SilcSocketConnection sock)
 }
 
 /* QoS read handler, this will call the read and write events to indicate
-   that data is available again after a timeout */
+   that data is available again after a timeout. */
 
 SILC_TASK_CALLBACK(silc_socket_read_qos)
 {
   SilcSocketConnection sock = context;
   sock->qos->applied = TRUE;
-  silc_schedule_set_listen_fd(sock->qos->schedule, sock->sock,
-                             (SILC_TASK_READ | SILC_TASK_WRITE), TRUE);
+  if (sock->users > 1)
+    silc_schedule_set_listen_fd(sock->qos->schedule, sock->sock,
+                               (SILC_TASK_READ | SILC_TASK_WRITE), TRUE);
   sock->qos->applied = FALSE;
   silc_socket_free(sock);
 }