From 4353ba5cdf0dab29e30997ce5b67055c8f1e1cba Mon Sep 17 00:00:00 2001 From: Shehjar Tikoo Date: Tue, 5 May 2009 15:58:38 +0530 Subject: libglusterfsclient: Add lightweight path resolution Signed-off-by: Anand V. Avati --- libglusterfsclient/src/libglusterfsclient.c | 385 ++++++++++++++++++++++------ 1 file changed, 300 insertions(+), 85 deletions(-) (limited to 'libglusterfsclient/src') diff --git a/libglusterfsclient/src/libglusterfsclient.c b/libglusterfsclient/src/libglusterfsclient.c index 25d746d74..6d8910fe1 100755 --- a/libglusterfsclient/src/libglusterfsclient.c +++ b/libglusterfsclient/src/libglusterfsclient.c @@ -388,6 +388,130 @@ xlator_graph_fini (xlator_t *xl) } } +/* Returns a pointer to the @n'th char matching + * @c in string @str, starting the search from right or + * end-of-string, rather than starting from left, as rindex + * function does. + */ +char * +libgf_rrindex (char *str, int c, int n) +{ + int len = 0; + int occurrence = 0; + + if (str == NULL) + return NULL; + + len = strlen (str); + /* Point to last character of string. */ + str += (len - 1); + while (len > 0) { + if ((int)*str == c) { + ++occurrence; + if (occurrence == n) + break; + } + --len; + --str; + } + + return str; +} + +char * +libgf_trim_to_prev_dir (char * path) +{ + char *idx = NULL; + + if (!path) + return NULL; + + /* Check if we're already at root, if yes + * then there is no prev dir. + */ + if (strlen (path) == 1) + return path; + + idx = libgf_rrindex (path, '/', 1); + /* Move to the char after the / */ + ++idx; + *idx = '\0'; + + return path; +} + +/* Performs a lightweight path resolution that only + * looks for . and .. and replaces those with the + * proper names. + * + * FIXME: This is a stop-gap measure till we have full + * fledge path resolution going in here. + * Function returns path strdup'ed so remember to FREE the + * string as required. + */ +char * +libgf_resolve_path_light (char *path) +{ + char *respath = NULL; + char *saveptr = NULL; + char *tok = NULL; + char *mypath = NULL; + int len = 0; + int addslash = 0; + + if (!path) + goto out; + + /* We dont as yet support relative paths anywhere in + * the lib. + */ + if (path[0] != '/') + goto out; + + mypath = strdup (path); + len = strlen (mypath); + respath = calloc (strlen(mypath) + 1, sizeof (char)); + if (respath == NULL) + goto out; + + /* The path only contains a / or a //, so simply add a / + * and return. + * This needs special handling because the loop below does + * not allow us to do so through strtok. + */ + if (((mypath[0] == '/') && (len == 1)) + || (strcmp (mypath, "//") == 0)) { + strcat (respath, "/"); + goto out; + } + + tok = strtok_r (mypath, "/", &saveptr); + addslash = 0; + strcat (respath, "/"); + while (tok) { + if (addslash) { + if ((strcmp (tok, ".") != 0) + && (strcmp (tok, "..") != 0)) { + strcat (respath, "/"); + } + } + + if ((strcmp (tok, ".") != 0) && (strcmp (tok, "..") != 0)) { + strcat (respath, tok); + addslash = 1; + } else if ((strcmp (tok, "..") == 0)) { + libgf_trim_to_prev_dir (respath); + addslash = 0; + } + + tok = strtok_r (NULL, "/", &saveptr); + } + +out: + if (mypath) + free (mypath); + return respath; +} void libgf_client_loc_wipe (loc_t *loc) @@ -1018,19 +1142,26 @@ glusterfs_mount (char *vmp, glusterfs_init_params_t *ipars) { glusterfs_handle_t vmphandle = NULL; int ret = -1; + char *vmp_resolved = NULL; GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, vmp, out); GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, ipars, out); + vmp_resolved = libgf_resolve_path_light (vmp); + if (!vmp_resolved) + goto out; + vmphandle = glusterfs_init (ipars); if (!vmphandle) { errno = EINVAL; goto out; } - ret = libgf_vmp_map_ghandle (vmp, vmphandle); + ret = libgf_vmp_map_ghandle (vmp_resolved, vmphandle); out: + if (vmp_resolved) + FREE (vmp_resolved); return ret; } @@ -1040,12 +1171,18 @@ glusterfs_umount (char *vmp) { struct vmp_entry *entry= NULL; int ret = -1; + char *vmp_resolved = NULL; + GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, vmp, out); - entry = libgf_vmp_search_entry (vmp); + vmp_resolved = libgf_resolve_path_light (vmp); + if (!vmp_resolved) + goto out; + + entry = libgf_vmp_search_entry (vmp_resolved); if (entry == NULL) { gf_log ("libglusterfsclient", GF_LOG_ERROR, - "path (%s) not mounted", vmp); + "path (%s) not mounted", vmp_resolved); goto out; } @@ -1055,7 +1192,7 @@ glusterfs_umount (char *vmp) if (entry->handle == NULL) { gf_log ("libglusterfsclient", GF_LOG_ERROR, "path (%s) has no corresponding glusterfs handle", - vmp); + vmp_resolved); goto out; } @@ -1063,6 +1200,9 @@ glusterfs_umount (char *vmp) libgf_free_vmp_entry (entry); out: + if (vmp_resolved) + FREE (vmp_resolved); + return ret; } @@ -1266,16 +1406,18 @@ glusterfs_glh_get (glusterfs_handle_t handle, const char *path, void *buf, GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, ctx, out); GF_VALIDATE_ABSOLUTE_PATH_OR_GOTO (LIBGF_XL_NAME, path, out); - loc.path = strdup (path); + loc.path = libgf_resolve_path_light ((char *)path); + if (!loc.path) + goto out; + op_ret = libgf_client_path_lookup (&loc, ctx, 0); if (op_ret == -1) { - gf_log ("libglusterfsclient", - GF_LOG_ERROR, - "path lookup failed for (%s)", path); + gf_log ("libglusterfsclient", GF_LOG_ERROR, + "path lookup failed for (%s)", loc.path); goto out; } - pathname = strdup (path); + pathname = strdup (loc.path); name = basename (pathname); op_ret = libgf_client_loc_fill (&loc, ctx, 0, loc.parent->ino, name); @@ -1636,6 +1778,7 @@ __glusterfs_glh_getxattr (glusterfs_handle_t handle, const char *path, libglusterfs_client_ctx_t *ctx = handle; char *file = NULL; dict_t *xattr_req = NULL; + char *pathres = NULL; GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, ctx, out); GF_VALIDATE_ABSOLUTE_PATH_OR_GOTO (LIBGF_XL_NAME, path, out); @@ -1646,16 +1789,19 @@ __glusterfs_glh_getxattr (glusterfs_handle_t handle, const char *path, goto out; } - loc.path = strdup (path); + pathres = libgf_resolve_path_light ((char *)path); + if (!pathres) + goto out; + + loc.path = strdup (pathres); op_ret = libgf_client_path_lookup (&loc, ctx, 1); if (op_ret == -1) { - gf_log ("libglusterfsclient", - GF_LOG_ERROR, - "path lookup failed for (%s)", path); + gf_log ("libglusterfsclient", GF_LOG_ERROR, + "path lookup failed for (%s)", loc.path); goto out; } - file = strdup (path); + file = strdup (pathres); file = basename (file); op_ret = libgf_client_loc_fill (&loc, ctx, 0, loc.parent->ino, file); if (op_ret == -1) { @@ -1681,7 +1827,7 @@ __glusterfs_glh_getxattr (glusterfs_handle_t handle, const char *path, goto do_getx; libgf_client_loc_wipe (&loc); - op_ret = libgf_realpath_loc_fill (ctx, (char *)path, &loc); + op_ret = libgf_realpath_loc_fill (ctx, (char *)pathres, &loc); if (op_ret == -1) goto out; @@ -1718,6 +1864,9 @@ out: dict_unref (dict); } + if (pathres) + FREE (pathres); + libgf_client_loc_wipe (&loc); return op_ret; @@ -1937,17 +2086,21 @@ glusterfs_glh_open (glusterfs_handle_t handle, const char *path, int flags,...) libglusterfs_client_inode_ctx_t *inode_ctx = NULL; mode_t mode = 0; va_list ap; + char *pathres = NULL; GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, ctx, out); GF_VALIDATE_ABSOLUTE_PATH_OR_GOTO (LIBGF_XL_NAME, path, out); - loc.path = strdup (path); + pathres = libgf_resolve_path_light ((char *)path); + if (!pathres) + goto out; + + loc.path = strdup (pathres); op_ret = libgf_client_path_lookup (&loc, ctx, 1); if ((op_ret == -1) && ((flags & O_CREAT) != O_CREAT)) { - gf_log ("libglusterfsclient", - GF_LOG_ERROR, - "path lookup failed for (%s)", path); + gf_log ("libglusterfsclient", GF_LOG_ERROR, + "path lookup failed for (%s)", loc.path); goto out; } @@ -1960,20 +2113,20 @@ glusterfs_glh_open (glusterfs_handle_t handle, const char *path, int flags,...) if ((op_ret == -1) && ((flags & O_CREAT) == O_CREAT)) { libgf_client_loc_wipe (&loc); - loc.path = strdup (path); + loc.path = strdup (pathres); op_ret = libgf_client_path_lookup (&loc, ctx, 0); if (op_ret == -1) { gf_log ("libglusterfsclient", GF_LOG_ERROR, - "path lookup failed for (%s) while trying to" - " create (%s)", dirname ((char *)path), path); + "path lookup failed for parent while trying to" + " create (%s)", pathres); goto out; } loc.inode = inode_new (ctx->itable); } - pathname = strdup (path); + pathname = strdup (pathres); name = basename (pathname); ret = libgf_client_loc_fill (&loc, ctx, 0, loc.parent->ino, name); @@ -2040,6 +2193,9 @@ out: FREE (pathname); } + if (pathres) + FREE (pathres); + return fd; } @@ -2225,20 +2381,24 @@ __glusterfs_glh_setxattr (glusterfs_handle_t handle, const char *path, libglusterfs_client_ctx_t *ctx = handle; char *tmppath = NULL; loc_t *realloc = NULL; + char *pathres = NULL; GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, ctx, out); GF_VALIDATE_ABSOLUTE_PATH_OR_GOTO (LIBGF_XL_NAME, path, out); - loc.path = strdup (path); + pathres = libgf_resolve_path_light ((char *)path); + if (!pathres) + goto out; + + loc.path = strdup (pathres); op_ret = libgf_client_path_lookup (&loc, ctx, 1); if (op_ret == -1) { - gf_log ("libglusterfsclient", - GF_LOG_ERROR, - "path lookup failed for (%s)", path); + gf_log ("libglusterfsclient", GF_LOG_ERROR, + "path lookup failed for (%s)", pathres); goto out; } - tmppath = strdup (path); + tmppath = strdup (pathres); op_ret = libgf_client_loc_fill (&loc, ctx, 0, loc.parent->ino, basename (tmppath)); @@ -2260,7 +2420,7 @@ __glusterfs_glh_setxattr (glusterfs_handle_t handle, const char *path, libgf_client_loc_wipe (&loc); realloc = &loc; - libgf_realpath_loc_fill (ctx, (char *)path, realloc); + libgf_realpath_loc_fill (ctx, (char *)pathres, realloc); do_setx: if (!op_ret) @@ -2268,6 +2428,9 @@ do_setx: size, flags); out: + if (pathres) + FREE (pathres); + libgf_client_loc_wipe (realloc); return op_ret; } @@ -3565,16 +3728,18 @@ __glusterfs_stat (glusterfs_handle_t handle, const char *path, GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, ctx, out); GF_VALIDATE_ABSOLUTE_PATH_OR_GOTO (LIBGF_XL_NAME, path, out); - loc.path = strdup (path); + loc.path = libgf_resolve_path_light ((char *)path); + if (!loc.path) + goto out; + op_ret = libgf_client_path_lookup (&loc, ctx, 1); if (op_ret == -1) { - gf_log ("libglusterfsclient", - GF_LOG_ERROR, - "path lookup failed for (%s)", path); + gf_log ("libglusterfsclient", GF_LOG_ERROR, + "path lookup failed for (%s)", loc.path); goto out; } - pathname = strdup (path); + pathname = strdup (loc.path); name = basename (pathname); op_ret = libgf_client_loc_fill (&loc, ctx, 0, loc.parent->ino, name); @@ -3599,7 +3764,7 @@ __glusterfs_stat (glusterfs_handle_t handle, const char *path, if (!S_ISLNK (loc.inode->st_mode)) goto lstat_fop; - op_ret = libgf_realpath_loc_fill (ctx, (char *)path, &targetloc); + op_ret = libgf_realpath_loc_fill (ctx, (char *)loc.path, &targetloc); if (op_ret == -1) goto out; real_loc = &targetloc; @@ -3843,7 +4008,10 @@ glusterfs_glh_mkdir (glusterfs_handle_t handle, const char *path, mode_t mode) GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, ctx, out); GF_VALIDATE_ABSOLUTE_PATH_OR_GOTO (LIBGF_XL_NAME, path, out); - loc.path = strdup (path); + loc.path = libgf_resolve_path_light ((char *)path); + if (!loc.path) + goto out; + op_ret = libgf_client_path_lookup (&loc, ctx, 1); if (op_ret == 0) { op_ret = -1; @@ -3857,7 +4025,7 @@ glusterfs_glh_mkdir (glusterfs_handle_t handle, const char *path, mode_t mode) goto out; } - pathname = strdup (path); + pathname = strdup (loc.path); name = basename (pathname); op_ret = libgf_client_loc_fill (&loc, ctx, 0, loc.parent->ino, name); @@ -3954,16 +4122,18 @@ glusterfs_glh_rmdir (glusterfs_handle_t handle, const char *path) GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, ctx, out); GF_VALIDATE_ABSOLUTE_PATH_OR_GOTO (LIBGF_XL_NAME, path, out); - loc.path = strdup (path); + loc.path = libgf_resolve_path_light ((char *)path); + if (!loc.path) + goto out; + op_ret = libgf_client_path_lookup (&loc, ctx, 1); if (op_ret == -1) { - gf_log ("libglusterfsclient", - GF_LOG_ERROR, - "path lookup failed for (%s)", path); + gf_log ("libglusterfsclient", GF_LOG_ERROR, + "path lookup failed for (%s)", loc.path); goto out; } - pathname = strdup (path); + pathname = strdup (loc.path); name = basename (pathname); op_ret = libgf_client_loc_fill (&loc, ctx, 0, loc.parent->ino, name); @@ -4060,12 +4230,14 @@ glusterfs_glh_chmod (glusterfs_handle_t handle, const char *path, mode_t mode) GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, ctx, out); GF_VALIDATE_ABSOLUTE_PATH_OR_GOTO (LIBGF_XL_NAME, path, out); - loc.path = strdup(path); + loc.path = libgf_resolve_path_light ((char *)path); + if (!loc.path) + goto out; op_ret = libgf_client_path_lookup (&loc, ctx, 1); if (op_ret == -1) goto out; - name = strdup (path); + name = strdup (loc.path); op_ret = libgf_client_loc_fill (&loc, ctx, 0, loc.parent->ino, basename (name)); if (op_ret == -1) { @@ -4154,12 +4326,15 @@ glusterfs_glh_chown (glusterfs_handle_t handle, const char *path, uid_t owner, GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, ctx, out); GF_VALIDATE_ABSOLUTE_PATH_OR_GOTO (LIBGF_XL_NAME, path, out); - loc.path = strdup (path); + loc.path = libgf_resolve_path_light ((char *)path); + if (!loc.path) + goto out; + op_ret = libgf_client_path_lookup (&loc, ctx, 1); if (op_ret == -1) goto out; - name = strdup (path); + name = strdup (loc.path); op_ret = libgf_client_loc_fill (&loc, ctx, 0, loc.parent->ino, basename ((char *)name)); if (op_ret == -1) { @@ -4210,13 +4385,15 @@ glusterfs_glh_opendir (glusterfs_handle_t handle, const char *path) GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, ctx, out); GF_VALIDATE_ABSOLUTE_PATH_OR_GOTO (LIBGF_XL_NAME, path, out); - loc.path = strdup (path); + loc.path = libgf_resolve_path_light ((char *)path); + if (!loc.path) + goto out; op_ret = libgf_client_path_lookup (&loc, ctx, 1); if (op_ret == -1) goto out; - name = strdup (path); + name = strdup (loc.path); op_ret = libgf_client_loc_fill (&loc, ctx, 0, loc.parent->ino, basename (name)); if (op_ret == -1) { @@ -4598,14 +4775,17 @@ glusterfs_glh_link (glusterfs_handle_t handle, const char *oldpath, GF_VALIDATE_ABSOLUTE_PATH_OR_GOTO (LIBGF_XL_NAME, oldpath, out); GF_VALIDATE_ABSOLUTE_PATH_OR_GOTO (LIBGF_XL_NAME, newpath, out); - old.path = strdup (oldpath); + old.path = libgf_resolve_path_light ((char *)oldpath); + if (!old.path) + goto out; + op_ret = libgf_client_path_lookup (&old, ctx, 1); if (op_ret == -1) { errno = ENOENT; goto out; } - oldname = strdup (oldpath); + oldname = strdup (old.path); op_ret = libgf_client_loc_fill (&old, ctx, 0, old.parent->ino, basename (oldname)); if (op_ret == -1) { @@ -4619,7 +4799,10 @@ glusterfs_glh_link (glusterfs_handle_t handle, const char *oldpath, goto out; } - new.path = strdup (newpath); + new.path = libgf_resolve_path_light ((char *)newpath); + if (!new.path) + goto out; + op_ret = libgf_client_path_lookup (&new, ctx, 1); if (op_ret == 0) { errno = EEXIST; @@ -4627,7 +4810,7 @@ glusterfs_glh_link (glusterfs_handle_t handle, const char *oldpath, goto out; } - newname = strdup (newpath); + newname = strdup (new.path); libgf_client_loc_fill (&new, ctx, 0, new.parent->ino, basename (newname)); op_ret = libgf_client_link (ctx, &old, &new); @@ -4737,15 +4920,18 @@ glusterfs_glh_statfs (glusterfs_handle_t handle, const char *path, GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, ctx, out); GF_VALIDATE_ABSOLUTE_PATH_OR_GOTO (LIBGF_XL_NAME, path, out); - loc.path = strdup (path); + loc.path = libgf_resolve_path_light ((char *)path); + if (!loc.path) + goto out; + op_ret = libgf_client_path_lookup (&loc, ctx, 1); if (op_ret == -1) { gf_log ("libglusterfsclient", GF_LOG_ERROR, - "path lookup failed for (%s)", path); + "path lookup failed for (%s)", loc.path); goto out; } - name = strdup (path); + name = strdup (loc.path); op_ret = libgf_client_loc_fill (&loc, ctx, 0, loc.parent->ino, basename (name)); if (op_ret == -1) { @@ -4819,15 +5005,17 @@ glusterfs_glh_statvfs (glusterfs_handle_t handle, const char *path, GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, ctx, out); GF_VALIDATE_ABSOLUTE_PATH_OR_GOTO (LIBGF_XL_NAME, path, out); - loc.path = strdup (path); + loc.path = libgf_resolve_path_light ((char *)path); + if (!loc.path) + goto out; op_ret = libgf_client_path_lookup (&loc, ctx, 1); if (op_ret == -1) { gf_log ("libglusterfsclient", GF_LOG_ERROR, - "path lookup failed for (%s)", path); + "path lookup failed for (%s)", loc.path); goto out; } - name = strdup (path); + name = strdup (loc.path); op_ret = libgf_client_loc_fill (&loc, ctx, 0, loc.parent->ino, basename (name)); if (op_ret == -1) { @@ -4926,26 +5114,32 @@ glusterfs_glh_rename (glusterfs_handle_t handle, const char *oldpath, GF_VALIDATE_ABSOLUTE_PATH_OR_GOTO (LIBGF_XL_NAME, oldpath, out); GF_VALIDATE_ABSOLUTE_PATH_OR_GOTO (LIBGF_XL_NAME, newpath, out); - oldloc.path = strdup (oldpath); + oldloc.path = libgf_resolve_path_light ((char *)oldpath); + if (!oldloc.path) + goto out; + op_ret = libgf_client_path_lookup (&oldloc, ctx, 1); if (op_ret == -1) { gf_log ("libglusterfsclient", GF_LOG_ERROR, - "path lookup failed for (%s)", oldpath); + "path lookup failed for (%s)", oldloc.path); goto out; } - newloc.path = strdup (newpath); + newloc.path = libgf_resolve_path_light ((char *)newpath); + if (!newloc.path) + goto out; + op_ret = libgf_client_path_lookup (&newloc, ctx, 1); if (op_ret == 0) { gf_log ("libglusterfsclient", GF_LOG_ERROR, - "newpath (%s) already exists, returning" - " EEXIST", newpath); + "newpath (%s) already exists, returning" + " EEXIST", newloc.path); errno = EEXIST; op_ret = -1; goto out; } - oldname = strdup (oldpath); + oldname = strdup (oldloc.path); op_ret = libgf_client_loc_fill (&oldloc, ctx, 0, oldloc.parent->ino, basename (oldname)); if (op_ret == -1) { @@ -4956,7 +5150,7 @@ glusterfs_glh_rename (glusterfs_handle_t handle, const char *oldpath, goto out; } - newname = strdup (newpath); + newname = strdup (newloc.path); op_ret = libgf_client_loc_fill (&newloc, ctx, 0, newloc.parent->ino, basename (newname)); if (op_ret == -1) { @@ -5074,15 +5268,18 @@ glusterfs_glh_utimes (glusterfs_handle_t handle, const char *path, GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, ctx, out); GF_VALIDATE_ABSOLUTE_PATH_OR_GOTO (LIBGF_XL_NAME, path, out); - loc.path = strdup (path); + loc.path = libgf_resolve_path_light ((char *)path); + if (!loc.path) + goto out; + op_ret = libgf_client_path_lookup (&loc, ctx, 1); if (op_ret == -1) { gf_log ("libglusterfsclient", GF_LOG_ERROR, - "path lookup failed for (%s)", path); + "path lookup failed for (%s)", loc.path); goto out; } - name = strdup (path); + name = strdup (loc.path); op_ret = libgf_client_loc_fill (&loc, ctx, 0, loc.parent->ino, basename (name)); if (op_ret == -1) { @@ -5142,15 +5339,18 @@ glusterfs_glh_utime (glusterfs_handle_t handle, const char *path, GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, ctx, out); GF_VALIDATE_ABSOLUTE_PATH_OR_GOTO (LIBGF_XL_NAME, path, out); - loc.path = strdup (path); + loc.path = libgf_resolve_path_light ((char *)path); + if (!loc.path) + goto out; + op_ret = libgf_client_path_lookup (&loc, ctx, 1); if (op_ret == -1) { gf_log ("libglusterfsclient", GF_LOG_ERROR, - "path lookup failed for (%s)", path); + "path lookup failed for (%s)", loc.path); goto out; } - name = strdup (path); + name = strdup (loc.path); op_ret = libgf_client_loc_fill (&loc, ctx, 0, loc.parent->ino, basename (name)); if (op_ret == -1) { @@ -5255,7 +5455,10 @@ glusterfs_glh_mknod(glusterfs_handle_t handle, const char *path, mode_t mode, GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, ctx, out); GF_VALIDATE_ABSOLUTE_PATH_OR_GOTO (LIBGF_XL_NAME, path, out); - loc.path = strdup (path); + loc.path = libgf_resolve_path_light ((char *)path); + if (!loc.path) + goto out; + op_ret = libgf_client_path_lookup (&loc, ctx, 1); if (op_ret == 0) { op_ret = -1; @@ -5269,7 +5472,7 @@ glusterfs_glh_mknod(glusterfs_handle_t handle, const char *path, mode_t mode, goto out; } - name = strdup (path); + name = strdup (loc.path); op_ret = libgf_client_loc_fill (&loc, ctx, 0, loc.parent->ino, basename (name)); if (op_ret == -1) { @@ -5327,7 +5530,10 @@ glusterfs_glh_mkfifo (glusterfs_handle_t handle, const char *path, mode_t mode) GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, ctx, out); GF_VALIDATE_ABSOLUTE_PATH_OR_GOTO (LIBGF_XL_NAME, path, out); - loc.path = strdup (path); + loc.path = libgf_resolve_path_light ((char *)path); + if (!loc.path) + goto out; + op_ret = libgf_client_path_lookup (&loc, ctx, 1); if (op_ret == 0) { op_ret = -1; @@ -5341,7 +5547,7 @@ glusterfs_glh_mkfifo (glusterfs_handle_t handle, const char *path, mode_t mode) goto out; } - name = strdup (path); + name = strdup (loc.path); op_ret = libgf_client_loc_fill (&loc, ctx, 0, loc.parent->ino, basename (name)); if (op_ret == -1) { @@ -5432,15 +5638,18 @@ glusterfs_glh_unlink (glusterfs_handle_t handle, const char *path) GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, ctx, out); GF_VALIDATE_ABSOLUTE_PATH_OR_GOTO (LIBGF_XL_NAME, path, out); - loc.path = strdup (path); + loc.path = libgf_resolve_path_light ((char *)path); + if (!loc.path) + goto out; + op_ret = libgf_client_path_lookup (&loc, ctx, 1); if (op_ret == -1) { gf_log ("libglusterfsclient", GF_LOG_ERROR, - "path lookup failed for (%s)", path); + "path lookup failed for (%s)", loc.path); goto out; } - name = strdup (path); + name = strdup (loc.path); op_ret = libgf_client_loc_fill (&loc, ctx, 0, loc.parent->ino, basename (name)); if (op_ret == -1) { @@ -5544,12 +5753,15 @@ glusterfs_glh_symlink (glusterfs_handle_t handle, const char *oldpath, /* Old path does not need to be interpreted or looked up */ oldloc.path = strdup (oldpath); - newloc.path = strdup (newpath); + newloc.path = libgf_resolve_path_light ((char *)newpath); + if (!newloc.path) + goto out; + op_ret = libgf_client_path_lookup (&newloc, ctx, 1); if (op_ret == 0) { gf_log ("libglusterfsclient", GF_LOG_ERROR, - "new path (%s) already exists, " - " returning EEXIST", newpath); + "new path (%s) already exists, " + " returning EEXIST", newloc.path); op_ret = -1; errno = EEXIST; goto out; @@ -5562,7 +5774,7 @@ glusterfs_glh_symlink (glusterfs_handle_t handle, const char *oldpath, } newloc.inode = inode_new (ctx->itable); - newname = strdup (newpath); + newname = strdup (newloc.path); op_ret = libgf_client_loc_fill (&newloc, ctx, 0, newloc.parent->ino, basename (newname)); @@ -5662,15 +5874,18 @@ glusterfs_glh_readlink (glusterfs_handle_t handle, const char *path, char *buf, GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, ctx, out); GF_VALIDATE_ABSOLUTE_PATH_OR_GOTO (LIBGF_XL_NAME, path, out); - loc.path = strdup (path); + loc.path = libgf_resolve_path_light ((char *)path); + if (!loc.path) + goto out; + op_ret = libgf_client_path_lookup (&loc, ctx, 1); if (op_ret == -1) { gf_log ("libglusterfsclient", GF_LOG_ERROR, - "path lookup failed for (%s)", path); + "path lookup failed for (%s)", loc.path); goto out; } - name = strdup (path); + name = strdup (loc.path); op_ret = libgf_client_loc_fill (&loc, ctx, 0, loc.parent->ino, basename (name)); if (op_ret == -1) { -- cgit