diff options
author | Shehjar Tikoo <shehjart@zresearch.com> | 2009-05-05 15:57:56 +0530 |
---|---|---|
committer | Anand V. Avati <avati@amp.gluster.com> | 2009-05-05 17:14:39 +0530 |
commit | 5cfa7a3a5ee9199399137e217597b1b97f7a4e38 (patch) | |
tree | b89f7471b8093df8558a3cc24815e5d03636ae66 /libglusterfsclient | |
parent | b46296282155281768407c93f878ba3823118463 (diff) |
libglusterfsclient: Improve path matching heuristic
Signed-off-by: Anand V. Avati <avati@amp.gluster.com>
Diffstat (limited to 'libglusterfsclient')
-rwxr-xr-x | libglusterfsclient/src/libglusterfsclient.c | 80 |
1 files changed, 73 insertions, 7 deletions
diff --git a/libglusterfsclient/src/libglusterfsclient.c b/libglusterfsclient/src/libglusterfsclient.c index 0a7b31e210a..36e7b4b0597 100755 --- a/libglusterfsclient/src/libglusterfsclient.c +++ b/libglusterfsclient/src/libglusterfsclient.c @@ -63,7 +63,22 @@ static int first_fini = 1; struct vmp_entry vmplist; int vmpentries = 0; -#define libgf_vmp_virtual_path(entry, path) ((char *)(path + (entry->vmplen-1))) +char * +libgf_vmp_virtual_path(struct vmp_entry *entry, const char *path) +{ + char *vpath = NULL; + char *tmp = NULL; + + vpath = calloc (strlen (path) + 1, sizeof (char)); + tmp = ((char *)(path + (entry->vmplen-1))); + if (tmp[0] != '/') { + vpath[0] = '/'; + strcat (&vpath[1], tmp); + } else + strcpy (vpath, tmp); + + return vpath; +} char * zr_build_process_uuid () @@ -907,7 +922,8 @@ out: } /* Returns the number of characters that match between an entry - * and the path. + * and the path. Assumes string1 is vmp entry. + * Assumes both are absolute paths. */ int libgf_strmatchcount (char *string1, int s1len, char *string2, int s2len) @@ -916,9 +932,6 @@ libgf_strmatchcount (char *string1, int s1len, char *string2, int s2len) int tosearch = 0; int matchcount = 0; - s1len = strlen (string1); - s2len = strlen (string2); - if (s1len <= s2len) tosearch = s1len; else @@ -937,7 +950,7 @@ libgf_strmatchcount (char *string1, int s1len, char *string2, int s2len) int libgf_vmp_entry_match (struct vmp_entry *entry, char *path) { - return libgf_strmatchcount (entry->vmp, entry->vmplen, path, + return libgf_strmatchcount (entry->vmp, (entry->vmplen - 1), path, strlen(path)); } @@ -966,7 +979,8 @@ libgf_vmp_search_entry (char *path) goto out; list_for_each_entry(entry, &vmplist.list, list) { matchcount = libgf_vmp_entry_match (entry, path); - if ((matchcount == entry->vmplen) && (matchcount > maxcount)) { + if ((matchcount == (entry->vmplen - 1)) && + (matchcount > maxcount)) { maxcount = matchcount; maxentry = entry; } @@ -1335,6 +1349,8 @@ glusterfs_get (const char *path, void *buf, size_t size, struct stat *stbuf) op_ret = glusterfs_glh_get (entry->handle, vpath, buf, size, stbuf); out: + if (vpath) + free (vpath); return op_ret; } @@ -1711,6 +1727,8 @@ glusterfs_getxattr (const char *path, const char *name, void *value, size); out: + if (vpath) + free (vpath); return op_ret; } @@ -1988,6 +2006,8 @@ glusterfs_open (const char *path, int flags, ...) } else fh = glusterfs_glh_open (entry->handle, vpath, flags); out: + if (vpath) + free (vpath); return fh; } @@ -2017,6 +2037,8 @@ glusterfs_creat (const char *path, mode_t mode) fh = glusterfs_glh_creat (entry->handle, vpath, mode); out: + if (vpath) + free (vpath); return fh; } @@ -2195,6 +2217,8 @@ glusterfs_setxattr (const char *path, const char *name, const void *value, op_ret = glusterfs_glh_setxattr (entry->handle, vpath, name, value, size, flags); out: + if (vpath) + free (vpath); return op_ret; } @@ -3521,6 +3545,8 @@ glusterfs_stat (const char *path, struct stat *buf) vpath = libgf_vmp_virtual_path (entry, path); op_ret = glusterfs_glh_stat (entry->handle, vpath, buf); out: + if (vpath) + free (vpath); return op_ret; } @@ -3549,6 +3575,8 @@ glusterfs_lstat (const char *path, struct stat *buf) vpath = libgf_vmp_virtual_path (entry, path); op_ret = glusterfs_glh_lstat (entry->handle, vpath, buf); out: + if (vpath) + free (vpath); return op_ret; } @@ -3773,6 +3801,8 @@ glusterfs_mkdir (const char *path, mode_t mode) vpath = libgf_vmp_virtual_path (entry, path); op_ret = glusterfs_glh_mkdir (entry->handle, vpath, mode); out: + if (vpath) + free (vpath); return op_ret; } @@ -3877,6 +3907,8 @@ glusterfs_rmdir (const char *path) vpath = libgf_vmp_virtual_path (entry, path); op_ret = glusterfs_glh_rmdir (entry->handle, vpath); out: + if (vpath) + free (vpath); return op_ret; } @@ -3967,6 +3999,8 @@ glusterfs_chmod (const char *path, mode_t mode) vpath = libgf_vmp_virtual_path (entry, path); op_ret = glusterfs_glh_chmod (entry->handle, vpath, mode); out: + if (vpath) + free (vpath); return op_ret; } @@ -4057,6 +4091,8 @@ glusterfs_chown (const char *path, uid_t owner, gid_t group) vpath = libgf_vmp_virtual_path (entry, path); op_ret = glusterfs_glh_chown (entry->handle, vpath, owner, group); out: + if (vpath) + free (vpath); return op_ret; } @@ -4136,6 +4172,8 @@ glusterfs_opendir (const char *path) vpath = libgf_vmp_virtual_path (entry, path); dir = glusterfs_glh_opendir (entry->handle, vpath); out: + if (vpath) + free (vpath); return dir; } @@ -4537,6 +4575,10 @@ glusterfs_link (const char *oldpath, const char *newpath) oldvpath = libgf_vmp_virtual_path (oldentry, oldpath); op_ret = glusterfs_glh_link (newentry->handle, oldvpath, newvpath); out: + if (newvpath) + free (newvpath); + if (oldvpath) + free (oldvpath); return op_ret; } @@ -4658,6 +4700,8 @@ glusterfs_statfs (const char *path, struct statfs *buf) vpath = libgf_vmp_virtual_path (entry, path); op_ret = glusterfs_glh_statfs (entry->handle, vpath, buf); out: + if (vpath) + free (vpath); return op_ret; } @@ -4719,6 +4763,8 @@ glusterfs_statvfs (const char *path, struct statvfs *buf) vpath = libgf_vmp_virtual_path (entry, path); op_ret = glusterfs_glh_statvfs (entry->handle, vpath, buf); out: + if (vpath) + free (vpath); return op_ret; } @@ -4866,6 +4912,10 @@ glusterfs_rename (const char *oldpath, const char *newpath) op_ret = glusterfs_glh_rename (old->handle, oldvpath, newvpath); out: + if (oldvpath) + free (oldvpath); + if (newvpath) + free (newvpath); return op_ret; } @@ -4972,6 +5022,8 @@ glusterfs_utimes (const char *path, const struct timeval times[2]) vpath = libgf_vmp_virtual_path (entry, path); op_ret = glusterfs_glh_utimes (entry->handle, vpath, times); out: + if (vpath) + free (vpath); return op_ret; } @@ -5040,6 +5092,8 @@ glusterfs_utime (const char *path, const struct utimbuf *buf) vpath = libgf_vmp_virtual_path (entry, path); op_ret = glusterfs_glh_utime (entry->handle, vpath, buf); out: + if (vpath) + free (vpath); return op_ret; } @@ -5153,6 +5207,8 @@ glusterfs_mknod(const char *pathname, mode_t mode, dev_t dev) vpath = libgf_vmp_virtual_path (entry, pathname); op_ret = glusterfs_glh_mknod (entry->handle, vpath, mode, dev); out: + if (vpath) + free (vpath); return op_ret; } @@ -5223,6 +5279,8 @@ glusterfs_mkfifo (const char *path, mode_t mode) vpath = libgf_vmp_virtual_path (entry, path); op_ret = glusterfs_glh_mkfifo (entry->handle, vpath, mode); out: + if (vpath) + free (vpath); return op_ret; } @@ -5318,6 +5376,8 @@ glusterfs_unlink (const char *path) vpath = libgf_vmp_virtual_path (entry, path); op_ret = glusterfs_glh_unlink (entry->handle, vpath); out: + if (vpath) + free (vpath); return op_ret; } @@ -5456,6 +5516,8 @@ glusterfs_symlink (const char *oldpath, const char *newpath) vpath = libgf_vmp_virtual_path (entry, newpath); op_ret = glusterfs_glh_symlink (entry->handle, oldpath, vpath); out: + if (vpath) + free (vpath); return op_ret; } @@ -5558,6 +5620,8 @@ glusterfs_readlink (const char *path, char *buf, size_t bufsize) vpath = libgf_vmp_virtual_path (entry, path); op_ret = glusterfs_glh_readlink (entry->handle, vpath, buf, bufsize); out: + if (vpath) + free (vpath); return op_ret; } @@ -5764,6 +5828,8 @@ glusterfs_realpath (const char *path, char *resolved_path) vpath = libgf_vmp_virtual_path (entry, path); res = glusterfs_glh_realpath (entry->handle, vpath, resolved_path); out: + if (vpath) + free (vpath); return res; } |