summaryrefslogtreecommitdiffstats
path: root/cli/src/cli.c
diff options
context:
space:
mode:
Diffstat (limited to 'cli/src/cli.c')
-rw-r--r--cli/src/cli.c64
1 files changed, 64 insertions, 0 deletions
diff --git a/cli/src/cli.c b/cli/src/cli.c
index 8d37405c614..8a06c8abd76 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)
{