Răsfoiți Sursa

Introduce get_run_dir function

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. Mkdir call is completely removed, because
it was not used anyway (check in main.c was called before totemsrp init,
so mkdir was never called) and also make install and/or package system
should take care of creating this directory with correct
permissions/context.

Signed-off-by: Jan Friesse <jfriesse@redhat.com>
Reviewed-by: Christine Caulfield <ccaulfie@redhat.com>
Jan Friesse 11 ani în urmă
părinte
comite
d310b251c3
5 a modificat fișierele cu 46 adăugiri și 32 ștergeri
  1. 15 8
      exec/main.c
  2. 3 23
      exec/totemsrp.c
  3. 21 0
      exec/util.c
  4. 5 0
      exec/util.h
  5. 2 1
      exec/votequorum.c

+ 15 - 8
exec/main.c

@@ -193,6 +193,7 @@ void corosync_state_dump (void)
 static void corosync_blackbox_write_to_file (void)
 static void corosync_blackbox_write_to_file (void)
 {
 {
 	char fname[PATH_MAX];
 	char fname[PATH_MAX];
+	char fdata_fname[PATH_MAX];
 	char time_str[PATH_MAX];
 	char time_str[PATH_MAX];
 	struct tm cur_time_tm;
 	struct tm cur_time_tm;
 	time_t cur_time_t;
 	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);
 	strftime(time_str, PATH_MAX, "%Y-%m-%dT%H:%M:%S", &cur_time_tm);
 	snprintf(fname, PATH_MAX, "%s/fdata-%s-%lld",
 	snprintf(fname, PATH_MAX, "%s/fdata-%s-%lld",
-	    LOCALSTATEDIR "/lib/corosync",
+	    get_run_dir(),
 	    time_str,
 	    time_str,
 	    (long long int)getpid());
 	    (long long int)getpid());
 
 
 	if ((res = qb_log_blackbox_write_to_file(fname)) < 0) {
 	if ((res = qb_log_blackbox_write_to_file(fname)) < 0) {
 		LOGSYS_PERROR(-res, LOGSYS_LEVEL_ERROR, "Can't store blackbox file");
 		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'",
 		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 res, ch;
 	int background, setprio;
 	int background, setprio;
 	struct stat stat_out;
 	struct stat stat_out;
-	char corosync_lib_dir[PATH_MAX];
 	enum e_corosync_done flock_err;
 	enum e_corosync_done flock_err;
 	uint64_t totem_config_warnings;
 	uint64_t totem_config_warnings;
 	struct scheduler_pause_timeout_data scheduler_pause_timeout_data;
 	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
 	 * 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))) {
 	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);
 		corosync_exit_error (COROSYNC_DONE_DIR_NOT_PRESENT);
 	}
 	}
 
 

+ 3 - 23
exec/totemsrp.c

@@ -91,6 +91,7 @@
 #include "totemnet.h"
 #include "totemnet.h"
 
 
 #include "cs_queue.h"
 #include "cs_queue.h"
+#include "util.h"
 
 
 #define LOCALHOST_IP				inet_addr("127.0.0.1")
 #define LOCALHOST_IP				inet_addr("127.0.0.1")
 #define QUEUE_RTR_ITEMS_SIZE_MAX		16384 /* allow 16384 retransmit items */
 #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...)		\
 #define log_printf(level, format, args...)		\
 do {							\
 do {							\
 	instance->totemsrp_log_printf (			\
 	instance->totemsrp_log_printf (			\
@@ -843,28 +842,12 @@ int totemsrp_initialize (
 		int waiting_trans_ack))
 		int waiting_trans_ack))
 {
 {
 	struct totemsrp_instance *instance;
 	struct totemsrp_instance *instance;
-	unsigned int res;
 
 
 	instance = malloc (sizeof (struct totemsrp_instance));
 	instance = malloc (sizeof (struct totemsrp_instance));
 	if (instance == NULL) {
 	if (instance == NULL) {
 		goto error_exit;
 		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);
 	totemsrp_instance_initialize (instance);
 
 
 	instance->totemsrp_waiting_trans_ack_cb_fn = waiting_trans_ack_cb_fn;
 	instance->totemsrp_waiting_trans_ack_cb_fn = waiting_trans_ack_cb_fn;
@@ -1033,9 +1016,6 @@ int totemsrp_initialize (
 	*srp_context = instance;
 	*srp_context = instance;
 	return (0);
 	return (0);
 
 
-error_destroy:
-	free (instance);
-
 error_exit:
 error_exit:
 	return (-1);
 	return (-1);
 }
 }
@@ -3321,7 +3301,7 @@ static void memb_ring_id_create_or_load (
 	char filename[PATH_MAX];
 	char filename[PATH_MAX];
 
 
 	snprintf (filename, sizeof(filename), "%s/ringid_%s",
 	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);
 	fd = open (filename, O_RDONLY, 0700);
 	/*
 	/*
 	 * If file can be opened and read, read the ring id
 	 * 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));
 	memcpy (&instance->my_ring_id, ring_id, sizeof (struct memb_ring_id));
 
 
 	snprintf (filename, sizeof(filename), "%s/ringid_%s",
 	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);
 	fd = open (filename, O_WRONLY, 0777);
 	if (fd == -1) {
 	if (fd == -1) {

+ 21 - 0
exec/util.c

@@ -170,3 +170,24 @@ int cs_name_tisEqual (cs_name_t *str1, char *str2) {
 		return 0;
 		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);
+}

+ 5 - 0
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,
 const char * short_service_name_get(uint32_t service_id,
 				    char *buf, size_t buf_size);
 				    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 */
 #endif /* UTIL_H_DEFINED */

+ 2 - 1
exec/votequorum.c

@@ -52,6 +52,7 @@
 #include <corosync/ipc_votequorum.h>
 #include <corosync/ipc_votequorum.h>
 
 
 #include "service.h"
 #include "service.h"
+#include "util.h"
 
 
 LOGSYS_DECLARE_SUBSYS ("VOTEQ");
 LOGSYS_DECLARE_SUBSYS ("VOTEQ");
 
 
@@ -778,7 +779,7 @@ static int load_ev_tracking_barrier(void)
 
 
 	ENTER();
 	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);
 	ev_tracking_fd = open(filename, O_RDWR, 0700);
 	if (ev_tracking_fd != -1) {
 	if (ev_tracking_fd != -1) {