Re: [PATCH 1/2] Introduce get_run_dir function

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

 



Chrissie,

> The mkdir() seems to have gone missing from this patch. There's a line
removing it, but a replacement doesn't appear anywhere else.


Yep. Actually, this is intentionally. We have test for dir existence right on the beginning of main.c. So I was thinking about remove that test and replace by mkdir, but:
- that directory should be created by make install
- directory should be installed with package with correct permissions and selinux context, ...

So for me, mkdir inside corosync seems to be just useless.


Also, I need to modify votequorum.c to use the get_run_dir() function.


Patch contains modified votequorum.c (ev_tracking).

Regards,
  Honza


Chrissie

On 30/05/14 13:39, Jan Friesse wrote:
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) {


_______________________________________________
discuss mailing list
discuss@xxxxxxxxxxxx
http://lists.corosync.org/mailman/listinfo/discuss

_______________________________________________
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