Run dir (LOCALSTATEDIR/lib/corosync) was hardcoded thru whole codebase.
Totemsrp was trying to create and chdir into it, but also
takes into account environment variable COROSYNC_RUN_DIR creating
inconsistency.

get_run_dir correctly returns COROSYNC_RUN_DIR (when set) or
LOCALSTATEDIR/lib/corosync. This is now used by all functions instead of
hardcoded string.

All occurrences of mkdir/chdir are removed from totemsrp and chdir is
now called in main function.

Signed-off-by: Jan Friesse <[email protected]>
---
 exec/main.c       |   23 +++++++++++++++--------
 exec/totemsrp.c   |   26 +++-----------------------
 exec/util.c       |   21 +++++++++++++++++++++
 exec/util.h       |    5 +++++
 exec/votequorum.c |    3 ++-
 5 files changed, 46 insertions(+), 32 deletions(-)

diff --git a/exec/main.c b/exec/main.c
index 8cf551e..d630058 100644
--- a/exec/main.c
+++ b/exec/main.c
@@ -193,6 +193,7 @@ void corosync_state_dump (void)
 static void corosync_blackbox_write_to_file (void)
 {
        char fname[PATH_MAX];
+       char fdata_fname[PATH_MAX];
        char time_str[PATH_MAX];
        struct tm cur_time_tm;
        time_t cur_time_t;
@@ -203,17 +204,18 @@ static void corosync_blackbox_write_to_file (void)
 
        strftime(time_str, PATH_MAX, "%Y-%m-%dT%H:%M:%S", &cur_time_tm);
        snprintf(fname, PATH_MAX, "%s/fdata-%s-%lld",
-           LOCALSTATEDIR "/lib/corosync",
+           get_run_dir(),
            time_str,
            (long long int)getpid());
 
        if ((res = qb_log_blackbox_write_to_file(fname)) < 0) {
                LOGSYS_PERROR(-res, LOGSYS_LEVEL_ERROR, "Can't store blackbox 
file");
        }
-       unlink(LOCALSTATEDIR "/lib/corosync/fdata");
-       if (symlink(fname, LOCALSTATEDIR "/lib/corosync/fdata") == -1) {
+       snprintf(fdata_fname, sizeof(fdata_fname), "%s/fdata", get_run_dir());
+       unlink(fdata_fname);
+       if (symlink(fname, fdata_fname) == -1) {
                log_printf(LOGSYS_LEVEL_ERROR, "Can't create symlink to '%s' 
for corosync blackbox file '%s'",
-                   fname, LOCALSTATEDIR "/lib/corosync/fdata");
+                   fname, fdata_fname);
        }
 }
 
@@ -1085,7 +1087,6 @@ int main (int argc, char **argv, char **envp)
        int res, ch;
        int background, setprio;
        struct stat stat_out;
-       char corosync_lib_dir[PATH_MAX];
        enum e_corosync_done flock_err;
        uint64_t totem_config_warnings;
        struct scheduler_pause_timeout_data scheduler_pause_timeout_data;
@@ -1181,10 +1182,16 @@ int main (int argc, char **argv, char **envp)
        /*
         * Make sure required directory is present
         */
-       sprintf (corosync_lib_dir, "%s/lib/corosync", LOCALSTATEDIR);
-       res = stat (corosync_lib_dir, &stat_out);
+       res = stat (get_run_dir(), &stat_out);
        if ((res == -1) || (res == 0 && !S_ISDIR(stat_out.st_mode))) {
-               log_printf (LOGSYS_LEVEL_ERROR, "Required directory not present 
%s.  Please create it.", corosync_lib_dir);
+               log_printf (LOGSYS_LEVEL_ERROR, "Required directory not present 
%s.  Please create it.", get_run_dir());
+               corosync_exit_error (COROSYNC_DONE_DIR_NOT_PRESENT);
+       }
+
+       res = chdir(get_run_dir());
+       if (res == -1) {
+               log_printf (LOGSYS_LEVEL_ERROR, "Cannot chdir to run directory 
%s.  "
+                   "Please make sure it has correct context and rights.", 
get_run_dir());
                corosync_exit_error (COROSYNC_DONE_DIR_NOT_PRESENT);
        }
 
diff --git a/exec/totemsrp.c b/exec/totemsrp.c
index 5f5b7be..dc6b209 100644
--- a/exec/totemsrp.c
+++ b/exec/totemsrp.c
@@ -91,6 +91,7 @@
 #include "totemnet.h"
 
 #include "cs_queue.h"
+#include "util.h"
 
 #define LOCALHOST_IP                           inet_addr("127.0.0.1")
 #define QUEUE_RTR_ITEMS_SIZE_MAX               16384 /* allow 16384 retransmit 
items */
@@ -680,8 +681,6 @@ struct message_handlers totemsrp_message_handlers = {
        }
 };
 
-static const char *rundir = NULL;
-
 #define log_printf(level, format, args...)             \
 do {                                                   \
        instance->totemsrp_log_printf (                 \
@@ -843,28 +842,12 @@ int totemsrp_initialize (
                int waiting_trans_ack))
 {
        struct totemsrp_instance *instance;
-       unsigned int res;
 
        instance = malloc (sizeof (struct totemsrp_instance));
        if (instance == NULL) {
                goto error_exit;
        }
 
-       rundir = getenv ("COROSYNC_RUN_DIR");
-       if (rundir == NULL) {
-               rundir = LOCALSTATEDIR "/lib/corosync";
-       }
-
-       res = mkdir (rundir, 0700);
-       if (res == -1 && errno != EEXIST) {
-               goto error_destroy;
-       }
-
-       res = chdir (rundir);
-       if (res == -1) {
-               goto error_destroy;
-       }
-
        totemsrp_instance_initialize (instance);
 
        instance->totemsrp_waiting_trans_ack_cb_fn = waiting_trans_ack_cb_fn;
@@ -1033,9 +1016,6 @@ int totemsrp_initialize (
        *srp_context = instance;
        return (0);
 
-error_destroy:
-       free (instance);
-
 error_exit:
        return (-1);
 }
@@ -3321,7 +3301,7 @@ static void memb_ring_id_create_or_load (
        char filename[PATH_MAX];
 
        snprintf (filename, sizeof(filename), "%s/ringid_%s",
-               rundir, totemip_print (&instance->my_id.addr[0]));
+               get_run_dir(), totemip_print (&instance->my_id.addr[0]));
        fd = open (filename, O_RDONLY, 0700);
        /*
         * If file can be opened and read, read the ring id
@@ -3366,7 +3346,7 @@ static void memb_ring_id_set_and_store (
        memcpy (&instance->my_ring_id, ring_id, sizeof (struct memb_ring_id));
 
        snprintf (filename, sizeof(filename), "%s/ringid_%s",
-               rundir, totemip_print (&instance->my_id.addr[0]));
+               get_run_dir(), totemip_print (&instance->my_id.addr[0]));
 
        fd = open (filename, O_WRONLY, 0777);
        if (fd == -1) {
diff --git a/exec/util.c b/exec/util.c
index 343759d..c7d561e 100644
--- a/exec/util.c
+++ b/exec/util.c
@@ -170,3 +170,24 @@ int cs_name_tisEqual (cs_name_t *str1, char *str2) {
                return 0;
        }
 }
+
+const char *get_run_dir(void)
+{
+       static char path[PATH_MAX] = {'\0'};
+       char *env_run_dir;
+       int res;
+
+       if (path[0] == '\0') {
+               env_run_dir = getenv("COROSYNC_RUN_DIR");
+
+               if (env_run_dir != NULL && env_run_dir[0] != '\0') {
+                       res = snprintf(path, PATH_MAX, "%s", 
getenv("COROSYNC_RUN_DIR"));
+               } else {
+                       res = snprintf(path, PATH_MAX, "%s/%s", LOCALSTATEDIR, 
"lib/corosync");
+               }
+
+               assert(res < PATH_MAX);
+       }
+
+       return (path);
+}
diff --git a/exec/util.h b/exec/util.h
index 58f804b..63caf74 100644
--- a/exec/util.h
+++ b/exec/util.h
@@ -79,4 +79,9 @@ extern int cs_name_tisEqual (cs_name_t *str1, char *str2);
 const char * short_service_name_get(uint32_t service_id,
                                    char *buf, size_t buf_size);
 
+/*
+ * Return run directory (ether COROSYNC_RUN_DIR env or 
LOCALSTATEDIR/lib/corosync)
+ */
+const char *get_run_dir(void);
+
 #endif /* UTIL_H_DEFINED */
diff --git a/exec/votequorum.c b/exec/votequorum.c
index 1e913eb..650e38e 100644
--- a/exec/votequorum.c
+++ b/exec/votequorum.c
@@ -52,6 +52,7 @@
 #include <corosync/ipc_votequorum.h>
 
 #include "service.h"
+#include "util.h"
 
 LOGSYS_DECLARE_SUBSYS ("VOTEQ");
 
@@ -778,7 +779,7 @@ static int load_ev_tracking_barrier(void)
 
        ENTER();
 
-       snprintf(filename, sizeof(filename) - 1, LOCALSTATEDIR 
"/lib/corosync/ev_tracking");
+       snprintf(filename, sizeof(filename) - 1, "%s/ev_tracking", 
get_run_dir());
 
        ev_tracking_fd = open(filename, O_RDWR, 0700);
        if (ev_tracking_fd != -1) {
-- 
1.7.1

_______________________________________________
discuss mailing list
[email protected]
http://lists.corosync.org/mailman/listinfo/discuss

Reply via email to