diff options
| author | Sachidananda <sac@gluster.com> | 2011-07-16 12:54:00 +0000 | 
|---|---|---|
| committer | Anand Avati <avati@gluster.com> | 2011-07-17 07:45:58 -0700 | 
| commit | 273f898364463cd10165fc82c8c5250a0962c452 (patch) | |
| tree | 6678fa75c2dcf17c84146c972b635ecee1e80d3b /cli/src | |
| parent | 260edb905171ebed3692eaeca404d13202cd5fd0 (diff) | |
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 <sac@gluster.com>
Signed-off-by: Anand Avati <avati@gluster.com>
BUG: 3183 (When creating volumes brick paths are not handled properly.)
URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=3183
Diffstat (limited to 'cli/src')
| -rw-r--r-- | cli/src/cli-cmd-parser.c | 6 | ||||
| -rw-r--r-- | cli/src/cli.c | 64 | ||||
| -rw-r--r-- | cli/src/cli.h | 3 | 
3 files changed, 71 insertions, 2 deletions
diff --git a/cli/src/cli-cmd-parser.c b/cli/src/cli-cmd-parser.c index 0097703f6c9..a767dfc35b7 100644 --- a/cli/src/cli-cmd-parser.c +++ b/cli/src/cli-cmd-parser.c @@ -75,13 +75,15 @@ cli_cmd_bricks_parse (const char **words, int wordcount, int brick_index,          brick_list_len++;          while (brick_index < wordcount) {                  if (validate_brick_name ((char *)words[brick_index])) { -                        cli_out ("wrong brick type: %s, use <HOSTNAME>:" +                        cli_out ("Wrong brick type: %s, use <HOSTNAME>:"                                   "<export-dir-abs-path>", words[brick_index]);                          ret = -1;                          goto out;                  } else {                          delimiter = strrchr (words[brick_index], ':'); -                        cli_path_strip_trailing_slashes (delimiter + 1); +                        ret = cli_canonicalize_path (delimiter + 1); +                        if (ret) +                                goto out;                  }                  if ((brick_list_len + strlen (words[brick_index]) + 1) > sizeof (brick_list)) { 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)  { diff --git a/cli/src/cli.h b/cli/src/cli.h index 0b94d6e36c2..ae4ebe7d99a 100644 --- a/cli/src/cli.h +++ b/cli/src/cli.h @@ -237,6 +237,9 @@ cli_rpc_notify (struct rpc_clnt *rpc, void *mydata, rpc_clnt_event_t event,  void  cli_path_strip_trailing_slashes (char *path); +int +cli_canonicalize_path (char *path); +  int32_t  cli_cmd_volume_profile_parse (const char **words, int wordcount,                                dict_t **options);  | 
