- Allow passing of a verify function. This way we can easily create

chdir() and expandpath() wrappers.
This commit is contained in:
Andi Gutmans 2000-03-16 22:37:59 +00:00
parent 1bcdb436c1
commit b46c44b485

View file

@ -15,7 +15,9 @@
#define S_ISDIR(mode) ((mode) & _S_IFDIR) #define S_ISDIR(mode) ((mode) & _S_IFDIR)
#endif #endif
typedef unsigned int uint; #ifndef S_ISREG
#define S_ISREG(mode) ((mode) & _S_IFREG)
#endif
#ifdef PHP_WIN32 #ifdef PHP_WIN32
#define strtok_r(a,b,c) strtok((a),(b)) #define strtok_r(a,b,c) strtok((a),(b))
@ -82,6 +84,8 @@ typedef struct _cwd_state {
uint cwd_length; uint cwd_length;
} cwd_state; } cwd_state;
typedef int (*verify_path_func)(const cwd_state *);
static int php_is_dir_ok(const cwd_state *state) static int php_is_dir_ok(const cwd_state *state)
{ {
struct stat buf; struct stat buf;
@ -92,6 +96,16 @@ static int php_is_dir_ok(const cwd_state *state)
return (1); 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) 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 */ /* 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); uint path_length = strlen(path);
char *ptr = path; char *ptr = path;
@ -192,7 +206,7 @@ int virtual_chdir(cwd_state *state, char *path)
ptr = strtok_r(NULL, TOKENIZER_STRING, &tok); ptr = strtok_r(NULL, TOKENIZER_STRING, &tok);
} }
if (!IS_DIR_OK(state)) { if (verify_path && !verify_path(state)) {
free(state->cwd); free(state->cwd);
*state = *old_state; *state = *old_state;
@ -206,7 +220,7 @@ int virtual_chdir(cwd_state *state, char *path)
return (ret); return (ret);
} }
void main(void) main(void)
{ {
cwd_state state; cwd_state state;
uint length; uint length;
@ -226,7 +240,7 @@ void main(void)
#define T(a) \ #define T(a) \
printf("[%s] $ cd %s\n", virtual_getcwd(&state, &length), 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)); printf("new path is %s\n", virtual_getcwd(&state, &length));
T("..") T("..")
@ -240,4 +254,6 @@ void main(void)
T("...foo") T("...foo")
T("D:/flash/zone") T("D:/flash/zone")
T("../foo/bar/../baz") T("../foo/bar/../baz")
return 0;
} }