summaryrefslogtreecommitdiff
path: root/main/php_virtual_cwd.c
diff options
context:
space:
mode:
authorAndi Gutmans <andi@php.net>2000-03-16 22:37:59 +0000
committerAndi Gutmans <andi@php.net>2000-03-16 22:37:59 +0000
commitb46c44b485562e96aa78d7f1e1ce7bf49f1bba10 (patch)
treea4d73543dbc822d045f783ef94a48651b3b95117 /main/php_virtual_cwd.c
parent1bcdb436c176885a071046c78e84ace8396e7a25 (diff)
downloadphp-git-b46c44b485562e96aa78d7f1e1ce7bf49f1bba10.tar.gz
- Allow passing of a verify function. This way we can easily create
chdir() and expandpath() wrappers.
Diffstat (limited to 'main/php_virtual_cwd.c')
-rw-r--r--main/php_virtual_cwd.c26
1 files changed, 21 insertions, 5 deletions
diff --git a/main/php_virtual_cwd.c b/main/php_virtual_cwd.c
index 85dcb170ea..58855fa10f 100644
--- a/main/php_virtual_cwd.c
+++ b/main/php_virtual_cwd.c
@@ -15,7 +15,9 @@
#define S_ISDIR(mode) ((mode) & _S_IFDIR)
#endif
-typedef unsigned int uint;
+#ifndef S_ISREG
+#define S_ISREG(mode) ((mode) & _S_IFREG)
+#endif
#ifdef PHP_WIN32
#define strtok_r(a,b,c) strtok((a),(b))
@@ -82,6 +84,8 @@ typedef struct _cwd_state {
uint cwd_length;
} cwd_state;
+typedef int (*verify_path_func)(const cwd_state *);
+
static int php_is_dir_ok(const cwd_state *state)
{
struct stat buf;
@@ -92,6 +96,16 @@ static int php_is_dir_ok(const cwd_state *state)
return (1);
}
+static int php_is_file_ok(const cwd_state *state)
+{
+ struct stat buf;
+
+ if (stat(state->cwd, &buf) == 0 && S_ISREG(buf.st_mode))
+ return (0);
+
+ return (1);
+}
+
char *virtual_getcwd(cwd_state *state, uint *length)
{
@@ -123,7 +137,7 @@ char *virtual_getcwd(cwd_state *state, uint *length)
}
/* returns 0 for ok, 1 for error */
-int virtual_chdir(cwd_state *state, char *path)
+int virtual_chdir(cwd_state *state, char *path, verify_path_func verify_path)
{
uint path_length = strlen(path);
char *ptr = path;
@@ -192,7 +206,7 @@ int virtual_chdir(cwd_state *state, char *path)
ptr = strtok_r(NULL, TOKENIZER_STRING, &tok);
}
- if (!IS_DIR_OK(state)) {
+ if (verify_path && !verify_path(state)) {
free(state->cwd);
*state = *old_state;
@@ -206,7 +220,7 @@ int virtual_chdir(cwd_state *state, char *path)
return (ret);
}
-void main(void)
+main(void)
{
cwd_state state;
uint length;
@@ -226,7 +240,7 @@ void main(void)
#define T(a) \
printf("[%s] $ cd %s\n", virtual_getcwd(&state, &length), a); \
- virtual_chdir(&state, strdup(a)); \
+ virtual_chdir(&state, strdup(a), NULL); \
printf("new path is %s\n", virtual_getcwd(&state, &length));
T("..")
@@ -240,4 +254,6 @@ void main(void)
T("...foo")
T("D:/flash/zone")
T("../foo/bar/../baz")
+
+ return 0;
}