diff options
author | Rajesh Amaravathi <rajesh@redhat.com> | 2012-05-10 16:24:45 +0530 |
---|---|---|
committer | Anand Avati <avati@redhat.com> | 2012-05-22 00:53:12 -0700 |
commit | fa287178ac714071ceacf8697bd36cc8a8a8da00 (patch) | |
tree | 684f2e2fc6527c8873f395704d5b799146383837 | |
parent | bb2fc0a23e46413a14baef1846a9873681d32fe2 (diff) |
core: canonicalize paths
canonicalize paths during add-brick, creation of volume,
setting nfs.export-dir in volgen
BUG: 789870
Change-Id: I1d3788ac850359b0def0457113831e825a475d58
Signed-off-by: Rajesh Amaravathi <rajesh@redhat.com>
Reviewed-on: http://review.gluster.com/3315
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Anand Avati <avati@redhat.com>
-rw-r--r-- | cli/src/cli-cmd-parser.c | 16 | ||||
-rw-r--r-- | cli/src/cli.c | 64 | ||||
-rw-r--r-- | cli/src/cli.h | 3 | ||||
-rw-r--r-- | libglusterfs/src/common-utils.c | 52 | ||||
-rw-r--r-- | libglusterfs/src/common-utils.h | 1 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-utils.c | 3 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-volgen.c | 4 |
7 files changed, 63 insertions, 80 deletions
diff --git a/cli/src/cli-cmd-parser.c b/cli/src/cli-cmd-parser.c index 6c8d374ebc1..02eb2c36992 100644 --- a/cli/src/cli-cmd-parser.c +++ b/cli/src/cli-cmd-parser.c @@ -80,7 +80,7 @@ cli_cmd_bricks_parse (const char **words, int wordcount, int brick_index, goto out; } else { delimiter = strrchr (words[brick_index], ':'); - ret = cli_canonicalize_path (delimiter + 1); + ret = gf_canonicalize_path (delimiter + 1); if (ret) goto out; } @@ -979,7 +979,7 @@ cli_cmd_volume_remove_brick_parse (const char **words, int wordcount, goto out; } else { delimiter = strrchr(words[brick_index], ':'); - ret = cli_canonicalize_path (delimiter + 1); + ret = gf_canonicalize_path (delimiter + 1); if (ret) goto out; } @@ -1073,7 +1073,7 @@ cli_cmd_volume_replace_brick_parse (const char **words, int wordcount, goto out; } else { delimiter = strrchr ((char *)words[3], ':'); - ret = cli_canonicalize_path (delimiter + 1); + ret = gf_canonicalize_path (delimiter + 1); if (ret) goto out; } @@ -1094,7 +1094,7 @@ cli_cmd_volume_replace_brick_parse (const char **words, int wordcount, goto out; } else { delimiter = strrchr ((char *)words[4], ':'); - ret = cli_canonicalize_path (delimiter + 1); + ret = gf_canonicalize_path (delimiter + 1); if (ret) goto out; } @@ -1202,7 +1202,7 @@ cli_cmd_log_filename_parse (const char **words, int wordcount, dict_t **options) ret = -1; goto out; } else { - ret = cli_canonicalize_path (delimiter + 1); + ret = gf_canonicalize_path (delimiter + 1); if (ret) goto out; } @@ -1318,7 +1318,7 @@ cli_cmd_log_locate_parse (const char **words, int wordcount, dict_t **options) ret = -1; goto out; } else { - ret = cli_canonicalize_path (delimiter + 1); + ret = gf_canonicalize_path (delimiter + 1); if (ret) goto out; } @@ -1369,7 +1369,7 @@ cli_cmd_log_rotate_parse (const char **words, int wordcount, dict_t **options) ret = -1; goto out; } else { - ret = cli_canonicalize_path (delimiter + 1); + ret = gf_canonicalize_path (delimiter + 1); if (ret) goto out; } @@ -1758,7 +1758,7 @@ cli_cmd_volume_top_parse (const char **words, int wordcount, ret = -1; goto out; } else { - ret = cli_canonicalize_path (delimiter + 1); + ret = gf_canonicalize_path (delimiter + 1); if (ret) goto out; } diff --git a/cli/src/cli.c b/cli/src/cli.c index 6a5ecf698c9..89b5a8bd40f 100644 --- a/cli/src/cli.c +++ b/cli/src/cli.c @@ -577,70 +577,6 @@ cli_local_wipe (cli_local_t *local) return; } -/* If the path exists use realpath(3) to handle extra slashes and to resolve - * symlinks else strip the extra slashes in the path and return */ - -int -cli_canonicalize_path (char *path) -{ - struct stat sb = {0}; - int ret = -1; - char *tmppath = NULL; - char *dir = NULL; - char *tmpstr = NULL; - int path_len = 0; - - if (!path) - return ret; - - ret = stat (path, &sb); - if (ret == -1) { - /* Strip the extra slashes and return */ - tmppath = gf_strdup (path); - if (tmppath == NULL) { - ret = -1; - gf_log ("cli", GF_LOG_ERROR, "Out of memory."); - goto out; - } - bzero (path, strlen(path)); - path[0] = '/'; - dir = strtok_r(tmppath, "/", &tmpstr); - while (dir) { - strncpy ((path + path_len + 1), dir, strlen(dir)); - path_len = strlen (path); - dir = strtok_r(NULL, "/", &tmpstr); - if (dir) - strncpy((path + path_len), "/", 1); - } - if (path_len == 0) - path[1] = '\0'; - else - path[path_len] = '\0'; - ret = 0; - goto out; - } else { - tmppath = gf_strdup(path); - if (tmppath == NULL) { - ret = -1; - gf_log ("cli", GF_LOG_ERROR, "Out of memory."); - goto out; - } - if (realpath (tmppath, path) == NULL) { - cli_out ("Path manipulation failed: %s", - strerror(errno)); - gf_log ("cli", GF_LOG_ERROR, "Path manipulation " - "failed: %s", strerror(errno)); - ret = -1; - goto out; - } - ret = 0; - } -out: - if (tmppath) - GF_FREE(tmppath); - return ret; -} - struct cli_state *global_state; int diff --git a/cli/src/cli.h b/cli/src/cli.h index 0b769812c5d..76b92e91d47 100644 --- a/cli/src/cli.h +++ b/cli/src/cli.h @@ -262,9 +262,6 @@ int cli_rpc_notify (struct rpc_clnt *rpc, void *mydata, rpc_clnt_event_t event, void *data); -int -cli_canonicalize_path (char *path); - int32_t cli_cmd_volume_profile_parse (const char **words, int wordcount, dict_t **options); diff --git a/libglusterfs/src/common-utils.c b/libglusterfs/src/common-utils.c index 737487d1d72..c9c396762ab 100644 --- a/libglusterfs/src/common-utils.c +++ b/libglusterfs/src/common-utils.c @@ -1953,11 +1953,6 @@ out: * power of two is returned. */ -/* - * rounds up nr to next power of two. If nr is already a power of two, next - * power of two is returned. - */ - inline int32_t gf_roundup_next_power_of_two (uint32_t nr) { @@ -2092,3 +2087,50 @@ gf_strip_whitespace (char *str, int len) GF_FREE (new_str); return new_len; } + +/* If the path exists use realpath(3) to handle extra slashes and to resolve + * symlinks else strip the extra slashes in the path and return */ + +int +gf_canonicalize_path (char *path) +{ + int ret = -1; + int path_len = 0; + int dir_path_len = 0; + char *tmppath = NULL; + char *dir = NULL; + char *tmpstr = NULL; + + if (!path || *path != '/') + goto out; + + tmppath = gf_strdup (path); + if (!tmppath) + goto out; + + /* Strip the extra slashes and return */ + bzero (path, strlen(path)); + path[0] = '/'; + dir = strtok_r(tmppath, "/", &tmpstr); + + while (dir) { + dir_path_len = strlen(dir); + strncpy ((path + path_len + 1), dir, dir_path_len); + path_len += dir_path_len + 1; + dir = strtok_r (NULL, "/", &tmpstr); + if (dir) + strncpy ((path + path_len), "/", 1); + } + path[path_len] = '\0'; + ret = 0; + + out: + if (ret) + gf_log ("common-utils", GF_LOG_ERROR, + "Path manipulation failed"); + + if (tmppath) + GF_FREE(tmppath); + + return ret; +} diff --git a/libglusterfs/src/common-utils.h b/libglusterfs/src/common-utils.h index b2533ae175d..9903edad456 100644 --- a/libglusterfs/src/common-utils.h +++ b/libglusterfs/src/common-utils.h @@ -486,4 +486,5 @@ char *get_path_name (char *word, char **path); void gf_path_strip_trailing_slashes (char *path); uint64_t get_mem_size (); int gf_strip_whitespace (char *str, int len); +int gf_canonicalize_path (char *path); #endif /* _COMMON_UTILS_H */ diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.c b/xlators/mgmt/glusterd/src/glusterd-utils.c index 1b5a58dd73d..987244e7518 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.c +++ b/xlators/mgmt/glusterd/src/glusterd-utils.c @@ -763,7 +763,10 @@ glusterd_brickinfo_from_brick (char *brick, GF_ASSERT (path); ret = glusterd_brickinfo_new (&new_brickinfo); + if (ret) + goto out; + ret = gf_canonicalize_path (path); if (ret) goto out; diff --git a/xlators/mgmt/glusterd/src/glusterd-volgen.c b/xlators/mgmt/glusterd/src/glusterd-volgen.c index 4e2a40cd08c..c8ff573b10b 100644 --- a/xlators/mgmt/glusterd/src/glusterd-volgen.c +++ b/xlators/mgmt/glusterd/src/glusterd-volgen.c @@ -2686,6 +2686,10 @@ nfs_option_handler (volgen_graph_t *graph, volinfo->volname); if (ret != -1) { + ret = gf_canonicalize_path (vme->value); + if (ret) + return -1; + ret = xlator_set_option (xl, aa, vme->value); GF_FREE (aa); } |