From 273f898364463cd10165fc82c8c5250a0962c452 Mon Sep 17 00:00:00 2001 From: Sachidananda Date: Sat, 16 Jul 2011 12:54:00 +0000 Subject: Canonicalize path names while creating volumes. When a volume is created resolve symbolic links, delete duplicate slashes in the path name. Signed-off-by: Sachidananda Urs Signed-off-by: Anand Avati BUG: 3183 (When creating volumes brick paths are not handled properly.) URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=3183 --- cli/src/cli.c | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) (limited to 'cli/src/cli.c') diff --git a/cli/src/cli.c b/cli/src/cli.c index 8d37405c6..8a06c8abd 100644 --- a/cli/src/cli.c +++ b/cli/src/cli.c @@ -568,6 +568,70 @@ 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; +} + void cli_path_strip_trailing_slashes (char *path) { -- cgit