diff options
author | Dmitry Stogov <dmitry@php.net> | 2006-11-10 12:59:27 +0000 |
---|---|---|
committer | Dmitry Stogov <dmitry@php.net> | 2006-11-10 12:59:27 +0000 |
commit | f05ed6390cb5cec8df76621d29d8255b0ad21f6e (patch) | |
tree | a90bde217d13dff721c986eeb64daa7a15c53bac /TSRM | |
parent | 140edac7f9708a589725577320746c44a0bae0e0 (diff) | |
download | php-git-f05ed6390cb5cec8df76621d29d8255b0ad21f6e.tar.gz |
VCWD_REALPATH() is improved to use realpath cache without VIRTUAL_DIR
Diffstat (limited to 'TSRM')
-rw-r--r-- | TSRM/tsrm_virtual_cwd.c | 39 | ||||
-rw-r--r-- | TSRM/tsrm_virtual_cwd.h | 16 |
2 files changed, 28 insertions, 27 deletions
diff --git a/TSRM/tsrm_virtual_cwd.c b/TSRM/tsrm_virtual_cwd.c index eafa003aec..30c83f06cf 100644 --- a/TSRM/tsrm_virtual_cwd.c +++ b/TSRM/tsrm_virtual_cwd.c @@ -1033,25 +1033,36 @@ CWD_API FILE *virtual_popen(const char *command, const char *type TSRMLS_DC) #endif -/* On AIX & Tru64 when a file does not exist realpath() returns - * NULL, and sets errno to ENOENT. Unlike in other libc implementations - * the destination is not filled and remains undefined. Therefor, we - * must populate it manually using strcpy as done on systems with no - * realpath() function. - */ -#if defined(__osf__) || defined(_AIX) -char *php_realpath_hack(const char *src, char *dest) +CWD_API char *tsrm_realpath(const char *path, char *real_path TSRMLS_DC) { - char *ret; + cwd_state new_state; + char cwd[MAXPATHLEN]; - if ((ret = realpath(src, dest)) == NULL && errno == ENOENT) { - return strcpy(dest, src); + if (!IS_ABSOLUTE_PATH(path, strlen(path)) && + VCWD_GETCWD(cwd, MAXPATHLEN)) { + new_state.cwd = strdup(cwd); + new_state.cwd_length = strlen(cwd); } else { - return ret; + new_state.cwd = (char*)malloc(1); + new_state.cwd[0] = '\0'; + new_state.cwd_length = 0; + } + + if (virtual_file_ex(&new_state, path, NULL, 1)) { + free(new_state.cwd); + return NULL; } -} -#endif + if (real_path) { + int copy_len = new_state.cwd_length>MAXPATHLEN-1 ? MAXPATHLEN-1 : new_state.cwd_length; + memcpy(real_path, new_state.cwd, copy_len); + real_path[copy_len] = '\0'; + free(new_state.cwd); + return real_path; + } else { + return new_state.cwd; + } +} /* diff --git a/TSRM/tsrm_virtual_cwd.h b/TSRM/tsrm_virtual_cwd.h index c8ec3534f8..9bb8b0f68a 100644 --- a/TSRM/tsrm_virtual_cwd.h +++ b/TSRM/tsrm_virtual_cwd.h @@ -172,10 +172,6 @@ CWD_API int virtual_access(const char *pathname, int mode TSRMLS_DC); #endif #endif -#if defined(__osf__) || defined(_AIX) -char *php_realpath_hack(const char *src, char *dest); -#endif - #if HAVE_UTIME CWD_API int virtual_utime(const char *filename, struct utimbuf *buf TSRMLS_DC); #endif @@ -186,6 +182,8 @@ CWD_API int virtual_chown(const char *filename, uid_t owner, gid_t group, int li CWD_API int virtual_file_ex(cwd_state *state, const char *path, verify_path_func verify_path, int use_realpath); +CWD_API char *tsrm_realpath(const char *path, char *real_path TSRMLS_DC); + #define REALPATH_CACHE_TTL (2*60) /* 2 minutes */ #define REALPATH_CACHE_SIZE 0 /* disabled while php.ini isn't loaded */ @@ -278,15 +276,7 @@ extern virtual_cwd_globals cwd_globals; #define VCWD_ACCESS(pathname, mode) access(pathname, mode) #endif -#ifdef HAVE_REALPATH -#if defined(__osf__) || defined(_AIX) -#define VCWD_REALPATH(path, real_path) php_realpath_hack(path, real_path) -#else -#define VCWD_REALPATH(path, real_path) realpath(path, real_path) -#endif -#else -#define VCWD_REALPATH(path, real_path) strcpy(real_path, path) -#endif +#define VCWD_REALPATH(path, real_path) tsrm_realpath(path, real_path TSRMLS_CC) #if HAVE_UTIME #define VCWD_UTIME(path, time) utime(path, time) |