Netware patches from Ananth Kesari.
Jarkko Hietaniemi [Tue, 26 Jun 2001 11:54:32 +0000 (11:54 +0000)]
p4raw-id: //depot/perl@10950

NetWare/Makefile
NetWare/config_H.wc
NetWare/nw5sck.c
NetWare/nw5sck.h
NetWare/nwperlsys.c
NetWare/nwperlsys.h
NetWare/nwtinfo.h

index 0914828..7065917 100644 (file)
@@ -342,11 +342,11 @@ NLM_DESCRIPTION = $(NLM_NAME8) for Netware
 !endif
 
 !ifndef NLM_VERSION
-NLM_VERSION    = 1.0.0
+NLM_VERSION    = 5.72.0
 !endif
 
 !ifndef NLM_EXT
-NLM_EXT         = NLM
+NLM_EXT        = NLM
 !endif
 
 !ifndef BUILT
@@ -415,7 +415,7 @@ INST_NW_TOP2 = $(INST_NW_DRV)\perl
 # versioned installation can be obtained by setting INST_TOP above to a
 # path that includes an arbitrary version string.
 #
-INST_VER       = \5.7.1
+INST_VER       = \5.7.2
 
 #
 # Comment this out if you DON'T want your perl installation to have
@@ -794,8 +794,9 @@ DLL_OBJ             = $(DLL_SRC:.c=.obj)
 X2P_OBJ                = $(X2P_SRC:.c=.obj)
 
 DYNAMIC_EXT    = Socket IO Fcntl Opcode SDBM_File POSIX attrs Thread B re \
-               Data/Dumper Devel/Peek ByteLoader Devel/DProf File/Glob 
-               
+               Data/Dumper Devel/Peek ByteLoader Devel/DProf File/Glob \
+               Storable/Storable List/Util MIME/Base64/Base64 XS/Typemap/Typemap
+
 STATIC_EXT     = DynaLoader
 NONXS_EXT      = Errno
 
index e604111..ea927dd 100644 (file)
  *     This symbol contains the ~name expanded version of ARCHLIB, to be used
  *     in programs that are not prepared to deal with ~ expansion at run-time.
  */
-#define ARCHLIB "c:\\perl\\5.7.1\\lib\\NetWare-x86-multi-thread"               /**/
+#define ARCHLIB "c:\\perl\\5.7.2\\lib\\NetWare-x86-multi-thread"               /**/
 /*#define ARCHLIB_EXP ""       /**/
 
 /* ARCHNAME:
  *     This symbol is the filename expanded version of the BIN symbol, for
  *     programs that do not want to deal with that at run-time.
  */
-#define BIN "c:\\perl\\5.7.1\\bin\\NetWare-x86-multi-thread"   /**/
-#define BIN_EXP "c:\\perl\\5.7.1\\bin\\NetWare-x86-multi-thread"       /**/
+#define BIN "c:\\perl\\5.7.2\\bin\\NetWare-x86-multi-thread"   /**/
+#define BIN_EXP "c:\\perl\\5.7.2\\bin\\NetWare-x86-multi-thread"       /**/
 
 /* PERL_BINCOMPAT_5005:
  *     This symbol, if defined, indicates that this version of Perl should be
  *     This symbol contains the ~name expanded version of SITEARCH, to be used
  *     in programs that are not prepared to deal with ~ expansion at run-time.
  */
-#define SITEARCH "c:\\perl\\site\\5.7.1\\lib\\NetWare-x86-multi-thread"                /**/
+#define SITEARCH "c:\\perl\\site\\5.7.2\\lib\\NetWare-x86-multi-thread"                /**/
 /*#define SITEARCH_EXP ""      /**/
 
 /* SITELIB:
  *     removed.  The elements in inc_version_list (inc_version_list.U) can
  *     be tacked onto this variable to generate a list of directories to search.
  */
-#define SITELIB "c:\\perl\\site\\5.7.1\\lib"           /**/
-#define SITELIB_EXP (nw_get_sitelib("5.7.1"))  /**/
+#define SITELIB "c:\\perl\\site\\5.7.2\\lib"           /**/
+#define SITELIB_EXP (nw_get_sitelib("5.7.2"))  /**/
 #define SITELIB_STEM ""                /**/
 
 /* Size_t_size:
 /* PERL_XS_APIVERSION:
  *     This variable contains the version of the oldest perl binary
  *     compatible with the present perl.  perl.c:incpush() and
- *     lib/lib.pm will automatically search in c:\\perl\\site\\5.7.1\\lib\\NetWare-x86-multi-thread for older
+ *     lib/lib.pm will automatically search in c:\\perl\\site\\5.7.2\\lib\\NetWare-x86-multi-thread for older
  *     directories across major versions back to xs_apiversion.
  *     This is only useful if you have a perl library directory tree
  *     structured like the default one.
  *     compatible with the present perl.  (That is, pure perl modules
  *     written for pm_apiversion will still work for the current
  *     version).  perl.c:incpush() and lib/lib.pm will automatically
- *     search in c:\\perl\\site\\5.7.1\\lib for older directories across major versions
+ *     search in c:\\perl\\site\\5.7.2\\lib for older directories across major versions
  *     back to pm_apiversion.  This is only useful if you have a perl
  *     library directory tree structured like the default one.  The
  *     versioned site_perl library was introduced in 5.005, so that's
index 0f6c736..5a9ce47 100644 (file)
@@ -8,11 +8,11 @@
  */
 
 /*
- * FILENAME            :       nw5sck.c
- * DESCRIPTION :       Socket related functions.
- * Author              :       SGP
- * Date                        :       January 2001.
- *
+ * FILENAME     :  nw5sck.c
+ * DESCRIPTION :  Socket related functions.
+ * Author              :  SGP
+ * Date                        :  January 2001.
+ * Date Modified:  June 26th 2001.
  */
 
 
 #include <fcntl.h>
 #include <sys/stat.h>
 
-static struct servent* nw_savecopyservent(struct servent*d,
-                                             struct servent*s,
-                                             const char *proto);
-
-
 u_long
 nw_htonl(u_long hostlong)
 {
@@ -171,28 +166,14 @@ nw_getprotobynumber(int num)
 struct servent *
 nw_getservbyname(const char *name, const char *proto)
 {
-       dTHXo; 
-    struct servent *r;
-
-    r = getservbyname((char*)name, (char*)proto);
-    if (r) {
-               /*r = nw_savecopyservent(&nw_servent, r, proto);*/
-    }
-    return r;
+    return (struct servent *)getservbyname((char*)name, (char*)proto);
 }
 
 
 struct servent *
 nw_getservbyport(int port, const char *proto)
 {
-    dTHXo; 
-    struct servent *r;
-
-    r = getservbyport(port, (char*)proto);
-    if (r) {
-               //r = nw_savecopyservent(&nw_servent, r, proto);
-    }
-    return r;
+    return (struct servent *)getservbyport(port, (char*)proto);
 }
 
 struct servent *
@@ -228,7 +209,7 @@ nw_setservent(int stayopen)
 int
 nw_setsockopt(SOCKET s, int level, int optname, const char* optval, int optlen)
 {
-       return setsockopt(s, level, optname, optval, optlen);
+       return setsockopt(s, level, optname, (char*)optval, optlen);
 }
 
 int
@@ -249,25 +230,6 @@ nw_inet_addr(const char *cp)
     return inet_addr((char*)cp);
 }
 
-static struct servent*
-nw_savecopyservent(struct servent*d, struct servent*s, const char *proto)
-{
-    d->s_name = s->s_name;
-    d->s_aliases = s->s_aliases;
-    d->s_port = s->s_port;
-#ifndef __BORLANDC__   /* Buggy on Win95 and WinNT-with-Borland-WSOCK */
-    if (/*!IsWin95() && */s->s_proto && strlen(s->s_proto))
-       d->s_proto = s->s_proto;
-    else
-#endif
-    if (proto && strlen(proto))
-       d->s_proto = (char *)proto;
-    else
-       d->s_proto = "tcp";
-   
-    return d;
-}
-
 SOCKET
 nw_socket(int af, int type, int protocol)
 {
@@ -276,7 +238,6 @@ nw_socket(int af, int type, int protocol)
 #ifndef USE_SOCKETS_AS_HANDLES
     s = socket(af, type, protocol);
 #else
-    //StartSockets();
     if((s = socket(af, type, protocol)) == INVALID_SOCKET)
        //errno = WSAGetLastError();
     else
index 4216dc8..b32493f 100644 (file)
@@ -8,10 +8,11 @@
  */
 
 /*
- * FILENAME            :       nw5sck.h
- * DESCRIPTION :       Socket related functions.
- * Author              :       SGP
- * Date                        :       January 2001.
+ * FILENAME     :  nw5sck.h
+ * DESCRIPTION  :  Socket related functions.
+ * Author       :  SGP
+ * Date         :  January 2001.
+ * Date Modified:  June 26th 2001.
  *
  */
 
@@ -43,7 +44,6 @@ struct nwsockent local_context;
 # undef getnetbyname
 # undef gethostbyaddr
 # undef getprotobyname
-# undef getprotobyname
 # undef getservbyname
 # undef getservbyport
 # undef getservent
@@ -65,7 +65,6 @@ struct nwsockent local_context;
 # define getnetbyaddr(net,typ) NWgetnetbyaddr(&local_context,net,typ)
 # define getnetbyname(name)    NWgetnetbyname(&local_context,name)
 # define getprotobyname(name)  NWgetprotobyname(&local_context,name)
-# define getprotobyname(name)  NWgetprotobyname(&local_context,name)
 # define getservbyname(n,p)    NWgetservbyname(&local_context,n,p)
 # define getservbyport(n,p)    NWgetservbyport(&local_context,n,p)
 # define getservent()          NWgetservent(&local_context)
index 90b77a9..bc97b11 100644 (file)
@@ -7,12 +7,13 @@
  */
 
 /*
- * FILENAME            :       nwperlsys.c
- * DESCRIPTION :       Contains the platform specific functions calls
+ * FILENAME     :   nwperlsys.c
+ * DESCRIPTION  :   Contains calls to Perl APIs and
+ *                  utility functions calls
  *                  
- * Author              :       SGP
- * Date Created :      June 12th 2001.
- * Date Modified:
+ * Author       :   SGP
+ * Date Created :   June 12th 2001.
+ * Date Modified:   June 26th 2001.
  */
 
 #include "EXTERN.h"
 
 #ifdef PERL_IMPLICIT_SYS
 
-#include "nw5iop.h"
-#include <fcntl.h>
-
-
-#include "win32ish.h"
-
-START_EXTERN_C
-extern int do_spawn2(char *cmd, int exectype);
-extern int do_aspawn(void *vreally, void **vmark, void **vsp);
-extern void Perl_init_os_extras(void);
-extern BOOL fnInsertHashListAddrs(void *addrs, BOOL dontTouchHashList);
-extern BOOL fnGetHashListAddrs(void *addrs, BOOL *dontTouchHashList);
-END_EXTERN_C
-
-//Includes iperlsys.h and function definitions
-#include "nwperlsys.h"
-
-/* IPerlStdio  - Stdio functions - Begin ================================================*/
-
-FILE*
-PerlStdIOStdin(struct IPerlStdIO* piPerl)
-{
-    return nw_stdin();
-}
-
-FILE*
-PerlStdIOStdout(struct IPerlStdIO* piPerl)
-{
-    return nw_stdout();
-}
-
-FILE*
-PerlStdIOStderr(struct IPerlStdIO* piPerl)
-{
-    return nw_stderr();
-}
-
-FILE*
-PerlStdIOOpen(struct IPerlStdIO* piPerl, const char *path, const char *mode)
-{
-    return nw_fopen(path, mode);
-}
-
-int
-PerlStdIOClose(struct IPerlStdIO* piPerl, FILE* pf)
-{
-    return nw_fclose(pf);
-}
-
-int
-PerlStdIOEof(struct IPerlStdIO* piPerl, FILE* pf)
-{
-    return nw_feof(pf);
-}
-
-int
-PerlStdIOError(struct IPerlStdIO* piPerl, FILE* pf)
-{
-    return nw_ferror(pf);
-}
-
-void
-PerlStdIOClearerr(struct IPerlStdIO* piPerl, FILE* pf)
-{
-    nw_clearerr(pf);
-}
-
-int
-PerlStdIOGetc(struct IPerlStdIO* piPerl, FILE* pf)
-{
-    return nw_getc(pf);
-}
-
-char*
-PerlStdIOGetBase(struct IPerlStdIO* piPerl, FILE* pf)
-{
-#ifdef FILE_base
-    FILE *f = pf;
-    return FILE_base(f);
-#else
-    return Nullch;
-#endif
-}
-
-int
-PerlStdIOGetBufsiz(struct IPerlStdIO* piPerl, FILE* pf)
-{
-#ifdef FILE_bufsiz
-    FILE *f = pf;
-    return FILE_bufsiz(f);
-#else
-    return (-1);
-#endif
-}
-
-int
-PerlStdIOGetCnt(struct IPerlStdIO* piPerl, FILE* pf)
-{
-#ifdef USE_STDIO_PTR
-    FILE *f = pf;
-    return FILE_cnt(f);
-#else
-    return (-1);
-#endif
-}
-
-char*
-PerlStdIOGetPtr(struct IPerlStdIO* piPerl, FILE* pf)
-{
-#ifdef USE_STDIO_PTR
-    FILE *f = pf;
-    return FILE_ptr(f);
-#else
-    return Nullch;
-#endif
-}
-
-char*
-PerlStdIOGets(struct IPerlStdIO* piPerl, FILE* pf, char* s, int n)
-{
-    return nw_fgets(s, n, pf);
-}
-
-int
-PerlStdIOPutc(struct IPerlStdIO* piPerl, FILE* pf, int c)
-{
-    return nw_fputc(c, pf);
-}
-
-int
-PerlStdIOPuts(struct IPerlStdIO* piPerl, FILE* pf, const char *s)
-{
-    return nw_fputs(s, pf);
-}
-
-int
-PerlStdIOFlush(struct IPerlStdIO* piPerl, FILE* pf)
-{
-    return nw_fflush(pf);
-}
-
-int
-PerlStdIOUngetc(struct IPerlStdIO* piPerl, int c, FILE* pf)
-{
-    return nw_ungetc(c, pf);
-}
-
-int
-PerlStdIOFileno(struct IPerlStdIO* piPerl, FILE* pf)
-{
-    return nw_fileno(pf);
-}
-
-FILE*
-PerlStdIOFdopen(struct IPerlStdIO* piPerl, int fd, const char *mode)
-{
-    return nw_fdopen(fd, mode);
-}
-
-FILE*
-PerlStdIOReopen(struct IPerlStdIO* piPerl, const char*path, const char*mode, FILE* pf)
-{
-    return nw_freopen(path, mode, pf);
-}
-
-SSize_t
-PerlStdIORead(struct IPerlStdIO* piPerl, void *buffer, Size_t size, Size_t count, FILE* pf)
-{
-    return nw_fread(buffer, size, count, pf);
-}
-
-SSize_t
-PerlStdIOWrite(struct IPerlStdIO* piPerl, const void *buffer, Size_t size, Size_t count, FILE* pf)
-{
-    return nw_fwrite(buffer, size, count, pf);
-}
-
-void
-PerlStdIOSetBuf(struct IPerlStdIO* piPerl, FILE* pf, char* buffer)
-{
-    nw_setbuf(pf, buffer);
-}
-
-int
-PerlStdIOSetVBuf(struct IPerlStdIO* piPerl, FILE* pf, char* buffer, int type, Size_t size)
-{
-    return nw_setvbuf(pf, buffer, type, size);
-}
-
-void
-PerlStdIOSetCnt(struct IPerlStdIO* piPerl, FILE* pf, int n)
-{
-#ifdef STDIO_CNT_LVALUE
-    FILE *f = pf;
-    FILE_cnt(f) = n;
-#endif
-}
-
-void
-PerlStdIOSetPtr(struct IPerlStdIO* piPerl, FILE* pf, char * ptr)
-{
-#ifdef STDIO_PTR_LVALUE
-    FILE *f = pf;
-    FILE_ptr(f) = ptr;
-#endif
-}
-
-void
-PerlStdIOSetlinebuf(struct IPerlStdIO* piPerl, FILE* pf)
-{
-    nw_setvbuf(pf, NULL, _IOLBF, 0);
-}
-
-int
-PerlStdIOPrintf(struct IPerlStdIO* piPerl, FILE* pf, const char *format,...)
-{
-    va_list(arglist);
-    va_start(arglist, format);
-    return nw_vfprintf(pf, format, arglist);
-}
-
-int
-PerlStdIOVprintf(struct IPerlStdIO* piPerl, FILE* pf, const char *format, va_list arglist)
-{
-    return nw_vfprintf(pf, format, arglist);
-}
-
-long
-PerlStdIOTell(struct IPerlStdIO* piPerl, FILE* pf)
-{
-    return nw_ftell(pf);
-}
-
-int
-PerlStdIOSeek(struct IPerlStdIO* piPerl, FILE* pf, off_t offset, int origin)
-{
-    return nw_fseek(pf, offset, origin);
-}
-
-void
-PerlStdIORewind(struct IPerlStdIO* piPerl, FILE* pf)
-{
-    nw_rewind(pf);
-}
-
-FILE*
-PerlStdIOTmpfile(struct IPerlStdIO* piPerl)
-{
-    return nw_tmpfile();
-}
-
-int
-PerlStdIOGetpos(struct IPerlStdIO* piPerl, FILE* pf, Fpos_t *p)
-{
-    return nw_fgetpos(pf, p);
-}
-
-int
-PerlStdIOSetpos(struct IPerlStdIO* piPerl, FILE* pf, const Fpos_t *p)
-{
-    return nw_fsetpos(pf, p);
-}
-
-void
-PerlStdIOInit(struct IPerlStdIO* piPerl)
-{
-}
-
-void
-PerlStdIOInitOSExtras(struct IPerlStdIO* piPerl)
-{
-    Perl_init_os_extras();
-}
-
-
-int
-PerlStdIOOpenOSfhandle(struct IPerlStdIO* piPerl, long osfhandle, int flags)
-{
-    return nw_open_osfhandle(osfhandle, flags);
-}
-
-int
-PerlStdIOGetOSfhandle(struct IPerlStdIO* piPerl, int filenum)
-{
-    return nw_get_osfhandle(filenum);
-}
-
-FILE*
-PerlStdIOFdupopen(struct IPerlStdIO* piPerl, FILE* pf)
-{
-    FILE* pfdup=NULL;
-    fpos_t pos=0;
-    char mode[3]={'\0'};
-    int fileno = nw_dup(nw_fileno(pf));
-
-    /* open the file in the same mode */
-    if(((FILE*)pf)->_flag & _IOREAD) {
-       mode[0] = 'r';
-       mode[1] = 0;
-    }
-    else if(((FILE*)pf)->_flag & _IOWRT) {
-       mode[0] = 'a';
-       mode[1] = 0;
-    }
-    else if(((FILE*)pf)->_flag & _IORW) {
-       mode[0] = 'r';
-       mode[1] = '+';
-       mode[2] = 0;
-    }
-
-    /* it appears that the binmode is attached to the 
-     * file descriptor so binmode files will be handled
-     * correctly
-     */
-    pfdup = nw_fdopen(fileno, mode);
-
-    /* move the file pointer to the same position */
-    if (!fgetpos(pf, &pos)) {
-       fsetpos(pfdup, &pos);
-    }
-    return pfdup;
-}
-
-/* IPerlStdio  - Stdio functions - End   ================================================*/
-
-/* IPerlDir    - Directory Manipulation functions - Begin ===================================*/
-
-int
-PerlDirMakedir(struct IPerlDir* piPerl, const char *dirname, int mode)
-{
-       return mkdir(dirname);
-}
-
-int
-PerlDirChdir(struct IPerlDir* piPerl, const char *dirname)
-{
-       return nw_chdir(dirname);
-}
-
-int
-PerlDirRmdir(struct IPerlDir* piPerl, const char *dirname)
-{
-       return nw_rmdir(dirname);
-}
-
-int
-PerlDirClose(struct IPerlDir* piPerl, DIR *dirp)
-{
-       return nw_closedir(dirp);
-}
-
-DIR*
-PerlDirOpen(struct IPerlDir* piPerl, char *filename)
-{
-       return nw_opendir(filename);
-}
-
-struct direct *
-PerlDirRead(struct IPerlDir* piPerl, DIR *dirp)
-{
-       return nw_readdir(dirp);
-}
-
-void
-PerlDirRewind(struct IPerlDir* piPerl, DIR *dirp)
-{
-    nw_rewinddir(dirp);
-}
-
-void
-PerlDirSeek(struct IPerlDir* piPerl, DIR *dirp, long loc)
-{
-    nw_seekdir(dirp, loc);
-}
-
-long
-PerlDirTell(struct IPerlDir* piPerl, DIR *dirp)
-{
-    return nw_telldir(dirp);
-}
-
-/* IPerlDir    - Directory Manipulation functions - End   ===================================*/
-
-/* IPerlEnv    - Environment related functions - Begin ======================================*/
-
-char*
-PerlEnvGetenv(struct IPerlEnv* piPerl, const char *varname)
-{
-       return(getenv(varname));
-};
-
-int
-PerlEnvPutenv(struct IPerlEnv* piPerl, const char *envstring)
-{
-       return(putenv(envstring));
-};
-
-char*
-PerlEnvGetenv_len(struct IPerlEnv* piPerl, const char* varname, unsigned long* len)
-{
-       *len = 0; 
-       char *e = getenv(varname);
-       if (e)
-           *len = strlen(e);
-       return e;
-}
-
-int
-PerlEnvUname(struct IPerlEnv* piPerl, struct utsname *name)
-{
-    return nw_uname(name);
-}
-
-void
-PerlEnvClearenv(struct IPerlEnv* piPerl)
-{
-       
-}
-
-/* IPerlEnv    - Environment related functions - End   ======================================*/
-
-/* IPerlLIO    - Low-level IO functions - Begin =============================================*/
-
-int
-PerlLIOAccess(struct IPerlLIO* piPerl, const char *path, int mode)
-{
-    return nw_access(path, mode);
-}
-
-int
-PerlLIOChmod(struct IPerlLIO* piPerl, const char *filename, int pmode)
-{
-    return nw_chmod(filename, pmode);
-}
-
-int
-PerlLIOChown(struct IPerlLIO* piPerl, const char *filename, uid_t owner, gid_t group)
-{
-       dTHXo;
-    Perl_croak(aTHX_ "chown not implemented!\n");
-       return 0;
-}
-
-int
-PerlLIOChsize(struct IPerlLIO* piPerl, int handle, long size)
-{
-       return (nw_chsize(handle,size));
-}
-
-int
-PerlLIOClose(struct IPerlLIO* piPerl, int handle)
-{
-    return nw_close(handle);
-}
-
-int
-PerlLIODup(struct IPerlLIO* piPerl, int handle)
-{
-    return nw_dup(handle);
-}
-
-int
-PerlLIODup2(struct IPerlLIO* piPerl, int handle1, int handle2)
-{
-    return nw_dup2(handle1, handle2);
-}
-
-int
-PerlLIOFlock(struct IPerlLIO* piPerl, int fd, int oper)
-{
-       //On NetWare simulate flock by locking a range on the file
-    return nw_flock(fd, oper);
-}
-
-int
-PerlLIOFileStat(struct IPerlLIO* piPerl, int handle, struct stat *buffer)
-{
-    return fstat(handle, buffer);
-}
-
-int
-PerlLIOIOCtl(struct IPerlLIO* piPerl, int i, unsigned int u, char *data)
-{
-       return ioctl(i, (int) u, (void *) data);
-}
-
-int
-PerlLIOIsatty(struct IPerlLIO* piPerl, int fd)
-{
-    return nw_isatty(fd);
-}
-
-int
-PerlLIOLink(struct IPerlLIO* piPerl, const char*oldname, const char *newname)
-{
-    return nw_link(oldname, newname);
-}
-
-long
-PerlLIOLseek(struct IPerlLIO* piPerl, int handle, long offset, int origin)
-{
-    return nw_lseek(handle, offset, origin);
-}
-
-int
-PerlLIOLstat(struct IPerlLIO* piPerl, const char *path, struct stat *buffer)
-{
-    return nw_stat(path, buffer);
-}
-
-char*
-PerlLIOMktemp(struct IPerlLIO* piPerl, char *Template)
-{
-       return(nw_mktemp(Template));
-}
-
-int
-PerlLIOOpen(struct IPerlLIO* piPerl, const char *filename, int oflag)
-{
-    return nw_open(filename, oflag);
-}
-
-int
-PerlLIOOpen3(struct IPerlLIO* piPerl, const char *filename, int oflag, int pmode)
-{
-    return nw_open(filename, oflag, pmode);
-}
-
-int
-PerlLIORead(struct IPerlLIO* piPerl, int handle, void *buffer, unsigned int count)
-{
-    return nw_read(handle, buffer, count);
-}
-
-int
-PerlLIORename(struct IPerlLIO* piPerl, const char *OldFileName, const char *newname)
-{
-    return nw_rename(OldFileName, newname);
-}
-
-int
-PerlLIOSetmode(struct IPerlLIO* piPerl, FILE *fp, int mode)
-{
-    return nw_setmode(fp, mode);
-}
-
-int
-PerlLIONameStat(struct IPerlLIO* piPerl, const char *path, struct stat *buffer)
-{
-    return nw_stat(path, buffer);
-}
-
-char*
-PerlLIOTmpnam(struct IPerlLIO* piPerl, char *string)
-{
-    return tmpnam(string);
-}
-
-int
-PerlLIOUmask(struct IPerlLIO* piPerl, int pmode)
-{
-    return umask(pmode);
-}
-
-int
-PerlLIOUnlink(struct IPerlLIO* piPerl, const char *filename)
-{
-    return nw_unlink(filename);
-}
-
-int
-PerlLIOUtime(struct IPerlLIO* piPerl, char *filename, struct utimbuf *times)
-{
-    return nw_utime(filename, times);
-}
-
-int
-PerlLIOWrite(struct IPerlLIO* piPerl, int handle, const void *buffer, unsigned int count)
-{
-    return nw_write(handle, buffer, count);
-}
-
-/* IPerlLIO    - Low-level IO functions - End   =============================================*/
-
-/* IPerlMem - Memory management functions - Begin ========================================*/
-
-void*
-PerlMemMalloc(struct IPerlMem* piPerl, size_t size)
-{
-       void *ptr = NULL;
-       ptr = malloc(size);
-       if (ptr) {
-               void **listptr;
-               BOOL m_dontTouchHashLists;
-               if(fnGetHashListAddrs(&listptr,&m_dontTouchHashLists)) {
-                       if (listptr) {
-                               WCValHashTable<void*>* m_allocList= (WCValHashTable<void*>*)listptr;
-                               (WCValHashTable<void*>*)m_allocList->insert(ptr);
-                       }
-               }
-       }
-       return(ptr);
-}
-
-void*
-PerlMemRealloc(struct IPerlMem* piPerl, void* ptr, size_t size)
-{
-       void *newptr = NULL;
-       WCValHashTable<void*>* m_allocList;
-
-       newptr = realloc(ptr, size);
-
-       if (ptr)
-       {
-               void **listptr;
-               BOOL m_dontTouchHashLists;
-               if(fnGetHashListAddrs(&listptr,&m_dontTouchHashLists)) {
-                       m_allocList= (WCValHashTable<void*>*)listptr;
-                       (WCValHashTable<void*>*)m_allocList->remove(ptr);
-               }
-       }
-       if (newptr)
-       {
-               if (m_allocList)
-                       (WCValHashTable<void*>*)m_allocList->insert(newptr);
-       }
-
-       return(newptr);
-}
-
-void
-PerlMemFree(struct IPerlMem* piPerl, void* ptr)
-{
-       BOOL m_dontTouchHashLists;
-       WCValHashTable<void*>* m_allocList;
-
-       void **listptr;
-       if(fnGetHashListAddrs(&listptr,&m_dontTouchHashLists)) {
-               m_allocList= (WCValHashTable<void*>*)listptr;
-               // Final clean up, free all the nodes from the hash list
-               if (m_dontTouchHashLists)
-               {
-                       if(ptr)
-                       {
-                               free(ptr);
-                               ptr = NULL;
-                       }
-               }
-               else
-               {
-                       if(ptr && m_allocList)
-                       {
-                               if ((WCValHashTable<void*>*)m_allocList->remove(ptr))
-                               {
-                                       free(ptr);
-                                       ptr = NULL;
-                               }
-                               else
-                               {
-                                       // If it comes here, that means that the memory pointer is not contained in the hash list.
-                                       // But no need to free now, since if is deleted here, it will result in an abend!!
-                                       // If the memory is still there, it will be cleaned during final cleanup anyway.
-                               }
-                       }
-               }
-       }
-       return;
-}
-
-void*
-PerlMemCalloc(struct IPerlMem* piPerl, size_t num, size_t size)
-{
-       void *ptr = NULL;
-
-       ptr = calloc(num, size);
-       if (ptr) {
-               void **listptr;
-               BOOL m_dontTouchHashLists;
-               if(fnGetHashListAddrs(&listptr,&m_dontTouchHashLists)) {
-                       if (listptr) {
-                               WCValHashTable<void*>* m_allocList= (WCValHashTable<void*>*)listptr;
-                               (WCValHashTable<void*>*)m_allocList->insert(ptr);
-                       }
-               }
-       }
-       return(ptr);
-}
-
-/* IPerlMem - Memory management functions - End   ========================================*/
-
-/* IPerlProc - Process control functions - Begin =========================================*/
-
-#define EXECF_EXEC 1
-#define EXECF_SPAWN 2
-
-void
-PerlProcAbort(struct IPerlProc* piPerl)
-{
-    nw_abort();
-}
-
-char *
-PerlProcCrypt(struct IPerlProc* piPerl, const char* clear, const char* salt)
-{
-    return nw_crypt(clear, salt);
-}
-
-void
-PerlProcExit(struct IPerlProc* piPerl, int status)
-{
-//    exit(status);
-       dTHX;
-       dJMPENV;
-       JMPENV_JUMP(2);
-}
-
-void
-PerlProc_Exit(struct IPerlProc* piPerl, int status)
-{
-//    _exit(status);
-       dTHX;
-       dJMPENV;
-       JMPENV_JUMP(2);
-}
-
-int
-PerlProcExecl(struct IPerlProc* piPerl, const char *cmdname, const char *arg0, const char *arg1, const char *arg2, const char *arg3)
-{
-       dTHXo;
-    Perl_croak(aTHX_ "execl not implemented!\n");
-       return 0;
-}
-
-int
-PerlProcExecv(struct IPerlProc* piPerl, const char *cmdname, const char *const *argv)
-{
-    return nw_execvp((char *)cmdname, (char **)argv);
-}
-
-int
-PerlProcExecvp(struct IPerlProc* piPerl, const char *cmdname, const char *const *argv)
-{
-    return nw_execvp((char *)cmdname, (char **)argv);
-}
-
-uid_t
-PerlProcGetuid(struct IPerlProc* piPerl)
-{
-       return 0;
-}
-
-uid_t
-PerlProcGeteuid(struct IPerlProc* piPerl)
-{
-       return 0;
-}
-
-gid_t
-PerlProcGetgid(struct IPerlProc* piPerl)
-{
-       return 0;
-}
-
-gid_t
-PerlProcGetegid(struct IPerlProc* piPerl)
-{
-       return 0;
-}
-
-char *
-PerlProcGetlogin(struct IPerlProc* piPerl)
-{
-       return NULL;
-}
-
-int
-PerlProcKill(struct IPerlProc* piPerl, int pid, int sig)
-{
-    return nw_kill(pid, sig);
-}
-
-int
-PerlProcKillpg(struct IPerlProc* piPerl, int pid, int sig)
-{
-    dTHXo;
-    Perl_croak(aTHX_ "killpg not implemented!\n");
-    return 0;
-}
-
-int
-PerlProcPauseProc(struct IPerlProc* piPerl)
-{
-    return nw_sleep((32767L << 16) + 32767);
-}
-
-PerlIO*
-PerlProcPopen(struct IPerlProc* piPerl, const char *command, const char *mode)
-{
-    dTHXo;
-    PERL_FLUSHALL_FOR_CHILD;
-
-       return (PerlIO*)nw_Popen((char *)command, (char *)mode, (int *)errno);
-}
-
-int
-PerlProcPclose(struct IPerlProc* piPerl, PerlIO *stream)
-{
-    return nw_Pclose((FILE*)stream, (int *)errno);
-}
-
-int
-PerlProcPipe(struct IPerlProc* piPerl, int *phandles)
-{
-    return nw_Pipe((int *)phandles, (int *)errno);
-}
-
-int
-PerlProcSetuid(struct IPerlProc* piPerl, uid_t u)
-{
-       return 0;
-}
-
-int
-PerlProcSetgid(struct IPerlProc* piPerl, gid_t g)
-{
-       return 0;
-}
-
-int
-PerlProcSleep(struct IPerlProc* piPerl, unsigned int s)
-{
-    return nw_sleep(s);
-}
-
-int
-PerlProcTimes(struct IPerlProc* piPerl, struct tms *timebuf)
-{
-    return nw_times(timebuf);
-}
-
-int
-PerlProcWait(struct IPerlProc* piPerl, int *status)
-{
-    return nw_wait(status);
-}
-
-int
-PerlProcWaitpid(struct IPerlProc* piPerl, int pid, int *status, int flags)
-{
-    return nw_waitpid(pid, status, flags);
-}
-
-Sighandler_t
-PerlProcSignal(struct IPerlProc* piPerl, int sig, Sighandler_t subcode)
-{
-    return 0;
-}
-
-int
-PerlProcFork(struct IPerlProc* piPerl)
-{
-       return 0;
-}
-
-int
-PerlProcGetpid(struct IPerlProc* piPerl)
-{
-    return nw_getpid();
-}
-
-/*BOOL
-PerlProcDoCmd(struct IPerlProc* piPerl, char *cmd)
-{
-    do_spawn2(cmd, EXECF_EXEC);
-    return FALSE;
-}*/
-
-int
-PerlProcSpawn(struct IPerlProc* piPerl, char* cmds)
-{
-    return do_spawn2(cmds, EXECF_SPAWN);
-}
-
-int
-PerlProcSpawnvp(struct IPerlProc* piPerl, int mode, const char *cmdname, const char *const *argv)
-{
-    return nw_spawnvp(mode, (char *)cmdname, (char **)argv);
-}
-
-int
-PerlProcASpawn(struct IPerlProc* piPerl, void *vreally, void **vmark, void **vsp)
-{
-    return do_aspawn(vreally, vmark, vsp);
-}
-
-/* IPerlProc - Process control functions - End   =========================================*/
-
-/* IPerlSock - Socket functions - Begin ==================================================*/
-
-u_long
-PerlSockHtonl(struct IPerlSock* piPerl, u_long hostlong)
-{
-       return(nw_htonl(hostlong));
-}
-
-u_short
-PerlSockHtons(struct IPerlSock* piPerl, u_short hostshort)
-{
-       return(nw_htons(hostshort));
-}
-
-u_long
-PerlSockNtohl(struct IPerlSock* piPerl, u_long netlong)
-{
-       return nw_ntohl(netlong);
-}
-
-u_short
-PerlSockNtohs(struct IPerlSock* piPerl, u_short netshort)
-{
-       return nw_ntohs(netshort);
-}
-
-SOCKET PerlSockAccept(struct IPerlSock* piPerl, SOCKET s, struct sockaddr* addr, int* addrlen)
-{
-       return nw_accept(s, addr, addrlen);
-}
-
-int
-PerlSockBind(struct IPerlSock* piPerl, SOCKET s, const struct sockaddr* name, int namelen)
-{
-       return nw_bind(s, name, namelen);
-}
-
-int
-PerlSockConnect(struct IPerlSock* piPerl, SOCKET s, const struct sockaddr* name, int namelen)
-{
-       return nw_connect(s, name, namelen);
-}
-
-void
-PerlSockEndhostent(struct IPerlSock* piPerl)
-{
-    nw_endhostent();
-}
-
-void
-PerlSockEndnetent(struct IPerlSock* piPerl)
-{
-    nw_endnetent();
-}
-
-void
-PerlSockEndprotoent(struct IPerlSock* piPerl)
-{
-    nw_endprotoent();
-}
-
-void
-PerlSockEndservent(struct IPerlSock* piPerl)
-{
-    nw_endservent();
-}
-
-struct hostent*
-PerlSockGethostbyaddr(struct IPerlSock* piPerl, const char* addr, int len, int type)
-{
-       return(nw_gethostbyaddr(addr,len,type));
-}
-
-struct hostent*
-PerlSockGethostbyname(struct IPerlSock* piPerl, const char* name)
-{
-    return nw_gethostbyname(name);
-}
-
-struct hostent*
-PerlSockGethostent(struct IPerlSock* piPerl)
-{
-       return(nw_gethostent());
-}
-
-int
-PerlSockGethostname(struct IPerlSock* piPerl, char* name, int namelen)
-{
-       return nw_gethostname(name,namelen);
-}
-
-struct netent *
-PerlSockGetnetbyaddr(struct IPerlSock* piPerl, long net, int type)
-{
-    return nw_getnetbyaddr(net, type);
-}
-
-struct netent *
-PerlSockGetnetbyname(struct IPerlSock* piPerl, const char *name)
-{
-    return nw_getnetbyname((char*)name);
-}
-
-struct netent *
-PerlSockGetnetent(struct IPerlSock* piPerl)
-{
-    return nw_getnetent();
-}
-
-int PerlSockGetpeername(struct IPerlSock* piPerl, SOCKET s, struct sockaddr* name, int* namelen)
-{
-    return nw_getpeername(s, name, namelen);
-}
-
-struct protoent*
-PerlSockGetprotobyname(struct IPerlSock* piPerl, const char* name)
-{
-    return nw_getprotobyname(name);
-}
-
-struct protoent*
-PerlSockGetprotobynumber(struct IPerlSock* piPerl, int number)
-{
-    return nw_getprotobynumber(number);
-}
-
-struct protoent*
-PerlSockGetprotoent(struct IPerlSock* piPerl)
-{
-    return nw_getprotoent();
-}
-
-struct servent*
-PerlSockGetservbyname(struct IPerlSock* piPerl, const char* name, const char* proto)
-{
-    return nw_getservbyname((char*)name, (char*)proto);
-}
-
-struct servent*
-PerlSockGetservbyport(struct IPerlSock* piPerl, int port, const char* proto)
-{
-       return nw_getservbyport(port, proto);
-}
-
-struct servent*
-PerlSockGetservent(struct IPerlSock* piPerl)
-{
-       return nw_getservent();
-}
-
-int
-PerlSockGetsockname(struct IPerlSock* piPerl, SOCKET s, struct sockaddr* name, int* namelen)
-{
-       return nw_getsockname(s, name, namelen);
-}
-
-int
-PerlSockGetsockopt(struct IPerlSock* piPerl, SOCKET s, int level, int optname, char* optval, int* optlen)
-{
-       return nw_getsockopt(s, level, optname, optval, optlen);
-}
-
-unsigned long
-PerlSockInetAddr(struct IPerlSock* piPerl, const char* cp)
-{
-       return(nw_inet_addr(cp));
-}
-
-char*
-PerlSockInetNtoa(struct IPerlSock* piPerl, struct in_addr in)
-{
-       return NULL;
-}
-
-int
-PerlSockListen(struct IPerlSock* piPerl, SOCKET s, int backlog)
-{
-       return (nw_listen(s, backlog));
-}
-
-int
-PerlSockRecv(struct IPerlSock* piPerl, SOCKET s, char* buffer, int len, int flags)
-{
-       return (nw_recv(s, buffer, len, flags));
-}
-
-int
-PerlSockRecvfrom(struct IPerlSock* piPerl, SOCKET s, char* buffer, int len, int flags, struct sockaddr* from, int* fromlen)
-{
-       return nw_recvfrom(s, buffer, len, flags, from, fromlen);
-}
-
-int
-PerlSockSelect(struct IPerlSock* piPerl, int nfds, char* readfds, char* writefds, char* exceptfds, const struct timeval* timeout)
-{
-       return nw_select(nfds, (fd_set*) readfds, (fd_set*) writefds, (fd_set*) exceptfds, timeout);
-}
-
-int
-PerlSockSend(struct IPerlSock* piPerl, SOCKET s, const char* buffer, int len, int flags)
-{
-       return (nw_send(s, buffer, len, flags));
-}
-
-int
-PerlSockSendto(struct IPerlSock* piPerl, SOCKET s, const char* buffer, int len, int flags, const struct sockaddr* to, int tolen)
-{
-       return(nw_sendto(s, buffer, len, flags, to, tolen));
-}
-
-void
-PerlSockSethostent(struct IPerlSock* piPerl, int stayopen)
-{
-       nw_sethostent(stayopen);
-}
-
-void
-PerlSockSetnetent(struct IPerlSock* piPerl, int stayopen)
-{
-       nw_setnetent(stayopen);
-}
-
-void
-PerlSockSetprotoent(struct IPerlSock* piPerl, int stayopen)
-{
-       nw_setprotoent(stayopen);
-}
-
-void
-PerlSockSetservent(struct IPerlSock* piPerl, int stayopen)
-{
-       nw_setservent(stayopen);
-}
-
-int
-PerlSockSetsockopt(struct IPerlSock* piPerl, SOCKET s, int level, int optname, const char* optval, int optlen)
-{
-    return nw_setsockopt(s, level, optname, optval, optlen);
-}
-
-int
-PerlSockShutdown(struct IPerlSock* piPerl, SOCKET s, int how)
-{
-       return nw_shutdown(s, how);
-}
-
-SOCKET
-PerlSockSocket(struct IPerlSock* piPerl, int af, int type, int protocol)
-{
-       return nw_socket(af, type, protocol);
-}
-
-int
-PerlSockSocketpair(struct IPerlSock* piPerl, int domain, int type, int protocol, int* fds)
-{
-    dTHXo;
-    Perl_croak(aTHX_ "socketpair not implemented!\n");
-    return 0;
-}
-
-int
-PerlSockIoctlsocket(struct IPerlSock* piPerl, SOCKET s, long cmd, u_long *argp)
-{
-       dTHXo;
-    Perl_croak(aTHX_ "ioctlsocket not implemented!\n");
-       return 0;
-}
-
-/* IPerlSock - Socket functions - End ==================================================*/
+//Includes iperlsys.h and function definitions
+#include "nwperlsys.h"
 
 /*============================================================================================
 
@@ -1268,13 +105,69 @@ perl_alloc(void)
 #ifdef PERL_OBJECT
            CPerlObj* pPerl = (CPerlObj*)my_perl;
 #endif
-               //w32_internal_host = m_allocList;
+               //nw5_internal_host = m_allocList;
        }
     return my_perl;
 }
 
 /*============================================================================================
 
+ Function              :       perl_alloc_override
+
+ Description   :       creates a Perl interpreter variable and initializes
+
+ Parameters    :       Pointer to structure containing function pointers
+
+ Returns               :       Pointer to Perl interpreter
+
+==============================================================================================*/
+EXTERN_C PerlInterpreter*
+perl_alloc_override(struct IPerlMem* ppMem, struct IPerlMem* ppMemShared,
+                struct IPerlMem* ppMemParse, struct IPerlEnv* ppEnv,
+                struct IPerlStdIO* ppStdIO, struct IPerlLIO* ppLIO,
+                struct IPerlDir* ppDir, struct IPerlSock* ppSock,
+                struct IPerlProc* ppProc)
+{
+    PerlInterpreter *my_perl = NULL;
+
+       WCValHashTable<void*>*  m_allocList;
+       m_allocList = new WCValHashTable<void*> (fnAllocListHash, 256);
+       fnInsertHashListAddrs(m_allocList, FALSE);
+
+       if (!ppMem)
+               ppMem=&perlMem;
+       if (!ppEnv)
+               ppEnv=&perlEnv;
+       if (!ppStdIO)
+               ppStdIO=&perlStdIO;
+       if (!ppLIO)
+               ppLIO=&perlLIO;
+       if (!ppDir)
+               ppDir=&perlDir;
+       if (!ppSock)
+               ppSock=&perlSock;
+       if (!ppProc)
+               ppProc=&perlProc;
+
+       my_perl = perl_alloc_using(ppMem,
+                                  ppMemShared,
+                                  ppMemParse,
+                                  ppEnv,
+                                  ppStdIO,
+                                  ppLIO,
+                                  ppDir,
+                                  ppSock,
+                                  ppProc);
+       if (my_perl) {
+#ifdef PERL_OBJECT
+           CPerlObj* pPerl = (CPerlObj*)my_perl;
+#endif
+           //nw5_internal_host = pHost;
+       }
+    return my_perl;
+}
+/*============================================================================================
+
  Function              :       nw5_delete_internal_host
 
  Description   :       Deletes the alloc_list pointer
index b8c9790..c871f0a 100644 (file)
@@ -7,11 +7,12 @@
  */
 
 /*
- * FILENAME            :       nwperlsys.h
- * DESCRIPTION :       Derives from iperlsys.h and define the platform specific function
- * Author              :       SGP
- * Date        Created :       June 12th 2001.
- * Date Modified:
+ * FILENAME     :  nwperlsys.h
+ * DESCRIPTION  :  Derives from iperlsys.h and define the 
+ *                 platform specific function
+ * Author       :  SGP
+ * Date        Created :  June 12th 2001.
+ * Date Modified:  June 26th 2001.
  */
 
 #ifndef ___NWPerlSys_H___
@@ -20,6 +21,9 @@
 
 #include "iperlsys.h"
 
+#include "nw5iop.h"
+#include <fcntl.h>
+
 //Socket related calls
 #include "nw5sck.h"
 
 //Watcom hash list
 #include <wchash.h>
 
-/* IPerlMem - Memory management - Begin ==================================================*/
+#include "win32ish.h"
+
+START_EXTERN_C
+extern int do_spawn2(char *cmd, int exectype);
+extern int do_aspawn(void *vreally, void **vmark, void **vsp);
+extern void Perl_init_os_extras(void);
+BOOL fnGetHashListAddrs(void *addrs, BOOL *dontTouchHashList);
+END_EXTERN_C
+
+/* IPerlMem - Memory management functions - Begin ========================================*/
 
-void* PerlMemMalloc(struct IPerlMem* piPerl, size_t size);
-void* PerlMemRealloc(struct IPerlMem* piPerl, void* ptr, size_t size);
-void  PerlMemFree(struct IPerlMem* piPerl, void* ptr);
-void* PerlMemCalloc(struct IPerlMem* piPerl, size_t num, size_t size);
+void*
+PerlMemMalloc(struct IPerlMem* piPerl, size_t size)
+{
+       void *ptr = NULL;
+       ptr = malloc(size);
+       if (ptr) {
+               void **listptr;
+               BOOL m_dontTouchHashLists;
+               if(fnGetHashListAddrs(&listptr,&m_dontTouchHashLists)) {
+                       if (listptr) {
+                               WCValHashTable<void*>* m_allocList= (WCValHashTable<void*>*)listptr;
+                               (WCValHashTable<void*>*)m_allocList->insert(ptr);
+                       }
+               }
+       }
+       return(ptr);
+}
+
+void*
+PerlMemRealloc(struct IPerlMem* piPerl, void* ptr, size_t size)
+{
+       void *newptr = NULL;
+       WCValHashTable<void*>* m_allocList;
+
+       newptr = realloc(ptr, size);
+
+       if (ptr)
+       {
+               void **listptr;
+               BOOL m_dontTouchHashLists;
+               if(fnGetHashListAddrs(&listptr,&m_dontTouchHashLists)) {
+                       m_allocList= (WCValHashTable<void*>*)listptr;
+                       (WCValHashTable<void*>*)m_allocList->remove(ptr);
+               }
+       }
+       if (newptr)
+       {
+               if (m_allocList)
+                       (WCValHashTable<void*>*)m_allocList->insert(newptr);
+       }
+
+       return(newptr);
+}
+
+void
+PerlMemFree(struct IPerlMem* piPerl, void* ptr)
+{
+       BOOL m_dontTouchHashLists;
+       WCValHashTable<void*>* m_allocList;
+
+       void **listptr;
+       if(fnGetHashListAddrs(&listptr,&m_dontTouchHashLists)) {
+               m_allocList= (WCValHashTable<void*>*)listptr;
+               // Final clean up, free all the nodes from the hash list
+               if (m_dontTouchHashLists)
+               {
+                       if(ptr)
+                       {
+                               free(ptr);
+                               ptr = NULL;
+                       }
+               }
+               else
+               {
+                       if(ptr && m_allocList)
+                       {
+                               if ((WCValHashTable<void*>*)m_allocList->remove(ptr))
+                               {
+                                       free(ptr);
+                                       ptr = NULL;
+                               }
+                               else
+                               {
+                                       // If it comes here, that means that the memory pointer is not contained in the hash list.
+                                       // But no need to free now, since if is deleted here, it will result in an abend!!
+                                       // If the memory is still there, it will be cleaned during final cleanup anyway.
+                               }
+                       }
+               }
+       }
+       return;
+}
+
+void*
+PerlMemCalloc(struct IPerlMem* piPerl, size_t num, size_t size)
+{
+       void *ptr = NULL;
+
+       ptr = calloc(num, size);
+       if (ptr) {
+               void **listptr;
+               BOOL m_dontTouchHashLists;
+               if(fnGetHashListAddrs(&listptr,&m_dontTouchHashLists)) {
+                       if (listptr) {
+                               WCValHashTable<void*>* m_allocList= (WCValHashTable<void*>*)listptr;
+                               (WCValHashTable<void*>*)m_allocList->insert(ptr);
+                       }
+               }
+       }
+       return(ptr);
+}
 
 struct IPerlMem perlMem =
 {
@@ -44,19 +154,63 @@ struct IPerlMem perlMem =
     PerlMemCalloc,
 };
 
-/* IPerlMem - Memory management - End   ==================================================*/
+/* IPerlMem - Memory management functions - End   ========================================*/
+
+/* IPerlDir    - Directory Manipulation functions - Begin ===================================*/
 
-/* IPerlDir    - Directory Manipulation - Begin =============================================*/
+int
+PerlDirMakedir(struct IPerlDir* piPerl, const char *dirname, int mode)
+{
+       return mkdir(dirname);
+}
 
-int PerlDirMakedir(struct IPerlDir* piPerl, const char *dirname, int mode);
-int PerlDirChdir(struct IPerlDir* piPerl, const char *dirname);
-int PerlDirRmdir(struct IPerlDir* piPerl, const char *dirname);
-int PerlDirClose(struct IPerlDir* piPerl, DIR *dirp);
-DIR* PerlDirOpen(struct IPerlDir* piPerl, char *filename);
-struct direct * PerlDirRead(struct IPerlDir* piPerl, DIR *dirp);
-void PerlDirRewind(struct IPerlDir* piPerl, DIR *dirp);
-void PerlDirSeek(struct IPerlDir* piPerl, DIR *dirp, long loc);
-long PerlDirTell(struct IPerlDir* piPerl, DIR *dirp);
+int
+PerlDirChdir(struct IPerlDir* piPerl, const char *dirname)
+{
+       return nw_chdir(dirname);
+}
+
+int
+PerlDirRmdir(struct IPerlDir* piPerl, const char *dirname)
+{
+       return nw_rmdir(dirname);
+}
+
+int
+PerlDirClose(struct IPerlDir* piPerl, DIR *dirp)
+{
+       return nw_closedir(dirp);
+}
+
+DIR*
+PerlDirOpen(struct IPerlDir* piPerl, char *filename)
+{
+       return nw_opendir(filename);
+}
+
+struct direct *
+PerlDirRead(struct IPerlDir* piPerl, DIR *dirp)
+{
+       return nw_readdir(dirp);
+}
+
+void
+PerlDirRewind(struct IPerlDir* piPerl, DIR *dirp)
+{
+    nw_rewinddir(dirp);
+}
+
+void
+PerlDirSeek(struct IPerlDir* piPerl, DIR *dirp, long loc)
+{
+    nw_seekdir(dirp, loc);
+}
+
+long
+PerlDirTell(struct IPerlDir* piPerl, DIR *dirp)
+{
+    return nw_telldir(dirp);
+}
 
 struct IPerlDir perlDir =
 {
@@ -71,24 +225,43 @@ struct IPerlDir perlDir =
     PerlDirTell,
 };
 
-/* IPerlDir    - Directory Manipulation - End   =============================================*/
+/* IPerlDir    - Directory Manipulation functions - End   ===================================*/
 
 /* IPerlEnv    - Environment related functions - Begin ======================================*/
 
-char* PerlEnvGetenv(struct IPerlEnv* piPerl, const char *varname);
-int PerlEnvPutenv(struct IPerlEnv* piPerl, const char *envstring);
-char* PerlEnvGetenv_len(struct IPerlEnv* piPerl, const char* varname, unsigned long* len);
-int PerlEnvUname(struct IPerlEnv* piPerl, struct utsname *name);
-void PerlEnvClearenv(struct IPerlEnv* piPerl);
+char*
+PerlEnvGetenv(struct IPerlEnv* piPerl, const char *varname)
+{
+       return(getenv(varname));
+};
+
+int
+PerlEnvPutenv(struct IPerlEnv* piPerl, const char *envstring)
+{
+       return(putenv(envstring));
+};
+
+char*
+PerlEnvGetenv_len(struct IPerlEnv* piPerl, const char* varname, unsigned long* len)
+{
+       *len = 0; 
+       char *e = getenv(varname);
+       if (e)
+           *len = strlen(e);
+       return e;
+}
 
-//Uncomment the following prototypes and the function names in the structure below
-//whenever it is implemented.
-//The function definition to be put in nwperlsys.c
+int
+PerlEnvUname(struct IPerlEnv* piPerl, struct utsname *name)
+{
+    return nw_uname(name);
+}
 
-/*void* PerlEnvGetChildenv(struct IPerlEnv* piPerl);
-void PerlEnvFreeChildenv(struct IPerlEnv* piPerl, void* childEnv);
-char* PerlEnvGetChilddir(struct IPerlEnv* piPerl);
-void PerlEnvFreeChilddir(struct IPerlEnv* piPerl, char* childDir);*/
+void
+PerlEnvClearenv(struct IPerlEnv* piPerl)
+{
+       
+}
 
 struct IPerlEnv perlEnv = 
 {
@@ -103,51 +276,313 @@ struct IPerlEnv perlEnv =
     PerlEnvFreeChilddir,*/
 };
 
-/* IPerlEnv    - Environment related functions - Begin ======================================*/
+/* IPerlEnv    - Environment related functions - End   ======================================*/
 
 /* IPerlStdio  - Stdio functions - Begin ================================================*/
 
-FILE* PerlStdIOStdin(struct IPerlStdIO* piPerl);
-FILE* PerlStdIOStdout(struct IPerlStdIO* piPerl);
-FILE* PerlStdIOStderr(struct IPerlStdIO* piPerl);
-FILE* PerlStdIOOpen(struct IPerlStdIO* piPerl, const char *path, const char *mode);
-int PerlStdIOClose(struct IPerlStdIO* piPerl, FILE* pf);
-int PerlStdIOEof(struct IPerlStdIO* piPerl, FILE* pf);
-int PerlStdIOError(struct IPerlStdIO* piPerl, FILE* pf);
-void PerlStdIOClearerr(struct IPerlStdIO* piPerl, FILE* pf);
-int PerlStdIOGetc(struct IPerlStdIO* piPerl, FILE* pf);
-char* PerlStdIOGetBase(struct IPerlStdIO* piPerl, FILE* pf);
-int PerlStdIOGetBufsiz(struct IPerlStdIO* piPerl, FILE* pf);
-int PerlStdIOGetCnt(struct IPerlStdIO* piPerl, FILE* pf);
-char* PerlStdIOGetPtr(struct IPerlStdIO* piPerl, FILE* pf);
-char* PerlStdIOGets(struct IPerlStdIO* piPerl, FILE* pf, char* s, int n);
-int PerlStdIOPutc(struct IPerlStdIO* piPerl, FILE* pf, int c);
-int PerlStdIOPuts(struct IPerlStdIO* piPerl, FILE* pf, const char *s);
-int PerlStdIOFlush(struct IPerlStdIO* piPerl, FILE* pf);
-int PerlStdIOUngetc(struct IPerlStdIO* piPerl, int c, FILE* pf);
-int PerlStdIOFileno(struct IPerlStdIO* piPerl, FILE* pf);
-FILE* PerlStdIOFdopen(struct IPerlStdIO* piPerl, int fd, const char *mode);
-FILE* PerlStdIOReopen(struct IPerlStdIO* piPerl, const char*path, const char*mode, FILE* pf);
-SSize_t PerlStdIORead(struct IPerlStdIO* piPerl, void *buffer, Size_t size, Size_t count, FILE* pf);
-SSize_t PerlStdIOWrite(struct IPerlStdIO* piPerl, const void *buffer, Size_t size, Size_t count, FILE* pf);
-void PerlStdIOSetBuf(struct IPerlStdIO* piPerl, FILE* pf, char* buffer);
-int PerlStdIOSetVBuf(struct IPerlStdIO* piPerl, FILE* pf, char* buffer, int type, Size_t size);
-void PerlStdIOSetCnt(struct IPerlStdIO* piPerl, FILE* pf, int n);
-void PerlStdIOSetPtr(struct IPerlStdIO* piPerl, FILE* pf, char * ptr);
-void PerlStdIOSetlinebuf(struct IPerlStdIO* piPerl, FILE* pf);
-int PerlStdIOPrintf(struct IPerlStdIO* piPerl, FILE* pf, const char *format,...);
-int PerlStdIOVprintf(struct IPerlStdIO* piPerl, FILE* pf, const char *format, va_list arglist);
-long PerlStdIOTell(struct IPerlStdIO* piPerl, FILE* pf);
-int PerlStdIOSeek(struct IPerlStdIO* piPerl, FILE* pf, off_t offset, int origin);
-void PerlStdIORewind(struct IPerlStdIO* piPerl, FILE* pf);
-FILE* PerlStdIOTmpfile(struct IPerlStdIO* piPerl);
-int PerlStdIOGetpos(struct IPerlStdIO* piPerl, FILE* pf, Fpos_t *p);
-int PerlStdIOSetpos(struct IPerlStdIO* piPerl, FILE* pf, const Fpos_t *p);
-void PerlStdIOInit(struct IPerlStdIO* piPerl);
-void PerlStdIOInitOSExtras(struct IPerlStdIO* piPerl);
-int PerlStdIOOpenOSfhandle(struct IPerlStdIO* piPerl, long osfhandle, int flags);
-int PerlStdIOGetOSfhandle(struct IPerlStdIO* piPerl, int filenum);
-FILE* PerlStdIOFdupopen(struct IPerlStdIO* piPerl, FILE* pf);
+FILE*
+PerlStdIOStdin(struct IPerlStdIO* piPerl)
+{
+    return nw_stdin();
+}
+
+FILE*
+PerlStdIOStdout(struct IPerlStdIO* piPerl)
+{
+    return nw_stdout();
+}
+
+FILE*
+PerlStdIOStderr(struct IPerlStdIO* piPerl)
+{
+    return nw_stderr();
+}
+
+FILE*
+PerlStdIOOpen(struct IPerlStdIO* piPerl, const char *path, const char *mode)
+{
+    return nw_fopen(path, mode);
+}
+
+int
+PerlStdIOClose(struct IPerlStdIO* piPerl, FILE* pf)
+{
+    return nw_fclose(pf);
+}
+
+int
+PerlStdIOEof(struct IPerlStdIO* piPerl, FILE* pf)
+{
+    return nw_feof(pf);
+}
+
+int
+PerlStdIOError(struct IPerlStdIO* piPerl, FILE* pf)
+{
+    return nw_ferror(pf);
+}
+
+void
+PerlStdIOClearerr(struct IPerlStdIO* piPerl, FILE* pf)
+{
+    nw_clearerr(pf);
+}
+
+int
+PerlStdIOGetc(struct IPerlStdIO* piPerl, FILE* pf)
+{
+    return nw_getc(pf);
+}
+
+char*
+PerlStdIOGetBase(struct IPerlStdIO* piPerl, FILE* pf)
+{
+#ifdef FILE_base
+    FILE *f = pf;
+    return FILE_base(f);
+#else
+    return Nullch;
+#endif
+}
+
+int
+PerlStdIOGetBufsiz(struct IPerlStdIO* piPerl, FILE* pf)
+{
+#ifdef FILE_bufsiz
+    FILE *f = pf;
+    return FILE_bufsiz(f);
+#else
+    return (-1);
+#endif
+}
+
+int
+PerlStdIOGetCnt(struct IPerlStdIO* piPerl, FILE* pf)
+{
+#ifdef USE_STDIO_PTR
+    FILE *f = pf;
+    return FILE_cnt(f);
+#else
+    return (-1);
+#endif
+}
+
+char*
+PerlStdIOGetPtr(struct IPerlStdIO* piPerl, FILE* pf)
+{
+#ifdef USE_STDIO_PTR
+    FILE *f = pf;
+    return FILE_ptr(f);
+#else
+    return Nullch;
+#endif
+}
+
+char*
+PerlStdIOGets(struct IPerlStdIO* piPerl, FILE* pf, char* s, int n)
+{
+    return nw_fgets(s, n, pf);
+}
+
+int
+PerlStdIOPutc(struct IPerlStdIO* piPerl, FILE* pf, int c)
+{
+    return nw_fputc(c, pf);
+}
+
+int
+PerlStdIOPuts(struct IPerlStdIO* piPerl, FILE* pf, const char *s)
+{
+    return nw_fputs(s, pf);
+}
+
+int
+PerlStdIOFlush(struct IPerlStdIO* piPerl, FILE* pf)
+{
+    return nw_fflush(pf);
+}
+
+int
+PerlStdIOUngetc(struct IPerlStdIO* piPerl, int c, FILE* pf)
+{
+    return nw_ungetc(c, pf);
+}
+
+int
+PerlStdIOFileno(struct IPerlStdIO* piPerl, FILE* pf)
+{
+    return nw_fileno(pf);
+}
+
+FILE*
+PerlStdIOFdopen(struct IPerlStdIO* piPerl, int fd, const char *mode)
+{
+    return nw_fdopen(fd, mode);
+}
+
+FILE*
+PerlStdIOReopen(struct IPerlStdIO* piPerl, const char*path, const char*mode, FILE* pf)
+{
+    return nw_freopen(path, mode, pf);
+}
+
+SSize_t
+PerlStdIORead(struct IPerlStdIO* piPerl, void *buffer, Size_t size, Size_t count, FILE* pf)
+{
+    return nw_fread(buffer, size, count, pf);
+}
+
+SSize_t
+PerlStdIOWrite(struct IPerlStdIO* piPerl, const void *buffer, Size_t size, Size_t count, FILE* pf)
+{
+    return nw_fwrite(buffer, size, count, pf);
+}
+
+void
+PerlStdIOSetBuf(struct IPerlStdIO* piPerl, FILE* pf, char* buffer)
+{
+    nw_setbuf(pf, buffer);
+}
+
+int
+PerlStdIOSetVBuf(struct IPerlStdIO* piPerl, FILE* pf, char* buffer, int type, Size_t size)
+{
+    return nw_setvbuf(pf, buffer, type, size);
+}
+
+void
+PerlStdIOSetCnt(struct IPerlStdIO* piPerl, FILE* pf, int n)
+{
+#ifdef STDIO_CNT_LVALUE
+    FILE *f = pf;
+    FILE_cnt(f) = n;
+#endif
+}
+
+void
+PerlStdIOSetPtr(struct IPerlStdIO* piPerl, FILE* pf, char * ptr)
+{
+#ifdef STDIO_PTR_LVALUE
+    FILE *f = pf;
+    FILE_ptr(f) = ptr;
+#endif
+}
+
+void
+PerlStdIOSetlinebuf(struct IPerlStdIO* piPerl, FILE* pf)
+{
+    nw_setvbuf(pf, NULL, _IOLBF, 0);
+}
+
+int
+PerlStdIOPrintf(struct IPerlStdIO* piPerl, FILE* pf, const char *format,...)
+{
+    va_list(arglist);
+    va_start(arglist, format);
+    return nw_vfprintf(pf, format, arglist);
+}
+
+int
+PerlStdIOVprintf(struct IPerlStdIO* piPerl, FILE* pf, const char *format, va_list arglist)
+{
+    return nw_vfprintf(pf, format, arglist);
+}
+
+long
+PerlStdIOTell(struct IPerlStdIO* piPerl, FILE* pf)
+{
+    return nw_ftell(pf);
+}
+
+int
+PerlStdIOSeek(struct IPerlStdIO* piPerl, FILE* pf, off_t offset, int origin)
+{
+    return nw_fseek(pf, offset, origin);
+}
+
+void
+PerlStdIORewind(struct IPerlStdIO* piPerl, FILE* pf)
+{
+    nw_rewind(pf);
+}
+
+FILE*
+PerlStdIOTmpfile(struct IPerlStdIO* piPerl)
+{
+    return nw_tmpfile();
+}
+
+int
+PerlStdIOGetpos(struct IPerlStdIO* piPerl, FILE* pf, Fpos_t *p)
+{
+    return nw_fgetpos(pf, p);
+}
+
+int
+PerlStdIOSetpos(struct IPerlStdIO* piPerl, FILE* pf, const Fpos_t *p)
+{
+    return nw_fsetpos(pf, p);
+}
+
+void
+PerlStdIOInit(struct IPerlStdIO* piPerl)
+{
+}
+
+void
+PerlStdIOInitOSExtras(struct IPerlStdIO* piPerl)
+{
+    Perl_init_os_extras();
+}
+
+
+int
+PerlStdIOOpenOSfhandle(struct IPerlStdIO* piPerl, long osfhandle, int flags)
+{
+    return nw_open_osfhandle(osfhandle, flags);
+}
+
+int
+PerlStdIOGetOSfhandle(struct IPerlStdIO* piPerl, int filenum)
+{
+    return nw_get_osfhandle(filenum);
+}
+
+FILE*
+PerlStdIOFdupopen(struct IPerlStdIO* piPerl, FILE* pf)
+{
+    FILE* pfdup=NULL;
+    fpos_t pos=0;
+    char mode[3]={'\0'};
+    int fileno = nw_dup(nw_fileno(pf));
+
+    /* open the file in the same mode */
+    if(((FILE*)pf)->_flag & _IOREAD) {
+       mode[0] = 'r';
+       mode[1] = 0;
+    }
+    else if(((FILE*)pf)->_flag & _IOWRT) {
+       mode[0] = 'a';
+       mode[1] = 0;
+    }
+    else if(((FILE*)pf)->_flag & _IORW) {
+       mode[0] = 'r';
+       mode[1] = '+';
+       mode[2] = 0;
+    }
+
+    /* it appears that the binmode is attached to the 
+     * file descriptor so binmode files will be handled
+     * correctly
+     */
+    pfdup = nw_fdopen(fileno, mode);
+
+    /* move the file pointer to the same position */
+    if (!fgetpos(pf, &pos)) {
+       fsetpos(pfdup, &pos);
+    }
+    return pfdup;
+}
 
 struct IPerlStdIO perlStdIO =
 {
@@ -196,32 +631,164 @@ struct IPerlStdIO perlStdIO =
 
 /* IPerlLIO    - Low-level IO functions - Begin =============================================*/
 
-int PerlLIOAccess(struct IPerlLIO* piPerl, const char *path, int mode);
-int PerlLIOChmod(struct IPerlLIO* piPerl, const char *filename, int pmode);
-int PerlLIOChown(struct IPerlLIO* piPerl, const char *filename, uid_t owner, gid_t group);
-int PerlLIOChsize(struct IPerlLIO* piPerl, int handle, long size);
-int PerlLIOClose(struct IPerlLIO* piPerl, int handle);
-int PerlLIODup(struct IPerlLIO* piPerl, int handle);
-int PerlLIODup2(struct IPerlLIO* piPerl, int handle1, int handle2);
-int PerlLIOFlock(struct IPerlLIO* piPerl, int fd, int oper);
-int PerlLIOFileStat(struct IPerlLIO* piPerl, int handle, struct stat *buffer);
-int PerlLIOIOCtl(struct IPerlLIO* piPerl, int i, unsigned int u, char *data);
-int PerlLIOIsatty(struct IPerlLIO* piPerl, int fd);
-int PerlLIOLink(struct IPerlLIO* piPerl, const char*oldname, const char *newname);
-long PerlLIOLseek(struct IPerlLIO* piPerl, int handle, long offset, int origin);
-int PerlLIOLstat(struct IPerlLIO* piPerl, const char *path, struct stat *buffer);
-char* PerlLIOMktemp(struct IPerlLIO* piPerl, char *Template);
-int PerlLIOOpen(struct IPerlLIO* piPerl, const char *filename, int oflag);
-int PerlLIOOpen3(struct IPerlLIO* piPerl, const char *filename, int oflag, int pmode);
-int PerlLIORead(struct IPerlLIO* piPerl, int handle, void *buffer, unsigned int count);
-int PerlLIORename(struct IPerlLIO* piPerl, const char *OldFileName, const char *newname);
-int PerlLIOSetmode(struct IPerlLIO* piPerl, FILE *fp, int mode);
-int PerlLIONameStat(struct IPerlLIO* piPerl, const char *path, struct stat *buffer);
-char* PerlLIOTmpnam(struct IPerlLIO* piPerl, char *string);
-int PerlLIOUmask(struct IPerlLIO* piPerl, int pmode);
-int PerlLIOUnlink(struct IPerlLIO* piPerl, const char *filename);
-int PerlLIOUtime(struct IPerlLIO* piPerl, char *filename, struct utimbuf *times);
-int PerlLIOWrite(struct IPerlLIO* piPerl, int handle, const void *buffer, unsigned int count);
+int
+PerlLIOAccess(struct IPerlLIO* piPerl, const char *path, int mode)
+{
+    return nw_access(path, mode);
+}
+
+int
+PerlLIOChmod(struct IPerlLIO* piPerl, const char *filename, int pmode)
+{
+    return nw_chmod(filename, pmode);
+}
+
+int
+PerlLIOChown(struct IPerlLIO* piPerl, const char *filename, uid_t owner, gid_t group)
+{
+       dTHXo;
+    Perl_croak(aTHX_ "chown not implemented!\n");
+       return 0;
+}
+
+int
+PerlLIOChsize(struct IPerlLIO* piPerl, int handle, long size)
+{
+       return (nw_chsize(handle,size));
+}
+
+int
+PerlLIOClose(struct IPerlLIO* piPerl, int handle)
+{
+    return nw_close(handle);
+}
+
+int
+PerlLIODup(struct IPerlLIO* piPerl, int handle)
+{
+    return nw_dup(handle);
+}
+
+int
+PerlLIODup2(struct IPerlLIO* piPerl, int handle1, int handle2)
+{
+    return nw_dup2(handle1, handle2);
+}
+
+int
+PerlLIOFlock(struct IPerlLIO* piPerl, int fd, int oper)
+{
+       //On NetWare simulate flock by locking a range on the file
+    return nw_flock(fd, oper);
+}
+
+int
+PerlLIOFileStat(struct IPerlLIO* piPerl, int handle, struct stat *buffer)
+{
+    return fstat(handle, buffer);
+}
+
+int
+PerlLIOIOCtl(struct IPerlLIO* piPerl, int i, unsigned int u, char *data)
+{
+       return 0;
+}
+
+int
+PerlLIOIsatty(struct IPerlLIO* piPerl, int fd)
+{
+    return nw_isatty(fd);
+}
+
+int
+PerlLIOLink(struct IPerlLIO* piPerl, const char*oldname, const char *newname)
+{
+    return nw_link(oldname, newname);
+}
+
+long
+PerlLIOLseek(struct IPerlLIO* piPerl, int handle, long offset, int origin)
+{
+    return nw_lseek(handle, offset, origin);
+}
+
+int
+PerlLIOLstat(struct IPerlLIO* piPerl, const char *path, struct stat *buffer)
+{
+    return nw_stat(path, buffer);
+}
+
+char*
+PerlLIOMktemp(struct IPerlLIO* piPerl, char *Template)
+{
+       return(nw_mktemp(Template));
+}
+
+int
+PerlLIOOpen(struct IPerlLIO* piPerl, const char *filename, int oflag)
+{
+    return nw_open(filename, oflag);
+}
+
+int
+PerlLIOOpen3(struct IPerlLIO* piPerl, const char *filename, int oflag, int pmode)
+{
+    return nw_open(filename, oflag, pmode);
+}
+
+int
+PerlLIORead(struct IPerlLIO* piPerl, int handle, void *buffer, unsigned int count)
+{
+    return nw_read(handle, buffer, count);
+}
+
+int
+PerlLIORename(struct IPerlLIO* piPerl, const char *OldFileName, const char *newname)
+{
+    return nw_rename(OldFileName, newname);
+}
+
+int
+PerlLIOSetmode(struct IPerlLIO* piPerl, FILE *fp, int mode)
+{
+    return nw_setmode(fp, mode);
+}
+
+int
+PerlLIONameStat(struct IPerlLIO* piPerl, const char *path, struct stat *buffer)
+{
+    return nw_stat(path, buffer);
+}
+
+char*
+PerlLIOTmpnam(struct IPerlLIO* piPerl, char *string)
+{
+    return tmpnam(string);
+}
+
+int
+PerlLIOUmask(struct IPerlLIO* piPerl, int pmode)
+{
+    return umask(pmode);
+}
+
+int
+PerlLIOUnlink(struct IPerlLIO* piPerl, const char *filename)
+{
+    return nw_unlink(filename);
+}
+
+int
+PerlLIOUtime(struct IPerlLIO* piPerl, char *filename, struct utimbuf *times)
+{
+    return nw_utime(filename, times);
+}
+
+int
+PerlLIOWrite(struct IPerlLIO* piPerl, int handle, const void *buffer, unsigned int count)
+{
+    return nw_write(handle, buffer, count);
+}
 
 struct IPerlLIO perlLIO =
 {
@@ -253,40 +820,212 @@ struct IPerlLIO perlLIO =
     PerlLIOWrite,    
 };
 
-/* IPerlLIO    - Low-level IO functions - End ==============================================*/
+/* IPerlLIO    - Low-level IO functions - End   =============================================*/
 
 /* IPerlProc - Process control functions - Begin =========================================*/
 
-void PerlProcAbort(struct IPerlProc* piPerl);
-char * PerlProcCrypt(struct IPerlProc* piPerl, const char* clear, const char* salt);
-void PerlProcExit(struct IPerlProc* piPerl, int status);
-void PerlProc_Exit(struct IPerlProc* piPerl, int status);
-int PerlProcExecl(struct IPerlProc* piPerl, const char *cmdname, const char *arg0, const char *arg1, const char *arg2, const char *arg3);
-int PerlProcExecv(struct IPerlProc* piPerl, const char *cmdname, const char *const *argv);
-int PerlProcExecvp(struct IPerlProc* piPerl, const char *cmdname, const char *const *argv);
-uid_t PerlProcGetuid(struct IPerlProc* piPerl);
-uid_t PerlProcGeteuid(struct IPerlProc* piPerl);
-gid_t PerlProcGetgid(struct IPerlProc* piPerl);
-gid_t PerlProcGetegid(struct IPerlProc* piPerl);
-char * PerlProcGetlogin(struct IPerlProc* piPerl);
-int PerlProcKill(struct IPerlProc* piPerl, int pid, int sig);
-int PerlProcKillpg(struct IPerlProc* piPerl, int pid, int sig);
-int PerlProcPauseProc(struct IPerlProc* piPerl);
-PerlIO* PerlProcPopen(struct IPerlProc* piPerl, const char *command, const char *mode);
-int PerlProcPclose(struct IPerlProc* piPerl, PerlIO *stream);
-int PerlProcPipe(struct IPerlProc* piPerl, int *phandles);
-int PerlProcSetuid(struct IPerlProc* piPerl, uid_t u);
-int PerlProcSetgid(struct IPerlProc* piPerl, gid_t g);
-int PerlProcSleep(struct IPerlProc* piPerl, unsigned int s);
-int PerlProcTimes(struct IPerlProc* piPerl, struct tms *timebuf);
-int PerlProcWait(struct IPerlProc* piPerl, int *status);
-int PerlProcWaitpid(struct IPerlProc* piPerl, int pid, int *status, int flags);
-Sighandler_t PerlProcSignal(struct IPerlProc* piPerl, int sig, Sighandler_t subcode);
-int PerlProcFork(struct IPerlProc* piPerl);
-int PerlProcGetpid(struct IPerlProc* piPerl);
-int PerlProcSpawn(struct IPerlProc* piPerl, char* cmds);
-int PerlProcSpawnvp(struct IPerlProc* piPerl, int mode, const char *cmdname, const char *const *argv);
-int PerlProcASpawn(struct IPerlProc* piPerl, void *vreally, void **vmark, void **vsp);
+#define EXECF_EXEC 1
+#define EXECF_SPAWN 2
+
+void
+PerlProcAbort(struct IPerlProc* piPerl)
+{
+    nw_abort();
+}
+
+char *
+PerlProcCrypt(struct IPerlProc* piPerl, const char* clear, const char* salt)
+{
+    return nw_crypt(clear, salt);
+}
+
+void
+PerlProcExit(struct IPerlProc* piPerl, int status)
+{
+//    exit(status);
+       dTHX;
+       dJMPENV;
+       JMPENV_JUMP(2);
+}
+
+void
+PerlProc_Exit(struct IPerlProc* piPerl, int status)
+{
+//    _exit(status);
+       dTHX;
+       dJMPENV;
+       JMPENV_JUMP(2);
+}
+
+int
+PerlProcExecl(struct IPerlProc* piPerl, const char *cmdname, const char *arg0, const char *arg1, const char *arg2, const char *arg3)
+{
+       dTHXo;
+    Perl_croak(aTHX_ "execl not implemented!\n");
+       return 0;
+}
+
+int
+PerlProcExecv(struct IPerlProc* piPerl, const char *cmdname, const char *const *argv)
+{
+    return nw_execvp((char *)cmdname, (char **)argv);
+}
+
+int
+PerlProcExecvp(struct IPerlProc* piPerl, const char *cmdname, const char *const *argv)
+{
+    return nw_execvp((char *)cmdname, (char **)argv);
+}
+
+uid_t
+PerlProcGetuid(struct IPerlProc* piPerl)
+{
+       return 0;
+}
+
+uid_t
+PerlProcGeteuid(struct IPerlProc* piPerl)
+{
+       return 0;
+}
+
+gid_t
+PerlProcGetgid(struct IPerlProc* piPerl)
+{
+       return 0;
+}
+
+gid_t
+PerlProcGetegid(struct IPerlProc* piPerl)
+{
+       return 0;
+}
+
+char *
+PerlProcGetlogin(struct IPerlProc* piPerl)
+{
+       return NULL;
+}
+
+int
+PerlProcKill(struct IPerlProc* piPerl, int pid, int sig)
+{
+    return nw_kill(pid, sig);
+}
+
+int
+PerlProcKillpg(struct IPerlProc* piPerl, int pid, int sig)
+{
+    dTHXo;
+    Perl_croak(aTHX_ "killpg not implemented!\n");
+    return 0;
+}
+
+int
+PerlProcPauseProc(struct IPerlProc* piPerl)
+{
+    return nw_sleep((32767L << 16) + 32767);
+}
+
+PerlIO*
+PerlProcPopen(struct IPerlProc* piPerl, const char *command, const char *mode)
+{
+    dTHXo;
+    PERL_FLUSHALL_FOR_CHILD;
+
+       return (PerlIO*)nw_Popen((char *)command, (char *)mode, (int *)errno);
+}
+
+int
+PerlProcPclose(struct IPerlProc* piPerl, PerlIO *stream)
+{
+    return nw_Pclose((FILE*)stream, (int *)errno);
+}
+
+int
+PerlProcPipe(struct IPerlProc* piPerl, int *phandles)
+{
+    return nw_Pipe((int *)phandles, (int *)errno);
+}
+
+int
+PerlProcSetuid(struct IPerlProc* piPerl, uid_t u)
+{
+       return 0;
+}
+
+int
+PerlProcSetgid(struct IPerlProc* piPerl, gid_t g)
+{
+       return 0;
+}
+
+int
+PerlProcSleep(struct IPerlProc* piPerl, unsigned int s)
+{
+    return nw_sleep(s);
+}
+
+int
+PerlProcTimes(struct IPerlProc* piPerl, struct tms *timebuf)
+{
+    return nw_times(timebuf);
+}
+
+int
+PerlProcWait(struct IPerlProc* piPerl, int *status)
+{
+    return nw_wait(status);
+}
+
+int
+PerlProcWaitpid(struct IPerlProc* piPerl, int pid, int *status, int flags)
+{
+    return nw_waitpid(pid, status, flags);
+}
+
+Sighandler_t
+PerlProcSignal(struct IPerlProc* piPerl, int sig, Sighandler_t subcode)
+{
+    return 0;
+}
+
+int
+PerlProcFork(struct IPerlProc* piPerl)
+{
+       return 0;
+}
+
+int
+PerlProcGetpid(struct IPerlProc* piPerl)
+{
+    return nw_getpid();
+}
+
+/*BOOL
+PerlProcDoCmd(struct IPerlProc* piPerl, char *cmd)
+{
+    do_spawn2(cmd, EXECF_EXEC);
+    return FALSE;
+}*/
+
+int
+PerlProcSpawn(struct IPerlProc* piPerl, char* cmds)
+{
+    return do_spawn2(cmds, EXECF_SPAWN);
+}
+
+int
+PerlProcSpawnvp(struct IPerlProc* piPerl, int mode, const char *cmdname, const char *const *argv)
+{
+    return nw_spawnvp(mode, (char *)cmdname, (char **)argv);
+}
+
+int
+PerlProcASpawn(struct IPerlProc* piPerl, void *vreally, void **vmark, void **vsp)
+{
+    return do_aspawn(vreally, vmark, vsp);
+}
 
 struct IPerlProc perlProc =
 {
@@ -325,50 +1064,273 @@ struct IPerlProc perlProc =
 
 /* IPerlSock - Socket functions - Begin ==================================================*/
 
-u_long PerlSockHtonl(struct IPerlSock* piPerl, u_long hostlong);
-u_short PerlSockHtons(struct IPerlSock* piPerl, u_short hostshort);
-u_long PerlSockNtohl(struct IPerlSock* piPerl, u_long netlong);
-u_short PerlSockNtohs(struct IPerlSock* piPerl, u_short netshort);
-SOCKET PerlSockAccept(struct IPerlSock* piPerl, SOCKET s, struct sockaddr* addr, int* addrlen);
-int PerlSockBind(struct IPerlSock* piPerl, SOCKET s, const struct sockaddr* name, int namelen);
-int PerlSockConnect(struct IPerlSock* piPerl, SOCKET s, const struct sockaddr* name, int namelen);
-void PerlSockEndhostent(struct IPerlSock* piPerl);
-void PerlSockEndnetent(struct IPerlSock* piPerl);
-void PerlSockEndprotoent(struct IPerlSock* piPerl);
-void PerlSockEndservent(struct IPerlSock* piPerl);
-struct hostent* PerlSockGethostbyaddr(struct IPerlSock* piPerl, const char* addr, int len, int type);
-struct hostent* PerlSockGethostbyname(struct IPerlSock* piPerl, const char* name);
-struct hostent* PerlSockGethostent(struct IPerlSock* piPerl);
-int PerlSockGethostname(struct IPerlSock* piPerl, char* name, int namelen);
-struct netent * PerlSockGetnetbyaddr(struct IPerlSock* piPerl, long net, int type);
-struct netent * PerlSockGetnetbyname(struct IPerlSock* piPerl, const char *name);
-struct netent * PerlSockGetnetent(struct IPerlSock* piPerl);
-int PerlSockGetpeername(struct IPerlSock* piPerl, SOCKET s, struct sockaddr* name, int* namelen);
-struct protoent* PerlSockGetprotobyname(struct IPerlSock* piPerl, const char* name);
-struct protoent* PerlSockGetprotobynumber(struct IPerlSock* piPerl, int number);
-struct protoent* PerlSockGetprotoent(struct IPerlSock* piPerl);
-struct servent* PerlSockGetservbyname(struct IPerlSock* piPerl, const char* name, const char* proto);
-struct servent* PerlSockGetservbyport(struct IPerlSock* piPerl, int port, const char* proto);
-struct servent* PerlSockGetservent(struct IPerlSock* piPerl);
-int PerlSockGetsockname(struct IPerlSock* piPerl, SOCKET s, struct sockaddr* name, int* namelen);
-int PerlSockGetsockopt(struct IPerlSock* piPerl, SOCKET s, int level, int optname, char* optval, int* optlen);
-unsigned long PerlSockInetAddr(struct IPerlSock* piPerl, const char* cp);
-char* PerlSockInetNtoa(struct IPerlSock* piPerl, struct in_addr in);
-int PerlSockListen(struct IPerlSock* piPerl, SOCKET s, int backlog);
-int PerlSockRecv(struct IPerlSock* piPerl, SOCKET s, char* buffer, int len, int flags);
-int PerlSockRecvfrom(struct IPerlSock* piPerl, SOCKET s, char* buffer, int len, int flags, struct sockaddr* from, int* fromlen);
-int PerlSockSelect(struct IPerlSock* piPerl, int nfds, char* readfds, char* writefds, char* exceptfds, const struct timeval* timeout);
-int PerlSockSend(struct IPerlSock* piPerl, SOCKET s, const char* buffer, int len, int flags);
-int PerlSockSendto(struct IPerlSock* piPerl, SOCKET s, const char* buffer, int len, int flags, const struct sockaddr* to, int tolen);
-void PerlSockSethostent(struct IPerlSock* piPerl, int stayopen);
-void PerlSockSetnetent(struct IPerlSock* piPerl, int stayopen);
-void PerlSockSetprotoent(struct IPerlSock* piPerl, int stayopen);
-void PerlSockSetservent(struct IPerlSock* piPerl, int stayopen);
-int PerlSockSetsockopt(struct IPerlSock* piPerl, SOCKET s, int level, int optname, const char* optval, int optlen);
-int PerlSockShutdown(struct IPerlSock* piPerl, SOCKET s, int how);
-SOCKET PerlSockSocket(struct IPerlSock* piPerl, int af, int type, int protocol);
-int PerlSockSocketpair(struct IPerlSock* piPerl, int domain, int type, int protocol, int* fds);
-int PerlSockIoctlsocket(struct IPerlSock* piPerl, SOCKET s, long cmd, u_long *argp);
+u_long
+PerlSockHtonl(struct IPerlSock* piPerl, u_long hostlong)
+{
+       return(nw_htonl(hostlong));
+}
+
+u_short
+PerlSockHtons(struct IPerlSock* piPerl, u_short hostshort)
+{
+       return(nw_htons(hostshort));
+}
+
+u_long
+PerlSockNtohl(struct IPerlSock* piPerl, u_long netlong)
+{
+       return nw_ntohl(netlong);
+}
+
+u_short
+PerlSockNtohs(struct IPerlSock* piPerl, u_short netshort)
+{
+       return nw_ntohs(netshort);
+}
+
+SOCKET PerlSockAccept(struct IPerlSock* piPerl, SOCKET s, struct sockaddr* addr, int* addrlen)
+{
+       return nw_accept(s, addr, addrlen);
+}
+
+int
+PerlSockBind(struct IPerlSock* piPerl, SOCKET s, const struct sockaddr* name, int namelen)
+{
+       return nw_bind(s, name, namelen);
+}
+
+int
+PerlSockConnect(struct IPerlSock* piPerl, SOCKET s, const struct sockaddr* name, int namelen)
+{
+       return nw_connect(s, name, namelen);
+}
+
+void
+PerlSockEndhostent(struct IPerlSock* piPerl)
+{
+    nw_endhostent();
+}
+
+void
+PerlSockEndnetent(struct IPerlSock* piPerl)
+{
+    nw_endnetent();
+}
+
+void
+PerlSockEndprotoent(struct IPerlSock* piPerl)
+{
+    nw_endprotoent();
+}
+
+void
+PerlSockEndservent(struct IPerlSock* piPerl)
+{
+    nw_endservent();
+}
+
+struct hostent*
+PerlSockGethostbyaddr(struct IPerlSock* piPerl, const char* addr, int len, int type)
+{
+       return(nw_gethostbyaddr(addr,len,type));
+}
+
+struct hostent*
+PerlSockGethostbyname(struct IPerlSock* piPerl, const char* name)
+{
+    return nw_gethostbyname(name);
+}
+
+struct hostent*
+PerlSockGethostent(struct IPerlSock* piPerl)
+{
+       return(nw_gethostent());
+}
+
+int
+PerlSockGethostname(struct IPerlSock* piPerl, char* name, int namelen)
+{
+       return nw_gethostname(name,namelen);
+}
+
+struct netent *
+PerlSockGetnetbyaddr(struct IPerlSock* piPerl, long net, int type)
+{
+    return nw_getnetbyaddr(net, type);
+}
+
+struct netent *
+PerlSockGetnetbyname(struct IPerlSock* piPerl, const char *name)
+{
+    return nw_getnetbyname((char*)name);
+}
+
+struct netent *
+PerlSockGetnetent(struct IPerlSock* piPerl)
+{
+    return nw_getnetent();
+}
+
+int PerlSockGetpeername(struct IPerlSock* piPerl, SOCKET s, struct sockaddr* name, int* namelen)
+{
+    return nw_getpeername(s, name, namelen);
+}
+
+struct protoent*
+PerlSockGetprotobyname(struct IPerlSock* piPerl, const char* name)
+{
+    return nw_getprotobyname(name);
+}
+
+struct protoent*
+PerlSockGetprotobynumber(struct IPerlSock* piPerl, int number)
+{
+    return nw_getprotobynumber(number);
+}
+
+struct protoent*
+PerlSockGetprotoent(struct IPerlSock* piPerl)
+{
+    return nw_getprotoent();
+}
+
+struct servent*
+PerlSockGetservbyname(struct IPerlSock* piPerl, const char* name, const char* proto)
+{
+    return nw_getservbyname((char*)name, (char*)proto);
+}
+
+struct servent*
+PerlSockGetservbyport(struct IPerlSock* piPerl, int port, const char* proto)
+{
+       return nw_getservbyport(port, proto);
+}
+
+struct servent*
+PerlSockGetservent(struct IPerlSock* piPerl)
+{
+       return nw_getservent();
+}
+
+int
+PerlSockGetsockname(struct IPerlSock* piPerl, SOCKET s, struct sockaddr* name, int* namelen)
+{
+       return nw_getsockname(s, name, namelen);
+}
+
+int
+PerlSockGetsockopt(struct IPerlSock* piPerl, SOCKET s, int level, int optname, char* optval, int* optlen)
+{
+       return nw_getsockopt(s, level, optname, optval, optlen);
+}
+
+unsigned long
+PerlSockInetAddr(struct IPerlSock* piPerl, const char* cp)
+{
+       return(nw_inet_addr(cp));
+}
+
+char*
+PerlSockInetNtoa(struct IPerlSock* piPerl, struct in_addr in)
+{
+       return NULL;
+}
+
+int
+PerlSockListen(struct IPerlSock* piPerl, SOCKET s, int backlog)
+{
+       return (nw_listen(s, backlog));
+}
+
+int
+PerlSockRecv(struct IPerlSock* piPerl, SOCKET s, char* buffer, int len, int flags)
+{
+       return (nw_recv(s, buffer, len, flags));
+}
+
+int
+PerlSockRecvfrom(struct IPerlSock* piPerl, SOCKET s, char* buffer, int len, int flags, struct sockaddr* from, int* fromlen)
+{
+       return nw_recvfrom(s, buffer, len, flags, from, fromlen);
+}
+
+int
+PerlSockSelect(struct IPerlSock* piPerl, int nfds, char* readfds, char* writefds, char* exceptfds, const struct timeval* timeout)
+{
+       return nw_select(nfds, (fd_set*) readfds, (fd_set*) writefds, (fd_set*) exceptfds, timeout);
+}
+
+int
+PerlSockSend(struct IPerlSock* piPerl, SOCKET s, const char* buffer, int len, int flags)
+{
+       return (nw_send(s, buffer, len, flags));
+}
+
+int
+PerlSockSendto(struct IPerlSock* piPerl, SOCKET s, const char* buffer, int len, int flags, const struct sockaddr* to, int tolen)
+{
+       return(nw_sendto(s, buffer, len, flags, to, tolen));
+}
+
+void
+PerlSockSethostent(struct IPerlSock* piPerl, int stayopen)
+{
+       nw_sethostent(stayopen);
+}
+
+void
+PerlSockSetnetent(struct IPerlSock* piPerl, int stayopen)
+{
+       nw_setnetent(stayopen);
+}
+
+void
+PerlSockSetprotoent(struct IPerlSock* piPerl, int stayopen)
+{
+       nw_setprotoent(stayopen);
+}
+
+void
+PerlSockSetservent(struct IPerlSock* piPerl, int stayopen)
+{
+       nw_setservent(stayopen);
+}
+
+int
+PerlSockSetsockopt(struct IPerlSock* piPerl, SOCKET s, int level, int optname, const char* optval, int optlen)
+{
+       dTHXo;
+    Perl_croak(aTHX_ "setsockopt not implemented!\n");
+       return 0;
+}
+
+int
+PerlSockShutdown(struct IPerlSock* piPerl, SOCKET s, int how)
+{
+       return nw_shutdown(s, how);
+}
+
+SOCKET
+PerlSockSocket(struct IPerlSock* piPerl, int af, int type, int protocol)
+{
+       return nw_socket(af, type, protocol);
+}
+
+int
+PerlSockSocketpair(struct IPerlSock* piPerl, int domain, int type, int protocol, int* fds)
+{
+    dTHXo;
+    Perl_croak(aTHX_ "socketpair not implemented!\n");
+    return 0;
+}
+
+int
+PerlSockIoctlsocket(struct IPerlSock* piPerl, SOCKET s, long cmd, u_long *argp)
+{
+       dTHXo;
+    Perl_croak(aTHX_ "ioctlsocket not implemented!\n");
+       return 0;
+}
 
 struct IPerlSock  perlSock =
 {
@@ -417,6 +1379,6 @@ struct IPerlSock  perlSock =
     PerlSockSocketpair,
 };
 
-/* IPerlSock - Socket functions - End ====================================================*/
+/* IPerlSock - Socket functions - End ==================================================*/
 
 #endif /* ___NWPerlSys_H___ */
index 6930e05..fd004bc 100644 (file)
@@ -31,7 +31,6 @@ typedef struct tagThreadInfo
        void*   m_allocList;
 }ThreadInfo;
 
-
 void fnInitializeThreadInfo(void);
 BOOL fnTerminateThreadInfo(void);
 BOOL fnRegisterWithThreadTable(void);
@@ -42,7 +41,11 @@ BOOL fnRemoveThreadInfo(int tid);
 ThreadInfo* fnGetThreadInfo(int tid);
 
 //For storing and retrieving Watcom Hash list address
-BOOL fnInsertHashListAddrs(void *addrs, BOOL dontTouchHashList);
+#ifdef __cplusplus
+       extern "C" BOOL fnInsertHashListAddrs(void *addrs, BOOL dontTouchHashList);
+#else
+       BOOL fnInsertHashListAddrs(void *addrs, BOOL dontTouchHashList);
+#endif
 BOOL fnGetHashListAddrs(void **addrs, BOOL *dontTouchHashList);
 
 //New TLS to set and get the thread contex - may be redundant,