diff options
author | Andi Gutmans <andi@php.net> | 2000-03-16 22:37:59 +0000 |
---|---|---|
committer | Andi Gutmans <andi@php.net> | 2000-03-16 22:37:59 +0000 |
commit | b46c44b485562e96aa78d7f1e1ce7bf49f1bba10 (patch) | |
tree | a4d73543dbc822d045f783ef94a48651b3b95117 /main/php_virtual_cwd.c | |
parent | 1bcdb436c176885a071046c78e84ace8396e7a25 (diff) | |
download | php-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.c | 26 |
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; } |