2000-09-04 02:18:13 +08:00
|
|
|
/*
|
|
|
|
+----------------------------------------------------------------------+
|
2014-09-20 00:33:14 +08:00
|
|
|
| PHP Version 7 |
|
2000-09-04 02:18:13 +08:00
|
|
|
+----------------------------------------------------------------------+
|
2016-01-02 17:56:11 +08:00
|
|
|
| Copyright (c) 1997-2016 The PHP Group |
|
2000-09-04 02:18:13 +08:00
|
|
|
+----------------------------------------------------------------------+
|
2006-01-01 20:51:34 +08:00
|
|
|
| This source file is subject to version 3.01 of the PHP license, |
|
2000-09-04 02:18:13 +08:00
|
|
|
| that is bundled with this package in the file LICENSE, and is |
|
2003-06-25 13:05:06 +08:00
|
|
|
| available through the world-wide-web at the following url: |
|
2006-01-01 20:51:34 +08:00
|
|
|
| http://www.php.net/license/3_01.txt |
|
2000-09-04 02:18:13 +08:00
|
|
|
| If you did not receive a copy of the PHP license and are unable to |
|
|
|
|
| obtain it through the world-wide-web, please send a note to |
|
|
|
|
| license@php.net so we can mail you a copy immediately. |
|
|
|
|
+----------------------------------------------------------------------+
|
|
|
|
| Authors: Andi Gutmans <andi@zend.com> |
|
|
|
|
| Sascha Schumann <sascha@schumann.cx> |
|
2010-09-01 17:49:53 +08:00
|
|
|
| Pierre Joye <pierre@php.net> |
|
2000-09-04 02:18:13 +08:00
|
|
|
+----------------------------------------------------------------------+
|
|
|
|
*/
|
|
|
|
|
|
|
|
/* $Id$ */
|
|
|
|
|
|
|
|
#ifndef VIRTUAL_CWD_H
|
|
|
|
#define VIRTUAL_CWD_H
|
|
|
|
|
2001-08-05 09:34:40 +08:00
|
|
|
#include "TSRM.h"
|
2000-09-07 04:27:12 +08:00
|
|
|
#include "tsrm_config_common.h"
|
2000-09-04 02:58:46 +08:00
|
|
|
|
2000-09-04 02:18:13 +08:00
|
|
|
#include <sys/types.h>
|
|
|
|
#include <sys/stat.h>
|
|
|
|
#include <ctype.h>
|
|
|
|
|
|
|
|
#ifdef HAVE_UTIME_H
|
|
|
|
#include <utime.h>
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef HAVE_STDARG_H
|
|
|
|
#include <stdarg.h>
|
|
|
|
#endif
|
|
|
|
|
2006-09-04 16:18:15 +08:00
|
|
|
#ifdef ZTS
|
|
|
|
#define VIRTUAL_DIR
|
|
|
|
#endif
|
|
|
|
|
2015-07-05 00:55:22 +08:00
|
|
|
#ifndef ZEND_WIN32
|
2000-09-04 02:18:13 +08:00
|
|
|
#include <unistd.h>
|
2006-09-04 16:18:15 +08:00
|
|
|
#else
|
|
|
|
#include <direct.h>
|
2000-09-04 02:18:13 +08:00
|
|
|
#endif
|
|
|
|
|
2003-08-07 23:32:18 +08:00
|
|
|
#if defined(__osf__) || defined(_AIX)
|
|
|
|
#include <errno.h>
|
|
|
|
#endif
|
|
|
|
|
2015-07-05 00:55:22 +08:00
|
|
|
#ifdef ZEND_WIN32
|
2000-09-04 02:47:35 +08:00
|
|
|
#include "readdir.h"
|
2000-09-04 12:18:38 +08:00
|
|
|
#include <sys/utime.h>
|
2000-09-04 02:47:35 +08:00
|
|
|
/* mode_t isn't defined on Windows */
|
2000-11-01 02:05:28 +08:00
|
|
|
typedef unsigned short mode_t;
|
2000-09-04 02:18:13 +08:00
|
|
|
|
2000-10-04 00:36:32 +08:00
|
|
|
#define DEFAULT_SLASH '\\'
|
2001-07-16 21:31:22 +08:00
|
|
|
#define DEFAULT_DIR_SEPARATOR ';'
|
2000-09-04 02:18:13 +08:00
|
|
|
#define IS_SLASH(c) ((c) == '/' || (c) == '\\')
|
2002-04-25 22:43:40 +08:00
|
|
|
#define IS_SLASH_P(c) (*(c) == '/' || \
|
|
|
|
(*(c) == '\\' && !IsDBCSLeadByte(*(c-1))))
|
2002-11-05 04:45:28 +08:00
|
|
|
|
2003-06-25 13:05:06 +08:00
|
|
|
/* COPY_WHEN_ABSOLUTE is 2 under Win32 because by chance both regular absolute paths
|
|
|
|
in the file system and UNC paths need copying of two characters */
|
2002-11-05 04:45:28 +08:00
|
|
|
#define COPY_WHEN_ABSOLUTE(path) 2
|
2001-03-23 16:33:06 +08:00
|
|
|
#define IS_UNC_PATH(path, len) \
|
|
|
|
(len >= 2 && IS_SLASH(path[0]) && IS_SLASH(path[1]))
|
2003-06-25 13:05:06 +08:00
|
|
|
#define IS_ABSOLUTE_PATH(path, len) \
|
2014-10-02 19:50:46 +08:00
|
|
|
(len >= 2 && (/* is local */isalpha(path[0]) && path[1] == ':' || /* is UNC */IS_SLASH(path[0]) && IS_SLASH(path[1])))
|
2000-09-04 02:18:13 +08:00
|
|
|
|
2002-05-29 16:41:21 +08:00
|
|
|
#elif defined(NETWARE)
|
|
|
|
#ifdef HAVE_DIRENT_H
|
|
|
|
#include <dirent.h>
|
|
|
|
#endif
|
|
|
|
|
2005-07-07 15:12:44 +08:00
|
|
|
#define DEFAULT_SLASH '/'
|
2002-05-29 16:41:21 +08:00
|
|
|
#define DEFAULT_DIR_SEPARATOR ';'
|
|
|
|
#define IS_SLASH(c) ((c) == '/' || (c) == '\\')
|
2003-06-25 13:05:06 +08:00
|
|
|
#define IS_SLASH_P(c) IS_SLASH(*(c))
|
2004-10-08 17:48:20 +08:00
|
|
|
/* Colon indicates volume name, either first character should be forward slash or backward slash */
|
2002-05-29 16:41:21 +08:00
|
|
|
#define IS_ABSOLUTE_PATH(path, len) \
|
2004-10-08 17:48:20 +08:00
|
|
|
((strchr(path, ':') != NULL) || ((len >= 1) && ((path[0] == '/') || (path[0] == '\\'))))
|
2002-05-29 16:41:21 +08:00
|
|
|
|
2000-09-04 02:18:13 +08:00
|
|
|
#else
|
|
|
|
#ifdef HAVE_DIRENT_H
|
|
|
|
#include <dirent.h>
|
|
|
|
#endif
|
|
|
|
|
2000-10-04 00:36:32 +08:00
|
|
|
#define DEFAULT_SLASH '/'
|
2001-11-03 21:33:21 +08:00
|
|
|
|
|
|
|
#ifdef __riscos__
|
|
|
|
#define DEFAULT_DIR_SEPARATOR ';'
|
|
|
|
#else
|
|
|
|
#define DEFAULT_DIR_SEPARATOR ':'
|
|
|
|
#endif
|
|
|
|
|
2000-09-04 02:18:13 +08:00
|
|
|
#define IS_SLASH(c) ((c) == '/')
|
2002-04-25 22:43:40 +08:00
|
|
|
#define IS_SLASH_P(c) (*(c) == '/')
|
2000-09-04 02:18:13 +08:00
|
|
|
|
|
|
|
#endif
|
|
|
|
|
2000-10-04 00:36:32 +08:00
|
|
|
|
|
|
|
#ifndef COPY_WHEN_ABSOLUTE
|
2002-11-05 04:45:28 +08:00
|
|
|
#define COPY_WHEN_ABSOLUTE(path) 0
|
2000-10-04 00:36:32 +08:00
|
|
|
#endif
|
|
|
|
|
2010-09-13 17:08:42 +08:00
|
|
|
#ifndef IS_ABSOLUTE_PATH
|
2000-09-04 02:18:13 +08:00
|
|
|
#define IS_ABSOLUTE_PATH(path, len) \
|
|
|
|
(IS_SLASH(path[0]))
|
|
|
|
#endif
|
|
|
|
|
2000-09-04 02:47:35 +08:00
|
|
|
#ifdef TSRM_EXPORTS
|
2000-09-04 02:18:13 +08:00
|
|
|
#define CWD_EXPORTS
|
|
|
|
#endif
|
|
|
|
|
2015-07-05 00:55:22 +08:00
|
|
|
#ifdef ZEND_WIN32
|
2008-01-30 17:41:12 +08:00
|
|
|
# ifdef CWD_EXPORTS
|
|
|
|
# define CWD_API __declspec(dllexport)
|
|
|
|
# else
|
|
|
|
# define CWD_API __declspec(dllimport)
|
|
|
|
# endif
|
|
|
|
#elif defined(__GNUC__) && __GNUC__ >= 4
|
|
|
|
# define CWD_API __attribute__ ((visibility("default")))
|
2000-09-04 02:18:13 +08:00
|
|
|
#else
|
2008-01-30 17:41:12 +08:00
|
|
|
# define CWD_API
|
2000-09-04 02:18:13 +08:00
|
|
|
#endif
|
|
|
|
|
2015-07-05 00:55:22 +08:00
|
|
|
#ifdef ZEND_WIN32
|
2014-08-16 17:16:11 +08:00
|
|
|
CWD_API int php_sys_stat_ex(const char *path, zend_stat_t *buf, int lstat);
|
2010-09-01 17:49:53 +08:00
|
|
|
# define php_sys_stat(path, buf) php_sys_stat_ex(path, buf, 0)
|
|
|
|
# define php_sys_lstat(path, buf) php_sys_stat_ex(path, buf, 1)
|
2010-10-04 18:35:32 +08:00
|
|
|
CWD_API int php_sys_readlink(const char *link, char *target, size_t target_len);
|
2006-11-10 23:04:07 +08:00
|
|
|
#else
|
|
|
|
# define php_sys_stat stat
|
2010-09-01 17:49:53 +08:00
|
|
|
# define php_sys_lstat lstat
|
2010-09-10 22:01:44 +08:00
|
|
|
# ifdef HAVE_SYMLINK
|
|
|
|
# define php_sys_readlink(link, target, target_len) readlink(link, target, target_len)
|
|
|
|
# endif
|
2006-11-10 23:04:07 +08:00
|
|
|
#endif
|
|
|
|
|
2000-09-04 02:18:13 +08:00
|
|
|
typedef struct _cwd_state {
|
|
|
|
char *cwd;
|
|
|
|
int cwd_length;
|
|
|
|
} cwd_state;
|
|
|
|
|
|
|
|
typedef int (*verify_path_func)(const cwd_state *);
|
|
|
|
|
|
|
|
CWD_API void virtual_cwd_startup(void);
|
|
|
|
CWD_API void virtual_cwd_shutdown(void);
|
2014-12-14 06:06:14 +08:00
|
|
|
CWD_API int virtual_cwd_activate(void);
|
|
|
|
CWD_API int virtual_cwd_deactivate(void);
|
|
|
|
CWD_API char *virtual_getcwd_ex(size_t *length);
|
|
|
|
CWD_API char *virtual_getcwd(char *buf, size_t size);
|
|
|
|
CWD_API int virtual_chdir(const char *path);
|
|
|
|
CWD_API int virtual_chdir_file(const char *path, int (*p_chdir)(const char *path));
|
|
|
|
CWD_API int virtual_filepath(const char *path, char **filepath);
|
|
|
|
CWD_API int virtual_filepath_ex(const char *path, char **filepath, verify_path_func verify_path);
|
|
|
|
CWD_API char *virtual_realpath(const char *path, char *real_path);
|
|
|
|
CWD_API FILE *virtual_fopen(const char *path, const char *mode);
|
|
|
|
CWD_API int virtual_open(const char *path, int flags, ...);
|
|
|
|
CWD_API int virtual_creat(const char *path, mode_t mode);
|
|
|
|
CWD_API int virtual_rename(const char *oldname, const char *newname);
|
|
|
|
CWD_API int virtual_stat(const char *path, zend_stat_t *buf);
|
|
|
|
CWD_API int virtual_lstat(const char *path, zend_stat_t *buf);
|
|
|
|
CWD_API int virtual_unlink(const char *path);
|
|
|
|
CWD_API int virtual_mkdir(const char *pathname, mode_t mode);
|
|
|
|
CWD_API int virtual_rmdir(const char *pathname);
|
|
|
|
CWD_API DIR *virtual_opendir(const char *pathname);
|
|
|
|
CWD_API FILE *virtual_popen(const char *command, const char *type);
|
|
|
|
CWD_API int virtual_access(const char *pathname, int mode);
|
2015-07-05 00:55:22 +08:00
|
|
|
#if defined(ZEND_WIN32)
|
2003-06-25 13:05:06 +08:00
|
|
|
/* these are not defined in win32 headers */
|
|
|
|
#ifndef W_OK
|
|
|
|
#define W_OK 0x02
|
|
|
|
#endif
|
|
|
|
#ifndef R_OK
|
|
|
|
#define R_OK 0x04
|
|
|
|
#endif
|
|
|
|
#ifndef X_OK
|
|
|
|
#define X_OK 0x01
|
|
|
|
#endif
|
|
|
|
#ifndef F_OK
|
|
|
|
#define F_OK 0x00
|
|
|
|
#endif
|
2002-10-04 09:04:00 +08:00
|
|
|
#endif
|
|
|
|
|
2000-09-04 02:18:13 +08:00
|
|
|
#if HAVE_UTIME
|
2014-12-14 06:06:14 +08:00
|
|
|
CWD_API int virtual_utime(const char *filename, struct utimbuf *buf);
|
2000-09-04 02:18:13 +08:00
|
|
|
#endif
|
2014-12-14 06:06:14 +08:00
|
|
|
CWD_API int virtual_chmod(const char *filename, mode_t mode);
|
2015-07-05 00:55:22 +08:00
|
|
|
#if !defined(ZEND_WIN32) && !defined(NETWARE)
|
2014-12-14 06:06:14 +08:00
|
|
|
CWD_API int virtual_chown(const char *filename, uid_t owner, gid_t group, int link);
|
2000-09-04 02:18:13 +08:00
|
|
|
#endif
|
|
|
|
|
2010-09-13 17:08:42 +08:00
|
|
|
/* One of the following constants must be used as the last argument
|
2006-11-14 17:15:55 +08:00
|
|
|
in virtual_file_ex() call. */
|
|
|
|
|
|
|
|
#define CWD_EXPAND 0 /* expand "." and ".." but dont resolve symlinks */
|
|
|
|
#define CWD_FILEPATH 1 /* resolve symlinks if file is exist otherwise expand */
|
|
|
|
#define CWD_REALPATH 2 /* call realpath(), resolve symlinks. File must exist */
|
2006-11-13 23:13:20 +08:00
|
|
|
|
2014-12-14 06:06:14 +08:00
|
|
|
CWD_API int virtual_file_ex(cwd_state *state, const char *path, verify_path_func verify_path, int use_realpath);
|
2000-09-04 02:18:13 +08:00
|
|
|
|
2014-12-14 06:06:14 +08:00
|
|
|
CWD_API char *tsrm_realpath(const char *path, char *real_path);
|
2006-11-10 20:59:27 +08:00
|
|
|
|
2004-10-05 08:42:25 +08:00
|
|
|
#define REALPATH_CACHE_TTL (2*60) /* 2 minutes */
|
|
|
|
#define REALPATH_CACHE_SIZE 0 /* disabled while php.ini isn't loaded */
|
|
|
|
|
|
|
|
typedef struct _realpath_cache_bucket {
|
2014-08-26 01:24:55 +08:00
|
|
|
zend_ulong key;
|
2004-10-05 08:42:25 +08:00
|
|
|
char *path;
|
|
|
|
char *realpath;
|
2014-09-13 03:31:25 +08:00
|
|
|
struct _realpath_cache_bucket *next;
|
|
|
|
time_t expires;
|
|
|
|
int path_len;
|
2004-10-05 08:42:25 +08:00
|
|
|
int realpath_len;
|
2008-08-12 16:01:24 +08:00
|
|
|
int is_dir;
|
2015-07-05 00:55:22 +08:00
|
|
|
#ifdef ZEND_WIN32
|
2009-06-16 08:07:05 +08:00
|
|
|
unsigned char is_rvalid;
|
|
|
|
unsigned char is_readable;
|
|
|
|
unsigned char is_wvalid;
|
|
|
|
unsigned char is_writable;
|
|
|
|
#endif
|
2004-10-05 08:42:25 +08:00
|
|
|
} realpath_cache_bucket;
|
|
|
|
|
2000-09-04 02:18:13 +08:00
|
|
|
typedef struct _virtual_cwd_globals {
|
|
|
|
cwd_state cwd;
|
2014-08-26 01:24:55 +08:00
|
|
|
zend_long realpath_cache_size;
|
|
|
|
zend_long realpath_cache_size_limit;
|
|
|
|
zend_long realpath_cache_ttl;
|
2004-10-05 08:42:25 +08:00
|
|
|
realpath_cache_bucket *realpath_cache[1024];
|
2000-09-04 02:18:13 +08:00
|
|
|
} virtual_cwd_globals;
|
|
|
|
|
|
|
|
#ifdef ZTS
|
reworked the patch, less new stuff but worky
TLS is already used in TSRM, the way exporting the tsrm cache through
a thread local variable is not portable. Additionally, the current
patch suffers from bugs which are hard to find, but prevent it to
be worky with apache. What is done here is mainly uses the idea
from the RFC patch, but
- __thread variable is removed
- offset math and declarations are removed
- extra macros and definitions are removed
What is done merely is
- use an inline function to access the tsrm cache. The function uses
the portable tsrm_tls_get macro which is cheap
- all the TSRM_* macros are set to placebo. Thus this opens the way
remove them later
Except that, the logic is old. TSRMLS_FETCH will have to be done once
per thread, then tsrm_get_ls_cache() can be used. Things seeming to be
worky are cli, cli server and apache. I also tried to enable bz2
shared and it has worked out of the box. The change is yet minimal
diffing to the current master bus is a worky start, IMHO. Though will
have to recheck the other previously done SAPIs - embed and cgi.
The offsets can be added to the tsrm_resource_type struct, then
it'll not be needed to declare them in the userspace. Even the
"done" member type can be changed to int16 or smaller, then adding
the offset as int16 will not change the struct size. As well on the
todo might be removing the hashed storage, thread_id != thread_id and
linked list logic in favour of the explicit TLS operations.
2014-09-26 00:48:27 +08:00
|
|
|
extern ts_rsrc_id cwd_globals_id;
|
2014-10-02 04:04:21 +08:00
|
|
|
# define CWDG(v) ZEND_TSRMG(cwd_globals_id, virtual_cwd_globals *, v)
|
2000-09-04 02:18:13 +08:00
|
|
|
#else
|
2004-10-05 08:42:25 +08:00
|
|
|
extern virtual_cwd_globals cwd_globals;
|
2000-09-04 02:18:13 +08:00
|
|
|
# define CWDG(v) (cwd_globals.v)
|
|
|
|
#endif
|
|
|
|
|
2014-12-14 06:06:14 +08:00
|
|
|
CWD_API void realpath_cache_clean(void);
|
|
|
|
CWD_API void realpath_cache_del(const char *path, int path_len);
|
|
|
|
CWD_API realpath_cache_bucket* realpath_cache_lookup(const char *path, int path_len, time_t t);
|
|
|
|
CWD_API zend_long realpath_cache_size(void);
|
|
|
|
CWD_API zend_long realpath_cache_max_buckets(void);
|
|
|
|
CWD_API realpath_cache_bucket** realpath_cache_get_buckets(void);
|
2007-01-22 17:31:46 +08:00
|
|
|
|
2000-09-04 12:18:38 +08:00
|
|
|
/* The actual macros to be used in programs using TSRM
|
|
|
|
* If the program defines VIRTUAL_DIR it will use the
|
2010-09-13 17:08:42 +08:00
|
|
|
* virtual_* functions
|
2000-09-04 12:18:38 +08:00
|
|
|
*/
|
|
|
|
|
|
|
|
#ifdef VIRTUAL_DIR
|
|
|
|
|
2014-12-14 06:06:14 +08:00
|
|
|
#define VCWD_GETCWD(buff, size) virtual_getcwd(buff, size)
|
|
|
|
#define VCWD_FOPEN(path, mode) virtual_fopen(path, mode)
|
2001-08-05 09:34:40 +08:00
|
|
|
/* Because open() has two modes, we have to macros to replace it */
|
2014-12-14 06:06:14 +08:00
|
|
|
#define VCWD_OPEN(path, flags) virtual_open(path, flags)
|
|
|
|
#define VCWD_OPEN_MODE(path, flags, mode) virtual_open(path, flags, mode)
|
|
|
|
#define VCWD_CREAT(path, mode) virtual_creat(path, mode)
|
|
|
|
#define VCWD_CHDIR(path) virtual_chdir(path)
|
|
|
|
#define VCWD_CHDIR_FILE(path) virtual_chdir_file(path, virtual_chdir)
|
2001-04-30 20:45:02 +08:00
|
|
|
#define VCWD_GETWD(buf)
|
2014-12-14 06:06:14 +08:00
|
|
|
#define VCWD_REALPATH(path, real_path) virtual_realpath(path, real_path)
|
|
|
|
#define VCWD_RENAME(oldname, newname) virtual_rename(oldname, newname)
|
|
|
|
#define VCWD_STAT(path, buff) virtual_stat(path, buff)
|
|
|
|
# define VCWD_LSTAT(path, buff) virtual_lstat(path, buff)
|
|
|
|
#define VCWD_UNLINK(path) virtual_unlink(path)
|
|
|
|
#define VCWD_MKDIR(pathname, mode) virtual_mkdir(pathname, mode)
|
|
|
|
#define VCWD_RMDIR(pathname) virtual_rmdir(pathname)
|
|
|
|
#define VCWD_OPENDIR(pathname) virtual_opendir(pathname)
|
|
|
|
#define VCWD_POPEN(command, type) virtual_popen(command, type)
|
|
|
|
#define VCWD_ACCESS(pathname, mode) virtual_access(pathname, mode)
|
2000-09-04 12:18:38 +08:00
|
|
|
#if HAVE_UTIME
|
2014-12-14 06:06:14 +08:00
|
|
|
#define VCWD_UTIME(path, time) virtual_utime(path, time)
|
2000-09-04 12:18:38 +08:00
|
|
|
#endif
|
2014-12-14 06:06:14 +08:00
|
|
|
#define VCWD_CHMOD(path, mode) virtual_chmod(path, mode)
|
2015-07-05 00:55:22 +08:00
|
|
|
#if !defined(ZEND_WIN32) && !defined(NETWARE)
|
2014-12-14 06:06:14 +08:00
|
|
|
#define VCWD_CHOWN(path, owner, group) virtual_chown(path, owner, group, 0)
|
2006-04-10 19:56:18 +08:00
|
|
|
#if HAVE_LCHOWN
|
2014-12-14 06:06:14 +08:00
|
|
|
#define VCWD_LCHOWN(path, owner, group) virtual_chown(path, owner, group, 1)
|
2000-09-04 12:18:38 +08:00
|
|
|
#endif
|
2006-04-10 19:56:18 +08:00
|
|
|
#endif
|
2000-09-04 12:18:38 +08:00
|
|
|
|
|
|
|
#else
|
|
|
|
|
2001-08-05 09:34:40 +08:00
|
|
|
#define VCWD_GETCWD(buff, size) getcwd(buff, size)
|
2001-04-30 20:45:02 +08:00
|
|
|
#define VCWD_FOPEN(path, mode) fopen(path, mode)
|
2001-08-05 09:34:40 +08:00
|
|
|
#define VCWD_OPEN(path, flags) open(path, flags)
|
|
|
|
#define VCWD_OPEN_MODE(path, flags, mode) open(path, flags, mode)
|
2001-04-30 20:45:02 +08:00
|
|
|
#define VCWD_CREAT(path, mode) creat(path, mode)
|
2008-04-24 15:45:01 +08:00
|
|
|
/* rename on windows will fail if newname already exists.
|
|
|
|
MoveFileEx has to be used */
|
2015-07-05 00:55:22 +08:00
|
|
|
#if defined(ZEND_WIN32)
|
2009-07-06 16:56:23 +08:00
|
|
|
# define VCWD_RENAME(oldname, newname) (MoveFileEx(oldname, newname, MOVEFILE_REPLACE_EXISTING|MOVEFILE_COPY_ALLOWED) == 0 ? -1 : 0)
|
2008-04-24 15:45:01 +08:00
|
|
|
#else
|
|
|
|
# define VCWD_RENAME(oldname, newname) rename(oldname, newname)
|
|
|
|
#endif
|
2001-04-30 20:45:02 +08:00
|
|
|
#define VCWD_CHDIR(path) chdir(path)
|
|
|
|
#define VCWD_CHDIR_FILE(path) virtual_chdir_file(path, chdir)
|
|
|
|
#define VCWD_GETWD(buf) getwd(buf)
|
2006-11-10 23:04:07 +08:00
|
|
|
#define VCWD_STAT(path, buff) php_sys_stat(path, buff)
|
2001-04-30 20:45:02 +08:00
|
|
|
#define VCWD_LSTAT(path, buff) lstat(path, buff)
|
|
|
|
#define VCWD_UNLINK(path) unlink(path)
|
|
|
|
#define VCWD_MKDIR(pathname, mode) mkdir(pathname, mode)
|
|
|
|
#define VCWD_RMDIR(pathname) rmdir(pathname)
|
|
|
|
#define VCWD_OPENDIR(pathname) opendir(pathname)
|
|
|
|
#define VCWD_POPEN(command, type) popen(command, type)
|
2015-07-05 00:55:22 +08:00
|
|
|
#if defined(ZEND_WIN32)
|
2014-12-14 06:06:14 +08:00
|
|
|
#define VCWD_ACCESS(pathname, mode) tsrm_win32_access(pathname, mode)
|
2003-06-25 13:05:06 +08:00
|
|
|
#else
|
2002-10-04 09:04:00 +08:00
|
|
|
#define VCWD_ACCESS(pathname, mode) access(pathname, mode)
|
2003-06-25 13:05:06 +08:00
|
|
|
#endif
|
2001-08-05 09:34:40 +08:00
|
|
|
|
2014-12-14 06:06:14 +08:00
|
|
|
#define VCWD_REALPATH(path, real_path) tsrm_realpath(path, real_path)
|
2001-08-05 09:34:40 +08:00
|
|
|
|
2000-09-04 12:18:38 +08:00
|
|
|
#if HAVE_UTIME
|
2015-07-05 00:55:22 +08:00
|
|
|
# ifdef ZEND_WIN32
|
2009-08-25 17:16:53 +08:00
|
|
|
# define VCWD_UTIME(path, time) win32_utime(path, time)
|
|
|
|
# else
|
|
|
|
# define VCWD_UTIME(path, time) utime(path, time)
|
|
|
|
# endif
|
2000-09-04 12:18:38 +08:00
|
|
|
#endif
|
2009-08-25 17:16:53 +08:00
|
|
|
|
2001-08-05 09:34:40 +08:00
|
|
|
#define VCWD_CHMOD(path, mode) chmod(path, mode)
|
2015-07-05 00:55:22 +08:00
|
|
|
#if !defined(ZEND_WIN32) && !defined(NETWARE)
|
2001-08-05 09:34:40 +08:00
|
|
|
#define VCWD_CHOWN(path, owner, group) chown(path, owner, group)
|
2006-04-10 19:56:18 +08:00
|
|
|
#if HAVE_LCHOWN
|
2006-03-06 02:57:54 +08:00
|
|
|
#define VCWD_LCHOWN(path, owner, group) lchown(path, owner, group)
|
2000-09-04 12:18:38 +08:00
|
|
|
#endif
|
2006-04-10 19:56:18 +08:00
|
|
|
#endif
|
2000-09-04 12:18:38 +08:00
|
|
|
|
|
|
|
#endif
|
|
|
|
|
2015-05-25 19:47:31 +08:00
|
|
|
/* Global stat declarations */
|
|
|
|
#ifndef _S_IFDIR
|
|
|
|
#define _S_IFDIR S_IFDIR
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef _S_IFREG
|
|
|
|
#define _S_IFREG S_IFREG
|
|
|
|
#endif
|
|
|
|
|
2015-05-26 00:07:47 +08:00
|
|
|
#ifndef S_IFLNK
|
|
|
|
# define S_IFLNK 0120000
|
|
|
|
#endif
|
|
|
|
|
2015-05-25 19:17:35 +08:00
|
|
|
#ifndef S_ISDIR
|
|
|
|
#define S_ISDIR(mode) (((mode)&S_IFMT) == S_IFDIR)
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef S_ISREG
|
|
|
|
#define S_ISREG(mode) (((mode)&S_IFMT) == S_IFREG)
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef S_ISLNK
|
|
|
|
#define S_ISLNK(mode) (((mode)&S_IFMT) == S_IFLNK)
|
|
|
|
#endif
|
|
|
|
|
2015-05-25 19:47:31 +08:00
|
|
|
#ifndef S_IXROOT
|
2015-05-25 19:17:35 +08:00
|
|
|
#define S_IXROOT ( S_IXUSR | S_IXGRP | S_IXOTH )
|
2015-05-25 19:47:31 +08:00
|
|
|
#endif
|
2015-05-25 19:17:35 +08:00
|
|
|
|
2000-09-04 02:18:13 +08:00
|
|
|
#endif /* VIRTUAL_CWD_H */
|