summaryrefslogtreecommitdiff
path: root/wince/perlhost.h
diff options
context:
space:
mode:
Diffstat (limited to 'wince/perlhost.h')
-rw-r--r--wince/perlhost.h2434
1 files changed, 0 insertions, 2434 deletions
diff --git a/wince/perlhost.h b/wince/perlhost.h
deleted file mode 100644
index a15ff6d5fb..0000000000
--- a/wince/perlhost.h
+++ /dev/null
@@ -1,2434 +0,0 @@
-/* perlhost.h
- *
- * (c) 1999 Microsoft Corporation. All rights reserved.
- * Portions (c) 1999 ActiveState Tool Corp, http://www.ActiveState.com/
- *
- * You may distribute under the terms of either the GNU General Public
- * License or the Artistic License, as specified in the README file.
- */
-
-#ifndef UNDER_CE
-#define CHECK_HOST_INTERP
-#endif
-
-#ifndef ___PerlHost_H___
-#define ___PerlHost_H___
-
-#ifndef UNDER_CE
-#include <signal.h>
-#endif
-#include "iperlsys.h"
-#include "vmem.h"
-#include "vdir.h"
-
-START_EXTERN_C
-extern char * g_win32_get_privlib(const char *pl);
-extern char * g_win32_get_sitelib(const char *pl);
-extern char * g_win32_get_vendorlib(const char *pl);
-extern char * g_getlogin(void);
-END_EXTERN_C
-
-class CPerlHost
-{
-public:
- /* Constructors */
- CPerlHost(void);
- CPerlHost(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);
- CPerlHost(CPerlHost& host);
- ~CPerlHost(void);
-
- static CPerlHost* IPerlMem2Host(struct IPerlMem* piPerl);
- static CPerlHost* IPerlMemShared2Host(struct IPerlMem* piPerl);
- static CPerlHost* IPerlMemParse2Host(struct IPerlMem* piPerl);
- static CPerlHost* IPerlEnv2Host(struct IPerlEnv* piPerl);
- static CPerlHost* IPerlStdIO2Host(struct IPerlStdIO* piPerl);
- static CPerlHost* IPerlLIO2Host(struct IPerlLIO* piPerl);
- static CPerlHost* IPerlDir2Host(struct IPerlDir* piPerl);
- static CPerlHost* IPerlSock2Host(struct IPerlSock* piPerl);
- static CPerlHost* IPerlProc2Host(struct IPerlProc* piPerl);
-
- BOOL PerlCreate(void);
- int PerlParse(int argc, char** argv, char** env);
- int PerlRun(void);
- void PerlDestroy(void);
-
-/* IPerlMem */
- /* Locks provided but should be unnecessary as this is private pool */
- inline void* Malloc(size_t size) { return m_pVMem->Malloc(size); };
- inline void* Realloc(void* ptr, size_t size) { return m_pVMem->Realloc(ptr, size); };
- inline void Free(void* ptr) { m_pVMem->Free(ptr); };
- inline void* Calloc(size_t num, size_t size)
- {
- size_t count = num*size;
- void* lpVoid = Malloc(count);
- if (lpVoid)
- ZeroMemory(lpVoid, count);
- return lpVoid;
- };
- inline void GetLock(void) { m_pVMem->GetLock(); };
- inline void FreeLock(void) { m_pVMem->FreeLock(); };
- inline int IsLocked(void) { return m_pVMem->IsLocked(); };
-
-/* IPerlMemShared */
- /* Locks used to serialize access to the pool */
- inline void GetLockShared(void) { m_pVMemShared->GetLock(); };
- inline void FreeLockShared(void) { m_pVMemShared->FreeLock(); };
- inline int IsLockedShared(void) { return m_pVMemShared->IsLocked(); };
- inline void* MallocShared(size_t size)
- {
- void *result;
- GetLockShared();
- result = m_pVMemShared->Malloc(size);
- FreeLockShared();
- return result;
- };
- inline void* ReallocShared(void* ptr, size_t size)
- {
- void *result;
- GetLockShared();
- result = m_pVMemShared->Realloc(ptr, size);
- FreeLockShared();
- return result;
- };
- inline void FreeShared(void* ptr)
- {
- GetLockShared();
- m_pVMemShared->Free(ptr);
- FreeLockShared();
- };
- inline void* CallocShared(size_t num, size_t size)
- {
- size_t count = num*size;
- void* lpVoid = MallocShared(count);
- if (lpVoid)
- ZeroMemory(lpVoid, count);
- return lpVoid;
- };
-
-/* IPerlMemParse */
- /* Assume something else is using locks to mangaging serialize
- on a batch basis
- */
- inline void GetLockParse(void) { m_pVMemParse->GetLock(); };
- inline void FreeLockParse(void) { m_pVMemParse->FreeLock(); };
- inline int IsLockedParse(void) { return m_pVMemParse->IsLocked(); };
- inline void* MallocParse(size_t size) { return m_pVMemParse->Malloc(size); };
- inline void* ReallocParse(void* ptr, size_t size) { return m_pVMemParse->Realloc(ptr, size); };
- inline void FreeParse(void* ptr) { m_pVMemParse->Free(ptr); };
- inline void* CallocParse(size_t num, size_t size)
- {
- size_t count = num*size;
- void* lpVoid = MallocParse(count);
- if (lpVoid)
- ZeroMemory(lpVoid, count);
- return lpVoid;
- };
-
-/* IPerlEnv */
- char *Getenv(const char *varname);
- int Putenv(const char *envstring);
- inline char *Getenv(const char *varname, unsigned long *len)
- {
- *len = 0;
- char *e = Getenv(varname);
- if (e)
- *len = strlen(e);
- return e;
- }
- void* CreateChildEnv(void) { return CreateLocalEnvironmentStrings(*m_pvDir); };
- void FreeChildEnv(void* pStr) { FreeLocalEnvironmentStrings((char*)pStr); };
- char* GetChildDir(void);
- void FreeChildDir(char* pStr);
- void Reset(void);
- void Clearenv(void);
-
- inline LPSTR GetIndex(DWORD &dwIndex)
- {
- if(dwIndex < m_dwEnvCount)
- {
- ++dwIndex;
- return m_lppEnvList[dwIndex-1];
- }
- return NULL;
- };
-
-protected:
- LPSTR Find(LPCSTR lpStr);
- void Add(LPCSTR lpStr);
-
- LPSTR CreateLocalEnvironmentStrings(VDir &vDir);
- void FreeLocalEnvironmentStrings(LPSTR lpStr);
- LPSTR* Lookup(LPCSTR lpStr);
- DWORD CalculateEnvironmentSpace(void);
-
-public:
-
-/* IPerlDIR */
- virtual int Chdir(const char *dirname);
-
-/* IPerllProc */
- void Abort(void);
- void Exit(int status);
- void _Exit(int status);
- int Execl(const char *cmdname, const char *arg0, const char *arg1, const char *arg2, const char *arg3);
- int Execv(const char *cmdname, const char *const *argv);
- int Execvp(const char *cmdname, const char *const *argv);
-
- inline VMem* GetMemShared(void) { m_pVMemShared->AddRef(); return m_pVMemShared; };
- inline VMem* GetMemParse(void) { m_pVMemParse->AddRef(); return m_pVMemParse; };
- inline VDir* GetDir(void) { return m_pvDir; };
-
-public:
-
- struct IPerlMem m_hostperlMem;
- struct IPerlMem m_hostperlMemShared;
- struct IPerlMem m_hostperlMemParse;
- struct IPerlEnv m_hostperlEnv;
- struct IPerlStdIO m_hostperlStdIO;
- struct IPerlLIO m_hostperlLIO;
- struct IPerlDir m_hostperlDir;
- struct IPerlSock m_hostperlSock;
- struct IPerlProc m_hostperlProc;
-
- struct IPerlMem* m_pHostperlMem;
- struct IPerlMem* m_pHostperlMemShared;
- struct IPerlMem* m_pHostperlMemParse;
- struct IPerlEnv* m_pHostperlEnv;
- struct IPerlStdIO* m_pHostperlStdIO;
- struct IPerlLIO* m_pHostperlLIO;
- struct IPerlDir* m_pHostperlDir;
- struct IPerlSock* m_pHostperlSock;
- struct IPerlProc* m_pHostperlProc;
-
- inline char* MapPathA(const char *pInName) { return m_pvDir->MapPathA(pInName); };
- inline WCHAR* MapPathW(const WCHAR *pInName) { return m_pvDir->MapPathW(pInName); };
-protected:
-
- VDir* m_pvDir;
- VMem* m_pVMem;
- VMem* m_pVMemShared;
- VMem* m_pVMemParse;
-
- DWORD m_dwEnvCount;
- LPSTR* m_lppEnvList;
- BOOL m_bTopLevel; // is this a toplevel host?
- static long num_hosts;
-public:
- inline int LastHost(void) { return num_hosts == 1L; };
- struct interpreter *host_perl;
-};
-
-long CPerlHost::num_hosts = 0L;
-
-extern "C" void win32_checkTLS(struct interpreter *host_perl);
-
-#define STRUCT2RAWPTR(x, y) (CPerlHost*)(((LPBYTE)x)-offsetof(CPerlHost, y))
-#ifdef CHECK_HOST_INTERP
-inline CPerlHost* CheckInterp(CPerlHost *host)
-{
- win32_checkTLS(host->host_perl);
- return host;
-}
-#define STRUCT2PTR(x, y) CheckInterp(STRUCT2RAWPTR(x, y))
-#else
-#define STRUCT2PTR(x, y) STRUCT2RAWPTR(x, y)
-#endif
-
-inline CPerlHost* IPerlMem2Host(struct IPerlMem* piPerl)
-{
- return STRUCT2RAWPTR(piPerl, m_hostperlMem);
-}
-
-inline CPerlHost* IPerlMemShared2Host(struct IPerlMem* piPerl)
-{
- return STRUCT2RAWPTR(piPerl, m_hostperlMemShared);
-}
-
-inline CPerlHost* IPerlMemParse2Host(struct IPerlMem* piPerl)
-{
- return STRUCT2RAWPTR(piPerl, m_hostperlMemParse);
-}
-
-inline CPerlHost* IPerlEnv2Host(struct IPerlEnv* piPerl)
-{
- return STRUCT2PTR(piPerl, m_hostperlEnv);
-}
-
-inline CPerlHost* IPerlStdIO2Host(struct IPerlStdIO* piPerl)
-{
- return STRUCT2PTR(piPerl, m_hostperlStdIO);
-}
-
-inline CPerlHost* IPerlLIO2Host(struct IPerlLIO* piPerl)
-{
- return STRUCT2PTR(piPerl, m_hostperlLIO);
-}
-
-inline CPerlHost* IPerlDir2Host(struct IPerlDir* piPerl)
-{
- return STRUCT2PTR(piPerl, m_hostperlDir);
-}
-
-inline CPerlHost* IPerlSock2Host(struct IPerlSock* piPerl)
-{
- return STRUCT2PTR(piPerl, m_hostperlSock);
-}
-
-inline CPerlHost* IPerlProc2Host(struct IPerlProc* piPerl)
-{
- return STRUCT2PTR(piPerl, m_hostperlProc);
-}
-
-
-
-#undef IPERL2HOST
-#define IPERL2HOST(x) IPerlMem2Host(x)
-
-/* IPerlMem */
-void*
-PerlMemMalloc(struct IPerlMem* piPerl, size_t size)
-{
- return IPERL2HOST(piPerl)->Malloc(size);
-}
-void*
-PerlMemRealloc(struct IPerlMem* piPerl, void* ptr, size_t size)
-{
- return IPERL2HOST(piPerl)->Realloc(ptr, size);
-}
-void
-PerlMemFree(struct IPerlMem* piPerl, void* ptr)
-{
- IPERL2HOST(piPerl)->Free(ptr);
-}
-void*
-PerlMemCalloc(struct IPerlMem* piPerl, size_t num, size_t size)
-{
- return IPERL2HOST(piPerl)->Calloc(num, size);
-}
-
-void
-PerlMemGetLock(struct IPerlMem* piPerl)
-{
- IPERL2HOST(piPerl)->GetLock();
-}
-
-void
-PerlMemFreeLock(struct IPerlMem* piPerl)
-{
- IPERL2HOST(piPerl)->FreeLock();
-}
-
-int
-PerlMemIsLocked(struct IPerlMem* piPerl)
-{
- return IPERL2HOST(piPerl)->IsLocked();
-}
-
-struct IPerlMem perlMem =
-{
- PerlMemMalloc,
- PerlMemRealloc,
- PerlMemFree,
- PerlMemCalloc,
- PerlMemGetLock,
- PerlMemFreeLock,
- PerlMemIsLocked,
-};
-
-#undef IPERL2HOST
-#define IPERL2HOST(x) IPerlMemShared2Host(x)
-
-/* IPerlMemShared */
-void*
-PerlMemSharedMalloc(struct IPerlMem* piPerl, size_t size)
-{
- return IPERL2HOST(piPerl)->MallocShared(size);
-}
-void*
-PerlMemSharedRealloc(struct IPerlMem* piPerl, void* ptr, size_t size)
-{
- return IPERL2HOST(piPerl)->ReallocShared(ptr, size);
-}
-void
-PerlMemSharedFree(struct IPerlMem* piPerl, void* ptr)
-{
- IPERL2HOST(piPerl)->FreeShared(ptr);
-}
-void*
-PerlMemSharedCalloc(struct IPerlMem* piPerl, size_t num, size_t size)
-{
- return IPERL2HOST(piPerl)->CallocShared(num, size);
-}
-
-void
-PerlMemSharedGetLock(struct IPerlMem* piPerl)
-{
- IPERL2HOST(piPerl)->GetLockShared();
-}
-
-void
-PerlMemSharedFreeLock(struct IPerlMem* piPerl)
-{
- IPERL2HOST(piPerl)->FreeLockShared();
-}
-
-int
-PerlMemSharedIsLocked(struct IPerlMem* piPerl)
-{
- return IPERL2HOST(piPerl)->IsLockedShared();
-}
-
-struct IPerlMem perlMemShared =
-{
- PerlMemSharedMalloc,
- PerlMemSharedRealloc,
- PerlMemSharedFree,
- PerlMemSharedCalloc,
- PerlMemSharedGetLock,
- PerlMemSharedFreeLock,
- PerlMemSharedIsLocked,
-};
-
-#undef IPERL2HOST
-#define IPERL2HOST(x) IPerlMemParse2Host(x)
-
-/* IPerlMemParse */
-void*
-PerlMemParseMalloc(struct IPerlMem* piPerl, size_t size)
-{
- return IPERL2HOST(piPerl)->MallocParse(size);
-}
-void*
-PerlMemParseRealloc(struct IPerlMem* piPerl, void* ptr, size_t size)
-{
- return IPERL2HOST(piPerl)->ReallocParse(ptr, size);
-}
-void
-PerlMemParseFree(struct IPerlMem* piPerl, void* ptr)
-{
- IPERL2HOST(piPerl)->FreeParse(ptr);
-}
-void*
-PerlMemParseCalloc(struct IPerlMem* piPerl, size_t num, size_t size)
-{
- return IPERL2HOST(piPerl)->CallocParse(num, size);
-}
-
-void
-PerlMemParseGetLock(struct IPerlMem* piPerl)
-{
- IPERL2HOST(piPerl)->GetLockParse();
-}
-
-void
-PerlMemParseFreeLock(struct IPerlMem* piPerl)
-{
- IPERL2HOST(piPerl)->FreeLockParse();
-}
-
-int
-PerlMemParseIsLocked(struct IPerlMem* piPerl)
-{
- return IPERL2HOST(piPerl)->IsLockedParse();
-}
-
-struct IPerlMem perlMemParse =
-{
- PerlMemParseMalloc,
- PerlMemParseRealloc,
- PerlMemParseFree,
- PerlMemParseCalloc,
- PerlMemParseGetLock,
- PerlMemParseFreeLock,
- PerlMemParseIsLocked,
-};
-
-
-#undef IPERL2HOST
-#define IPERL2HOST(x) IPerlEnv2Host(x)
-
-/* IPerlEnv */
-char*
-PerlEnvGetenv(struct IPerlEnv* piPerl, const char *varname)
-{
- return IPERL2HOST(piPerl)->Getenv(varname);
-};
-
-int
-PerlEnvPutenv(struct IPerlEnv* piPerl, const char *envstring)
-{
- return IPERL2HOST(piPerl)->Putenv(envstring);
-};
-
-char*
-PerlEnvGetenv_len(struct IPerlEnv* piPerl, const char* varname, unsigned long* len)
-{
- return IPERL2HOST(piPerl)->Getenv(varname, len);
-}
-
-int
-PerlEnvUname(struct IPerlEnv* piPerl, struct utsname *name)
-{
- return win32_uname(name);
-}
-
-void
-PerlEnvClearenv(struct IPerlEnv* piPerl)
-{
- IPERL2HOST(piPerl)->Clearenv();
-}
-
-void*
-PerlEnvGetChildenv(struct IPerlEnv* piPerl)
-{
- return IPERL2HOST(piPerl)->CreateChildEnv();
-}
-
-void
-PerlEnvFreeChildenv(struct IPerlEnv* piPerl, void* childEnv)
-{
- IPERL2HOST(piPerl)->FreeChildEnv(childEnv);
-}
-
-char*
-PerlEnvGetChilddir(struct IPerlEnv* piPerl)
-{
- return IPERL2HOST(piPerl)->GetChildDir();
-}
-
-void
-PerlEnvFreeChilddir(struct IPerlEnv* piPerl, char* childDir)
-{
- IPERL2HOST(piPerl)->FreeChildDir(childDir);
-}
-
-unsigned long
-PerlEnvOsId(struct IPerlEnv* piPerl)
-{
- return win32_os_id();
-}
-
-char*
-PerlEnvLibPath(struct IPerlEnv* piPerl, const char *pl)
-{
- return g_win32_get_privlib(pl);
-}
-
-char*
-PerlEnvSiteLibPath(struct IPerlEnv* piPerl, const char *pl)
-{
- return g_win32_get_sitelib(pl);
-}
-
-char*
-PerlEnvVendorLibPath(struct IPerlEnv* piPerl, const char *pl)
-{
- return g_win32_get_vendorlib(pl);
-}
-
-void
-PerlEnvGetChildIO(struct IPerlEnv* piPerl, child_IO_table* ptr)
-{
- win32_get_child_IO(ptr);
-}
-
-struct IPerlEnv perlEnv =
-{
- PerlEnvGetenv,
- PerlEnvPutenv,
- PerlEnvGetenv_len,
- PerlEnvUname,
- PerlEnvClearenv,
- PerlEnvGetChildenv,
- PerlEnvFreeChildenv,
- PerlEnvGetChilddir,
- PerlEnvFreeChilddir,
- PerlEnvOsId,
- PerlEnvLibPath,
- PerlEnvSiteLibPath,
- PerlEnvVendorLibPath,
- PerlEnvGetChildIO,
-};
-
-#undef IPERL2HOST
-#define IPERL2HOST(x) IPerlStdIO2Host(x)
-
-/* PerlStdIO */
-FILE*
-PerlStdIOStdin(struct IPerlStdIO* piPerl)
-{
- return win32_stdin();
-}
-
-FILE*
-PerlStdIOStdout(struct IPerlStdIO* piPerl)
-{
- return win32_stdout();
-}
-
-FILE*
-PerlStdIOStderr(struct IPerlStdIO* piPerl)
-{
- return win32_stderr();
-}
-
-FILE*
-PerlStdIOOpen(struct IPerlStdIO* piPerl, const char *path, const char *mode)
-{
- return win32_fopen(path, mode);
-}
-
-int
-PerlStdIOClose(struct IPerlStdIO* piPerl, FILE* pf)
-{
- return win32_fclose((pf));
-}
-
-int
-PerlStdIOEof(struct IPerlStdIO* piPerl, FILE* pf)
-{
- return win32_feof(pf);
-}
-
-int
-PerlStdIOError(struct IPerlStdIO* piPerl, FILE* pf)
-{
- return win32_ferror(pf);
-}
-
-void
-PerlStdIOClearerr(struct IPerlStdIO* piPerl, FILE* pf)
-{
- win32_clearerr(pf);
-}
-
-int
-PerlStdIOGetc(struct IPerlStdIO* piPerl, FILE* pf)
-{
- return win32_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 win32_fgets(s, n, pf);
-}
-
-int
-PerlStdIOPutc(struct IPerlStdIO* piPerl, FILE* pf, int c)
-{
- return win32_fputc(c, pf);
-}
-
-int
-PerlStdIOPuts(struct IPerlStdIO* piPerl, FILE* pf, const char *s)
-{
- return win32_fputs(s, pf);
-}
-
-int
-PerlStdIOFlush(struct IPerlStdIO* piPerl, FILE* pf)
-{
- return win32_fflush(pf);
-}
-
-int
-PerlStdIOUngetc(struct IPerlStdIO* piPerl,int c, FILE* pf)
-{
- return win32_ungetc(c, pf);
-}
-
-int
-PerlStdIOFileno(struct IPerlStdIO* piPerl, FILE* pf)
-{
- return win32_fileno(pf);
-}
-
-FILE*
-PerlStdIOFdopen(struct IPerlStdIO* piPerl, int fd, const char *mode)
-{
- return win32_fdopen(fd, mode);
-}
-
-FILE*
-PerlStdIOReopen(struct IPerlStdIO* piPerl, const char*path, const char*mode, FILE* pf)
-{
- return win32_freopen(path, mode, (FILE*)pf);
-}
-
-SSize_t
-PerlStdIORead(struct IPerlStdIO* piPerl, void *buffer, Size_t size, Size_t count, FILE* pf)
-{
- return win32_fread(buffer, size, count, pf);
-}
-
-SSize_t
-PerlStdIOWrite(struct IPerlStdIO* piPerl, const void *buffer, Size_t size, Size_t count, FILE* pf)
-{
- return win32_fwrite(buffer, size, count, pf);
-}
-
-void
-PerlStdIOSetBuf(struct IPerlStdIO* piPerl, FILE* pf, char* buffer)
-{
- win32_setbuf(pf, buffer);
-}
-
-int
-PerlStdIOSetVBuf(struct IPerlStdIO* piPerl, FILE* pf, char* buffer, int type, Size_t size)
-{
- return win32_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)
-{
- win32_setvbuf(pf, NULL, _IOLBF, 0);
-}
-
-int
-PerlStdIOPrintf(struct IPerlStdIO* piPerl, FILE* pf, const char *format,...)
-{
- va_list(arglist);
- va_start(arglist, format);
- return win32_vfprintf(pf, format, arglist);
-}
-
-int
-PerlStdIOVprintf(struct IPerlStdIO* piPerl, FILE* pf, const char *format, va_list arglist)
-{
- return win32_vfprintf(pf, format, arglist);
-}
-
-Off_t
-PerlStdIOTell(struct IPerlStdIO* piPerl, FILE* pf)
-{
- return win32_ftell(pf);
-}
-
-int
-PerlStdIOSeek(struct IPerlStdIO* piPerl, FILE* pf, Off_t offset, int origin)
-{
- return win32_fseek(pf, offset, origin);
-}
-
-void
-PerlStdIORewind(struct IPerlStdIO* piPerl, FILE* pf)
-{
- win32_rewind(pf);
-}
-
-FILE*
-PerlStdIOTmpfile(struct IPerlStdIO* piPerl)
-{
- return win32_tmpfile();
-}
-
-int
-PerlStdIOGetpos(struct IPerlStdIO* piPerl, FILE* pf, Fpos_t *p)
-{
- return win32_fgetpos(pf, p);
-}
-
-int
-PerlStdIOSetpos(struct IPerlStdIO* piPerl, FILE* pf, const Fpos_t *p)
-{
- return win32_fsetpos(pf, p);
-}
-void
-PerlStdIOInit(struct IPerlStdIO* piPerl)
-{
-}
-
-void
-PerlStdIOInitOSExtras(struct IPerlStdIO* piPerl)
-{
- Perl_init_os_extras();
-}
-
-int
-PerlStdIOOpenOSfhandle(struct IPerlStdIO* piPerl, intptr_t osfhandle, int flags)
-{
- return win32_open_osfhandle(osfhandle, flags);
-}
-
-intptr_t
-PerlStdIOGetOSfhandle(struct IPerlStdIO* piPerl, int filenum)
-{
- return win32_get_osfhandle(filenum);
-}
-
-FILE*
-PerlStdIOFdupopen(struct IPerlStdIO* piPerl, FILE* pf)
-{
-#ifndef UNDER_CE
- FILE* pfdup;
- fpos_t pos;
- char mode[3];
- int fileno = win32_dup(win32_fileno(pf));
-
- /* open the file in the same mode */
-#ifdef __BORLANDC__
- if((pf)->flags & _F_READ) {
- mode[0] = 'r';
- mode[1] = 0;
- }
- else if((pf)->flags & _F_WRIT) {
- mode[0] = 'a';
- mode[1] = 0;
- }
- else if((pf)->flags & _F_RDWR) {
- mode[0] = 'r';
- mode[1] = '+';
- mode[2] = 0;
- }
-#else
- if((pf)->_flag & _IOREAD) {
- mode[0] = 'r';
- mode[1] = 0;
- }
- else if((pf)->_flag & _IOWRT) {
- mode[0] = 'a';
- mode[1] = 0;
- }
- else if((pf)->_flag & _IORW) {
- mode[0] = 'r';
- mode[1] = '+';
- mode[2] = 0;
- }
-#endif
-
- /* it appears that the binmode is attached to the
- * file descriptor so binmode files will be handled
- * correctly
- */
- pfdup = win32_fdopen(fileno, mode);
-
- /* move the file pointer to the same position */
- if (!fgetpos(pf, &pos)) {
- fsetpos(pfdup, &pos);
- }
- return pfdup;
-#else
- return 0;
-#endif
-}
-
-struct IPerlStdIO perlStdIO =
-{
- PerlStdIOStdin,
- PerlStdIOStdout,
- PerlStdIOStderr,
- PerlStdIOOpen,
- PerlStdIOClose,
- PerlStdIOEof,
- PerlStdIOError,
- PerlStdIOClearerr,
- PerlStdIOGetc,
- PerlStdIOGetBase,
- PerlStdIOGetBufsiz,
- PerlStdIOGetCnt,
- PerlStdIOGetPtr,
- PerlStdIOGets,
- PerlStdIOPutc,
- PerlStdIOPuts,
- PerlStdIOFlush,
- PerlStdIOUngetc,
- PerlStdIOFileno,
- PerlStdIOFdopen,
- PerlStdIOReopen,
- PerlStdIORead,
- PerlStdIOWrite,
- PerlStdIOSetBuf,
- PerlStdIOSetVBuf,
- PerlStdIOSetCnt,
- PerlStdIOSetPtr,
- PerlStdIOSetlinebuf,
- PerlStdIOPrintf,
- PerlStdIOVprintf,
- PerlStdIOTell,
- PerlStdIOSeek,
- PerlStdIORewind,
- PerlStdIOTmpfile,
- PerlStdIOGetpos,
- PerlStdIOSetpos,
- PerlStdIOInit,
- PerlStdIOInitOSExtras,
- PerlStdIOFdupopen,
-};
-
-
-#undef IPERL2HOST
-#define IPERL2HOST(x) IPerlLIO2Host(x)
-
-/* IPerlLIO */
-int
-PerlLIOAccess(struct IPerlLIO* piPerl, const char *path, int mode)
-{
- return win32_access(path, mode);
-}
-
-int
-PerlLIOChmod(struct IPerlLIO* piPerl, const char *filename, int pmode)
-{
- return win32_chmod(filename, pmode);
-}
-
-int
-PerlLIOChown(struct IPerlLIO* piPerl, const char *filename, uid_t owner, gid_t group)
-{
- return chown(filename, owner, group);
-}
-
-int
-PerlLIOChsize(struct IPerlLIO* piPerl, int handle, Off_t size)
-{
- return win32_chsize(handle, size);
-}
-
-int
-PerlLIOClose(struct IPerlLIO* piPerl, int handle)
-{
- return win32_close(handle);
-}
-
-int
-PerlLIODup(struct IPerlLIO* piPerl, int handle)
-{
- return win32_dup(handle);
-}
-
-int
-PerlLIODup2(struct IPerlLIO* piPerl, int handle1, int handle2)
-{
- return win32_dup2(handle1, handle2);
-}
-
-int
-PerlLIOFlock(struct IPerlLIO* piPerl, int fd, int oper)
-{
- return win32_flock(fd, oper);
-}
-
-int
-PerlLIOFileStat(struct IPerlLIO* piPerl, int handle, Stat_t *buffer)
-{
- return win32_fstat(handle, buffer);
-}
-
-int
-PerlLIOIOCtl(struct IPerlLIO* piPerl, int i, unsigned int u, char *data)
-{
- return win32_ioctlsocket((SOCKET)i, (long)u, (u_long*)data);
-}
-
-int
-PerlLIOIsatty(struct IPerlLIO* piPerl, int fd)
-{
- return isatty(fd);
-}
-
-int
-PerlLIOLink(struct IPerlLIO* piPerl, const char*oldname, const char *newname)
-{
- return win32_link(oldname, newname);
-}
-
-Off_t
-PerlLIOLseek(struct IPerlLIO* piPerl, int handle, Off_t offset, int origin)
-{
- return win32_lseek(handle, offset, origin);
-}
-
-int
-PerlLIOLstat(struct IPerlLIO* piPerl, const char *path, Stat_t *buffer)
-{
- return win32_stat(path, buffer);
-}
-
-char*
-PerlLIOMktemp(struct IPerlLIO* piPerl, char *Template)
-{
- return mktemp(Template);
-}
-
-int
-PerlLIOOpen(struct IPerlLIO* piPerl, const char *filename, int oflag)
-{
- return win32_open(filename, oflag);
-}
-
-int
-PerlLIOOpen3(struct IPerlLIO* piPerl, const char *filename, int oflag, int pmode)
-{
- return win32_open(filename, oflag, pmode);
-}
-
-int
-PerlLIORead(struct IPerlLIO* piPerl, int handle, void *buffer, unsigned int count)
-{
- return win32_read(handle, buffer, count);
-}
-
-int
-PerlLIORename(struct IPerlLIO* piPerl, const char *OldFileName, const char *newname)
-{
- return win32_rename(OldFileName, newname);
-}
-
-int
-PerlLIOSetmode(struct IPerlLIO* piPerl, int handle, int mode)
-{
- return win32_setmode(handle, mode);
-}
-
-int
-PerlLIONameStat(struct IPerlLIO* piPerl, const char *path, Stat_t *buffer)
-{
- return win32_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 win32_unlink(filename);
-}
-
-int
-PerlLIOUtime(struct IPerlLIO* piPerl, const char *filename, struct utimbuf *times)
-{
- return win32_utime(filename, times);
-}
-
-int
-PerlLIOWrite(struct IPerlLIO* piPerl, int handle, const void *buffer, unsigned int count)
-{
- return win32_write(handle, buffer, count);
-}
-
-struct IPerlLIO perlLIO =
-{
- PerlLIOAccess,
- PerlLIOChmod,
- PerlLIOChown,
- PerlLIOChsize,
- PerlLIOClose,
- PerlLIODup,
- PerlLIODup2,
- PerlLIOFlock,
- PerlLIOFileStat,
- PerlLIOIOCtl,
- PerlLIOIsatty,
- PerlLIOLink,
- PerlLIOLseek,
- PerlLIOLstat,
- PerlLIOMktemp,
- PerlLIOOpen,
- PerlLIOOpen3,
- PerlLIORead,
- PerlLIORename,
- PerlLIOSetmode,
- PerlLIONameStat,
- PerlLIOTmpnam,
- PerlLIOUmask,
- PerlLIOUnlink,
- PerlLIOUtime,
- PerlLIOWrite,
-};
-
-
-#undef IPERL2HOST
-#define IPERL2HOST(x) IPerlDir2Host(x)
-
-/* IPerlDIR */
-int
-PerlDirMakedir(struct IPerlDir* piPerl, const char *dirname, int mode)
-{
- return win32_mkdir(dirname, mode);
-}
-
-int
-PerlDirChdir(struct IPerlDir* piPerl, const char *dirname)
-{
- return IPERL2HOST(piPerl)->Chdir(dirname);
-}
-
-int
-PerlDirRmdir(struct IPerlDir* piPerl, const char *dirname)
-{
- return win32_rmdir(dirname);
-}
-
-int
-PerlDirClose(struct IPerlDir* piPerl, DIR *dirp)
-{
- return win32_closedir(dirp);
-}
-
-DIR*
-PerlDirOpen(struct IPerlDir* piPerl, const char *filename)
-{
- return win32_opendir(filename);
-}
-
-struct direct *
-PerlDirRead(struct IPerlDir* piPerl, DIR *dirp)
-{
- return win32_readdir(dirp);
-}
-
-void
-PerlDirRewind(struct IPerlDir* piPerl, DIR *dirp)
-{
- win32_rewinddir(dirp);
-}
-
-void
-PerlDirSeek(struct IPerlDir* piPerl, DIR *dirp, long loc)
-{
- win32_seekdir(dirp, loc);
-}
-
-long
-PerlDirTell(struct IPerlDir* piPerl, DIR *dirp)
-{
- return win32_telldir(dirp);
-}
-
-char*
-PerlDirMapPathA(struct IPerlDir* piPerl, const char* path)
-{
- return IPERL2HOST(piPerl)->MapPathA(path);
-}
-
-WCHAR*
-PerlDirMapPathW(struct IPerlDir* piPerl, const WCHAR* path)
-{
- return IPERL2HOST(piPerl)->MapPathW(path);
-}
-
-struct IPerlDir perlDir =
-{
- PerlDirMakedir,
- PerlDirChdir,
- PerlDirRmdir,
- PerlDirClose,
- PerlDirOpen,
- PerlDirRead,
- PerlDirRewind,
- PerlDirSeek,
- PerlDirTell,
- PerlDirMapPathA,
- PerlDirMapPathW,
-};
-
-
-/* IPerlSock */
-u_long
-PerlSockHtonl(struct IPerlSock* piPerl, u_long hostlong)
-{
- return win32_htonl(hostlong);
-}
-
-u_short
-PerlSockHtons(struct IPerlSock* piPerl, u_short hostshort)
-{
- return win32_htons(hostshort);
-}
-
-u_long
-PerlSockNtohl(struct IPerlSock* piPerl, u_long netlong)
-{
- return win32_ntohl(netlong);
-}
-
-u_short
-PerlSockNtohs(struct IPerlSock* piPerl, u_short netshort)
-{
- return win32_ntohs(netshort);
-}
-
-SOCKET PerlSockAccept(struct IPerlSock* piPerl, SOCKET s, struct sockaddr* addr, int* addrlen)
-{
- return win32_accept(s, addr, addrlen);
-}
-
-int
-PerlSockBind(struct IPerlSock* piPerl, SOCKET s, const struct sockaddr* name, int namelen)
-{
- return win32_bind(s, name, namelen);
-}
-
-int
-PerlSockConnect(struct IPerlSock* piPerl, SOCKET s, const struct sockaddr* name, int namelen)
-{
- return win32_connect(s, name, namelen);
-}
-
-void
-PerlSockEndhostent(struct IPerlSock* piPerl)
-{
- win32_endhostent();
-}
-
-void
-PerlSockEndnetent(struct IPerlSock* piPerl)
-{
- win32_endnetent();
-}
-
-void
-PerlSockEndprotoent(struct IPerlSock* piPerl)
-{
- win32_endprotoent();
-}
-
-void
-PerlSockEndservent(struct IPerlSock* piPerl)
-{
- win32_endservent();
-}
-
-struct hostent*
-PerlSockGethostbyaddr(struct IPerlSock* piPerl, const char* addr, int len, int type)
-{
- return win32_gethostbyaddr(addr, len, type);
-}
-
-struct hostent*
-PerlSockGethostbyname(struct IPerlSock* piPerl, const char* name)
-{
- return win32_gethostbyname(name);
-}
-
-struct hostent*
-PerlSockGethostent(struct IPerlSock* piPerl)
-{
- dTHX;
- Perl_croak(aTHX_ "gethostent not implemented!\n");
- return NULL;
-}
-
-int
-PerlSockGethostname(struct IPerlSock* piPerl, char* name, int namelen)
-{
- return win32_gethostname(name, namelen);
-}
-
-struct netent *
-PerlSockGetnetbyaddr(struct IPerlSock* piPerl, long net, int type)
-{
- return win32_getnetbyaddr(net, type);
-}
-
-struct netent *
-PerlSockGetnetbyname(struct IPerlSock* piPerl, const char *name)
-{
- return win32_getnetbyname((char*)name);
-}
-
-struct netent *
-PerlSockGetnetent(struct IPerlSock* piPerl)
-{
- return win32_getnetent();
-}
-
-int PerlSockGetpeername(struct IPerlSock* piPerl, SOCKET s, struct sockaddr* name, int* namelen)
-{
- return win32_getpeername(s, name, namelen);
-}
-
-struct protoent*
-PerlSockGetprotobyname(struct IPerlSock* piPerl, const char* name)
-{
- return win32_getprotobyname(name);
-}
-
-struct protoent*
-PerlSockGetprotobynumber(struct IPerlSock* piPerl, int number)
-{
- return win32_getprotobynumber(number);
-}
-
-struct protoent*
-PerlSockGetprotoent(struct IPerlSock* piPerl)
-{
- return win32_getprotoent();
-}
-
-struct servent*
-PerlSockGetservbyname(struct IPerlSock* piPerl, const char* name, const char* proto)
-{
- return win32_getservbyname(name, proto);
-}
-
-struct servent*
-PerlSockGetservbyport(struct IPerlSock* piPerl, int port, const char* proto)
-{
- return win32_getservbyport(port, proto);
-}
-
-struct servent*
-PerlSockGetservent(struct IPerlSock* piPerl)
-{
- return win32_getservent();
-}
-
-int
-PerlSockGetsockname(struct IPerlSock* piPerl, SOCKET s, struct sockaddr* name, int* namelen)
-{
- return win32_getsockname(s, name, namelen);
-}
-
-int
-PerlSockGetsockopt(struct IPerlSock* piPerl, SOCKET s, int level, int optname, char* optval, int* optlen)
-{
- return win32_getsockopt(s, level, optname, optval, optlen);
-}
-
-unsigned long
-PerlSockInetAddr(struct IPerlSock* piPerl, const char* cp)
-{
- return win32_inet_addr(cp);
-}
-
-char*
-PerlSockInetNtoa(struct IPerlSock* piPerl, struct in_addr in)
-{
- return win32_inet_ntoa(in);
-}
-
-int
-PerlSockListen(struct IPerlSock* piPerl, SOCKET s, int backlog)
-{
- return win32_listen(s, backlog);
-}
-
-int
-PerlSockRecv(struct IPerlSock* piPerl, SOCKET s, char* buffer, int len, int flags)
-{
- return win32_recv(s, buffer, len, flags);
-}
-
-int
-PerlSockRecvfrom(struct IPerlSock* piPerl, SOCKET s, char* buffer, int len, int flags, struct sockaddr* from, int* fromlen)
-{
- return win32_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 win32_select(nfds, (Perl_fd_set*)readfds, (Perl_fd_set*)writefds, (Perl_fd_set*)exceptfds, timeout);
-}
-
-int
-PerlSockSend(struct IPerlSock* piPerl, SOCKET s, const char* buffer, int len, int flags)
-{
- return win32_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 win32_sendto(s, buffer, len, flags, to, tolen);
-}
-
-void
-PerlSockSethostent(struct IPerlSock* piPerl, int stayopen)
-{
- win32_sethostent(stayopen);
-}
-
-void
-PerlSockSetnetent(struct IPerlSock* piPerl, int stayopen)
-{
- win32_setnetent(stayopen);
-}
-
-void
-PerlSockSetprotoent(struct IPerlSock* piPerl, int stayopen)
-{
- win32_setprotoent(stayopen);
-}
-
-void
-PerlSockSetservent(struct IPerlSock* piPerl, int stayopen)
-{
- win32_setservent(stayopen);
-}
-
-int
-PerlSockSetsockopt(struct IPerlSock* piPerl, SOCKET s, int level, int optname, const char* optval, int optlen)
-{
- return win32_setsockopt(s, level, optname, optval, optlen);
-}
-
-int
-PerlSockShutdown(struct IPerlSock* piPerl, SOCKET s, int how)
-{
- return win32_shutdown(s, how);
-}
-
-SOCKET
-PerlSockSocket(struct IPerlSock* piPerl, int af, int type, int protocol)
-{
- return win32_socket(af, type, protocol);
-}
-
-int
-PerlSockSocketpair(struct IPerlSock* piPerl, int domain, int type, int protocol, int* fds)
-{
- return Perl_my_socketpair(domain, type, protocol, fds);
-}
-
-int
-PerlSockClosesocket(struct IPerlSock* piPerl, SOCKET s)
-{
- return win32_closesocket(s);
-}
-
-int
-PerlSockIoctlsocket(struct IPerlSock* piPerl, SOCKET s, long cmd, u_long *argp)
-{
- return win32_ioctlsocket(s, cmd, argp);
-}
-
-struct IPerlSock perlSock =
-{
- PerlSockHtonl,
- PerlSockHtons,
- PerlSockNtohl,
- PerlSockNtohs,
- PerlSockAccept,
- PerlSockBind,
- PerlSockConnect,
- PerlSockEndhostent,
- PerlSockEndnetent,
- PerlSockEndprotoent,
- PerlSockEndservent,
- PerlSockGethostname,
- PerlSockGetpeername,
- PerlSockGethostbyaddr,
- PerlSockGethostbyname,
- PerlSockGethostent,
- PerlSockGetnetbyaddr,
- PerlSockGetnetbyname,
- PerlSockGetnetent,
- PerlSockGetprotobyname,
- PerlSockGetprotobynumber,
- PerlSockGetprotoent,
- PerlSockGetservbyname,
- PerlSockGetservbyport,
- PerlSockGetservent,
- PerlSockGetsockname,
- PerlSockGetsockopt,
- PerlSockInetAddr,
- PerlSockInetNtoa,
- PerlSockListen,
- PerlSockRecv,
- PerlSockRecvfrom,
- PerlSockSelect,
- PerlSockSend,
- PerlSockSendto,
- PerlSockSethostent,
- PerlSockSetnetent,
- PerlSockSetprotoent,
- PerlSockSetservent,
- PerlSockSetsockopt,
- PerlSockShutdown,
- PerlSockSocket,
- PerlSockSocketpair,
- PerlSockClosesocket,
-};
-
-
-/* IPerlProc */
-
-#define EXECF_EXEC 1
-#define EXECF_SPAWN 2
-
-void
-PerlProcAbort(struct IPerlProc* piPerl)
-{
- win32_abort();
-}
-
-char *
-PerlProcCrypt(struct IPerlProc* piPerl, const char* clear, const char* salt)
-{
- return win32_crypt(clear, salt);
-}
-
-void
-PerlProcExit(struct IPerlProc* piPerl, int status)
-{
- exit(status);
-}
-
-void
-PerlProc_Exit(struct IPerlProc* piPerl, int status)
-{
- _exit(status);
-}
-
-int
-PerlProcExecl(struct IPerlProc* piPerl, const char *cmdname, const char *arg0, const char *arg1, const char *arg2, const char *arg3)
-{
- return execl(cmdname, arg0, arg1, arg2, arg3);
-}
-
-int
-PerlProcExecv(struct IPerlProc* piPerl, const char *cmdname, const char *const *argv)
-{
- return win32_execvp(cmdname, argv);
-}
-
-int
-PerlProcExecvp(struct IPerlProc* piPerl, const char *cmdname, const char *const *argv)
-{
- return win32_execvp(cmdname, argv);
-}
-
-uid_t
-PerlProcGetuid(struct IPerlProc* piPerl)
-{
- return getuid();
-}
-
-uid_t
-PerlProcGeteuid(struct IPerlProc* piPerl)
-{
- return geteuid();
-}
-
-gid_t
-PerlProcGetgid(struct IPerlProc* piPerl)
-{
- return getgid();
-}
-
-gid_t
-PerlProcGetegid(struct IPerlProc* piPerl)
-{
- return getegid();
-}
-
-char *
-PerlProcGetlogin(struct IPerlProc* piPerl)
-{
- return g_getlogin();
-}
-
-int
-PerlProcKill(struct IPerlProc* piPerl, int pid, int sig)
-{
- return win32_kill(pid, sig);
-}
-
-int
-PerlProcKillpg(struct IPerlProc* piPerl, int pid, int sig)
-{
- dTHX;
- Perl_croak(aTHX_ "killpg not implemented!\n");
- return 0;
-}
-
-int
-PerlProcPauseProc(struct IPerlProc* piPerl)
-{
- return win32_sleep((32767L << 16) + 32767);
-}
-
-PerlIO*
-PerlProcPopen(struct IPerlProc* piPerl, const char *command, const char *mode)
-{
- dTHX;
- PERL_FLUSHALL_FOR_CHILD;
- return win32_popen(command, mode);
-}
-
-PerlIO*
-PerlProcPopenList(struct IPerlProc* piPerl, const char *mode, IV narg, SV **args)
-{
- dTHX;
- PERL_FLUSHALL_FOR_CHILD;
- return win32_popenlist(mode, narg, args);
-}
-
-int
-PerlProcPclose(struct IPerlProc* piPerl, PerlIO *stream)
-{
- return win32_pclose(stream);
-}
-
-int
-PerlProcPipe(struct IPerlProc* piPerl, int *phandles)
-{
- return win32_pipe(phandles, 512, O_BINARY);
-}
-
-int
-PerlProcSetuid(struct IPerlProc* piPerl, uid_t u)
-{
- return setuid(u);
-}
-
-int
-PerlProcSetgid(struct IPerlProc* piPerl, gid_t g)
-{
- return setgid(g);
-}
-
-int
-PerlProcSleep(struct IPerlProc* piPerl, unsigned int s)
-{
- return win32_sleep(s);
-}
-
-int
-PerlProcTimes(struct IPerlProc* piPerl, struct tms *timebuf)
-{
- return win32_times(timebuf);
-}
-
-int
-PerlProcWait(struct IPerlProc* piPerl, int *status)
-{
- return win32_wait(status);
-}
-
-int
-PerlProcWaitpid(struct IPerlProc* piPerl, int pid, int *status, int flags)
-{
- return win32_waitpid(pid, status, flags);
-}
-
-Sighandler_t
-PerlProcSignal(struct IPerlProc* piPerl, int sig, Sighandler_t subcode)
-{
- return win32_signal(sig, subcode);
-}
-
-int
-PerlProcGetTimeOfDay(struct IPerlProc* piPerl, struct timeval *t, void *z)
-{
- return win32_gettimeofday(t, z);
-}
-
-#ifdef USE_ITHREADS
-static THREAD_RET_TYPE
-win32_start_child(LPVOID arg)
-{
- PerlInterpreter *my_perl = (PerlInterpreter*)arg;
- GV *tmpgv;
- int status;
-#ifdef PERL_SYNC_FORK
- static long sync_fork_id = 0;
- long id = ++sync_fork_id;
-#endif
-
-
- PERL_SET_THX(my_perl);
- win32_checkTLS(my_perl);
-
- /* set $$ to pseudo id */
-#ifdef PERL_SYNC_FORK
- w32_pseudo_id = id;
-#else
- w32_pseudo_id = GetCurrentThreadId();
- if (IsWin95()) {
- int pid = (int)w32_pseudo_id;
- if (pid < 0)
- w32_pseudo_id = -pid;
- }
-#endif
- if (tmpgv = gv_fetchpv("$", TRUE, SVt_PV)) {
- SV *sv = GvSV(tmpgv);
- SvREADONLY_off(sv);
- sv_setiv(sv, -(IV)w32_pseudo_id);
- SvREADONLY_on(sv);
- }
- hv_clear(PL_pidstatus);
-
- /* push a zero on the stack (we are the child) */
- {
- dSP;
- dTARGET;
- PUSHi(0);
- PUTBACK;
- }
-
- /* continue from next op */
- PL_op = PL_op->op_next;
-
- {
- dJMPENV;
- volatile int oldscope = PL_scopestack_ix;
-
-restart:
- JMPENV_PUSH(status);
- switch (status) {
- case 0:
- CALLRUNOPS(aTHX);
- status = 0;
- break;
- case 2:
- while (PL_scopestack_ix > oldscope)
- LEAVE;
- FREETMPS;
- PL_curstash = PL_defstash;
- if (PL_endav && !PL_minus_c)
- call_list(oldscope, PL_endav);
- status = STATUS_EXIT;
- break;
- case 3:
- if (PL_restartop) {
- POPSTACK_TO(PL_mainstack);
- PL_op = PL_restartop;
- PL_restartop = Nullop;
- goto restart;
- }
- PerlIO_printf(Perl_error_log, "panic: restartop\n");
- FREETMPS;
- status = 1;
- break;
- }
- JMPENV_POP;
-
- /* XXX hack to avoid perl_destruct() freeing optree */
- win32_checkTLS(my_perl);
- PL_main_root = Nullop;
- }
-
- win32_checkTLS(my_perl);
- /* close the std handles to avoid fd leaks */
- {
- do_close(PL_stdingv, FALSE);
- do_close(gv_fetchpv("STDOUT", TRUE, SVt_PVIO), FALSE); /* PL_stdoutgv - ISAGN */
- do_close(PL_stderrgv, FALSE);
- }
-
- /* destroy everything (waits for any pseudo-forked children) */
- win32_checkTLS(my_perl);
- perl_destruct(my_perl);
- win32_checkTLS(my_perl);
- perl_free(my_perl);
-
-#ifdef PERL_SYNC_FORK
- return id;
-#else
- return (DWORD)status;
-#endif
-}
-#endif /* USE_ITHREADS */
-
-int
-PerlProcFork(struct IPerlProc* piPerl)
-{
- dTHX;
-#ifdef USE_ITHREADS
- DWORD id;
- HANDLE handle;
- CPerlHost *h;
-
- if (w32_num_pseudo_children >= MAXIMUM_WAIT_OBJECTS) {
- errno = EAGAIN;
- return -1;
- }
- h = new CPerlHost(*(CPerlHost*)w32_internal_host);
- PerlInterpreter *new_perl = perl_clone_using((PerlInterpreter*)aTHX, 1,
- h->m_pHostperlMem,
- h->m_pHostperlMemShared,
- h->m_pHostperlMemParse,
- h->m_pHostperlEnv,
- h->m_pHostperlStdIO,
- h->m_pHostperlLIO,
- h->m_pHostperlDir,
- h->m_pHostperlSock,
- h->m_pHostperlProc
- );
- new_perl->Isys_intern.internal_host = h;
- h->host_perl = new_perl;
-# ifdef PERL_SYNC_FORK
- id = win32_start_child((LPVOID)new_perl);
- PERL_SET_THX(aTHX);
-# else
-# ifdef USE_RTL_THREAD_API
- handle = (HANDLE)_beginthreadex((void*)NULL, 0, win32_start_child,
- (void*)new_perl, 0, (unsigned*)&id);
-# else
- handle = CreateThread(NULL, 0, win32_start_child,
- (LPVOID)new_perl, 0, &id);
-# endif
- PERL_SET_THX(aTHX); /* XXX perl_clone*() set TLS */
- if (!handle) {
- errno = EAGAIN;
- return -1;
- }
- if (IsWin95()) {
- int pid = (int)id;
- if (pid < 0)
- id = -pid;
- }
- w32_pseudo_child_handles[w32_num_pseudo_children] = handle;
- w32_pseudo_child_pids[w32_num_pseudo_children] = id;
- ++w32_num_pseudo_children;
-# endif
- return -(int)id;
-#else
- Perl_croak(aTHX_ "fork() not implemented!\n");
- return -1;
-#endif /* USE_ITHREADS */
-}
-
-int
-PerlProcGetpid(struct IPerlProc* piPerl)
-{
- return win32_getpid();
-}
-
-void*
-PerlProcDynaLoader(struct IPerlProc* piPerl, const char* filename)
-{
- return win32_dynaload(filename);
-}
-
-void
-PerlProcGetOSError(struct IPerlProc* piPerl, SV* sv, DWORD dwErr)
-{
- win32_str_os_error(sv, dwErr);
-}
-
-int
-PerlProcSpawnvp(struct IPerlProc* piPerl, int mode, const char *cmdname, const char *const *argv)
-{
- return win32_spawnvp(mode, cmdname, argv);
-}
-
-int
-PerlProcLastHost(struct IPerlProc* piPerl)
-{
- dTHX;
- CPerlHost *h = (CPerlHost*)w32_internal_host;
- return h->LastHost();
-}
-
-struct IPerlProc perlProc =
-{
- PerlProcAbort,
- PerlProcCrypt,
- PerlProcExit,
- PerlProc_Exit,
- PerlProcExecl,
- PerlProcExecv,
- PerlProcExecvp,
- PerlProcGetuid,
- PerlProcGeteuid,
- PerlProcGetgid,
- PerlProcGetegid,
- PerlProcGetlogin,
- PerlProcKill,
- PerlProcKillpg,
- PerlProcPauseProc,
- PerlProcPopen,
- PerlProcPclose,
- PerlProcPipe,
- PerlProcSetuid,
- PerlProcSetgid,
- PerlProcSleep,
- PerlProcTimes,
- PerlProcWait,
- PerlProcWaitpid,
- PerlProcSignal,
- PerlProcFork,
- PerlProcGetpid,
- PerlProcDynaLoader,
- PerlProcGetOSError,
- PerlProcSpawnvp,
- PerlProcLastHost,
- PerlProcPopenList,
- PerlProcGetTimeOfDay
-};
-
-
-/*
- * CPerlHost
- */
-
-CPerlHost::CPerlHost(void)
-{
- /* Construct a host from scratch */
- InterlockedIncrement(&num_hosts);
- m_pvDir = new VDir();
- m_pVMem = new VMem();
- m_pVMemShared = new VMem();
- m_pVMemParse = new VMem();
-
- m_pvDir->Init(NULL, m_pVMem);
-
- m_dwEnvCount = 0;
- m_lppEnvList = NULL;
- m_bTopLevel = TRUE;
-
- CopyMemory(&m_hostperlMem, &perlMem, sizeof(perlMem));
- CopyMemory(&m_hostperlMemShared, &perlMemShared, sizeof(perlMemShared));
- CopyMemory(&m_hostperlMemParse, &perlMemParse, sizeof(perlMemParse));
- CopyMemory(&m_hostperlEnv, &perlEnv, sizeof(perlEnv));
- CopyMemory(&m_hostperlStdIO, &perlStdIO, sizeof(perlStdIO));
- CopyMemory(&m_hostperlLIO, &perlLIO, sizeof(perlLIO));
- CopyMemory(&m_hostperlDir, &perlDir, sizeof(perlDir));
- CopyMemory(&m_hostperlSock, &perlSock, sizeof(perlSock));
- CopyMemory(&m_hostperlProc, &perlProc, sizeof(perlProc));
-
- m_pHostperlMem = &m_hostperlMem;
- m_pHostperlMemShared = &m_hostperlMemShared;
- m_pHostperlMemParse = &m_hostperlMemParse;
- m_pHostperlEnv = &m_hostperlEnv;
- m_pHostperlStdIO = &m_hostperlStdIO;
- m_pHostperlLIO = &m_hostperlLIO;
- m_pHostperlDir = &m_hostperlDir;
- m_pHostperlSock = &m_hostperlSock;
- m_pHostperlProc = &m_hostperlProc;
-}
-
-#define SETUPEXCHANGE(xptr, iptr, table) \
- STMT_START { \
- if (xptr) { \
- iptr = *xptr; \
- *xptr = &table; \
- } \
- else { \
- iptr = &table; \
- } \
- } STMT_END
-
-CPerlHost::CPerlHost(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)
-{
- InterlockedIncrement(&num_hosts);
- m_pvDir = new VDir(0);
- m_pVMem = new VMem();
- m_pVMemShared = new VMem();
- m_pVMemParse = new VMem();
-
- m_pvDir->Init(NULL, m_pVMem);
-
- m_dwEnvCount = 0;
- m_lppEnvList = NULL;
- m_bTopLevel = FALSE;
-
- CopyMemory(&m_hostperlMem, &perlMem, sizeof(perlMem));
- CopyMemory(&m_hostperlMemShared, &perlMemShared, sizeof(perlMemShared));
- CopyMemory(&m_hostperlMemParse, &perlMemParse, sizeof(perlMemParse));
- CopyMemory(&m_hostperlEnv, &perlEnv, sizeof(perlEnv));
- CopyMemory(&m_hostperlStdIO, &perlStdIO, sizeof(perlStdIO));
- CopyMemory(&m_hostperlLIO, &perlLIO, sizeof(perlLIO));
- CopyMemory(&m_hostperlDir, &perlDir, sizeof(perlDir));
- CopyMemory(&m_hostperlSock, &perlSock, sizeof(perlSock));
- CopyMemory(&m_hostperlProc, &perlProc, sizeof(perlProc));
-
- SETUPEXCHANGE(ppMem, m_pHostperlMem, m_hostperlMem);
- SETUPEXCHANGE(ppMemShared, m_pHostperlMemShared, m_hostperlMemShared);
- SETUPEXCHANGE(ppMemParse, m_pHostperlMemParse, m_hostperlMemParse);
- SETUPEXCHANGE(ppEnv, m_pHostperlEnv, m_hostperlEnv);
- SETUPEXCHANGE(ppStdIO, m_pHostperlStdIO, m_hostperlStdIO);
- SETUPEXCHANGE(ppLIO, m_pHostperlLIO, m_hostperlLIO);
- SETUPEXCHANGE(ppDir, m_pHostperlDir, m_hostperlDir);
- SETUPEXCHANGE(ppSock, m_pHostperlSock, m_hostperlSock);
- SETUPEXCHANGE(ppProc, m_pHostperlProc, m_hostperlProc);
-}
-#undef SETUPEXCHANGE
-
-CPerlHost::CPerlHost(CPerlHost& host)
-{
- /* Construct a host from another host */
- InterlockedIncrement(&num_hosts);
- m_pVMem = new VMem();
- m_pVMemShared = host.GetMemShared();
- m_pVMemParse = host.GetMemParse();
-
- /* duplicate directory info */
- m_pvDir = new VDir(0);
- m_pvDir->Init(host.GetDir(), m_pVMem);
-
- CopyMemory(&m_hostperlMem, &perlMem, sizeof(perlMem));
- CopyMemory(&m_hostperlMemShared, &perlMemShared, sizeof(perlMemShared));
- CopyMemory(&m_hostperlMemParse, &perlMemParse, sizeof(perlMemParse));
- CopyMemory(&m_hostperlEnv, &perlEnv, sizeof(perlEnv));
- CopyMemory(&m_hostperlStdIO, &perlStdIO, sizeof(perlStdIO));
- CopyMemory(&m_hostperlLIO, &perlLIO, sizeof(perlLIO));
- CopyMemory(&m_hostperlDir, &perlDir, sizeof(perlDir));
- CopyMemory(&m_hostperlSock, &perlSock, sizeof(perlSock));
- CopyMemory(&m_hostperlProc, &perlProc, sizeof(perlProc));
- m_pHostperlMem = &m_hostperlMem;
- m_pHostperlMemShared = &m_hostperlMemShared;
- m_pHostperlMemParse = &m_hostperlMemParse;
- m_pHostperlEnv = &m_hostperlEnv;
- m_pHostperlStdIO = &m_hostperlStdIO;
- m_pHostperlLIO = &m_hostperlLIO;
- m_pHostperlDir = &m_hostperlDir;
- m_pHostperlSock = &m_hostperlSock;
- m_pHostperlProc = &m_hostperlProc;
-
- m_dwEnvCount = 0;
- m_lppEnvList = NULL;
- m_bTopLevel = FALSE;
-
- /* duplicate environment info */
- LPSTR lpPtr;
- DWORD dwIndex = 0;
- while(lpPtr = host.GetIndex(dwIndex))
- Add(lpPtr);
-}
-
-CPerlHost::~CPerlHost(void)
-{
- Reset();
- InterlockedDecrement(&num_hosts);
- delete m_pvDir;
- m_pVMemParse->Release();
- m_pVMemShared->Release();
- m_pVMem->Release();
-}
-
-LPSTR
-CPerlHost::Find(LPCSTR lpStr)
-{
- LPSTR lpPtr;
- LPSTR* lppPtr = Lookup(lpStr);
- if(lppPtr != NULL) {
- for(lpPtr = *lppPtr; *lpPtr != '\0' && *lpPtr != '='; ++lpPtr)
- ;
-
- if(*lpPtr == '=')
- ++lpPtr;
-
- return lpPtr;
- }
- return NULL;
-}
-
-int
-lookup(const void *arg1, const void *arg2)
-{ // Compare strings
- char*ptr1, *ptr2;
- char c1,c2;
-
- ptr1 = *(char**)arg1;
- ptr2 = *(char**)arg2;
- for(;;) {
- c1 = *ptr1++;
- c2 = *ptr2++;
- if(c1 == '\0' || c1 == '=') {
- if(c2 == '\0' || c2 == '=')
- break;
-
- return -1; // string 1 < string 2
- }
- else if(c2 == '\0' || c2 == '=')
- return 1; // string 1 > string 2
- else if(c1 != c2) {
- c1 = toupper(c1);
- c2 = toupper(c2);
- if(c1 != c2) {
- if(c1 < c2)
- return -1; // string 1 < string 2
-
- return 1; // string 1 > string 2
- }
- }
- }
- return 0;
-}
-
-LPSTR*
-CPerlHost::Lookup(LPCSTR lpStr)
-{
-#ifdef UNDER_CE
- if (!m_lppEnvList || !m_dwEnvCount)
- return NULL;
-#endif
- if (!lpStr)
- return NULL;
- return (LPSTR*)bsearch(&lpStr, m_lppEnvList, m_dwEnvCount, sizeof(LPSTR), lookup);
-}
-
-int
-compare(const void *arg1, const void *arg2)
-{ // Compare strings
- char*ptr1, *ptr2;
- char c1,c2;
-
- ptr1 = *(char**)arg1;
- ptr2 = *(char**)arg2;
- for(;;) {
- c1 = *ptr1++;
- c2 = *ptr2++;
- if(c1 == '\0' || c1 == '=') {
- if(c1 == c2)
- break;
-
- return -1; // string 1 < string 2
- }
- else if(c2 == '\0' || c2 == '=')
- return 1; // string 1 > string 2
- else if(c1 != c2) {
- c1 = toupper(c1);
- c2 = toupper(c2);
- if(c1 != c2) {
- if(c1 < c2)
- return -1; // string 1 < string 2
-
- return 1; // string 1 > string 2
- }
- }
- }
- return 0;
-}
-
-void
-CPerlHost::Add(LPCSTR lpStr)
-{
- dTHX;
- char szBuffer[1024];
- LPSTR *lpPtr;
- int index, length = strlen(lpStr)+1;
-
- for(index = 0; lpStr[index] != '\0' && lpStr[index] != '='; ++index)
- szBuffer[index] = lpStr[index];
-
- szBuffer[index] = '\0';
-
- // replacing ?
- lpPtr = Lookup(szBuffer);
- if (lpPtr != NULL) {
- // must allocate things via host memory allocation functions
- // rather than perl's Renew() et al, as the perl interpreter
- // may either not be initialized enough when we allocate these,
- // or may already be dead when we go to free these
- *lpPtr = (char*)Realloc(*lpPtr, length * sizeof(char));
- strcpy(*lpPtr, lpStr);
- }
- else {
- m_lppEnvList = (LPSTR*)Realloc(m_lppEnvList, (m_dwEnvCount+1) * sizeof(LPSTR));
- if (m_lppEnvList) {
- m_lppEnvList[m_dwEnvCount] = (char*)Malloc(length * sizeof(char));
- if (m_lppEnvList[m_dwEnvCount] != NULL) {
- strcpy(m_lppEnvList[m_dwEnvCount], lpStr);
- ++m_dwEnvCount;
- qsort(m_lppEnvList, m_dwEnvCount, sizeof(LPSTR), compare);
- }
- }
- }
-}
-
-DWORD
-CPerlHost::CalculateEnvironmentSpace(void)
-{
- DWORD index;
- DWORD dwSize = 0;
- for(index = 0; index < m_dwEnvCount; ++index)
- dwSize += strlen(m_lppEnvList[index]) + 1;
-
- return dwSize;
-}
-
-void
-CPerlHost::FreeLocalEnvironmentStrings(LPSTR lpStr)
-{
- dTHX;
- Safefree(lpStr);
-}
-
-char*
-CPerlHost::GetChildDir(void)
-{
- dTHX;
- int length;
- char* ptr;
- Newx(ptr, MAX_PATH+1, char);
- if(ptr) {
- m_pvDir->GetCurrentDirectoryA(MAX_PATH+1, ptr);
- length = strlen(ptr);
- if (length > 3) {
- if ((ptr[length-1] == '\\') || (ptr[length-1] == '/'))
- ptr[length-1] = 0;
- }
- }
- return ptr;
-}
-
-void
-CPerlHost::FreeChildDir(char* pStr)
-{
- dTHX;
- Safefree(pStr);
-}
-
-LPSTR
-CPerlHost::CreateLocalEnvironmentStrings(VDir &vDir)
-{
- dTHX;
- LPSTR lpStr, lpPtr, lpEnvPtr, lpTmp, lpLocalEnv, lpAllocPtr;
- DWORD dwSize, dwEnvIndex;
- int nLength, compVal;
-
- // get the process environment strings
- lpAllocPtr = lpTmp = (LPSTR)GetEnvironmentStrings();
-
- // step over current directory stuff
- while(*lpTmp == '=')
- lpTmp += strlen(lpTmp) + 1;
-
- // save the start of the environment strings
- lpEnvPtr = lpTmp;
- for(dwSize = 1; *lpTmp != '\0'; lpTmp += strlen(lpTmp) + 1) {
- // calculate the size of the environment strings
- dwSize += strlen(lpTmp) + 1;
- }
-
- // add the size of current directories
- dwSize += vDir.CalculateEnvironmentSpace();
-
- // add the additional space used by changes made to the environment
- dwSize += CalculateEnvironmentSpace();
-
- Newx(lpStr, dwSize, char);
- lpPtr = lpStr;
- if(lpStr != NULL) {
- // build the local environment
- lpStr = vDir.BuildEnvironmentSpace(lpStr);
-
- dwEnvIndex = 0;
- lpLocalEnv = GetIndex(dwEnvIndex);
- while(*lpEnvPtr != '\0') {
- if(!lpLocalEnv) {
- // all environment overrides have been added
- // so copy string into place
- strcpy(lpStr, lpEnvPtr);
- nLength = strlen(lpEnvPtr) + 1;
- lpStr += nLength;
- lpEnvPtr += nLength;
- }
- else {
- // determine which string to copy next
- compVal = compare(&lpEnvPtr, &lpLocalEnv);
- if(compVal < 0) {
- strcpy(lpStr, lpEnvPtr);
- nLength = strlen(lpEnvPtr) + 1;
- lpStr += nLength;
- lpEnvPtr += nLength;
- }
- else {
- char *ptr = strchr(lpLocalEnv, '=');
- if(ptr && ptr[1]) {
- strcpy(lpStr, lpLocalEnv);
- lpStr += strlen(lpLocalEnv) + 1;
- }
- lpLocalEnv = GetIndex(dwEnvIndex);
- if(compVal == 0) {
- // this string was replaced
- lpEnvPtr += strlen(lpEnvPtr) + 1;
- }
- }
- }
- }
-
- while(lpLocalEnv) {
- // still have environment overrides to add
- // so copy the strings into place if not an override
- char *ptr = strchr(lpLocalEnv, '=');
- if(ptr && ptr[1]) {
- strcpy(lpStr, lpLocalEnv);
- lpStr += strlen(lpLocalEnv) + 1;
- }
- lpLocalEnv = GetIndex(dwEnvIndex);
- }
-
- // add final NULL
- *lpStr = '\0';
- }
-
- // release the process environment strings
- FreeEnvironmentStrings(lpAllocPtr);
-
- return lpPtr;
-}
-
-void
-CPerlHost::Reset(void)
-{
- dTHX;
- if(m_lppEnvList != NULL) {
- for(DWORD index = 0; index < m_dwEnvCount; ++index) {
- Free(m_lppEnvList[index]);
- m_lppEnvList[index] = NULL;
- }
- }
- m_dwEnvCount = 0;
- Free(m_lppEnvList);
- m_lppEnvList = NULL;
-}
-
-void
-CPerlHost::Clearenv(void)
-{
- dTHX;
- char ch;
- LPSTR lpPtr, lpStr, lpEnvPtr;
- if (m_lppEnvList != NULL) {
- /* set every entry to an empty string */
- for(DWORD index = 0; index < m_dwEnvCount; ++index) {
- char* ptr = strchr(m_lppEnvList[index], '=');
- if(ptr) {
- *++ptr = 0;
- }
- }
- }
-
- /* get the process environment strings */
- lpStr = lpEnvPtr = (LPSTR)GetEnvironmentStrings();
-
- /* step over current directory stuff */
- while(*lpStr == '=')
- lpStr += strlen(lpStr) + 1;
-
- while(*lpStr) {
- lpPtr = strchr(lpStr, '=');
- if(lpPtr) {
- ch = *++lpPtr;
- *lpPtr = 0;
- Add(lpStr);
- if (m_bTopLevel)
- (void)win32_putenv(lpStr);
- *lpPtr = ch;
- }
- lpStr += strlen(lpStr) + 1;
- }
-
- FreeEnvironmentStrings(lpEnvPtr);
-}
-
-
-char*
-CPerlHost::Getenv(const char *varname)
-{
- dTHX;
- if (!m_bTopLevel) {
- char *pEnv = Find(varname);
- if (pEnv && *pEnv)
- return pEnv;
- }
- return win32_getenv(varname);
-}
-
-int
-CPerlHost::Putenv(const char *envstring)
-{
- dTHX;
- Add(envstring);
- if (m_bTopLevel)
- return win32_putenv(envstring);
-
- return 0;
-}
-
-int
-CPerlHost::Chdir(const char *dirname)
-{
- dTHX;
- int ret;
- if (!dirname) {
- errno = ENOENT;
- return -1;
- }
- ret = m_pvDir->SetCurrentDirectoryA((char*)dirname);
- if(ret < 0) {
- errno = ENOENT;
- }
- return ret;
-}
-
-#endif /* ___PerlHost_H___ */