]> granicus.if.org Git - php/commitdiff
Restore HEAD of TSRM to what it was two days ago.
authorSebastian Bergmann <sebastian@php.net>
Wed, 25 Jun 2003 05:05:06 +0000 (05:05 +0000)
committerSebastian Bergmann <sebastian@php.net>
Wed, 25 Jun 2003 05:05:06 +0000 (05:05 +0000)
TSRM/TSRM.c
TSRM/TSRM.h
TSRM/tsrm_config.nw.h
TSRM/tsrm_config_common.h
TSRM/tsrm_nw.c
TSRM/tsrm_nw.h
TSRM/tsrm_virtual_cwd.c
TSRM/tsrm_virtual_cwd.h
TSRM/tsrm_win32.c
TSRM/tsrm_win32.h

index 7f6ea1f232ee757c85da8c7e10ce00a9f6a59a3e..f39114d77048eb516fb3a27e90bd69cd731c58f9 100644 (file)
@@ -158,6 +158,9 @@ TSRM_API void tsrm_shutdown(void)
 
                                next_p = p->next;
                                for (j=0; j<id_count; j++) {
+                                       if (resource_types_table && resource_types_table[j].dtor) {
+                                               resource_types_table[j].dtor(p->storage[j], &p->storage);
+                                       }
                                        free(p->storage[j]);
                                }
                                free(p->storage);
@@ -290,6 +293,15 @@ TSRM_API void *ts_resource_ex(ts_rsrc_id id, THREAD_T *th_id)
        int hash_value;
        tsrm_tls_entry *thread_resources;
 
+#ifdef NETWARE
+       /* The below if loop is added for NetWare to fix an abend while unloading PHP
+        * when an Apache unload command is issued on the system console.
+        * While exiting from PHP, at the end for some reason, this function is called
+        * with tsrm_tls_table = NULL. When this happened, the server abends when
+        * tsrm_tls_table is accessed since it is NULL.
+        */
+       if(tsrm_tls_table) {
+#endif
        if (!th_id) {
 #if defined(PTHREADS)
                /* Fast path for looking up the resources for the current
@@ -352,6 +364,9 @@ TSRM_API void *ts_resource_ex(ts_rsrc_id id, THREAD_T *th_id)
         * changes to the structure as we read it.
         */
        TSRM_SAFE_RETURN_RSRC(thread_resources->storage, id, thread_resources->count);
+#ifdef NETWARE
+       }       /* if(tsrm_tls_table) */
+#endif
 }
 
 
@@ -419,7 +434,12 @@ TSRM_API THREAD_T tsrm_thread_id(void)
 #ifdef TSRM_WIN32
        return GetCurrentThreadId();
 #elif defined(NETWARE)
-       return NXThreadGetId();
+       /* There seems to be some problem with the LibC call: NXThreadGetId().
+        * Due to this, the PHPMyAdmin application is abending in PHP calls.
+        * Used the call, kCurrentThread instead and it works fine.
+        */
+/*     return NXThreadGetId(); */
+       return kCurrentThread();
 #elif defined(GNUPTH)
        return pth_self();
 #elif defined(PTHREADS)
@@ -441,16 +461,23 @@ TSRM_API MUTEX_T tsrm_mutex_alloc(void)
 {
        MUTEX_T mutexp;
 #ifdef NETWARE
-       long flags = 0;  /* Don't require NX_MUTEX_RECURSIVE, I guess */
+#ifndef USE_MPK
+       /* To use the Recursive Mutex Locking of LibC */
+       long flags = NX_MUTEX_RECURSIVE;
        NXHierarchy_t order = 0;
        NX_LOCK_INFO_ALLOC (lockInfo, "PHP-TSRM", 0);
-#endif    
+#endif
+#endif
 
 #ifdef TSRM_WIN32
        mutexp = malloc(sizeof(CRITICAL_SECTION));
        InitializeCriticalSection(mutexp);
 #elif defined(NETWARE)
-       mutexp = NXMutexAlloc(flags, order, &lockInfo); /* return value ignored for now */
+#ifdef USE_MPK
+       mutexp = kMutexAlloc((BYTE*)"PHP-TSRM");
+#else
+       mutexp = NXMutexAlloc(flags, order, &lockInfo);
+#endif
 #elif defined(GNUPTH)
        mutexp = (MUTEX_T) malloc(sizeof(*mutexp));
        pth_mutex_init(mutexp);
@@ -481,8 +508,13 @@ TSRM_API void tsrm_mutex_free(MUTEX_T mutexp)
        if (mutexp) {
 #ifdef TSRM_WIN32
                DeleteCriticalSection(mutexp);
+               free(mutexp);
 #elif defined(NETWARE)
+#ifdef USE_MPK
+               kMutexFree(mutexp);
+#else
                NXMutexFree(mutexp);
+#endif
 #elif defined(GNUPTH)
                free(mutexp);
 #elif defined(PTHREADS)
@@ -513,7 +545,11 @@ TSRM_API int tsrm_mutex_lock(MUTEX_T mutexp)
        EnterCriticalSection(mutexp);
        return 1;
 #elif defined(NETWARE)
+#ifdef USE_MPK
+       return kMutexLock(mutexp);
+#else
        return NXLock(mutexp);
+#endif
 #elif defined(GNUPTH)
        return pth_mutex_acquire(mutexp, 0, NULL);
 #elif defined(PTHREADS)
@@ -540,7 +576,11 @@ TSRM_API int tsrm_mutex_unlock(MUTEX_T mutexp)
        LeaveCriticalSection(mutexp);
        return 1;
 #elif defined(NETWARE)
+#ifdef USE_MPK
+       return kMutexUnlock(mutexp);
+#else
        return NXUnlock(mutexp);
+#endif
 #elif defined(GNUPTH)
        return pth_mutex_release(mutexp);
 #elif defined(PTHREADS)
index a80500d6db0402db67a172b371c13d523570d343..09da7b49cbd52dc7865d1afd2e03066329d5ed6a 100644 (file)
 #ifdef ZTS
 
 #ifdef TSRM_WIN32
+# ifndef TSRM_INCLUDE_FULL_WINDOWS_HEADERS
+#  define WIN32_LEAN_AND_MEAN
+# endif
 # include <windows.h>
 #elif defined(NETWARE)
 # include <nks/thread.h>
+#ifdef USE_MPK
+# include <mpklib4php.h>
+#else
 # include <nks/synch.h>
+#endif
 #elif defined(GNUPTH)
 # include <pth.h>
 #elif defined(PTHREADS)
@@ -60,7 +67,11 @@ typedef int ts_rsrc_id;
 # define MUTEX_T CRITICAL_SECTION *
 #elif defined(NETWARE)
 # define THREAD_T NXThreadId_t
+#ifdef USE_MPK
+# define MUTEX_T MUTEX
+#else
 # define MUTEX_T NXMutex_t *
+#endif
 #elif defined(GNUPTH)
 # define THREAD_T pth_t
 # define MUTEX_T pth_mutex_t *
@@ -138,6 +149,8 @@ TSRM_API void *tsrm_set_new_thread_end_handler(tsrm_thread_end_func_t new_thread
 #define TSRM_UNSHUFFLE_RSRC_ID(rsrc_id)                ((rsrc_id)-1)
 
 #define TSRMLS_FETCH()                 void ***tsrm_ls = (void ***) ts_resource_ex(0, NULL)
+#define TSRMLS_FETCH_FROM_CTX(ctx)     void ***tsrm_ls = (void ***) ctx
+#define TSRMLS_SET_CTX(ctx)            (void ***) ctx = tsrm_ls
 #define TSRMG(id, type, element)       (((type) (*((void ***) tsrm_ls))[TSRM_UNSHUFFLE_RSRC_ID(id)])->element)
 #define TSRMLS_D       void ***tsrm_ls
 #define TSRMLS_DC      , TSRMLS_D
@@ -151,6 +164,8 @@ TSRM_API void *tsrm_set_new_thread_end_handler(tsrm_thread_end_func_t new_thread
 #else /* non ZTS */
 
 #define TSRMLS_FETCH()
+#define TSRMLS_FETCH_FROM_CTX(ctx)
+#define TSRMLS_SET_CTX(ctx)
 #define TSRMLS_D       void
 #define TSRMLS_DC
 #define TSRMLS_C
index 0681852c7d45815901279a273645f57f1c395828..14fcc19ab2faef4444169f2f64388d87cb7d180e 100644 (file)
@@ -3,7 +3,9 @@
 
 #define HAVE_UTIME 1
 
-/* Though we have alloca(), this seems to be causing some problem with the stack pointer -- hence not using it */
-/* #define HAVE_ALLOCA 1 */
+/* Though we have alloca(), this seems to be causing some problem
+ * with the stack pointer. Hence not using it
+ */
+/*#define HAVE_ALLOCA 1*/
 
 #endif
index 8dbb93fe89fc09d0ba6da183ca2c658e6e8f1123..0cc0e6c5a1b0e876d269266d6400dbebecb80985 100644 (file)
@@ -25,7 +25,9 @@
  #pragma alloca
 #  else
 #   ifndef alloca /* predefined by HP cc +Olibcalls */
+#    ifndef NETWARE
 char *alloca ();
+#    endif
 #   endif
 #  endif
 # endif
index 3559b783a8efc00f59e9d6cb899c1ab4b93d403c..60f73c3c7e25c7f976d6405e0872ab0a64938366 100644 (file)
@@ -4,15 +4,16 @@
    +----------------------------------------------------------------------+
    | Copyright (c) 1997-2003 The PHP Group                                |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.02 of the PHP license,      |
+   | This source file is subject to version 3.0 of the PHP license,       |
    | that is bundled with this package in the file LICENSE, and is        |
-   | available at through the world-wide-web at                           |
-   | http://www.php.net/license/2_02.txt.                                 |
+   | available through the world-wide-web at the following url:           |
+   | http://www.php.net/license/3_0.txt.                                  |
    | 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: Venkat Raghavan S <rvenkat@novell.com>                      |
+   |          Anantha Kesari H Y <hyanantha@novell.com>                   |
    +----------------------------------------------------------------------+
 */
 
@@ -39,8 +40,9 @@
 
 #include "mktemp.h"
 
-/* strtok() call in LibC is abending when used in a different address space -- hence using
-   PHP's version itself for now : Venkat (30/4/02) */
+/* strtok() call in LibC is abending when used in a different address space
+ * -- hence using PHP's version itself for now
+ */
 #include "tsrm_strtok_r.h"
 #define tsrm_strtok_r(a,b,c) strtok((a),(b))
 
 
 TSRM_API FILE* popen(const char *commandline, const char *type)
 {
-    char *command = NULL, *argv[MAX_ARGS] = {'\0'}, **env = NULL;
+       char *command = NULL, *argv[MAX_ARGS] = {'\0'}, **env = NULL;
        char *tempName = "sys:/php/temp/phpXXXXXX.tmp";
-    char *filePath = NULL;
-    char *ptr = NULL;
-    int ptrLen = 0, argc = 0, i = 0, envCount = 0, err = 0;
+       char *filePath = NULL;
+       char *ptr = NULL;
+       int ptrLen = 0, argc = 0, i = 0, envCount = 0, err = 0;
        FILE *stream = NULL;
 #if defined(USE_PIPE_OPEN) || defined(USE_MKFIFO)
-    int pipe_handle;
-    int mode = O_RDONLY;
+       int pipe_handle;
+       int mode = O_RDONLY;
 #else
-    NXHandle_t pipe_handle;
-    NXMode_t mode = NX_O_RDONLY;
+       NXHandle_t pipe_handle;
+       NXMode_t mode = NX_O_RDONLY;
 #endif
-    NXExecEnvSpec_t envSpec;
-    NXNameSpec_t nameSpec;
-    NXVmId_t newVM = 0;
+       NXExecEnvSpec_t envSpec;
+       NXNameSpec_t nameSpec;
+       NXVmId_t newVM = 0;
 
-    /* Check for validity of input parameters */
-    if (!commandline || !type)
-        return NULL;
+       /* Check for validity of input parameters */
+       if (!commandline || !type)
+               return NULL;
 
-    /* Get temporary file name */
-    filePath = mktemp(tempName);
-/*consoleprintf ("PHP | popen: file path = %s, mode = %s\n", filePath, type);*/
+       /* Get temporary file name */
+       filePath = mktemp(tempName);
        if (!filePath)
                return NULL;
 
-    /* Set pipe mode according to type -- for now allow only "r" or "w" */
-    if (strcmp(type, "r") == 0)
+       /* Set pipe mode according to type -- for now allow only "r" or "w" */
+       if (strcmp(type, "r") == 0)
 #if defined(USE_PIPE_OPEN) || defined(USE_MKFIFO)
-        mode = O_RDONLY;
+               mode = O_RDONLY;
 #else
-        mode = NX_O_RDONLY;
+               mode = NX_O_RDONLY;
 #endif
-    else if (strcmp(type, "w") == 0)
+       else if (strcmp(type, "w") == 0)
 #if defined(USE_PIPE_OPEN) || defined(USE_MKFIFO)
-        mode = O_WRONLY;
+               mode = O_WRONLY;
 #else
-        mode = NX_O_WRONLY;
+               mode = NX_O_WRONLY;
 #endif
-    else
-        return NULL;
+       else
+               return NULL;
 
 #ifdef USE_PIPE_OPEN
-    pipe_handle = pipe_open(filePath, mode);
-/*consoleprintf ("PHP | popen: pipe_open() returned %d\n", pipe_handle);*/
-    if (pipe_handle == -1)
-        return NULL;
+       pipe_handle = pipe_open(filePath, mode);
+       if (pipe_handle == -1)
+               return NULL;
 #elif defined(USE_MKFIFO)
-    pipe_handle = mkfifo(filePath, mode);
-consoleprintf ("PHP | popen: mkfifo() returned %d\n", pipe_handle);
-    if (pipe_handle == -1)
-        return NULL;
+       pipe_handle = mkfifo(filePath, mode);
+       if (pipe_handle == -1)
+               return NULL;
 #else
-    /*
-        - NetWare doesn't require first parameter
-        - Allowing LibC to choose the buffer size for now
-    */
-    err = NXFifoOpen(0, filePath, mode, 0, &pipe_handle);
-/*consoleprintf ("PHP | popen: NXFifoOpen() returned %d\n", err);*/
-    if (err)
-        return NULL;
+       /* - NetWare doesn't require first parameter
+        * - Allowing LibC to choose the buffer size for now
+        */
+       err = NXFifoOpen(0, filePath, mode, 0, &pipe_handle);
+       if (err)
+               return NULL;
 #endif
 
-    /* Copy the environment variables in preparation for the spawn call */
-
-    envCount = NXGetEnvCount() + 1;  /* add one for NULL */
-    env = (char**)NXMemAlloc(sizeof(char*) * envCount, 0);
-    if (!env)
-        return NULL;
-
-    err = NXCopyEnv(env, envCount);
-consoleprintf ("PHP | popen: NXCopyEnv() returned %d\n", err);
-    if (err)
-    {
-        NXMemFree (env);
-        return NULL;
-    }
-
-    /* Separate commandline string into words */
-consoleprintf ("PHP | popen: commandline = %s\n", commandline);
-    ptr = tsrm_strtok_r((char*)commandline, WHITESPACE, NULL);
-    ptrLen = strlen(ptr);
-
-    command = (char*)malloc(ptrLen + 1);
-    if (!command)
-    {
-        NXMemFree (env);
-        return NULL;
-    }
-
-    strcpy (command, ptr);
-
-    ptr = tsrm_strtok_r(NULL, WHITESPACE, NULL);
-    while (ptr && (argc < MAX_ARGS))
-    {
-        ptrLen = strlen(ptr);
-
-        argv[argc] = (char*)malloc(ptrLen + 1);
-        if (!argv[argc])
-        {
-            NXMemFree (env);
-
-            if (command)
-                free (command);
-
-            for (i = 0; i < argc; i++)
-            {
-                if (argv[i])
-                free (argv[i]);
-            }
-
-            return NULL;
-        }
-
-        strcpy (argv[argc], ptr);
-
-        argc++;
-
-        ptr = tsrm_strtok_r(NULL, WHITESPACE, NULL);
-    }
-consoleprintf ("PHP | popen: commandline string parsed into tokens\n");
-    /* Setup the execution environment and spawn new process */
-
-    envSpec.esFlags = 0;    /* Not used */
-    envSpec.esArgc = argc;
-    envSpec.esArgv = (void**)argv;
-    envSpec.esEnv = (void**)env;
-
-    envSpec.esStdin.ssType =
-    envSpec.esStdout.ssType = NX_OBJ_FIFO;
-    envSpec.esStderr.ssType = NX_OBJ_FILE;
+       /* Copy the environment variables in preparation for the spawn call */
+       envCount = NXGetEnvCount() + 1;  /* add one for NULL */
+       env = (char **) NXMemAlloc(sizeof(char *) * envCount, 0);
+       if (!env)
+               return NULL;
+
+       err = NXCopyEnv(env, envCount);
+       if (err) {
+               NXMemFree (env);
+               return NULL;
+       }
+
+       /* Separate commandline string into words */
+       ptr = tsrm_strtok_r((char*)commandline, WHITESPACE, NULL);
+       ptrLen = strlen(ptr);
+
+       command = (char*)malloc(ptrLen + 1);
+       if (!command) {
+               NXMemFree (env);
+               return NULL;
+       }
+
+       strcpy (command, ptr);
+
+       ptr = tsrm_strtok_r(NULL, WHITESPACE, NULL);
+       while (ptr && (argc < MAX_ARGS)) {
+               ptrLen = strlen(ptr);
+
+               argv[argc] = (char*)malloc(ptrLen + 1);
+               if (!argv[argc]) {
+                       NXMemFree (env);
+                       if (command)
+                               free (command);
+
+                       for (i = 0; i < argc; i++) {
+                               if (argv[i])
+                                       free (argv[i]);
+                       }
+
+                       return NULL;
+               }
+
+               strcpy (argv[argc], ptr);
+               argc++;
+               ptr = tsrm_strtok_r(NULL, WHITESPACE, NULL);
+       }
+
+       /* Setup the execution environment and spawn new process */
+       envSpec.esFlags = 0;    /* Not used */
+       envSpec.esArgc = argc;
+       envSpec.esArgv = (void **) argv;
+       envSpec.esEnv = (void **) env;
+
+/*     envSpec.esStdin.ssType = */
+       envSpec.esStdout.ssType = NX_OBJ_FIFO;
+       envSpec.esStderr.ssType = NX_OBJ_FILE;
+
+       /* 'ssHandle' is not a struct/union/class member */
 /*
-    envSpec.esStdin.ssHandle =
-    envSpec.esStdout.ssHandle =
-    envSpec.esStderr.ssHandle = -1;
+       envSpec.esStdin.ssHandle =
+       envSpec.esStdout.ssHandle =
+       envSpec.esStderr.ssHandle = -1;
 */
-    envSpec.esStdin.ssPathCtx =
-    envSpec.esStdout.ssPathCtx =
-    envSpec.esStderr.ssPathCtx = NULL;
+       envSpec.esStdin.ssPathCtx = NULL;
+       envSpec.esStdout.ssPathCtx = NULL;
+       envSpec.esStderr.ssPathCtx = NULL;
 
 #if defined(USE_PIPE_OPEN) || defined(USE_MKFIFO)
-    if (mode == O_RDONLY)
+       if (mode == O_RDONLY) {
 #else
-    if (mode == NX_O_RDONLY)
+       if (mode == NX_O_RDONLY) {
 #endif
-    {
-        envSpec.esStdin.ssPath = filePath;
-        envSpec.esStdout.ssPath = stdout;
-    }
-    else /* Write Only */
-    {
-        envSpec.esStdin.ssPath = stdin;
-        envSpec.esStdout.ssPath = filePath;
-    }
-
-    envSpec.esStderr.ssPath = stdout;
-
-    nameSpec.ssType = NX_OBJ_FIFO;
-/*    nameSpec.ssHandle = 0; */ /* Not used */
-    nameSpec.ssPathCtx = NULL;  /* Not used */
-    nameSpec.ssPath = argv[0];
-consoleprintf ("PHP | popen: environment setup\n");
-    err = NXVmSpawn(&nameSpec, &envSpec, 0, &newVM);
-consoleprintf ("PHP | popen: NXVmSpawn() returned %d\n", err);
-    if (!err)
-        /* Get file pointer corresponding to the pipe (file) opened */
-        stream = fdopen(pipe_handle, type);
-
-    /* Clean-up */
-
-    if (env)
-        NXMemFree (env);
-
-    if (pipe_handle)
+               envSpec.esStdin.ssPath = filePath;
+               envSpec.esStdout.ssPath = stdout;
+       } else { /* Write Only */
+               envSpec.esStdin.ssPath = stdin;
+               envSpec.esStdout.ssPath = filePath;
+       }
+
+       envSpec.esStderr.ssPath = stdout;
+
+       nameSpec.ssType = NX_OBJ_FIFO;
+/*     nameSpec.ssHandle = 0; */       /* 'ssHandle' is not a struct/union/class member */
+       nameSpec.ssPathCtx = NULL;  /* Not used */
+       nameSpec.ssPath = argv[0];
+       err = NXVmSpawn(&nameSpec, &envSpec, 0, &newVM);
+       if (!err)
+               /* Get file pointer corresponding to the pipe (file) opened */
+               stream = fdopen(pipe_handle, type);
+
+       /* Clean-up */
+       if (env)
+               NXMemFree (env);
+
+       if (pipe_handle)
 #if defined(USE_PIPE_OPEN) || defined(USE_MKFIFO)
-        close(pipe_handle);
+               close(pipe_handle);
 #else
-        NXClose(pipe_handle);
+               NXClose(pipe_handle);
 #endif
 
-    if (command)
-        free (command);
+       if (command)
+               free (command);
 
-    for (i = 0; i < argc; i++)
-    {
-        if (argv[i])
-            free (argv[i]);
-    }
-consoleprintf ("PHP | popen: all clean-up done, returning...\n");
-    return stream;
+       for (i = 0; i < argc; i++) {
+               if (argv[i])
+                       free (argv[i]);
+       }
+
+       return stream;
 }
 
 TSRM_API int pclose(FILE* stream)
 {
-    int err = 0;
-    NXHandle_t fd = 0;
+       int err = 0;
+       NXHandle_t fd = 0;
 
-    /* Get the process associated with this pipe (file) handle and terminate it */
-    fd = fileno(stream);
-    NXClose (fd);
+       /* Get the process associated with this pipe (file) handle and terminate it */
+       fd = fileno(stream);
+       NXClose (fd);
 
-    err = fclose(stream);
+       err = fclose(stream);
 
-    return err;
+       return err;
 }
 
-#endif
+#endif /* NETWARE */
index e5ba62b8aac1a8ee6867b223fdc55947f65ed9a6..fbd38a3ba1cf82e7abd314418ac49ac345959216 100644 (file)
@@ -4,15 +4,16 @@
    +----------------------------------------------------------------------+
    | Copyright (c) 1997-2003 The PHP Group                                |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.02 of the PHP license,      |
+   | This source file is subject to version 3.0 of the PHP license,       |
    | that is bundled with this package in the file LICENSE, and is        |
-   | available at through the world-wide-web at                           |
-   | http://www.php.net/license/2_02.txt.                                 |
+   | available through the world-wide-web at the following url:           |
+   | http://www.php.net/license/3_0.txt.                                  |
    | 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: Venkat Raghavan S <rvenkat@novell.com>                      |
+   |          Anantha Kesari H Y <hyanantha@novell.com>                   |
    +----------------------------------------------------------------------+
 */
 
index fd27f70666d6c4277e22ee5bf76a24c1c6c158f4..060ba4eaa02ac3ab8405f339896561766a411a2c 100644 (file)
@@ -4,10 +4,10 @@
    +----------------------------------------------------------------------+
    | Copyright (c) 1997-2003 The PHP Group                                |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.02 of the PHP license,      |
+   | This source file is subject to version 3.0 of the PHP license,       |
    | that is bundled with this package in the file LICENSE, and is        |
-   | available at through the world-wide-web at                           |
-   | http://www.php.net/license/2_02.txt.                                 |
+   | available through the world-wide-web at the following url:           |
+   | http://www.php.net/license/3_0.txt.                                  |
    | 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.               |
@@ -49,7 +49,7 @@
 
 #include "TSRM.h"
 
-/* Only need mutex for popen() in Windows and NetWare, because it doesn't chdir() on UNIX */
+/* Only need mutex for popen() in Windows and NetWare because it doesn't chdir() on UNIX */
 #if (defined(TSRM_WIN32) || defined(NETWARE)) && defined(ZTS)
 MUTEX_T cwd_mutex;
 #endif
@@ -210,7 +210,7 @@ CWD_API void virtual_cwd_startup(void)
        cwd_globals_ctor(&cwd_globals TSRMLS_CC);
 #endif
 
-#if defined(TSRM_WIN32) && defined(ZTS)
+#if (defined(TSRM_WIN32) || defined(NETWARE)) && defined(ZTS)
        cwd_mutex = tsrm_mutex_alloc();
 #endif
 }
@@ -220,7 +220,7 @@ CWD_API void virtual_cwd_shutdown(void)
 #ifndef ZTS
        cwd_globals_dtor(&cwd_globals TSRMLS_CC);
 #endif
-#if defined(TSRM_WIN32) && defined(ZTS)
+#if (defined(TSRM_WIN32) || defined(NETWARE)) && defined(ZTS)
        tsrm_mutex_free(cwd_mutex);
 #endif
 
@@ -343,9 +343,6 @@ CWD_API int virtual_file_ex(cwd_state *state, const char *path, verify_path_func
         copy_amount = COPY_WHEN_ABSOLUTE(path_copy);
                is_absolute = 1;
 #ifdef TSRM_WIN32
-       } else if (IS_UNC_PATH(path_copy, path_length)) {
-               copy_amount = 2;
-               is_absolute = 1;
        } else if (IS_SLASH(path_copy[0])) {
                copy_amount = 2;
 #endif
@@ -486,19 +483,23 @@ CWD_API int virtual_chdir_file(const char *path, int (*p_chdir)(const char *path
 CWD_API char *virtual_realpath(const char *path, char *real_path TSRMLS_DC)
 {
        cwd_state new_state;
-       int retval;
+       char *retval;
 
        CWD_STATE_COPY(&new_state, &CWDG(cwd));
-       retval = virtual_file_ex(&new_state, path, NULL, 1);
        
-       if (!retval) {
+       if (virtual_file_ex(&new_state, path, NULL, 1)==0) {
                int len = new_state.cwd_length>MAXPATHLEN-1?MAXPATHLEN-1:new_state.cwd_length;
+
                memcpy(real_path, new_state.cwd, len);
                real_path[len] = '\0';
-               return real_path;
+               retval = real_path;
+       } else {
+               retval = NULL;
        }
 
-       return NULL;
+       CWD_STATE_FREE(&new_state);
+
+       return retval;
 }
 
 CWD_API int virtual_filepath_ex(const char *path, char **filepath, verify_path_func verify_path TSRMLS_DC)
@@ -538,7 +539,6 @@ CWD_API FILE *virtual_fopen(const char *path, const char *mode TSRMLS_DC)
        return f;
 }
 
-#if !defined(TSRM_WIN32)
 CWD_API int virtual_access(const char *pathname, int mode TSRMLS_DC)
 {
        cwd_state new_state;
@@ -547,13 +547,16 @@ CWD_API int virtual_access(const char *pathname, int mode TSRMLS_DC)
        CWD_STATE_COPY(&new_state, &CWDG(cwd));
        virtual_file_ex(&new_state, pathname, NULL, 1);
 
+#if defined(TSRM_WIN32)
+       ret = tsrm_win32_access(new_state.cwd, mode);
+#else
        ret = access(new_state.cwd, mode);
+#endif
        
        CWD_STATE_FREE(&new_state);
        
        return ret;
 }
-#endif
 
 
 #if HAVE_UTIME
index 4d5ba24f1b61862d08fbc1432b1ee6796fe7d43e..cc8abb7f7b0d603213768706b95b1626dec4e2a6 100644 (file)
@@ -4,10 +4,10 @@
    +----------------------------------------------------------------------+
    | Copyright (c) 1997-2003 The PHP Group                                |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.02 of the PHP license,      |
+   | This source file is subject to version 3.0 of the PHP license,       |
    | that is bundled with this package in the file LICENSE, and is        |
-   | available at through the world-wide-web at                           |
-   | http://www.php.net/license/2_02.txt.                                 |
+   | available through the world-wide-web at the following url:           |
+   | http://www.php.net/license/3_0.txt.                                  |
    | 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.               |
@@ -53,14 +53,13 @@ typedef unsigned short mode_t;
 #define IS_SLASH_P(c)  (*(c) == '/' || \
         (*(c) == '\\' && !IsDBCSLeadByte(*(c-1))))
 
-/* COPY_WHEN_ABSOLUTE also takes path as argument because netware needs it
- * to account for volume name that is unique to NetWare absolute paths
- */
+/* 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 */
 #define COPY_WHEN_ABSOLUTE(path) 2
-#define IS_ABSOLUTE_PATH(path, len) \
-       (len >= 2 && ((isalpha(path[0]) && path[1] == ':') || (IS_SLASH(path[0]) && IS_SLASH(path[1]))))
 #define IS_UNC_PATH(path, len) \
        (len >= 2 && IS_SLASH(path[0]) && IS_SLASH(path[1]))
+#define IS_ABSOLUTE_PATH(path, len) \
+       (len >= 2 && ((isalpha(path[0]) && path[1] == ':') || IS_UNC_PATH(path, len)))
 
 #elif defined(NETWARE)
 #ifdef HAVE_DIRENT_H
@@ -70,6 +69,7 @@ typedef unsigned short mode_t;
 #define DEFAULT_SLASH '/'
 #define DEFAULT_DIR_SEPARATOR  ';'
 #define IS_SLASH(c)    ((c) == '/' || (c) == '\\')
+#define IS_SLASH_P(c)  IS_SLASH(*(c))
 #define COPY_WHEN_ABSOLUTE(path) \
     (strchr(path, ':') - path + 1)  /* Take the volume name which ends with a colon */
 #define IS_ABSOLUTE_PATH(path, len) \
@@ -150,9 +150,21 @@ CWD_API int virtual_mkdir(const char *pathname, mode_t mode TSRMLS_DC);
 CWD_API int virtual_rmdir(const char *pathname TSRMLS_DC);
 CWD_API DIR *virtual_opendir(const char *pathname TSRMLS_DC);
 CWD_API FILE *virtual_popen(const char *command, const char *type TSRMLS_DC);
-
-#if !defined(TSRM_WIN32)
 CWD_API int virtual_access(const char *pathname, int mode TSRMLS_DC);
+#if defined(TSRM_WIN32)
+/* 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
 #endif
 
 #if HAVE_UTIME
@@ -229,7 +241,11 @@ typedef struct _virtual_cwd_globals {
 #define VCWD_RMDIR(pathname) rmdir(pathname)
 #define VCWD_OPENDIR(pathname) opendir(pathname)
 #define VCWD_POPEN(command, type) popen(command, type)
+#if defined(TSRM_WIN32)
+#define VCWD_ACCESS(pathname, mode) tsrm_win32_access(pathname, mode)
+#else
 #define VCWD_ACCESS(pathname, mode) access(pathname, mode)
+#endif
 
 #ifdef HAVE_REALPATH
 #define VCWD_REALPATH(path, real_path) realpath(path, real_path)
index 46365b5fc19417bfe4d248ae579f74bc4b7b676e..a8a8274f45b487bb47925a22faba2b34cace67b4 100644 (file)
@@ -4,10 +4,10 @@
    +----------------------------------------------------------------------+
    | Copyright (c) 1997-2003 The PHP Group                                |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.02 of the PHP license,      |
+   | This source file is subject to version 3.0 of the PHP license,       |
    | that is bundled with this package in the file LICENSE, and is        |
-   | available at through the world-wide-web at                           |
-   | http://www.php.net/license/2_02.txt.                                 |
+   | available through the world-wide-web at the following url:           |
+   | http://www.php.net/license/3_0.txt.                                  |
    | 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.               |
@@ -24,6 +24,8 @@
 #include <process.h>
 #include <time.h>
 
+#define TSRM_INCLUDE_FULL_WINDOWS_HEADERS
+
 #include "TSRM.h"
 
 #ifdef TSRM_WIN32
@@ -81,6 +83,19 @@ TSRM_API void tsrm_win32_shutdown(void)
 #endif
 }
 
+TSRM_API int tsrm_win32_access(const char *pathname, int mode)
+{
+       SHFILEINFO sfi;
+
+       if (mode == 1 /*X_OK*/) {
+               return access(pathname, 0) == 0 && 
+                       SHGetFileInfo(pathname, 0, &sfi, sizeof(SHFILEINFO), SHGFI_EXETYPE) != 0 ? 0 : -1;
+       } else {
+               return access(pathname, mode);
+       }
+}
+
+
 static process_pair *process_get(FILE *stream TSRMLS_DC)
 {
        process_pair *ptr;
@@ -359,4 +374,4 @@ TSRM_API int shmctl(int key, int cmd, struct shmid_ds *buf) {
                        return -1;
        }
 }
-#endif
\ No newline at end of file
+#endif
index cab558866b75f14e42ad29dca52419cbfee86c63..303e10520370bc4e1ccfcfaa4f87c2f301090660 100644 (file)
@@ -4,10 +4,10 @@
    +----------------------------------------------------------------------+
    | Copyright (c) 1997-2003 The PHP Group                                |
    +----------------------------------------------------------------------+
-   | This source file is subject to version 2.02 of the PHP license,      |
+   | This source file is subject to version 3.0 of the PHP license,       |
    | that is bundled with this package in the file LICENSE, and is        |
-   | available at through the world-wide-web at                           |
-   | http://www.php.net/license/2_02.txt.                                 |
+   | available through the world-wide-web at the following url:           |
+   | http://www.php.net/license/3_0.txt.                                  |
    | 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.               |
@@ -95,10 +95,11 @@ TSRM_API void tsrm_win32_shutdown(void);
 TSRM_API FILE *popen_ex(const char *command, const char *type, const char *cwd, char *env);
 TSRM_API FILE *popen(const char *command, const char *type);
 TSRM_API int pclose(FILE *stream);
+TSRM_API int tsrm_win32_access(const char *pathname, int mode);
 
 TSRM_API int shmget(int key, int size, int flags);
 TSRM_API void *shmat(int key, const void *shmaddr, int flags);
 TSRM_API int shmdt(const void *shmaddr);
 TSRM_API int shmctl(int key, int cmd, struct shmid_ds *buf);
 
-#endif
+#endif
\ No newline at end of file