cvs: /php4 php_virtual_cwd.c
| From: | Andi Gutmans | Date: | Thu, 16 Mar 2000 22:38:29 +0000 |
| Subject: | cvs: /php4 php_virtual_cwd.c | ||
| Groups: | php.version4 | ||
| Request: | Send a blank email to php-version4+get-12287@lists.php.net to get a copy of this message | ||
andi Thu Mar 16 14:38:29 2000 EDT
Modified files:
/php4 php_virtual_cwd.c
Log:
- Allow passing of a verify function. This way we can easily create
chdir() and expandpath() wrappers.
Index: php4/php_virtual_cwd.c
diff -u php4/php_virtual_cwd.c:1.9 php4/php_virtual_cwd.c:1.10
--- php4/php_virtual_cwd.c:1.9 Thu Mar 16 11:19:14 2000
+++ php4/php_virtual_cwd.c Thu Mar 16 14:37:59 2000
@@ -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 @@
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,7 +96,17 @@
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)
{
if (state->cwd_length == 0) {
@@ -123,7 +137,7 @@
}
/* 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 @@
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 @@
return (ret);
}
-void main(void)
+main(void)
{
cwd_state state;
uint length;
@@ -226,7 +240,7 @@
#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 @@
T("...foo")
T("D:/flash/zone")
T("../foo/bar/../baz")
+
+ return 0;
}