Fix: send/received actual size is overwritten by 'expected' size
[lttng-tools.git] / src / common / unix.c
index d37313c5aed87ee6600b1953ce6ba84a97d6f660..141e85233ed7dea5c4a2c8b4deb1cab0dbafb72a 100644 (file)
@@ -220,6 +220,9 @@ ssize_t lttcomm_recv_unix_sock(int sock, void *buf, size_t len)
  * Receive data of size len in put that data into the buf param. Using recvmsg
  * API. Only use with sockets set in non-blocking mode.
  *
+ * NOTE: EPIPE errors are NOT reported. This call expects the socket to be in a
+ * poll set. The poll loop will handle the EPIPE original cause.
+ *
  * Return the size of received data.
  */
 LTTNG_HIDDEN
@@ -243,17 +246,24 @@ retry:
                        goto retry;
                } else {
                        /*
-                        * Only warn about EPIPE when quiet mode is
-                        * deactivated.
-                        * We consider EPIPE as expected.
+                        * We consider EPIPE and EAGAIN/EWOULDBLOCK as expected.
                         */
-                       if (errno != EPIPE || !lttng_opt_quiet) {
-                               PERROR("recvmsg");
+                       if (errno == EAGAIN || errno == EWOULDBLOCK ||
+                                       errno == EPIPE) {
+                               /*
+                                * Nothing was recv.
+                                */
+                               ret = 0;
+                               goto end;
                        }
+
+                       /* Unexpected error */
+                       PERROR("recvmsg");
+                       ret = -1;
                        goto end;
                }
        }
-       ret = len;
+
 end:
        return ret;
 }
@@ -308,6 +318,9 @@ end:
  * of the function is that this one does not retry to send on partial sends,
  * except if the interruption was caused by a signal (EINTR).
  *
+ * NOTE: EPIPE errors are NOT reported. This call expects the socket to be in a
+ * poll set. The poll loop will handle the EPIPE original cause.
+ *
  * Return the size of sent data.
  */
 LTTNG_HIDDEN
@@ -331,17 +344,24 @@ retry:
                        goto retry;
                } else {
                        /*
-                        * Only warn about EPIPE when quiet mode is
-                        * deactivated.
-                        * We consider EPIPE as expected.
+                        * We consider EPIPE and EAGAIN/EWOULDBLOCK as expected.
                         */
-                       if (errno != EPIPE || !lttng_opt_quiet) {
-                               PERROR("sendmsg");
+                       if (errno == EAGAIN || errno == EWOULDBLOCK ||
+                                       errno == EPIPE) {
+                               /*
+                                * This can happen in non blocking mode.
+                                * Nothing was sent.
+                                */
+                               ret = 0;
+                               goto end;
                        }
+
+                       /* Unexpected error */
+                       PERROR("sendmsg");
+                       ret = -1;
                        goto end;
                }
        }
-       ret = len;
 end:
        return ret;
 }
This page took 0.025004 seconds and 4 git commands to generate.