aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/psmq.c36
1 files changed, 23 insertions, 13 deletions
diff --git a/lib/psmq.c b/lib/psmq.c
index 914d559..6db30a5 100644
--- a/lib/psmq.c
+++ b/lib/psmq.c
@@ -321,6 +321,7 @@ int psmq_init
struct mq_attr mqa; /* mqueue attributes */
int ack; /* ACK from the broker after open */
size_t mqnamelen; /* length of mqname string */
+ int saveerrno; /* saved errno value */
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
@@ -341,6 +342,7 @@ int psmq_init
mqa.mq_maxmsg = maxmsg;
psmq->qsub = (mqd_t)-1;
psmq->qpub = (mqd_t)-1;
+ ack = 0;
/* if staled queue exist, remove it, so it
* doesn't do weird stuff */
@@ -418,28 +420,36 @@ int psmq_init
break;
}
- /* broker will return either 0 or errno to
- * indicate what went wrong on his side, if
- * ack is 0, broker will send file descriptor
- * to use when communicating with him. */
- if (ack != 0)
- {
- if (ack > 0)
- errno = ack;
-
- goto error;
- }
-
/* ack received and fd is valid,
* we are victorious */
- return 0;
+ if (ack == 0)
+ return 0;
error:
+ /* broker will return either 0 or errno to
+ * indicate what went wrong on his side, if
+ * ack is 0, broker will send file descriptor
+ * to use when communicating with him.
+ *
+ * if() is here, because we can get here when
+ * psmq_publish_msg() fails, in which case ack
+ * will be 0 and then we won't want to set errno
+ * as it's already set by psmq_publish_msg() */
+ if (ack > 0)
+ errno = ack;
+
+ /* some OSes like to overwrite errno with 0 when
+ * syscalls have succeded. It's unusuall but can
+ * happen (like on Solaris) */
+ saveerrno = errno;
+
mq_close(psmq->qpub);
mq_close(psmq->qsub);
mq_unlink(mqname);
psmq->qpub = (mqd_t)-1;
psmq->qsub = (mqd_t)-1;
+
+ errno = saveerrno;
return -1;
}