3 * (c) 1999 Microsoft Corporation. All rights reserved.
4 * Portions (c) 1999 ActiveState Tool Corp, http://www.ActiveState.com/
6 * You may distribute under the terms of either the GNU General Public
7 * License or the Artistic License, as specified in the README file.
11 #define CHECK_HOST_INTERP
14 #ifndef ___PerlHost_H___
15 #define ___PerlHost_H___
24 #ifndef WC_NO_BEST_FIT_CHARS
25 # define WC_NO_BEST_FIT_CHARS 0x00000400
29 extern char * g_win32_get_privlib(const char *pl, STRLEN *const len);
30 extern char * g_win32_get_sitelib(const char *pl, STRLEN *const len);
31 extern char * g_win32_get_vendorlib(const char *pl,
33 extern char * g_getlogin(void);
41 CPerlHost(struct IPerlMem** ppMem, struct IPerlMem** ppMemShared,
42 struct IPerlMem** ppMemParse, struct IPerlEnv** ppEnv,
43 struct IPerlStdIO** ppStdIO, struct IPerlLIO** ppLIO,
44 struct IPerlDir** ppDir, struct IPerlSock** ppSock,
45 struct IPerlProc** ppProc);
46 CPerlHost(CPerlHost& host);
49 static CPerlHost* IPerlMem2Host(struct IPerlMem* piPerl);
50 static CPerlHost* IPerlMemShared2Host(struct IPerlMem* piPerl);
51 static CPerlHost* IPerlMemParse2Host(struct IPerlMem* piPerl);
52 static CPerlHost* IPerlEnv2Host(struct IPerlEnv* piPerl);
53 static CPerlHost* IPerlStdIO2Host(struct IPerlStdIO* piPerl);
54 static CPerlHost* IPerlLIO2Host(struct IPerlLIO* piPerl);
55 static CPerlHost* IPerlDir2Host(struct IPerlDir* piPerl);
56 static CPerlHost* IPerlSock2Host(struct IPerlSock* piPerl);
57 static CPerlHost* IPerlProc2Host(struct IPerlProc* piPerl);
59 BOOL PerlCreate(void);
60 int PerlParse(int argc, char** argv, char** env);
62 void PerlDestroy(void);
65 /* Locks provided but should be unnecessary as this is private pool */
66 inline void* Malloc(size_t size) { return m_pVMem->Malloc(size); };
67 inline void* Realloc(void* ptr, size_t size) { return m_pVMem->Realloc(ptr, size); };
68 inline void Free(void* ptr) { m_pVMem->Free(ptr); };
69 inline void* Calloc(size_t num, size_t size)
71 size_t count = num*size;
72 void* lpVoid = Malloc(count);
74 ZeroMemory(lpVoid, count);
77 inline void GetLock(void) { m_pVMem->GetLock(); };
78 inline void FreeLock(void) { m_pVMem->FreeLock(); };
79 inline int IsLocked(void) { return m_pVMem->IsLocked(); };
82 /* Locks used to serialize access to the pool */
83 inline void GetLockShared(void) { m_pVMemShared->GetLock(); };
84 inline void FreeLockShared(void) { m_pVMemShared->FreeLock(); };
85 inline int IsLockedShared(void) { return m_pVMemShared->IsLocked(); };
86 inline void* MallocShared(size_t size)
90 result = m_pVMemShared->Malloc(size);
94 inline void* ReallocShared(void* ptr, size_t size)
98 result = m_pVMemShared->Realloc(ptr, size);
102 inline void FreeShared(void* ptr)
105 m_pVMemShared->Free(ptr);
108 inline void* CallocShared(size_t num, size_t size)
110 size_t count = num*size;
111 void* lpVoid = MallocShared(count);
113 ZeroMemory(lpVoid, count);
118 /* Assume something else is using locks to mangaging serialize
121 inline void GetLockParse(void) { m_pVMemParse->GetLock(); };
122 inline void FreeLockParse(void) { m_pVMemParse->FreeLock(); };
123 inline int IsLockedParse(void) { return m_pVMemParse->IsLocked(); };
124 inline void* MallocParse(size_t size) { return m_pVMemParse->Malloc(size); };
125 inline void* ReallocParse(void* ptr, size_t size) { return m_pVMemParse->Realloc(ptr, size); };
126 inline void FreeParse(void* ptr) { m_pVMemParse->Free(ptr); };
127 inline void* CallocParse(size_t num, size_t size)
129 size_t count = num*size;
130 void* lpVoid = MallocParse(count);
132 ZeroMemory(lpVoid, count);
137 char *Getenv(const char *varname);
138 int Putenv(const char *envstring);
139 inline char *Getenv(const char *varname, unsigned long *len)
142 char *e = Getenv(varname);
147 void* CreateChildEnv(void) { return CreateLocalEnvironmentStrings(*m_pvDir); };
148 void FreeChildEnv(void* pStr) { FreeLocalEnvironmentStrings((char*)pStr); };
149 char* GetChildDir(void);
150 void FreeChildDir(char* pStr);
154 inline LPSTR GetIndex(DWORD &dwIndex)
156 if(dwIndex < m_dwEnvCount)
159 return m_lppEnvList[dwIndex-1];
165 LPSTR Find(LPCSTR lpStr);
166 void Add(LPCSTR lpStr);
168 LPSTR CreateLocalEnvironmentStrings(VDir &vDir);
169 void FreeLocalEnvironmentStrings(LPSTR lpStr);
170 LPSTR* Lookup(LPCSTR lpStr);
171 DWORD CalculateEnvironmentSpace(void);
176 virtual int Chdir(const char *dirname);
180 void Exit(int status);
181 void _Exit(int status);
182 int Execl(const char *cmdname, const char *arg0, const char *arg1, const char *arg2, const char *arg3);
183 int Execv(const char *cmdname, const char *const *argv);
184 int Execvp(const char *cmdname, const char *const *argv);
186 inline VMem* GetMemShared(void) { m_pVMemShared->AddRef(); return m_pVMemShared; };
187 inline VMem* GetMemParse(void) { m_pVMemParse->AddRef(); return m_pVMemParse; };
188 inline VDir* GetDir(void) { return m_pvDir; };
192 struct IPerlMem m_hostperlMem;
193 struct IPerlMem m_hostperlMemShared;
194 struct IPerlMem m_hostperlMemParse;
195 struct IPerlEnv m_hostperlEnv;
196 struct IPerlStdIO m_hostperlStdIO;
197 struct IPerlLIO m_hostperlLIO;
198 struct IPerlDir m_hostperlDir;
199 struct IPerlSock m_hostperlSock;
200 struct IPerlProc m_hostperlProc;
202 struct IPerlMem* m_pHostperlMem;
203 struct IPerlMem* m_pHostperlMemShared;
204 struct IPerlMem* m_pHostperlMemParse;
205 struct IPerlEnv* m_pHostperlEnv;
206 struct IPerlStdIO* m_pHostperlStdIO;
207 struct IPerlLIO* m_pHostperlLIO;
208 struct IPerlDir* m_pHostperlDir;
209 struct IPerlSock* m_pHostperlSock;
210 struct IPerlProc* m_pHostperlProc;
212 inline char* MapPathA(const char *pInName) { return m_pvDir->MapPathA(pInName); };
213 inline WCHAR* MapPathW(const WCHAR *pInName) { return m_pvDir->MapPathW(pInName); };
223 BOOL m_bTopLevel; // is this a toplevel host?
224 static long num_hosts;
226 inline int LastHost(void) { return num_hosts == 1L; };
227 struct interpreter *host_perl;
230 long CPerlHost::num_hosts = 0L;
232 extern "C" void win32_checkTLS(struct interpreter *host_perl);
234 #define STRUCT2RAWPTR(x, y) (CPerlHost*)(((LPBYTE)x)-offsetof(CPerlHost, y))
235 #ifdef CHECK_HOST_INTERP
236 inline CPerlHost* CheckInterp(CPerlHost *host)
238 win32_checkTLS(host->host_perl);
241 #define STRUCT2PTR(x, y) CheckInterp(STRUCT2RAWPTR(x, y))
243 #define STRUCT2PTR(x, y) STRUCT2RAWPTR(x, y)
246 inline CPerlHost* IPerlMem2Host(struct IPerlMem* piPerl)
248 return STRUCT2RAWPTR(piPerl, m_hostperlMem);
251 inline CPerlHost* IPerlMemShared2Host(struct IPerlMem* piPerl)
253 return STRUCT2RAWPTR(piPerl, m_hostperlMemShared);
256 inline CPerlHost* IPerlMemParse2Host(struct IPerlMem* piPerl)
258 return STRUCT2RAWPTR(piPerl, m_hostperlMemParse);
261 inline CPerlHost* IPerlEnv2Host(struct IPerlEnv* piPerl)
263 return STRUCT2PTR(piPerl, m_hostperlEnv);
266 inline CPerlHost* IPerlStdIO2Host(struct IPerlStdIO* piPerl)
268 return STRUCT2PTR(piPerl, m_hostperlStdIO);
271 inline CPerlHost* IPerlLIO2Host(struct IPerlLIO* piPerl)
273 return STRUCT2PTR(piPerl, m_hostperlLIO);
276 inline CPerlHost* IPerlDir2Host(struct IPerlDir* piPerl)
278 return STRUCT2PTR(piPerl, m_hostperlDir);
281 inline CPerlHost* IPerlSock2Host(struct IPerlSock* piPerl)
283 return STRUCT2PTR(piPerl, m_hostperlSock);
286 inline CPerlHost* IPerlProc2Host(struct IPerlProc* piPerl)
288 return STRUCT2PTR(piPerl, m_hostperlProc);
294 #define IPERL2HOST(x) IPerlMem2Host(x)
298 PerlMemMalloc(struct IPerlMem* piPerl, size_t size)
300 return IPERL2HOST(piPerl)->Malloc(size);
303 PerlMemRealloc(struct IPerlMem* piPerl, void* ptr, size_t size)
305 return IPERL2HOST(piPerl)->Realloc(ptr, size);
308 PerlMemFree(struct IPerlMem* piPerl, void* ptr)
310 IPERL2HOST(piPerl)->Free(ptr);
313 PerlMemCalloc(struct IPerlMem* piPerl, size_t num, size_t size)
315 return IPERL2HOST(piPerl)->Calloc(num, size);
319 PerlMemGetLock(struct IPerlMem* piPerl)
321 IPERL2HOST(piPerl)->GetLock();
325 PerlMemFreeLock(struct IPerlMem* piPerl)
327 IPERL2HOST(piPerl)->FreeLock();
331 PerlMemIsLocked(struct IPerlMem* piPerl)
333 return IPERL2HOST(piPerl)->IsLocked();
336 struct IPerlMem perlMem =
348 #define IPERL2HOST(x) IPerlMemShared2Host(x)
352 PerlMemSharedMalloc(struct IPerlMem* piPerl, size_t size)
354 return IPERL2HOST(piPerl)->MallocShared(size);
357 PerlMemSharedRealloc(struct IPerlMem* piPerl, void* ptr, size_t size)
359 return IPERL2HOST(piPerl)->ReallocShared(ptr, size);
362 PerlMemSharedFree(struct IPerlMem* piPerl, void* ptr)
364 IPERL2HOST(piPerl)->FreeShared(ptr);
367 PerlMemSharedCalloc(struct IPerlMem* piPerl, size_t num, size_t size)
369 return IPERL2HOST(piPerl)->CallocShared(num, size);
373 PerlMemSharedGetLock(struct IPerlMem* piPerl)
375 IPERL2HOST(piPerl)->GetLockShared();
379 PerlMemSharedFreeLock(struct IPerlMem* piPerl)
381 IPERL2HOST(piPerl)->FreeLockShared();
385 PerlMemSharedIsLocked(struct IPerlMem* piPerl)
387 return IPERL2HOST(piPerl)->IsLockedShared();
390 struct IPerlMem perlMemShared =
393 PerlMemSharedRealloc,
396 PerlMemSharedGetLock,
397 PerlMemSharedFreeLock,
398 PerlMemSharedIsLocked,
402 #define IPERL2HOST(x) IPerlMemParse2Host(x)
406 PerlMemParseMalloc(struct IPerlMem* piPerl, size_t size)
408 return IPERL2HOST(piPerl)->MallocParse(size);
411 PerlMemParseRealloc(struct IPerlMem* piPerl, void* ptr, size_t size)
413 return IPERL2HOST(piPerl)->ReallocParse(ptr, size);
416 PerlMemParseFree(struct IPerlMem* piPerl, void* ptr)
418 IPERL2HOST(piPerl)->FreeParse(ptr);
421 PerlMemParseCalloc(struct IPerlMem* piPerl, size_t num, size_t size)
423 return IPERL2HOST(piPerl)->CallocParse(num, size);
427 PerlMemParseGetLock(struct IPerlMem* piPerl)
429 IPERL2HOST(piPerl)->GetLockParse();
433 PerlMemParseFreeLock(struct IPerlMem* piPerl)
435 IPERL2HOST(piPerl)->FreeLockParse();
439 PerlMemParseIsLocked(struct IPerlMem* piPerl)
441 return IPERL2HOST(piPerl)->IsLockedParse();
444 struct IPerlMem perlMemParse =
451 PerlMemParseFreeLock,
452 PerlMemParseIsLocked,
457 #define IPERL2HOST(x) IPerlEnv2Host(x)
461 PerlEnvGetenv(struct IPerlEnv* piPerl, const char *varname)
463 return IPERL2HOST(piPerl)->Getenv(varname);
467 PerlEnvPutenv(struct IPerlEnv* piPerl, const char *envstring)
469 return IPERL2HOST(piPerl)->Putenv(envstring);
473 PerlEnvGetenv_len(struct IPerlEnv* piPerl, const char* varname, unsigned long* len)
475 return IPERL2HOST(piPerl)->Getenv(varname, len);
479 PerlEnvUname(struct IPerlEnv* piPerl, struct utsname *name)
481 return win32_uname(name);
485 PerlEnvClearenv(struct IPerlEnv* piPerl)
487 IPERL2HOST(piPerl)->Clearenv();
491 PerlEnvGetChildenv(struct IPerlEnv* piPerl)
493 return IPERL2HOST(piPerl)->CreateChildEnv();
497 PerlEnvFreeChildenv(struct IPerlEnv* piPerl, void* childEnv)
499 IPERL2HOST(piPerl)->FreeChildEnv(childEnv);
503 PerlEnvGetChilddir(struct IPerlEnv* piPerl)
505 return IPERL2HOST(piPerl)->GetChildDir();
509 PerlEnvFreeChilddir(struct IPerlEnv* piPerl, char* childDir)
511 IPERL2HOST(piPerl)->FreeChildDir(childDir);
515 PerlEnvOsId(struct IPerlEnv* piPerl)
517 return win32_os_id();
521 PerlEnvLibPath(struct IPerlEnv* piPerl, const char *pl, STRLEN *const len)
523 return g_win32_get_privlib(pl, len);
527 PerlEnvSiteLibPath(struct IPerlEnv* piPerl, const char *pl, STRLEN *const len)
529 return g_win32_get_sitelib(pl, len);
533 PerlEnvVendorLibPath(struct IPerlEnv* piPerl, const char *pl,
536 return g_win32_get_vendorlib(pl, len);
540 PerlEnvGetChildIO(struct IPerlEnv* piPerl, child_IO_table* ptr)
542 win32_get_child_IO(ptr);
545 struct IPerlEnv perlEnv =
559 PerlEnvVendorLibPath,
564 #define IPERL2HOST(x) IPerlStdIO2Host(x)
568 PerlStdIOStdin(struct IPerlStdIO* piPerl)
570 return win32_stdin();
574 PerlStdIOStdout(struct IPerlStdIO* piPerl)
576 return win32_stdout();
580 PerlStdIOStderr(struct IPerlStdIO* piPerl)
582 return win32_stderr();
586 PerlStdIOOpen(struct IPerlStdIO* piPerl, const char *path, const char *mode)
588 return win32_fopen(path, mode);
592 PerlStdIOClose(struct IPerlStdIO* piPerl, FILE* pf)
594 return win32_fclose((pf));
598 PerlStdIOEof(struct IPerlStdIO* piPerl, FILE* pf)
600 return win32_feof(pf);
604 PerlStdIOError(struct IPerlStdIO* piPerl, FILE* pf)
606 return win32_ferror(pf);
610 PerlStdIOClearerr(struct IPerlStdIO* piPerl, FILE* pf)
616 PerlStdIOGetc(struct IPerlStdIO* piPerl, FILE* pf)
618 return win32_getc(pf);
622 PerlStdIOGetBase(struct IPerlStdIO* piPerl, FILE* pf)
633 PerlStdIOGetBufsiz(struct IPerlStdIO* piPerl, FILE* pf)
637 return FILE_bufsiz(f);
644 PerlStdIOGetCnt(struct IPerlStdIO* piPerl, FILE* pf)
655 PerlStdIOGetPtr(struct IPerlStdIO* piPerl, FILE* pf)
666 PerlStdIOGets(struct IPerlStdIO* piPerl, char* s, int n, FILE* pf)
668 return win32_fgets(s, n, pf);
672 PerlStdIOPutc(struct IPerlStdIO* piPerl, int c, FILE* pf)
674 return win32_fputc(c, pf);
678 PerlStdIOPuts(struct IPerlStdIO* piPerl, const char *s, FILE* pf)
680 return win32_fputs(s, pf);
684 PerlStdIOFlush(struct IPerlStdIO* piPerl, FILE* pf)
686 return win32_fflush(pf);
690 PerlStdIOUngetc(struct IPerlStdIO* piPerl,int c, FILE* pf)
692 return win32_ungetc(c, pf);
696 PerlStdIOFileno(struct IPerlStdIO* piPerl, FILE* pf)
698 return win32_fileno(pf);
702 PerlStdIOFdopen(struct IPerlStdIO* piPerl, int fd, const char *mode)
704 return win32_fdopen(fd, mode);
708 PerlStdIOReopen(struct IPerlStdIO* piPerl, const char*path, const char*mode, FILE* pf)
710 return win32_freopen(path, mode, (FILE*)pf);
714 PerlStdIORead(struct IPerlStdIO* piPerl, void *buffer, Size_t size, Size_t count, FILE* pf)
716 return win32_fread(buffer, size, count, pf);
720 PerlStdIOWrite(struct IPerlStdIO* piPerl, const void *buffer, Size_t size, Size_t count, FILE* pf)
722 return win32_fwrite(buffer, size, count, pf);
726 PerlStdIOSetBuf(struct IPerlStdIO* piPerl, FILE* pf, char* buffer)
728 win32_setbuf(pf, buffer);
732 PerlStdIOSetVBuf(struct IPerlStdIO* piPerl, FILE* pf, char* buffer, int type, Size_t size)
734 return win32_setvbuf(pf, buffer, type, size);
738 PerlStdIOSetCnt(struct IPerlStdIO* piPerl, FILE* pf, int n)
740 #ifdef STDIO_CNT_LVALUE
747 PerlStdIOSetPtr(struct IPerlStdIO* piPerl, FILE* pf, STDCHAR * ptr)
749 #ifdef STDIO_PTR_LVALUE
756 PerlStdIOSetlinebuf(struct IPerlStdIO* piPerl, FILE* pf)
758 win32_setvbuf(pf, NULL, _IOLBF, 0);
762 PerlStdIOPrintf(struct IPerlStdIO* piPerl, FILE* pf, const char *format,...)
765 va_start(arglist, format);
766 return win32_vfprintf(pf, format, arglist);
770 PerlStdIOVprintf(struct IPerlStdIO* piPerl, FILE* pf, const char *format, va_list arglist)
772 return win32_vfprintf(pf, format, arglist);
776 PerlStdIOTell(struct IPerlStdIO* piPerl, FILE* pf)
778 return win32_ftell(pf);
782 PerlStdIOSeek(struct IPerlStdIO* piPerl, FILE* pf, Off_t offset, int origin)
784 return win32_fseek(pf, offset, origin);
788 PerlStdIORewind(struct IPerlStdIO* piPerl, FILE* pf)
794 PerlStdIOTmpfile(struct IPerlStdIO* piPerl)
796 return win32_tmpfile();
800 PerlStdIOGetpos(struct IPerlStdIO* piPerl, FILE* pf, Fpos_t *p)
802 return win32_fgetpos(pf, p);
806 PerlStdIOSetpos(struct IPerlStdIO* piPerl, FILE* pf, const Fpos_t *p)
808 return win32_fsetpos(pf, p);
811 PerlStdIOInit(struct IPerlStdIO* piPerl)
816 PerlStdIOInitOSExtras(struct IPerlStdIO* piPerl)
818 Perl_init_os_extras();
822 PerlStdIOOpenOSfhandle(struct IPerlStdIO* piPerl, intptr_t osfhandle, int flags)
824 return win32_open_osfhandle(osfhandle, flags);
828 PerlStdIOGetOSfhandle(struct IPerlStdIO* piPerl, int filenum)
830 return win32_get_osfhandle(filenum);
834 PerlStdIOFdupopen(struct IPerlStdIO* piPerl, FILE* pf)
840 int fileno = win32_dup(win32_fileno(pf));
842 /* open the file in the same mode */
843 if((pf)->_flag & _IOREAD) {
847 else if((pf)->_flag & _IOWRT) {
851 else if((pf)->_flag & _IORW) {
857 /* it appears that the binmode is attached to the
858 * file descriptor so binmode files will be handled
861 pfdup = win32_fdopen(fileno, mode);
863 /* move the file pointer to the same position */
864 if (!fgetpos(pf, &pos)) {
865 fsetpos(pfdup, &pos);
873 struct IPerlStdIO perlStdIO =
912 PerlStdIOInitOSExtras,
918 #define IPERL2HOST(x) IPerlLIO2Host(x)
922 PerlLIOAccess(struct IPerlLIO* piPerl, const char *path, int mode)
924 return win32_access(path, mode);
928 PerlLIOChmod(struct IPerlLIO* piPerl, const char *filename, int pmode)
930 return win32_chmod(filename, pmode);
934 PerlLIOChown(struct IPerlLIO* piPerl, const char *filename, uid_t owner, gid_t group)
936 return chown(filename, owner, group);
940 PerlLIOChsize(struct IPerlLIO* piPerl, int handle, Off_t size)
942 return win32_chsize(handle, size);
946 PerlLIOClose(struct IPerlLIO* piPerl, int handle)
948 return win32_close(handle);
952 PerlLIODup(struct IPerlLIO* piPerl, int handle)
954 return win32_dup(handle);
958 PerlLIODup2(struct IPerlLIO* piPerl, int handle1, int handle2)
960 return win32_dup2(handle1, handle2);
964 PerlLIOFlock(struct IPerlLIO* piPerl, int fd, int oper)
966 return win32_flock(fd, oper);
970 PerlLIOFileStat(struct IPerlLIO* piPerl, int handle, Stat_t *buffer)
972 return win32_fstat(handle, buffer);
976 PerlLIOIOCtl(struct IPerlLIO* piPerl, int i, unsigned int u, char *data)
981 /* mauke says using memcpy avoids alignment issues */
982 memcpy(&u_long_arg, data, sizeof u_long_arg);
983 retval = win32_ioctlsocket((SOCKET)i, (long)u, &u_long_arg);
984 memcpy(data, &u_long_arg, sizeof u_long_arg);
989 PerlLIOIsatty(struct IPerlLIO* piPerl, int fd)
991 return win32_isatty(fd);
995 PerlLIOLink(struct IPerlLIO* piPerl, const char*oldname, const char *newname)
997 return win32_link(oldname, newname);
1001 PerlLIOLseek(struct IPerlLIO* piPerl, int handle, Off_t offset, int origin)
1003 return win32_lseek(handle, offset, origin);
1007 PerlLIOLstat(struct IPerlLIO* piPerl, const char *path, Stat_t *buffer)
1009 return win32_stat(path, buffer);
1013 PerlLIOMktemp(struct IPerlLIO* piPerl, char *Template)
1015 return mktemp(Template);
1019 PerlLIOOpen(struct IPerlLIO* piPerl, const char *filename, int oflag)
1021 return win32_open(filename, oflag);
1025 PerlLIOOpen3(struct IPerlLIO* piPerl, const char *filename, int oflag, int pmode)
1027 return win32_open(filename, oflag, pmode);
1031 PerlLIORead(struct IPerlLIO* piPerl, int handle, void *buffer, unsigned int count)
1033 return win32_read(handle, buffer, count);
1037 PerlLIORename(struct IPerlLIO* piPerl, const char *OldFileName, const char *newname)
1039 return win32_rename(OldFileName, newname);
1043 PerlLIOSetmode(struct IPerlLIO* piPerl, int handle, int mode)
1045 return win32_setmode(handle, mode);
1049 PerlLIONameStat(struct IPerlLIO* piPerl, const char *path, Stat_t *buffer)
1051 return win32_stat(path, buffer);
1055 PerlLIOTmpnam(struct IPerlLIO* piPerl, char *string)
1057 return tmpnam(string);
1061 PerlLIOUmask(struct IPerlLIO* piPerl, int pmode)
1063 return umask(pmode);
1067 PerlLIOUnlink(struct IPerlLIO* piPerl, const char *filename)
1069 return win32_unlink(filename);
1073 PerlLIOUtime(struct IPerlLIO* piPerl, const char *filename, struct utimbuf *times)
1075 return win32_utime(filename, times);
1079 PerlLIOWrite(struct IPerlLIO* piPerl, int handle, const void *buffer, unsigned int count)
1081 return win32_write(handle, buffer, count);
1084 struct IPerlLIO perlLIO =
1116 #define IPERL2HOST(x) IPerlDir2Host(x)
1120 PerlDirMakedir(struct IPerlDir* piPerl, const char *dirname, int mode)
1122 return win32_mkdir(dirname, mode);
1126 PerlDirChdir(struct IPerlDir* piPerl, const char *dirname)
1128 return IPERL2HOST(piPerl)->Chdir(dirname);
1132 PerlDirRmdir(struct IPerlDir* piPerl, const char *dirname)
1134 return win32_rmdir(dirname);
1138 PerlDirClose(struct IPerlDir* piPerl, DIR *dirp)
1140 return win32_closedir(dirp);
1144 PerlDirOpen(struct IPerlDir* piPerl, const char *filename)
1146 return win32_opendir(filename);
1150 PerlDirRead(struct IPerlDir* piPerl, DIR *dirp)
1152 return win32_readdir(dirp);
1156 PerlDirRewind(struct IPerlDir* piPerl, DIR *dirp)
1158 win32_rewinddir(dirp);
1162 PerlDirSeek(struct IPerlDir* piPerl, DIR *dirp, long loc)
1164 win32_seekdir(dirp, loc);
1168 PerlDirTell(struct IPerlDir* piPerl, DIR *dirp)
1170 return win32_telldir(dirp);
1174 PerlDirMapPathA(struct IPerlDir* piPerl, const char* path)
1176 return IPERL2HOST(piPerl)->MapPathA(path);
1180 PerlDirMapPathW(struct IPerlDir* piPerl, const WCHAR* path)
1182 return IPERL2HOST(piPerl)->MapPathW(path);
1185 struct IPerlDir perlDir =
1203 PerlSockHtonl(struct IPerlSock* piPerl, u_long hostlong)
1205 return win32_htonl(hostlong);
1209 PerlSockHtons(struct IPerlSock* piPerl, u_short hostshort)
1211 return win32_htons(hostshort);
1215 PerlSockNtohl(struct IPerlSock* piPerl, u_long netlong)
1217 return win32_ntohl(netlong);
1221 PerlSockNtohs(struct IPerlSock* piPerl, u_short netshort)
1223 return win32_ntohs(netshort);
1226 SOCKET PerlSockAccept(struct IPerlSock* piPerl, SOCKET s, struct sockaddr* addr, int* addrlen)
1228 return win32_accept(s, addr, addrlen);
1232 PerlSockBind(struct IPerlSock* piPerl, SOCKET s, const struct sockaddr* name, int namelen)
1234 return win32_bind(s, name, namelen);
1238 PerlSockConnect(struct IPerlSock* piPerl, SOCKET s, const struct sockaddr* name, int namelen)
1240 return win32_connect(s, name, namelen);
1244 PerlSockEndhostent(struct IPerlSock* piPerl)
1250 PerlSockEndnetent(struct IPerlSock* piPerl)
1256 PerlSockEndprotoent(struct IPerlSock* piPerl)
1258 win32_endprotoent();
1262 PerlSockEndservent(struct IPerlSock* piPerl)
1268 PerlSockGethostbyaddr(struct IPerlSock* piPerl, const char* addr, int len, int type)
1270 return win32_gethostbyaddr(addr, len, type);
1274 PerlSockGethostbyname(struct IPerlSock* piPerl, const char* name)
1276 return win32_gethostbyname(name);
1280 PerlSockGethostent(struct IPerlSock* piPerl)
1283 Perl_croak(aTHX_ "gethostent not implemented!\n");
1288 PerlSockGethostname(struct IPerlSock* piPerl, char* name, int namelen)
1290 return win32_gethostname(name, namelen);
1294 PerlSockGetnetbyaddr(struct IPerlSock* piPerl, long net, int type)
1296 return win32_getnetbyaddr(net, type);
1300 PerlSockGetnetbyname(struct IPerlSock* piPerl, const char *name)
1302 return win32_getnetbyname((char*)name);
1306 PerlSockGetnetent(struct IPerlSock* piPerl)
1308 return win32_getnetent();
1311 int PerlSockGetpeername(struct IPerlSock* piPerl, SOCKET s, struct sockaddr* name, int* namelen)
1313 return win32_getpeername(s, name, namelen);
1317 PerlSockGetprotobyname(struct IPerlSock* piPerl, const char* name)
1319 return win32_getprotobyname(name);
1323 PerlSockGetprotobynumber(struct IPerlSock* piPerl, int number)
1325 return win32_getprotobynumber(number);
1329 PerlSockGetprotoent(struct IPerlSock* piPerl)
1331 return win32_getprotoent();
1335 PerlSockGetservbyname(struct IPerlSock* piPerl, const char* name, const char* proto)
1337 return win32_getservbyname(name, proto);
1341 PerlSockGetservbyport(struct IPerlSock* piPerl, int port, const char* proto)
1343 return win32_getservbyport(port, proto);
1347 PerlSockGetservent(struct IPerlSock* piPerl)
1349 return win32_getservent();
1353 PerlSockGetsockname(struct IPerlSock* piPerl, SOCKET s, struct sockaddr* name, int* namelen)
1355 return win32_getsockname(s, name, namelen);
1359 PerlSockGetsockopt(struct IPerlSock* piPerl, SOCKET s, int level, int optname, char* optval, int* optlen)
1361 return win32_getsockopt(s, level, optname, optval, optlen);
1365 PerlSockInetAddr(struct IPerlSock* piPerl, const char* cp)
1367 return win32_inet_addr(cp);
1371 PerlSockInetNtoa(struct IPerlSock* piPerl, struct in_addr in)
1373 return win32_inet_ntoa(in);
1377 PerlSockListen(struct IPerlSock* piPerl, SOCKET s, int backlog)
1379 return win32_listen(s, backlog);
1383 PerlSockRecv(struct IPerlSock* piPerl, SOCKET s, char* buffer, int len, int flags)
1385 return win32_recv(s, buffer, len, flags);
1389 PerlSockRecvfrom(struct IPerlSock* piPerl, SOCKET s, char* buffer, int len, int flags, struct sockaddr* from, int* fromlen)
1391 return win32_recvfrom(s, buffer, len, flags, from, fromlen);
1395 PerlSockSelect(struct IPerlSock* piPerl, int nfds, char* readfds, char* writefds, char* exceptfds, const struct timeval* timeout)
1397 return win32_select(nfds, (Perl_fd_set*)readfds, (Perl_fd_set*)writefds, (Perl_fd_set*)exceptfds, timeout);
1401 PerlSockSend(struct IPerlSock* piPerl, SOCKET s, const char* buffer, int len, int flags)
1403 return win32_send(s, buffer, len, flags);
1407 PerlSockSendto(struct IPerlSock* piPerl, SOCKET s, const char* buffer, int len, int flags, const struct sockaddr* to, int tolen)
1409 return win32_sendto(s, buffer, len, flags, to, tolen);
1413 PerlSockSethostent(struct IPerlSock* piPerl, int stayopen)
1415 win32_sethostent(stayopen);
1419 PerlSockSetnetent(struct IPerlSock* piPerl, int stayopen)
1421 win32_setnetent(stayopen);
1425 PerlSockSetprotoent(struct IPerlSock* piPerl, int stayopen)
1427 win32_setprotoent(stayopen);
1431 PerlSockSetservent(struct IPerlSock* piPerl, int stayopen)
1433 win32_setservent(stayopen);
1437 PerlSockSetsockopt(struct IPerlSock* piPerl, SOCKET s, int level, int optname, const char* optval, int optlen)
1439 return win32_setsockopt(s, level, optname, optval, optlen);
1443 PerlSockShutdown(struct IPerlSock* piPerl, SOCKET s, int how)
1445 return win32_shutdown(s, how);
1449 PerlSockSocket(struct IPerlSock* piPerl, int af, int type, int protocol)
1451 return win32_socket(af, type, protocol);
1455 PerlSockSocketpair(struct IPerlSock* piPerl, int domain, int type, int protocol, int* fds)
1457 return Perl_my_socketpair(domain, type, protocol, fds);
1461 PerlSockClosesocket(struct IPerlSock* piPerl, SOCKET s)
1463 return win32_closesocket(s);
1467 PerlSockIoctlsocket(struct IPerlSock* piPerl, SOCKET s, long cmd, u_long *argp)
1469 return win32_ioctlsocket(s, cmd, argp);
1472 struct IPerlSock perlSock =
1483 PerlSockEndprotoent,
1485 PerlSockGethostname,
1486 PerlSockGetpeername,
1487 PerlSockGethostbyaddr,
1488 PerlSockGethostbyname,
1490 PerlSockGetnetbyaddr,
1491 PerlSockGetnetbyname,
1493 PerlSockGetprotobyname,
1494 PerlSockGetprotobynumber,
1495 PerlSockGetprotoent,
1496 PerlSockGetservbyname,
1497 PerlSockGetservbyport,
1499 PerlSockGetsockname,
1511 PerlSockSetprotoent,
1517 PerlSockClosesocket,
1523 #define EXECF_EXEC 1
1524 #define EXECF_SPAWN 2
1527 PerlProcAbort(struct IPerlProc* piPerl)
1533 PerlProcCrypt(struct IPerlProc* piPerl, const char* clear, const char* salt)
1535 return win32_crypt(clear, salt);
1539 PerlProcExit(struct IPerlProc* piPerl, int status)
1545 PerlProc_Exit(struct IPerlProc* piPerl, int status)
1551 PerlProcExecl(struct IPerlProc* piPerl, const char *cmdname, const char *arg0, const char *arg1, const char *arg2, const char *arg3)
1553 return execl(cmdname, arg0, arg1, arg2, arg3);
1557 PerlProcExecv(struct IPerlProc* piPerl, const char *cmdname, const char *const *argv)
1559 return win32_execvp(cmdname, argv);
1563 PerlProcExecvp(struct IPerlProc* piPerl, const char *cmdname, const char *const *argv)
1565 return win32_execvp(cmdname, argv);
1569 PerlProcGetuid(struct IPerlProc* piPerl)
1575 PerlProcGeteuid(struct IPerlProc* piPerl)
1581 PerlProcGetgid(struct IPerlProc* piPerl)
1587 PerlProcGetegid(struct IPerlProc* piPerl)
1593 PerlProcGetlogin(struct IPerlProc* piPerl)
1595 return g_getlogin();
1599 PerlProcKill(struct IPerlProc* piPerl, int pid, int sig)
1601 return win32_kill(pid, sig);
1605 PerlProcKillpg(struct IPerlProc* piPerl, int pid, int sig)
1607 return win32_kill(pid, -sig);
1611 PerlProcPauseProc(struct IPerlProc* piPerl)
1613 return win32_sleep((32767L << 16) + 32767);
1617 PerlProcPopen(struct IPerlProc* piPerl, const char *command, const char *mode)
1620 PERL_FLUSHALL_FOR_CHILD;
1621 return win32_popen(command, mode);
1625 PerlProcPopenList(struct IPerlProc* piPerl, const char *mode, IV narg, SV **args)
1628 PERL_FLUSHALL_FOR_CHILD;
1629 return win32_popenlist(mode, narg, args);
1633 PerlProcPclose(struct IPerlProc* piPerl, PerlIO *stream)
1635 return win32_pclose(stream);
1639 PerlProcPipe(struct IPerlProc* piPerl, int *phandles)
1641 return win32_pipe(phandles, 512, O_BINARY);
1645 PerlProcSetuid(struct IPerlProc* piPerl, uid_t u)
1651 PerlProcSetgid(struct IPerlProc* piPerl, gid_t g)
1657 PerlProcSleep(struct IPerlProc* piPerl, unsigned int s)
1659 return win32_sleep(s);
1663 PerlProcTimes(struct IPerlProc* piPerl, struct tms *timebuf)
1665 return win32_times(timebuf);
1669 PerlProcWait(struct IPerlProc* piPerl, int *status)
1671 return win32_wait(status);
1675 PerlProcWaitpid(struct IPerlProc* piPerl, int pid, int *status, int flags)
1677 return win32_waitpid(pid, status, flags);
1681 PerlProcSignal(struct IPerlProc* piPerl, int sig, Sighandler_t subcode)
1683 return win32_signal(sig, subcode);
1687 PerlProcGetTimeOfDay(struct IPerlProc* piPerl, struct timeval *t, void *z)
1689 return win32_gettimeofday(t, z);
1693 static THREAD_RET_TYPE
1694 win32_start_child(LPVOID arg)
1696 PerlInterpreter *my_perl = (PerlInterpreter*)arg;
1698 HWND parent_message_hwnd;
1699 #ifdef PERL_SYNC_FORK
1700 static long sync_fork_id = 0;
1701 long id = ++sync_fork_id;
1705 PERL_SET_THX(my_perl);
1706 win32_checkTLS(my_perl);
1708 #ifdef PERL_SYNC_FORK
1711 w32_pseudo_id = GetCurrentThreadId();
1713 #ifdef PERL_USES_PL_PIDSTATUS
1714 hv_clear(PL_pidstatus);
1717 /* create message window and tell parent about it */
1718 parent_message_hwnd = w32_message_hwnd;
1719 w32_message_hwnd = win32_create_message_window();
1720 if (parent_message_hwnd != NULL)
1721 PostMessage(parent_message_hwnd, WM_USER_MESSAGE, w32_pseudo_id, (LPARAM)w32_message_hwnd);
1723 /* push a zero on the stack (we are the child) */
1731 /* continue from next op */
1732 PL_op = PL_op->op_next;
1736 volatile int oldscope = 1; /* We are responsible for all scopes */
1739 JMPENV_PUSH(status);
1743 /* We may have additional unclosed scopes if fork() was called
1744 * from within a BEGIN block. See perlfork.pod for more details.
1745 * We cannot clean up these other scopes because they belong to a
1746 * different interpreter, but we also cannot leave PL_scopestack_ix
1747 * dangling because that can trigger an assertion in perl_destruct().
1749 if (PL_scopestack_ix > oldscope) {
1750 PL_scopestack[oldscope-1] = PL_scopestack[PL_scopestack_ix-1];
1751 PL_scopestack_ix = oldscope;
1756 while (PL_scopestack_ix > oldscope)
1759 PL_curstash = PL_defstash;
1760 if (PL_curstash != PL_defstash) {
1761 SvREFCNT_dec(PL_curstash);
1762 PL_curstash = (HV *)SvREFCNT_inc(PL_defstash);
1764 if (PL_endav && !PL_minus_c)
1765 call_list(oldscope, PL_endav);
1766 status = STATUS_EXIT;
1770 POPSTACK_TO(PL_mainstack);
1771 PL_op = PL_restartop;
1772 PL_restartop = (OP*)NULL;
1775 PerlIO_printf(Perl_error_log, "panic: restartop\n");
1782 /* XXX hack to avoid perl_destruct() freeing optree */
1783 win32_checkTLS(my_perl);
1784 PL_main_root = (OP*)NULL;
1787 win32_checkTLS(my_perl);
1788 /* close the std handles to avoid fd leaks */
1790 do_close(PL_stdingv, FALSE);
1791 do_close(gv_fetchpv("STDOUT", TRUE, SVt_PVIO), FALSE); /* PL_stdoutgv - ISAGN */
1792 do_close(PL_stderrgv, FALSE);
1795 /* destroy everything (waits for any pseudo-forked children) */
1796 win32_checkTLS(my_perl);
1797 perl_destruct(my_perl);
1798 win32_checkTLS(my_perl);
1801 #ifdef PERL_SYNC_FORK
1804 return (DWORD)status;
1807 #endif /* USE_ITHREADS */
1810 PerlProcFork(struct IPerlProc* piPerl)
1818 if (w32_num_pseudo_children >= MAXIMUM_WAIT_OBJECTS) {
1822 h = new CPerlHost(*(CPerlHost*)w32_internal_host);
1823 PerlInterpreter *new_perl = perl_clone_using((PerlInterpreter*)aTHX,
1826 h->m_pHostperlMemShared,
1827 h->m_pHostperlMemParse,
1829 h->m_pHostperlStdIO,
1835 new_perl->Isys_intern.internal_host = h;
1836 h->host_perl = new_perl;
1837 # ifdef PERL_SYNC_FORK
1838 id = win32_start_child((LPVOID)new_perl);
1841 if (w32_message_hwnd == INVALID_HANDLE_VALUE)
1842 w32_message_hwnd = win32_create_message_window();
1843 new_perl->Isys_intern.message_hwnd = w32_message_hwnd;
1844 w32_pseudo_child_message_hwnds[w32_num_pseudo_children] =
1845 (w32_message_hwnd == NULL) ? (HWND)NULL : (HWND)INVALID_HANDLE_VALUE;
1846 # ifdef USE_RTL_THREAD_API
1847 handle = (HANDLE)_beginthreadex((void*)NULL, 0, win32_start_child,
1848 (void*)new_perl, 0, (unsigned*)&id);
1850 handle = CreateThread(NULL, 0, win32_start_child,
1851 (LPVOID)new_perl, 0, &id);
1853 PERL_SET_THX(aTHX); /* XXX perl_clone*() set TLS */
1858 w32_pseudo_child_handles[w32_num_pseudo_children] = handle;
1859 w32_pseudo_child_pids[w32_num_pseudo_children] = id;
1860 w32_pseudo_child_sigterm[w32_num_pseudo_children] = 0;
1861 ++w32_num_pseudo_children;
1865 Perl_croak(aTHX_ "fork() not implemented!\n");
1867 #endif /* USE_ITHREADS */
1871 PerlProcGetpid(struct IPerlProc* piPerl)
1873 return win32_getpid();
1877 PerlProcDynaLoader(struct IPerlProc* piPerl, const char* filename)
1879 return win32_dynaload(filename);
1883 PerlProcGetOSError(struct IPerlProc* piPerl, SV* sv, DWORD dwErr)
1885 win32_str_os_error(sv, dwErr);
1889 PerlProcSpawnvp(struct IPerlProc* piPerl, int mode, const char *cmdname, const char *const *argv)
1891 return win32_spawnvp(mode, cmdname, argv);
1895 PerlProcLastHost(struct IPerlProc* piPerl)
1898 CPerlHost *h = (CPerlHost*)w32_internal_host;
1899 return h->LastHost();
1902 struct IPerlProc perlProc =
1936 PerlProcGetTimeOfDay
1944 CPerlHost::CPerlHost(void)
1946 /* Construct a host from scratch */
1947 InterlockedIncrement(&num_hosts);
1948 m_pvDir = new VDir();
1949 m_pVMem = new VMem();
1950 m_pVMemShared = new VMem();
1951 m_pVMemParse = new VMem();
1953 m_pvDir->Init(NULL, m_pVMem);
1956 m_lppEnvList = NULL;
1959 CopyMemory(&m_hostperlMem, &perlMem, sizeof(perlMem));
1960 CopyMemory(&m_hostperlMemShared, &perlMemShared, sizeof(perlMemShared));
1961 CopyMemory(&m_hostperlMemParse, &perlMemParse, sizeof(perlMemParse));
1962 CopyMemory(&m_hostperlEnv, &perlEnv, sizeof(perlEnv));
1963 CopyMemory(&m_hostperlStdIO, &perlStdIO, sizeof(perlStdIO));
1964 CopyMemory(&m_hostperlLIO, &perlLIO, sizeof(perlLIO));
1965 CopyMemory(&m_hostperlDir, &perlDir, sizeof(perlDir));
1966 CopyMemory(&m_hostperlSock, &perlSock, sizeof(perlSock));
1967 CopyMemory(&m_hostperlProc, &perlProc, sizeof(perlProc));
1969 m_pHostperlMem = &m_hostperlMem;
1970 m_pHostperlMemShared = &m_hostperlMemShared;
1971 m_pHostperlMemParse = &m_hostperlMemParse;
1972 m_pHostperlEnv = &m_hostperlEnv;
1973 m_pHostperlStdIO = &m_hostperlStdIO;
1974 m_pHostperlLIO = &m_hostperlLIO;
1975 m_pHostperlDir = &m_hostperlDir;
1976 m_pHostperlSock = &m_hostperlSock;
1977 m_pHostperlProc = &m_hostperlProc;
1980 #define SETUPEXCHANGE(xptr, iptr, table) \
1991 CPerlHost::CPerlHost(struct IPerlMem** ppMem, struct IPerlMem** ppMemShared,
1992 struct IPerlMem** ppMemParse, struct IPerlEnv** ppEnv,
1993 struct IPerlStdIO** ppStdIO, struct IPerlLIO** ppLIO,
1994 struct IPerlDir** ppDir, struct IPerlSock** ppSock,
1995 struct IPerlProc** ppProc)
1997 InterlockedIncrement(&num_hosts);
1998 m_pvDir = new VDir(0);
1999 m_pVMem = new VMem();
2000 m_pVMemShared = new VMem();
2001 m_pVMemParse = new VMem();
2003 m_pvDir->Init(NULL, m_pVMem);
2006 m_lppEnvList = NULL;
2007 m_bTopLevel = FALSE;
2009 CopyMemory(&m_hostperlMem, &perlMem, sizeof(perlMem));
2010 CopyMemory(&m_hostperlMemShared, &perlMemShared, sizeof(perlMemShared));
2011 CopyMemory(&m_hostperlMemParse, &perlMemParse, sizeof(perlMemParse));
2012 CopyMemory(&m_hostperlEnv, &perlEnv, sizeof(perlEnv));
2013 CopyMemory(&m_hostperlStdIO, &perlStdIO, sizeof(perlStdIO));
2014 CopyMemory(&m_hostperlLIO, &perlLIO, sizeof(perlLIO));
2015 CopyMemory(&m_hostperlDir, &perlDir, sizeof(perlDir));
2016 CopyMemory(&m_hostperlSock, &perlSock, sizeof(perlSock));
2017 CopyMemory(&m_hostperlProc, &perlProc, sizeof(perlProc));
2019 SETUPEXCHANGE(ppMem, m_pHostperlMem, m_hostperlMem);
2020 SETUPEXCHANGE(ppMemShared, m_pHostperlMemShared, m_hostperlMemShared);
2021 SETUPEXCHANGE(ppMemParse, m_pHostperlMemParse, m_hostperlMemParse);
2022 SETUPEXCHANGE(ppEnv, m_pHostperlEnv, m_hostperlEnv);
2023 SETUPEXCHANGE(ppStdIO, m_pHostperlStdIO, m_hostperlStdIO);
2024 SETUPEXCHANGE(ppLIO, m_pHostperlLIO, m_hostperlLIO);
2025 SETUPEXCHANGE(ppDir, m_pHostperlDir, m_hostperlDir);
2026 SETUPEXCHANGE(ppSock, m_pHostperlSock, m_hostperlSock);
2027 SETUPEXCHANGE(ppProc, m_pHostperlProc, m_hostperlProc);
2029 #undef SETUPEXCHANGE
2031 CPerlHost::CPerlHost(CPerlHost& host)
2033 /* Construct a host from another host */
2034 InterlockedIncrement(&num_hosts);
2035 m_pVMem = new VMem();
2036 m_pVMemShared = host.GetMemShared();
2037 m_pVMemParse = host.GetMemParse();
2039 /* duplicate directory info */
2040 m_pvDir = new VDir(0);
2041 m_pvDir->Init(host.GetDir(), m_pVMem);
2043 CopyMemory(&m_hostperlMem, &perlMem, sizeof(perlMem));
2044 CopyMemory(&m_hostperlMemShared, &perlMemShared, sizeof(perlMemShared));
2045 CopyMemory(&m_hostperlMemParse, &perlMemParse, sizeof(perlMemParse));
2046 CopyMemory(&m_hostperlEnv, &perlEnv, sizeof(perlEnv));
2047 CopyMemory(&m_hostperlStdIO, &perlStdIO, sizeof(perlStdIO));
2048 CopyMemory(&m_hostperlLIO, &perlLIO, sizeof(perlLIO));
2049 CopyMemory(&m_hostperlDir, &perlDir, sizeof(perlDir));
2050 CopyMemory(&m_hostperlSock, &perlSock, sizeof(perlSock));
2051 CopyMemory(&m_hostperlProc, &perlProc, sizeof(perlProc));
2052 m_pHostperlMem = &m_hostperlMem;
2053 m_pHostperlMemShared = &m_hostperlMemShared;
2054 m_pHostperlMemParse = &m_hostperlMemParse;
2055 m_pHostperlEnv = &m_hostperlEnv;
2056 m_pHostperlStdIO = &m_hostperlStdIO;
2057 m_pHostperlLIO = &m_hostperlLIO;
2058 m_pHostperlDir = &m_hostperlDir;
2059 m_pHostperlSock = &m_hostperlSock;
2060 m_pHostperlProc = &m_hostperlProc;
2063 m_lppEnvList = NULL;
2064 m_bTopLevel = FALSE;
2066 /* duplicate environment info */
2069 while(lpPtr = host.GetIndex(dwIndex))
2073 CPerlHost::~CPerlHost(void)
2076 InterlockedDecrement(&num_hosts);
2078 m_pVMemParse->Release();
2079 m_pVMemShared->Release();
2084 CPerlHost::Find(LPCSTR lpStr)
2087 LPSTR* lppPtr = Lookup(lpStr);
2088 if(lppPtr != NULL) {
2089 for(lpPtr = *lppPtr; *lpPtr != '\0' && *lpPtr != '='; ++lpPtr)
2101 lookup(const void *arg1, const void *arg2)
2102 { // Compare strings
2106 ptr1 = *(char**)arg1;
2107 ptr2 = *(char**)arg2;
2111 if(c1 == '\0' || c1 == '=') {
2112 if(c2 == '\0' || c2 == '=')
2115 return -1; // string 1 < string 2
2117 else if(c2 == '\0' || c2 == '=')
2118 return 1; // string 1 > string 2
2124 return -1; // string 1 < string 2
2126 return 1; // string 1 > string 2
2134 CPerlHost::Lookup(LPCSTR lpStr)
2137 if (!m_lppEnvList || !m_dwEnvCount)
2142 return (LPSTR*)bsearch(&lpStr, m_lppEnvList, m_dwEnvCount, sizeof(LPSTR), lookup);
2146 compare(const void *arg1, const void *arg2)
2147 { // Compare strings
2151 ptr1 = *(char**)arg1;
2152 ptr2 = *(char**)arg2;
2156 if(c1 == '\0' || c1 == '=') {
2160 return -1; // string 1 < string 2
2162 else if(c2 == '\0' || c2 == '=')
2163 return 1; // string 1 > string 2
2169 return -1; // string 1 < string 2
2171 return 1; // string 1 > string 2
2179 CPerlHost::Add(LPCSTR lpStr)
2182 char szBuffer[1024];
2184 int index, length = strlen(lpStr)+1;
2186 for(index = 0; lpStr[index] != '\0' && lpStr[index] != '='; ++index)
2187 szBuffer[index] = lpStr[index];
2189 szBuffer[index] = '\0';
2192 lpPtr = Lookup(szBuffer);
2193 if (lpPtr != NULL) {
2194 // must allocate things via host memory allocation functions
2195 // rather than perl's Renew() et al, as the perl interpreter
2196 // may either not be initialized enough when we allocate these,
2197 // or may already be dead when we go to free these
2198 *lpPtr = (char*)Realloc(*lpPtr, length * sizeof(char));
2199 strcpy(*lpPtr, lpStr);
2202 m_lppEnvList = (LPSTR*)Realloc(m_lppEnvList, (m_dwEnvCount+1) * sizeof(LPSTR));
2204 m_lppEnvList[m_dwEnvCount] = (char*)Malloc(length * sizeof(char));
2205 if (m_lppEnvList[m_dwEnvCount] != NULL) {
2206 strcpy(m_lppEnvList[m_dwEnvCount], lpStr);
2208 qsort(m_lppEnvList, m_dwEnvCount, sizeof(LPSTR), compare);
2215 CPerlHost::CalculateEnvironmentSpace(void)
2219 for(index = 0; index < m_dwEnvCount; ++index)
2220 dwSize += strlen(m_lppEnvList[index]) + 1;
2226 CPerlHost::FreeLocalEnvironmentStrings(LPSTR lpStr)
2233 CPerlHost::GetChildDir(void)
2239 Newx(ptr, MAX_PATH+1, char);
2240 m_pvDir->GetCurrentDirectoryA(MAX_PATH+1, ptr);
2241 length = strlen(ptr);
2243 if ((ptr[length-1] == '\\') || (ptr[length-1] == '/'))
2250 CPerlHost::FreeChildDir(char* pStr)
2257 CPerlHost::CreateLocalEnvironmentStrings(VDir &vDir)
2260 LPSTR lpStr, lpPtr, lpEnvPtr, lpTmp, lpLocalEnv, lpAllocPtr;
2261 DWORD dwSize, dwEnvIndex;
2262 int nLength, compVal;
2264 // get the process environment strings
2265 lpAllocPtr = lpTmp = (LPSTR)GetEnvironmentStrings();
2267 // step over current directory stuff
2268 while(*lpTmp == '=')
2269 lpTmp += strlen(lpTmp) + 1;
2271 // save the start of the environment strings
2273 for(dwSize = 1; *lpTmp != '\0'; lpTmp += strlen(lpTmp) + 1) {
2274 // calculate the size of the environment strings
2275 dwSize += strlen(lpTmp) + 1;
2278 // add the size of current directories
2279 dwSize += vDir.CalculateEnvironmentSpace();
2281 // add the additional space used by changes made to the environment
2282 dwSize += CalculateEnvironmentSpace();
2284 Newx(lpStr, dwSize, char);
2287 // build the local environment
2288 lpStr = vDir.BuildEnvironmentSpace(lpStr);
2291 lpLocalEnv = GetIndex(dwEnvIndex);
2292 while(*lpEnvPtr != '\0') {
2294 // all environment overrides have been added
2295 // so copy string into place
2296 strcpy(lpStr, lpEnvPtr);
2297 nLength = strlen(lpEnvPtr) + 1;
2299 lpEnvPtr += nLength;
2302 // determine which string to copy next
2303 compVal = compare(&lpEnvPtr, &lpLocalEnv);
2305 strcpy(lpStr, lpEnvPtr);
2306 nLength = strlen(lpEnvPtr) + 1;
2308 lpEnvPtr += nLength;
2311 char *ptr = strchr(lpLocalEnv, '=');
2313 strcpy(lpStr, lpLocalEnv);
2314 lpStr += strlen(lpLocalEnv) + 1;
2316 lpLocalEnv = GetIndex(dwEnvIndex);
2318 // this string was replaced
2319 lpEnvPtr += strlen(lpEnvPtr) + 1;
2326 // still have environment overrides to add
2327 // so copy the strings into place if not an override
2328 char *ptr = strchr(lpLocalEnv, '=');
2330 strcpy(lpStr, lpLocalEnv);
2331 lpStr += strlen(lpLocalEnv) + 1;
2333 lpLocalEnv = GetIndex(dwEnvIndex);
2340 // release the process environment strings
2341 FreeEnvironmentStrings(lpAllocPtr);
2347 CPerlHost::Reset(void)
2350 if(m_lppEnvList != NULL) {
2351 for(DWORD index = 0; index < m_dwEnvCount; ++index) {
2352 Free(m_lppEnvList[index]);
2353 m_lppEnvList[index] = NULL;
2358 m_lppEnvList = NULL;
2362 CPerlHost::Clearenv(void)
2366 LPSTR lpPtr, lpStr, lpEnvPtr;
2367 if (m_lppEnvList != NULL) {
2368 /* set every entry to an empty string */
2369 for(DWORD index = 0; index < m_dwEnvCount; ++index) {
2370 char* ptr = strchr(m_lppEnvList[index], '=');
2377 /* get the process environment strings */
2378 lpStr = lpEnvPtr = (LPSTR)GetEnvironmentStrings();
2380 /* step over current directory stuff */
2381 while(*lpStr == '=')
2382 lpStr += strlen(lpStr) + 1;
2385 lpPtr = strchr(lpStr, '=');
2391 (void)win32_putenv(lpStr);
2394 lpStr += strlen(lpStr) + 1;
2397 FreeEnvironmentStrings(lpEnvPtr);
2402 CPerlHost::Getenv(const char *varname)
2406 char *pEnv = Find(varname);
2410 return win32_getenv(varname);
2414 CPerlHost::Putenv(const char *envstring)
2419 return win32_putenv(envstring);
2425 CPerlHost::Chdir(const char *dirname)
2433 ret = m_pvDir->SetCurrentDirectoryA((char*)dirname);
2440 #endif /* ___PerlHost_H___ */