]> granicus.if.org Git - php/commitdiff
Changes to build TSRM on NetWare
authorVenkat Raghavan S <rvenkat@php.net>
Wed, 29 May 2002 08:41:21 +0000 (08:41 +0000)
committerVenkat Raghavan S <rvenkat@php.net>
Wed, 29 May 2002 08:41:21 +0000 (08:41 +0000)
TSRM/tsrm_config.nw.h [new file with mode: 0644]
TSRM/tsrm_config_common.h
TSRM/tsrm_nw.c [new file with mode: 0644]
TSRM/tsrm_nw.h [new file with mode: 0644]
TSRM/tsrm_virtual_cwd.c
TSRM/tsrm_virtual_cwd.h
netware/mktemp.h [new file with mode: 0644]
netware/sys/stat.h [new file with mode: 0644]
netware/tsrm.mak

diff --git a/TSRM/tsrm_config.nw.h b/TSRM/tsrm_config.nw.h
new file mode 100644 (file)
index 0000000..0681852
--- /dev/null
@@ -0,0 +1,9 @@
+#ifndef TSRM_CONFIG_NW_H
+#define TSRM_CONFIG_NW_H
+
+#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 */
+
+#endif
index add5a50fa53ddf4a01404d1a311fe38c83d59e28..6c220fa008dab3fd1f8868289d9dcbc37d4567aa 100644 (file)
@@ -5,11 +5,13 @@
 # define TSRM_WIN32
 #endif
 
-#ifndef TSRM_WIN32
+#ifdef TSRM_WIN32
+# include "tsrm_config.w32.h"
+#elif defined(NETWARE)
+# include "tsrm_config.nw.h"
+#else
 # include "tsrm_config.h"
 # include <sys/param.h>
-#else
-# include "tsrm_config.w32.h"
 #endif
 
 #ifdef TSRM_WIN32
diff --git a/TSRM/tsrm_nw.c b/TSRM/tsrm_nw.c
new file mode 100644 (file)
index 0000000..c0f69ad
--- /dev/null
@@ -0,0 +1,260 @@
+/*
+   +----------------------------------------------------------------------+
+   | PHP Version 4                                                        |
+   +----------------------------------------------------------------------+
+   | Copyright (c) 1997-2002 The PHP Group                                |
+   +----------------------------------------------------------------------+
+   | This source file is subject to version 2.02 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.                                 |
+   | 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>                      |
+   +----------------------------------------------------------------------+
+*/
+
+/* $Id$ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <fcntl.h>
+
+#include "TSRM.h"
+
+#ifdef NETWARE
+
+#ifdef USE_MKFIFO
+#include <sys/stat.h>
+#elif !defined(USE_PIPE_OPEN)   /* NXFifoOpen */
+#include <nks/fsio.h>
+#endif
+
+#include <nks/vm.h>
+#include <nks/memory.h>
+
+#include <string.h>
+
+#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) */
+#include "tsrm_strtok_r.h"
+#define tsrm_strtok_r(a,b,c) strtok((a),(b))
+
+#define WHITESPACE  " \t"
+#define MAX_ARGS    10
+
+
+TSRM_API FILE* popen(const char *commandline, const char *type)
+{
+    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;
+       FILE *stream = NULL;
+#if defined(USE_PIPE_OPEN) || defined(USE_MKFIFO)
+    int pipe_handle;
+    int mode = O_RDONLY;
+#else
+    NXHandle_t pipe_handle;
+    NXMode_t mode = NX_O_RDONLY;
+#endif
+    NXExecEnvSpec_t envSpec;
+    NXNameSpec_t nameSpec;
+    NXVmId_t newVM = 0;
+
+    /* 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);*/
+       if (!filePath)
+               return NULL;
+
+    /* 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;
+#else
+        mode = NX_O_RDONLY;
+#endif
+    else if (strcmp(type, "w") == 0)
+#if defined(USE_PIPE_OPEN) || defined(USE_MKFIFO)
+        mode = O_WRONLY;
+#else
+        mode = NX_O_WRONLY;
+#endif
+    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;
+#elif defined(USE_MKFIFO)
+    pipe_handle = mkfifo(filePath, mode);
+consoleprintf ("PHP | popen: mkfifo() returned %d\n", pipe_handle);
+    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;
+#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;
+/*
+    envSpec.esStdin.ssHandle =
+    envSpec.esStdout.ssHandle =
+    envSpec.esStderr.ssHandle = -1;
+*/
+    envSpec.esStdin.ssPathCtx =
+    envSpec.esStdout.ssPathCtx =
+    envSpec.esStderr.ssPathCtx = NULL;
+
+#if defined(USE_PIPE_OPEN) || defined(USE_MKFIFO)
+    if (mode == O_RDONLY)
+#else
+    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)
+#if defined(USE_PIPE_OPEN) || defined(USE_MKFIFO)
+        close(pipe_handle);
+#else
+        NXClose(pipe_handle);
+#endif
+
+    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;
+}
+
+TSRM_API int pclose(FILE* stream)
+{
+    int err = 0;
+    NXHandle_t fd = 0;
+
+    /* Get the process associated with this pipe (file) handle and terminate it */
+    fd = fileno(stream);
+    NXClose (fd);
+
+    err = fclose(stream);
+
+    return err;
+}
+
+#endif
diff --git a/TSRM/tsrm_nw.h b/TSRM/tsrm_nw.h
new file mode 100644 (file)
index 0000000..3ced3f2
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+   +----------------------------------------------------------------------+
+   | PHP Version 4                                                        |
+   +----------------------------------------------------------------------+
+   | Copyright (c) 1997-2002 The PHP Group                                |
+   +----------------------------------------------------------------------+
+   | This source file is subject to version 2.02 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.                                 |
+   | 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>                      |
+   +----------------------------------------------------------------------+
+*/
+
+
+#ifndef TSRM_NW_H
+#define TSRM_NW_H
+
+#include "TSRM.h"
+
+TSRM_API FILE* popen(const char *command, const char *type);
+TSRM_API int pclose(FILE* stream);
+
+#endif
index e0c305d05c59071480f29516e536a28c16b78f40..a2a65eda74bc2de80de0ca5148ae7922abcd0902 100644 (file)
 #include "tsrm_win32.h"
 #endif
 
+#ifdef NETWARE
+/*#include "pipe.h"*/
+#include "tsrm_nw.h"
+#endif
+
 #define VIRTUAL_CWD_DEBUG 0
 
 #include "TSRM.h"
 
-/* Only need mutex for popen() in Windows because it doesn't chdir() on UNIX */
-#if defined(TSRM_WIN32) && defined(ZTS)
+/* 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
 
@@ -85,6 +90,13 @@ static int php_check_dots(const char *element, int n)
 #define IS_DIRECTORY_CURRENT(element, len) \
        (len == 1 && ptr[0] == '.')
 
+#elif defined(NETWARE)
+/* NetWare has strtok() (in LibC) and allows both slashes in paths, like Windows --
+   but rest of the stuff is like Unix */
+/* strtok() call in LibC is abending when used in a different address space -- hence using
+   PHP's version itself for now */
+/*#define tsrm_strtok_r(a,b,c) strtok((a),(b))*/
+#define TOKENIZER_STRING "/\\"
 
 #else
 #define TOKENIZER_STRING "/"
@@ -121,9 +133,15 @@ static int php_check_dots(const char *element, int n)
        
 static int php_is_dir_ok(const cwd_state *state) 
 {
+#if !(defined(NETWARE) && defined(CLIB_STAT_PATCH))
        struct stat buf;
 
        if (stat(state->cwd, &buf) == 0 && S_ISDIR(buf.st_mode))
+#else
+    struct stat_libc buf;
+
+    if (stat(state->cwd, (struct stat*)(&buf)) == 0 && S_ISDIR(buf.st_mode))
+#endif
                return (0);
 
        return (1);
@@ -131,9 +149,15 @@ static int php_is_dir_ok(const cwd_state *state)
 
 static int php_is_file_ok(const cwd_state *state) 
 {
+#if !(defined(NETWARE) && defined(CLIB_STAT_PATCH))
        struct stat buf;
 
        if (stat(state->cwd, &buf) == 0 && S_ISREG(buf.st_mode))
+#else
+    struct stat_libc buf;
+
+    if (stat(state->cwd, (struct stat*)(&buf)) == 0 && S_ISREG(buf.st_mode))
+#endif
                return (0);
 
        return (1);
@@ -274,7 +298,7 @@ CWD_API int virtual_file_ex(cwd_state *state, const char *path, verify_path_func
        if (path_length == 0) 
                return (0);
 
-#if !defined(TSRM_WIN32) && !defined(__BEOS__)
+#if !defined(TSRM_WIN32) && !defined(__BEOS__) && !defined(NETWARE)
        if (IS_ABSOLUTE_PATH(path, path_length)) {
                if (realpath(path, resolved_path)) {
                        path = resolved_path;
@@ -309,7 +333,12 @@ CWD_API int virtual_file_ex(cwd_state *state, const char *path, verify_path_func
        fprintf(stderr,"cwd = %s path = %s\n", state->cwd, path);
 #endif
        if (IS_ABSOLUTE_PATH(path_copy, path_length)) {
+/* COPY_WHEN_ABSOLUTE needs to account for volume name that is unique to NetWare absolute paths */
+#ifndef NETWARE
                copy_amount = COPY_WHEN_ABSOLUTE;
+#else
+        copy_amount = COPY_WHEN_ABSOLUTE(path_copy);
+#endif
                is_absolute = 1;
 #ifdef TSRM_WIN32
        } else if (IS_UNC_PATH(path_copy, path_length)) {
@@ -368,6 +397,11 @@ CWD_API int virtual_file_ex(cwd_state *state, const char *path, verify_path_func
                                IsDBCSLeadByte(state->cwd[state->cwd_length-2])) {
                                state->cwd[state->cwd_length++] = DEFAULT_SLASH;
                        }
+#elif defined(NETWARE)
+            /* If the token is a volume name, it will have colon at the end -- so, no slash before it */
+            if (ptr[ptr_length-1] != ':') {
+                               state->cwd[state->cwd_length++] = DEFAULT_SLASH;
+                       }
 #else
                        state->cwd[state->cwd_length++] = DEFAULT_SLASH;
 #endif
@@ -377,7 +411,12 @@ CWD_API int virtual_file_ex(cwd_state *state, const char *path, verify_path_func
                ptr = tsrm_strtok_r(NULL, TOKENIZER_STRING, &tok);
        }
 
+/* COPY_WHEN_ABSOLUTE needs to account for volume name that is unique to NetWare absolute paths */
+#ifndef NETWARE
        if (state->cwd_length == COPY_WHEN_ABSOLUTE) {
+#else
+       if (state->cwd_length == COPY_WHEN_ABSOLUTE(state->cwd)) {
+#endif
                state->cwd = (char *) realloc(state->cwd, state->cwd_length+1+1);
                state->cwd[state->cwd_length] = DEFAULT_SLASH;
                state->cwd[state->cwd_length+1] = '\0';
@@ -427,7 +466,12 @@ CWD_API int virtual_chdir_file(const char *path, int (*p_chdir)(const char *path
                return -1;
        }
 
+/* COPY_WHEN_ABSOLUTE needs to account for volume name that is unique to NetWare absolute paths */
+#ifndef NETWARE
        if (length == COPY_WHEN_ABSOLUTE && IS_ABSOLUTE_PATH(path, length+1)) { /* Also use trailing slash if this is absolute */
+#else
+       if (length == COPY_WHEN_ABSOLUTE(path) && IS_ABSOLUTE_PATH(path, length+1)) { /* Also use trailing slash if this is absolute */
+#endif
                length++;
        }
        temp = (char *) tsrm_do_alloca(length+1);
@@ -526,7 +570,7 @@ CWD_API int virtual_chmod(const char *filename, mode_t mode TSRMLS_DC)
        return ret;
 }
 
-#ifndef TSRM_WIN32
+#if !defined(TSRM_WIN32) && !defined(NETWARE)
 CWD_API int virtual_chown(const char *filename, uid_t owner, gid_t group TSRMLS_DC)
 {
        cwd_state new_state;
@@ -602,6 +646,7 @@ CWD_API int virtual_rename(char *oldname, char *newname TSRMLS_DC)
        return retval;
 }
 
+#if !(defined(NETWARE) && defined(CLIB_STAT_PATCH))
 CWD_API int virtual_stat(const char *path, struct stat *buf TSRMLS_DC)
 {
        cwd_state new_state;
@@ -615,9 +660,23 @@ CWD_API int virtual_stat(const char *path, struct stat *buf TSRMLS_DC)
        CWD_STATE_FREE(&new_state);
        return retval;
 }
+#else
+CWD_API int virtual_stat(const char *path, struct stat_libc *buf TSRMLS_DC)
+{
+       cwd_state new_state;
+       int retval;
 
-#ifndef TSRM_WIN32
+       CWD_STATE_COPY(&new_state, &CWDG(cwd));
+       virtual_file_ex(&new_state, path, NULL);
+
+       retval = stat(new_state.cwd, (struct stat*)buf);
+
+       CWD_STATE_FREE(&new_state);
+       return retval;
+}
+#endif
 
+#if !defined(TSRM_WIN32) && !defined(NETWARE)
 CWD_API int virtual_lstat(const char *path, struct stat *buf TSRMLS_DC)
 {
        cwd_state new_state;
@@ -631,7 +690,6 @@ CWD_API int virtual_lstat(const char *path, struct stat *buf TSRMLS_DC)
        CWD_STATE_FREE(&new_state);
        return retval;
 }
-
 #endif
 
 CWD_API int virtual_unlink(const char *path TSRMLS_DC)
@@ -697,46 +755,41 @@ CWD_API DIR *virtual_opendir(const char *pathname TSRMLS_DC)
        return retval;
 }
 
-#ifndef TSRM_WIN32
+#ifdef TSRM_WIN32
 
+/* On Windows the trick of prepending "cd cwd; " doesn't work so we need to perform
+   a real chdir() and mutex it
+ */
 CWD_API FILE *virtual_popen(const char *command, const char *type TSRMLS_DC)
 {
-       int command_length;
-       char *command_line;
-       char *ptr;
+       char prev_cwd[MAXPATHLEN];
+       char *getcwd_result;
        FILE *retval;
 
-       command_length = strlen(command);
-
-       ptr = command_line = (char *) malloc(command_length + sizeof("cd  ; ") + CWDG(cwd).cwd_length+1);
-       if (!command_line) {
+       getcwd_result = getcwd(prev_cwd, MAXPATHLEN);
+       if (!getcwd_result) {
                return NULL;
        }
-       memcpy(ptr, "cd ", sizeof("cd ")-1);
-       ptr += sizeof("cd ")-1;
 
-       if (CWDG(cwd).cwd_length == 0) {
-               *ptr++ = DEFAULT_SLASH;
-       } else {
-               memcpy(ptr, CWDG(cwd).cwd, CWDG(cwd).cwd_length);
-               ptr += CWDG(cwd).cwd_length;
-       }
-       
-       *ptr++ = ' ';
-       *ptr++ = ';';
-       *ptr++ = ' ';
+#ifdef ZTS
+       tsrm_mutex_lock(cwd_mutex);
+#endif
 
-       memcpy(ptr, command, command_length+1);
-       retval = popen(command_line, type);
+       chdir(CWDG(cwd).cwd);
+       retval = popen(command, type);
+       chdir(prev_cwd);
+
+#ifdef ZTS
+       tsrm_mutex_unlock(cwd_mutex);
+#endif
 
-       free(command_line);
        return retval;
 }
 
-#else
+#elif defined(NETWARE)
 
-/* On Windows the trick of prepending "cd cwd; " doesn't work so we need to perform
-   a real chdir() and mutex it
+/* On NetWare, the trick of prepending "cd cwd; " doesn't work so we need to perform
+   a VCWD_CHDIR() and mutex it
  */
 CWD_API FILE *virtual_popen(const char *command, const char *type TSRMLS_DC)
 {
@@ -744,7 +797,7 @@ CWD_API FILE *virtual_popen(const char *command, const char *type TSRMLS_DC)
        char *getcwd_result;
        FILE *retval;
 
-       getcwd_result = getcwd(prev_cwd, MAXPATHLEN);
+       getcwd_result = VCWD_GETCWD(prev_cwd, MAXPATHLEN);
        if (!getcwd_result) {
                return NULL;
        }
@@ -753,9 +806,9 @@ CWD_API FILE *virtual_popen(const char *command, const char *type TSRMLS_DC)
        tsrm_mutex_lock(cwd_mutex);
 #endif
 
-       chdir(CWDG(cwd).cwd);
+       VCWD_CHDIR(CWDG(cwd).cwd);
        retval = popen(command, type);
-       chdir(prev_cwd);
+       VCWD_CHDIR(prev_cwd);
 
 #ifdef ZTS
        tsrm_mutex_unlock(cwd_mutex);
@@ -764,6 +817,42 @@ CWD_API FILE *virtual_popen(const char *command, const char *type TSRMLS_DC)
        return retval;
 }
 
+#else /* Unix */
+
+CWD_API FILE *virtual_popen(const char *command, const char *type TSRMLS_DC)
+{
+       int command_length;
+       char *command_line;
+       char *ptr;
+       FILE *retval;
+
+       command_length = strlen(command);
+
+       ptr = command_line = (char *) malloc(command_length + sizeof("cd  ; ") + CWDG(cwd).cwd_length+1);
+       if (!command_line) {
+               return NULL;
+       }
+       memcpy(ptr, "cd ", sizeof("cd ")-1);
+       ptr += sizeof("cd ")-1;
+
+       if (CWDG(cwd).cwd_length == 0) {
+               *ptr++ = DEFAULT_SLASH;
+       } else {
+               memcpy(ptr, CWDG(cwd).cwd, CWDG(cwd).cwd_length);
+               ptr += CWDG(cwd).cwd_length;
+       }
+       
+       *ptr++ = ' ';
+       *ptr++ = ';';
+       *ptr++ = ' ';
+
+       memcpy(ptr, command, command_length+1);
+       retval = popen(command_line, type);
+
+       free(command_line);
+       return retval;
+}
+
 #endif
 
 
index 98efaa14323209fbf9db752e1037f14b310a8184..d77539d1efd729deeda34a622b2699dc6692e13b 100644 (file)
@@ -58,6 +58,19 @@ typedef unsigned short mode_t;
 #define IS_UNC_PATH(path, len) \
        (len >= 2 && IS_SLASH(path[0]) && IS_SLASH(path[1]))
 
+#elif defined(NETWARE)
+#ifdef HAVE_DIRENT_H
+#include <dirent.h>
+#endif
+
+#define DEFAULT_SLASH '/'
+#define DEFAULT_DIR_SEPARATOR  ';'
+#define IS_SLASH(c)    ((c) == '/' || (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) \
+    (strchr(path, ':') != NULL) /* Colon indicates volume name */
+
 #else
 #ifdef HAVE_DIRENT_H
 #include <dirent.h>
@@ -120,8 +133,12 @@ CWD_API FILE *virtual_fopen(const char *path, const char *mode TSRMLS_DC);
 CWD_API int virtual_open(const char *path TSRMLS_DC, int flags, ...);
 CWD_API int virtual_creat(const char *path, mode_t mode TSRMLS_DC);
 CWD_API int virtual_rename(char *oldname, char *newname TSRMLS_DC);
+#if !(defined(NETWARE) && defined(CLIB_STAT_PATCH))
 CWD_API int virtual_stat(const char *path, struct stat *buf TSRMLS_DC);
-#ifndef TSRM_WIN32
+#else
+CWD_API int virtual_stat(const char *path, struct stat_libc *buf TSRMLS_DC);
+#endif
+#if !defined(TSRM_WIN32) && !defined(NETWARE)
 CWD_API int virtual_lstat(const char *path, struct stat *buf TSRMLS_DC);
 #endif
 CWD_API int virtual_unlink(const char *path TSRMLS_DC);
@@ -133,7 +150,7 @@ CWD_API FILE *virtual_popen(const char *command, const char *type TSRMLS_DC);
 CWD_API int virtual_utime(const char *filename, struct utimbuf *buf TSRMLS_DC);
 #endif
 CWD_API int virtual_chmod(const char *filename, mode_t mode TSRMLS_DC);
-#ifndef TSRM_WIN32
+#if !defined(TSRM_WIN32) && !defined(NETWARE)
 CWD_API int virtual_chown(const char *filename, uid_t owner, gid_t group TSRMLS_DC);
 #endif
 
@@ -168,7 +185,7 @@ typedef struct _virtual_cwd_globals {
 #define VCWD_REALPATH(path, real_path) virtual_realpath(path, real_path TSRMLS_CC)
 #define VCWD_RENAME(oldname, newname) virtual_rename(oldname, newname TSRMLS_CC)
 #define VCWD_STAT(path, buff) virtual_stat(path, buff TSRMLS_CC)
-#ifdef TSRM_WIN32
+#if !defined(TSRM_WIN32) && !defined(NETWARE)
 #define VCWD_LSTAT(path, buff) virtual_stat(path, buff TSRMLS_CC)
 #else
 #define VCWD_LSTAT(path, buff) virtual_lstat(path, buff TSRMLS_CC)
@@ -182,7 +199,7 @@ typedef struct _virtual_cwd_globals {
 #define VCWD_UTIME(path, time) virtual_utime(path, time TSRMLS_CC)
 #endif
 #define VCWD_CHMOD(path, mode) virtual_chmod(path, mode TSRMLS_CC)
-#ifndef TSRM_WIN32
+#if !defined(TSRM_WIN32) && !defined(NETWARE)
 #define VCWD_CHOWN(path, owner, group) virtual_chown(path, owner, group TSRMLS_CC)
 #endif
 
@@ -205,7 +222,7 @@ typedef struct _virtual_cwd_globals {
 #define VCWD_OPENDIR(pathname) opendir(pathname)
 #define VCWD_POPEN(command, type) popen(command, type)
 
-#ifndef TSRM_WIN32
+#if !defined(TSRM_WIN32) && !defined(NETWARE)
 #define VCWD_REALPATH(path, real_path) realpath(path, real_path)
 #else
 #define VCWD_REALPATH(path, real_path) strcpy(real_path, path)
@@ -215,7 +232,7 @@ typedef struct _virtual_cwd_globals {
 #define VCWD_UTIME(path, time) utime(path, time)
 #endif
 #define VCWD_CHMOD(path, mode) chmod(path, mode)
-#ifndef TSRM_WIN32
+#if !defined(TSRM_WIN32) && !defined(NETWARE)
 #define VCWD_CHOWN(path, owner, group) chown(path, owner, group)
 #endif
 
diff --git a/netware/mktemp.h b/netware/mktemp.h
new file mode 100644 (file)
index 0000000..b370438
--- /dev/null
@@ -0,0 +1 @@
+char* mktemp(char* templateStr);
diff --git a/netware/sys/stat.h b/netware/sys/stat.h
new file mode 100644 (file)
index 0000000..dc1ab91
--- /dev/null
@@ -0,0 +1,138 @@
+#ifndef __sys_stat_h__
+#define __sys_stat_h__
+/*============================================================================
+=  Novell Software Development Kit
+=
+=  Copyright (C) 1999-2002 Novell, Inc. All Rights Reserved.
+=
+=  This work is subject to U.S. and international copyright laws and treaties.
+=  Use and redistribution of this work is subject  to  the  license  agreement
+=  accompanying  the  software  development kit (SDK) that contains this work.
+=  However, no part of this work may be revised and/or  modified  without  the
+=  prior  written consent of Novell, Inc. Any use or exploitation of this work
+=  without authorization could subject the perpetrator to criminal  and  civil
+=  liability.
+=
+=  Source(s): ISO/IEC (POSIX) 9845:1996
+=
+=  sys/stat.h
+==============================================================================
+*/
+#include <time.h>
+#include <stddef.h>
+#include <sys/mode.h>
+#include <sys/time.h>
+
+#include <pshpack1.h>
+
+#ifdef CLIB_STAT_PATCH  /* Venkat (7/2/02) */
+/***************** stat structure taken from CLib and modified ***************/
+struct stat 
+{
+   long           st_dev;        /* volume number                         */    /* dev_t replaced by long : Venkat (19/3/02) */
+   MACHINE_WORD   st_ino;        /* directory entry number of the st_name */    /* ino_t replaced by MACHINE_WORD : Venkat (19/3/02) */
+   unsigned short st_mode;       /* emulated file mode                    */
+   unsigned short st_pad1;       /* reserved for alignment                */
+   unsigned long  st_nlink;      /* count of hard links (always 1)        */
+   unsigned long  st_uid;        /* object id of owner                    */
+   unsigned long  st_gid;        /* group-id (always 0)                   */
+   long           st_rdev;       /* device type (always 0)                */    /* dev_t replaced by long : Venkat (19/3/02) */
+   off_t          st_size;       /* total file size--files only           */
+   time_t         st_atime;      /* last access date--files only          */
+   time_t         st_mtime;      /* last modify date and time             */
+   time_t         st_ctime;      /* POSIX: last status change time...     */
+                                 /* ...NetWare: creation date/time        */
+   time_t         st_btime;      /* last archived date and time           */
+   unsigned long  st_attr;       /* file attributes                       */
+   unsigned long  st_archivedID; /* user/object ID of last archive        */
+   unsigned long  st_updatedID;  /* user/object ID of last update         */
+   unsigned short st_inheritedRightsMask;  /* inherited rights mask       */
+   unsigned short st_pad2;       /* reserved for alignment                */
+   unsigned int   st_originatingNameSpace; /* namespace of creation       */
+   size_t         st_blksize;    /* block size for allocation--files only */
+   size_t         st_blocks;     /* count of blocks allocated to file     */
+   unsigned int   st_flags;      /* user-defined flags                    */
+   unsigned long  st_spare[4];   /* for future use                        */
+   unsigned char  st_name[255+1];/* TARGET_NAMESPACE name                 */
+};
+/***************** stat structure taken from CLib and modified ***************/
+
+struct stat_libc
+{
+   uint32_t   st_userspec; /* untouched by stat()                   */
+   uint32_t   st_flags;    /* flags for this entry                  */
+   mode_t     st_mode;     /* emulated file mode                    */
+   uint32_t   st_spare1;
+   uint64_t   st_gen;      /* generation number of inode            */
+   ino_t      st_ino;      /* directory entry number                */
+   dev_t      st_dev;      /* volume number                         */
+   dev_t      st_rdev;     /* device type (always 0)                */
+   off64_t    st_size;     /* total file size                       */
+   uint64_t   st_spare2;
+   blkcnt_t   st_blocks;   /* count of blocks allocated to file     */
+   blksize_t  st_blksize;  /* block size for allocation--files only */
+   nlink_t    st_nlink;    /* count of hard links (always 1)        */
+   uint32_t   st_spare3[3];
+   uid_t      st_uid;      /* owner (object) identity               */
+   gid_t      st_gid;      /* group-id (always 0)                   */
+   uid_t      st_bid;      /* identity of last archiver             */
+   uid_t      st_mid;      /* identity of last updator              */
+   timespec_t st_atime;    /* last access date--files only          */
+   timespec_t st_mtime;    /* last modify date and time             */
+   timespec_t st_ctime;    /* last file attributes modification     */
+   timespec_t st_btime;    /* last archived date and time           */
+   uint64_t   st_spare4[44];
+};                         /* sizeof(struct dirent) == 0x200 (512.) */
+
+#else
+struct stat
+{
+   uint32_t   st_userspec; /* untouched by stat()                   */
+   uint32_t   st_flags;    /* flags for this entry                  */
+   mode_t     st_mode;     /* emulated file mode                    */
+   uint32_t   st_spare1;
+   uint64_t   st_gen;      /* generation number of inode            */
+   ino_t      st_ino;      /* directory entry number                */
+   dev_t      st_dev;      /* volume number                         */
+   dev_t      st_rdev;     /* device type (always 0)                */
+   off64_t    st_size;     /* total file size                       */
+   uint64_t   st_spare2;
+   blkcnt_t   st_blocks;   /* count of blocks allocated to file     */
+   blksize_t  st_blksize;  /* block size for allocation--files only */
+   nlink_t    st_nlink;    /* count of hard links (always 1)        */
+   uint32_t   st_spare3[3];
+   uid_t      st_uid;      /* owner (object) identity               */
+   gid_t      st_gid;      /* group-id (always 0)                   */
+   uid_t      st_bid;      /* identity of last archiver             */
+   uid_t      st_mid;      /* identity of last updator              */
+   timespec_t st_atime;    /* last access date--files only          */
+   timespec_t st_mtime;    /* last modify date and time             */
+   timespec_t st_ctime;    /* last file attributes modification     */
+   timespec_t st_btime;    /* last archived date and time           */
+   uint64_t   st_spare4[44];
+};                         /* sizeof(struct dirent) == 0x200 (512.) */
+#endif
+
+#include <poppack.h>
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+int    chmod ( const char *path,     mode_t mode        );
+int    fchmod( int fildes,           mode_t mode        );
+int    fstat ( int fildes,           struct stat *buf );
+int    mkdir ( const char *pathname, mode_t mode        );
+int    mkfifo( const char *pathname, mode_t mode        );
+int    stat  ( const char *path,     struct stat *buf );
+mode_t umask (                       mode_t cmask       );
+
+#ifdef __cplusplus
+}
+#endif
+
+#define stat64  stat       /* same structure and function do both   */
+#define fstat64 fstat      /* same function does both               */
+
+#endif
index da7a1dd447da3fbaaeac254428774eb09b70bb4f..94603934dc8a197b6a804adac258fcd9c9f2f566 100644 (file)
@@ -33,23 +33,15 @@ ifndef BINARY
 endif
 
 # Compile flags
-#C_FLAGS   = -c -maxerrors 25 -processor Pentium -align packed
-#C_FLAGS  += -w on -cpp_exceptions on -wchar_t off -bool on
-#C_FLAGS  += -msgstyle gcc -ext obj -ARM on -msext off -ansi off -nostdinc
 C_FLAGS  = -c -maxerrors 25 -msgstyle gcc
 C_FLAGS += -wchar_t on -bool on
 C_FLAGS += -processor Pentium -align 1
-#C_FLAGS += -r
 C_FLAGS += -nostdinc
-#C_FLAGS +=  -ext obj
-#C_FLAGS  += -DNLM_PLATFORM -D__GNUC__ -DTSRM_EXPORTS -D_LIB
 C_FLAGS  += -DZTS -DNETWARE -DHAVE_DIRENT_H
-C_FLAGS  += -DNEW_LIBC
 #C_FLAGS  += -DUSE_PIPE_OPEN
 C_FLAGS  += -DUSE_MKFIFO
 C_FLAGS  += -DCLIB_STAT_PATCH -DUSE_MPK
-#C_FLAGS  += -I. -I- -I../netware -I$(SDK_DIR)/sdk     # ../netware added for special SYS/STAT.H : Venkat(6/2/02)
-C_FLAGS  += -I. -I- -I../netware -I$(SDK_DIR)/include  # ../netware added for special SYS/STAT.H : Venkat(6/2/02)
+C_FLAGS  += -I. -I- -I../netware -I$(SDK_DIR)/include  # ../netware added for special SYS/STAT.H
 C_FLAGS  += -I$(MPK_DIR)/include1
 C_FLAGS  += -I$(MWCIncludes)
 
@@ -87,14 +79,6 @@ project: $(BINARY) $(MESSAGE)
 $(OBJ_DIR)/%.d: %.c
        @echo Building Dependencies for $(<F)
        @$(CC) -M $< $(C_FLAGS) -o $@
-
-$(OBJ_DIR)/%.d: %.cpp
-       @echo Building Dependencies for $(<F)
-       @$(CC) -M $< $(C_FLAGS) -o $@
-
-$(OBJ_DIR)/%.obj: %.cpp
-       @echo Compiling $?...
-       @$(CC) $< $(C_FLAGS) -o $@
        
 $(OBJ_DIR)/%.obj: %.c
        @echo Compiling $?...