ctdb-common: Add path support for datadir
authorMartin Schwenke <martin@meltin.net>
Fri, 6 Jul 2018 07:14:27 +0000 (17:14 +1000)
committerAmitay Isaacs <amitay@samba.org>
Wed, 11 Jul 2018 09:48:38 +0000 (11:48 +0200)
Signed-off-by: Martin Schwenke <martin@meltin.net>
Pair-programmed-with: Amitay Isaacs <amitay@gmail.com>
Reviewed-by: Amitay Isaacs <amitay@gmail.com>
ctdb/common/path.c
ctdb/common/path.h
ctdb/common/path_tool.c
ctdb/tests/cunit/path_tests_001.sh

index 4e69739ba8661b88428e9dc260fe112d8427d88f..36706e43b322ab506d417933715eb2513ca5ac46 100644 (file)
 
 struct {
        char *basedir;
+       char datadir[PATH_MAX];
        char etcdir[PATH_MAX];
        char rundir[PATH_MAX];
        char vardir[PATH_MAX];
        bool test_mode;
        bool basedir_set;
+       bool datadir_set;
        bool etcdir_set;
        bool rundir_set;
        bool vardir_set;
 } ctdb_paths = {
+       .datadir = CTDB_DATADIR,
        .etcdir = CTDB_ETCDIR,
        .rundir = CTDB_RUNDIR,
        .vardir = CTDB_VARDIR,
@@ -94,6 +97,22 @@ static bool path_construct(char *path, const char *subdir)
        return true;
 }
 
+const char *path_datadir(void)
+{
+       bool ok;
+
+       if (! ctdb_paths.datadir_set) {
+               ok = path_construct(ctdb_paths.datadir, "share");
+               if (!ok) {
+                       D_ERR("Failed to construct DATADIR\n");
+               } else {
+                       ctdb_paths.datadir_set = true;
+               }
+       }
+
+       return ctdb_paths.datadir;
+}
+
 const char *path_etcdir(void)
 {
        bool ok;
@@ -142,6 +161,11 @@ const char *path_vardir(void)
        return ctdb_paths.vardir;
 }
 
+char *path_datadir_append(TALLOC_CTX *mem_ctx, const char *path)
+{
+       return talloc_asprintf(mem_ctx, "%s/%s", path_datadir(), path);
+}
+
 char *path_etcdir_append(TALLOC_CTX *mem_ctx, const char *path)
 {
        return talloc_asprintf(mem_ctx, "%s/%s", path_etcdir(), path);
index 370250a0cfe691f2ec69ec93b20dfdc67c3de6f4..dcc6c20638df5f2bdb9fca064e81b7896b06e647 100644 (file)
 
 #include <talloc.h>
 
+const char *path_datadir(void);
 const char *path_etcdir(void);
 const char *path_rundir(void);
 const char *path_vardir(void);
 
+char *path_datadir_append(TALLOC_CTX *mem_ctx, const char *path);
 char *path_etcdir_append(TALLOC_CTX *mem_ctx, const char *path);
 char *path_rundir_append(TALLOC_CTX *mem_ctx, const char *path);
 char *path_vardir_append(TALLOC_CTX *mem_ctx, const char *path);
index 339066b582ea52a65359eb6780ba2523cb0fe704..1c60b023c427700f342b1b517ba6ce6e96537a2a 100644 (file)
@@ -100,6 +100,49 @@ static int path_tool_socket(TALLOC_CTX *mem_ctx,
        return 0;
 }
 
+static int path_tool_datadir(TALLOC_CTX *mem_ctx,
+                            int argc,
+                            const char **argv,
+                            void *private_data)
+{
+       struct path_tool_context *ctx = talloc_get_type_abort(
+               private_data, struct path_tool_context);
+
+       if (argc != 0) {
+               cmdline_usage(ctx->cmdline, "datadir");
+               return EINVAL;
+       }
+
+       printf("%s\n", path_datadir());
+
+       return 0;
+}
+
+static int path_tool_datadir_append(TALLOC_CTX *mem_ctx,
+                                   int argc,
+                                   const char **argv,
+                                   void *private_data)
+{
+       struct path_tool_context *ctx = talloc_get_type_abort(
+               private_data, struct path_tool_context);
+       char *p;
+
+       if (argc != 1) {
+               cmdline_usage(ctx->cmdline, "datadir append");
+               return EINVAL;
+       }
+
+       p = path_datadir_append(mem_ctx, argv[0]);
+       if (p == NULL) {
+               D_ERR("Memory allocation error\n");
+               return 1;
+       }
+
+       printf("%s\n", p);
+
+       return 0;
+}
+
 static int path_tool_etcdir(TALLOC_CTX *mem_ctx,
                            int argc,
                            const char **argv,
@@ -236,6 +279,10 @@ struct cmdline_command path_commands[] = {
          "Get path of CTDB daemon pidfile", "<daemon>" },
        { "socket", path_tool_socket,
          "Get path of CTDB daemon socket", "<daemon>" },
+       { "datadir append", path_tool_datadir_append,
+         "Get path relative to CTDB DATADIR", "<path>" },
+       { "datadir", path_tool_datadir,
+         "Get path of CTDB DATADIR", NULL },
        { "etcdir append", path_tool_etcdir_append,
          "Get path relative to CTDB ETCDIR", "<path>" },
        { "etcdir", path_tool_etcdir,
index 9637e6cea114e62123dd36768079a7b7631c4f68..7b2ff129b71e474241f14e037379674a76d48a4f 100755 (executable)
@@ -21,6 +21,11 @@ $CTDB_BASE/run/foobar.socket
 EOF
 unit_test ctdb-path socket foobar
 
+ok <<EOF
+$CTDB_BASE/share
+EOF
+unit_test ctdb-path datadir
+
 ok <<EOF
 $CTDB_BASE
 EOF
@@ -36,6 +41,11 @@ $CTDB_BASE/var
 EOF
 unit_test ctdb-path vardir
 
+ok <<EOF
+$CTDB_BASE/share/foobar
+EOF
+unit_test ctdb-path datadir append foobar
+
 ok <<EOF
 $CTDB_BASE/foobar
 EOF