[PATCH 1/2] Introduce get_run_dir function

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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 <jfriesse@xxxxxxxxxx>
---
 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
discuss@xxxxxxxxxxxx
http://lists.corosync.org/mailman/listinfo/discuss




[Index of Archives]     [Linux Clusters]     [Corosync Project]     [Linux USB Devel]     [Linux Audio Users]     [Photo]     [Yosemite News]    [Yosemite Photos]    [Linux Kernel]     [Linux SCSI]     [X.Org]

  Powered by Linux