File bug-986644_pacemaker-libcrmcommon-errors-waiting-for-data.patch of Package pacemaker.3577

commit 4e2be138afeae6a94a685fcfea9d1b50ba817fec
Author: Ken Gaillot <kgaillot@redhat.com>
Date:   Thu Sep 15 10:16:22 2016 -0500

    Fix: libcrmcommon: report errors consistently when waiting for data on connection
    
    For some errors, crm_ipc_ready() and crm_remote_ready() would return -errno,
    while for other errors, they would return -1 and set errno, making it impossible
    for callers to reliably interpret the value. Now, they consistently return
    -errno on error.

diff --git a/lib/common/ipc.c b/lib/common/ipc.c
index 6d6d3cd..f060fcd 100644
--- a/lib/common/ipc.c
+++ b/lib/common/ipc.c
@@ -910,9 +910,18 @@ crm_ipc_connected(crm_ipc_t * client)
     return rc;
 }
 
+/*!
+ * \brief Check whether an IPC connection is ready to be read
+ *
+ * \param[in] client  Connection to check
+ *
+ * \return Positive value if ready to be read, 0 if not ready, -errno on error
+ */
 int
-crm_ipc_ready(crm_ipc_t * client)
+crm_ipc_ready(crm_ipc_t *client)
 {
+    int rc;
+
     CRM_ASSERT(client != NULL);
 
     if (crm_ipc_connected(client) == FALSE) {
@@ -920,7 +929,8 @@ crm_ipc_ready(crm_ipc_t * client)
     }
 
     client->pfd.revents = 0;
-    return poll(&(client->pfd), 1, 0);
+    rc = poll(&(client->pfd), 1, 0);
+    return (rc < 0)? -errno : rc;
 }
 
 static int
diff --git a/lib/common/remote.c b/lib/common/remote.c
index fd6a9c2..2042f78 100644
--- a/lib/common/remote.c
+++ b/lib/common/remote.c
@@ -440,14 +440,15 @@ crm_remote_parse_buffer(crm_remote_t * remote)
 
 /*!
  * \internal
- * \brief Determine if a remote session has data to read
+ * \brief Wait for a remote session to have data to read
  *
- * \retval 0, timeout occured.
- * \retval positive, data is ready to be read
- * \retval negative, session has ended
+ * \param[in] remote         Connection to check
+ * \param[in] total_timeout  Maximum time (in ms) to wait
+ *
+ * \return Positive value if ready to be read, 0 on timeout, -errno on error
  */
 int
-crm_remote_ready(crm_remote_t * remote, int total_timeout /* ms */ )
+crm_remote_ready(crm_remote_t *remote, int total_timeout)
 {
     struct pollfd fds = { 0, };
     int sock = 0;
@@ -493,7 +494,7 @@ crm_remote_ready(crm_remote_t * remote, int total_timeout /* ms */ )
         rc = poll(&fds, 1, timeout);
     } while (rc < 0 && errno == EINTR);
 
-    return rc;
+    return (rc < 0)? -errno : rc;
 }
 
 
@@ -631,12 +632,8 @@ crm_remote_recv(crm_remote_t * remote, int total_timeout /*ms */ , int *disconne
             crm_err("poll timed out (%d ms) while waiting to receive msg", remaining_timeout);
             return FALSE;
 
-        } else if (rc == -EAGAIN) {
-            crm_trace("waiting for remote connection data (up to %dms)",
-                      remaining_timeout);
-
         } else if(rc < 0) {
-            crm_debug("poll() failed: %s (%d)", pcmk_strerror(rc), rc);
+            crm_debug("could not poll: %s (%d)", pcmk_strerror(rc), rc);
 
         } else {
             rc = crm_remote_recv_once(remote);
openSUSE Build Service is sponsored by