diff options
| -rw-r--r-- | api/src/gfapi.aliases | 3 | ||||
| -rw-r--r-- | api/src/gfapi.map | 5 | ||||
| -rw-r--r-- | api/src/glfs-fops.c | 47 | ||||
| -rw-r--r-- | api/src/glfs-mem-types.h | 1 | ||||
| -rw-r--r-- | api/src/glfs.h | 4 | 
5 files changed, 50 insertions, 10 deletions
diff --git a/api/src/gfapi.aliases b/api/src/gfapi.aliases index ac89d35df6b..74ef4d3442d 100644 --- a/api/src/gfapi.aliases +++ b/api/src/gfapi.aliases @@ -82,7 +82,7 @@ _pub_glfs_fremovexattr _glfs_fremovexattr$GFAPI_3.4.0  _pub_glfs_getcwd _glfs_getcwd$GFAPI_3.4.0  _pub_glfs_chdir _glfs_chdir$GFAPI_3.4.0  _pub_glfs_fchdir _glfs_fchdir$GFAPI_3.4.0 -_pub_glfs_realpath _glfs_realpath$GFAPI_3.4.0 +_pub_glfs_realpath34 _glfs_realpath$GFAPI_3.4.0  _pub_glfs_posix_lock _glfs_posix_lock$GFAPI_3.4.0  _pub_glfs_dup _glfs_dup$GFAPI_3.4.0 @@ -153,5 +153,6 @@ _pub_glfs_upcall_inode_get_pobject _glfs_upcall_inode_get_pobject$GFAPI_3.7.16  _pub_glfs_upcall_inode_get_pstat _glfs_upcall_inode_get_pstat$GFAPI_3.7.16  _pub_glfs_upcall_inode_get_oldpobject _glfs_upcall_inode_get_oldpobject$GFAPI_3.7.16  _pub_glfs_upcall_inode_get_oldpstat _glfs_upcall_inode_get_oldpstat$GFAPI_3.7.16 +_pub_glfs_realpath _glfs_realpath$GFAPI_3.7.17  _pub_glfs_ipc _glfs_ipc$GFAPI_4.0.0 diff --git a/api/src/gfapi.map b/api/src/gfapi.map index bd7ff13fe41..1ae6d4665fc 100644 --- a/api/src/gfapi.map +++ b/api/src/gfapi.map @@ -188,6 +188,11 @@ GFAPI_3.7.16 {  		glfs_upcall_inode_get_oldpstat;  } GFAPI_3.7.15; +GFAPI_3.7.17 { +	global: +		glfs_realpath; +} GFAPI_3.7.16; +  GFAPI_4.0.0 {  	global:  		glfs_ipc; diff --git a/api/src/glfs-fops.c b/api/src/glfs-fops.c index bbbf61dddfc..0a59a8dcf1c 100644 --- a/api/src/glfs-fops.c +++ b/api/src/glfs-fops.c @@ -4071,9 +4071,11 @@ invalid_fs:  GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_fchdir, 3.4.0); +static gf_boolean_t warn_realpath = _gf_true; /* log once */ -char * -pub_glfs_realpath (struct glfs *fs, const char *path, char *resolved_path) +static char * +glfs_realpath_common (struct glfs *fs, const char *path, char *resolved_path, +                      gf_boolean_t warn_deprecated)  {  	int              ret = -1;  	char            *retpath = NULL; @@ -4088,8 +4090,20 @@ pub_glfs_realpath (struct glfs *fs, const char *path, char *resolved_path)  	if (resolved_path)  		retpath = resolved_path; -	else -		retpath = allocpath = malloc (PATH_MAX + 1); +        else if (warn_deprecated) { +                retpath = allocpath = malloc (PATH_MAX + 1); +                if (warn_realpath) { +                        warn_realpath = _gf_false; +                        gf_log (THIS->name, GF_LOG_WARNING, "this application " +                                "is compiled against an old version of " +                                "libgfapi, it should use glfs_free() to " +                                "release the path returned by " +                                "glfs_realpath()"); +                } +        } else { +                retpath = allocpath = GF_CALLOC (1, PATH_MAX + 1, +                                                 glfs_mt_realpath_t); +        }  	if (!retpath) {  		ret = -1; @@ -4120,9 +4134,11 @@ out:  	loc_wipe (&loc);  	if (ret == -1) { -		if (allocpath) -			free (allocpath); -		retpath = NULL; +                if (warn_deprecated && allocpath) +                        free (allocpath); +                else if (allocpath) +                        GF_FREE (allocpath); +                retpath = NULL;  	}  	glfs_subvol_done (fs, subvol); @@ -4133,7 +4149,22 @@ invalid_fs:  	return retpath;  } -GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_realpath, 3.4.0); + +char * +pub_glfs_realpath34 (struct glfs *fs, const char *path, char *resolved_path) +{ +        return glfs_realpath_common (fs, path, resolved_path, _gf_true); +} + +GFAPI_SYMVER_PUBLIC(glfs_realpath34, glfs_realpath, 3.4.0); + +char * +pub_glfs_realpath (struct glfs *fs, const char *path, char *resolved_path) +{ +        return glfs_realpath_common (fs, path, resolved_path, _gf_false); +} + +GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_realpath, 3.7.17);  char * diff --git a/api/src/glfs-mem-types.h b/api/src/glfs-mem-types.h index d32d63f0f13..52033360853 100644 --- a/api/src/glfs-mem-types.h +++ b/api/src/glfs-mem-types.h @@ -28,6 +28,7 @@ enum glfs_mem_types_ {          glfs_mt_upcall_entry_t,  	glfs_mt_acl_t,          glfs_mt_upcall_inode_t, +        glfs_mt_realpath_t,  	glfs_mt_end  };  #endif diff --git a/api/src/glfs.h b/api/src/glfs.h index 30600a79c32..c81b7cc5d0b 100644 --- a/api/src/glfs.h +++ b/api/src/glfs.h @@ -755,9 +755,11 @@ int glfs_chdir (glfs_t *fs, const char *path) __THROW  int glfs_fchdir (glfs_fd_t *fd) __THROW          GFAPI_PUBLIC(glfs_fchdir, 3.4.0); -char *glfs_realpath (glfs_t *fs, const char *path, char *resolved_path) __THROW +char *glfs_realpath34 (glfs_t *fs, const char *path, char *resolved_path) __THROW          GFAPI_PUBLIC(glfs_realpath, 3.4.0); +char *glfs_realpath (glfs_t *fs, const char *path, char *resolved_path) __THROW +        GFAPI_PUBLIC(glfs_realpath, 3.7.17);  /*   * @cmd and @flock are as specified in man fcntl(2).   */  | 
