Message queues stop working correctly after queue file is removed from /tmp.

Message queue API uses "ftok" which relies on the file being permanent. The
behaviour is undefined if the file is removed. Many systems clean out /tmp
periodically, so this can break if the message queue is long lived.

Create the queue file in /var/run.
---
 src/base/os_defs.c | 19 +++++++++++++++++--
 1 file changed, 17 insertions(+), 2 deletions(-)

diff --git a/src/base/os_defs.c b/src/base/os_defs.c
index da38cd71c..83458c208 100644
--- a/src/base/os_defs.c
+++ b/src/base/os_defs.c
@@ -55,6 +55,8 @@
 #include "base/osaf_time.h"
 #include "base/logtrace.h"
 
+#include "osaf/configmake.h"
+
 NCS_OS_LOCK gl_ncs_atomic_mtx;
 #ifndef NDEBUG
 bool gl_ncs_atomic_mtx_initialise = false;
@@ -658,7 +660,7 @@ uint32_t ncs_os_posix_mq(NCS_OS_POSIX_MQ_REQ_INFO *req)
 
                memset(&buf, 0, sizeof(struct msqid_ds));
 
-               sprintf(filename, "/tmp/%s%d", req->info.open.qname,
+               sprintf(filename, PKGPIDDIR "/%s%d", req->info.open.qname,
                        req->info.open.node);
 
                if (req->info.open.iflags & O_CREAT) {
@@ -669,6 +671,13 @@ uint32_t ncs_os_posix_mq(NCS_OS_POSIX_MQ_REQ_INFO *req)
                                return NCSCC_RC_FAILURE;
 
                        key = ftok(filename, 1);
+
+                       if (key < 0) {
+                               LOG_ER("ftok failed for %s: %i", filename,
+                                               errno);
+                               return NCSCC_RC_FAILURE;
+                       }
+
                        os_req.info.create.i_key = &key;
 
                        if (fclose(file) != 0)
@@ -678,6 +687,12 @@ uint32_t ncs_os_posix_mq(NCS_OS_POSIX_MQ_REQ_INFO *req)
                        os_req.req = NCS_OS_MQ_REQ_OPEN;
 
                        key = ftok(filename, 1);
+
+                       if (key < 0) {
+                               LOG_ER("ftok failed for %s: %i", filename,
+                                               errno);
+                               return NCSCC_RC_FAILURE;
+                       }
                        os_req.info.open.i_key = &key;
                }
 
@@ -721,7 +736,7 @@ uint32_t ncs_os_posix_mq(NCS_OS_POSIX_MQ_REQ_INFO *req)
                char filename[264];
 
                memset(filename, 0, sizeof(filename));
-               sprintf(filename, "/tmp/%s%d", req->info.unlink.qname,
+               sprintf(filename, PKGPIDDIR "%s%d", req->info.unlink.qname,
                        req->info.unlink.node);
 
                if (unlink(filename) != 0)
-- 
2.21.1


-----------------------------------------------------------------------------------------------------------------------
Notice: This e-mail together with any attachments may contain information of 
Ribbon Communications Inc. that
is confidential and/or proprietary for the sole use of the intended recipient.  
Any review, disclosure, reliance or
distribution by others or forwarding without express permission is strictly 
prohibited.  If you are not the intended
recipient, please notify the sender immediately and then delete all copies, 
including any attachments.
-----------------------------------------------------------------------------------------------------------------------

_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to