[HANA_STATUS_HTTP_BROKEN_PIPE] = { "Close from server (http)", { 0, 1 }},
};
+/* checks if <err> is a real error for errno or one that can be ignored, and
+ * return 0 for these ones or <err> for real ones.
+ */
+static inline int unclean_errno(int err)
+{
+ if (err == EAGAIN || err == EINPROGRESS ||
+ err == EISCONN || err == EALREADY)
+ return 0;
+ return err;
+}
+
/*
* Convert check_status code to description
*/
int skerr;
socklen_t lskerr = sizeof(skerr);
- if (conn->flags & CO_FL_ERROR && ((errno && errno != EAGAIN) || !conn->ctrl))
+ if (conn->flags & CO_FL_ERROR && (unclean_errno(errno) || !conn->ctrl))
return 1;
if (!conn_ctrl_ready(conn))
if (getsockopt(conn->handle.fd, SOL_SOCKET, SO_ERROR, &skerr, &lskerr) == 0)
errno = skerr;
- if (errno == EAGAIN)
- errno = 0;
+ errno = unclean_errno(errno);
if (!errno) {
/* we could not retrieve an error, that does not mean there is
if (check->result != CHK_RES_UNKNOWN)
return;
- errno = errno_bck;
- if (conn && (!errno || errno == EAGAIN))
+ errno = unclean_errno(errno_bck);
+ if (conn && errno)
retrieve_errno_from_socket(conn);
if (conn && !(conn->flags & CO_FL_ERROR) &&
}
if (conn && conn->err_code) {
- if (errno && errno != EAGAIN)
+ if (unclean_errno(errno))
chunk_printf(&trash, "%s (%s)%s", conn_err_code_str(conn), strerror(errno),
chk->area);
else
err_msg = trash.area;
}
else {
- if (errno && errno != EAGAIN) {
+ if (unclean_errno(errno)) {
chunk_printf(&trash, "%s%s", strerror(errno),
chk->area);
err_msg = trash.area;