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_getlogin(void);
37 CPerlHost(struct IPerlMem** ppMem, struct IPerlMem** ppMemShared,
38 struct IPerlMem** ppMemParse, struct IPerlEnv** ppEnv,
39 struct IPerlStdIO** ppStdIO, struct IPerlLIO** ppLIO,
40 struct IPerlDir** ppDir, struct IPerlSock** ppSock,
41 struct IPerlProc** ppProc);
42 CPerlHost(CPerlHost& host);
45 static CPerlHost* IPerlMem2Host(struct IPerlMem* piPerl);
46 static CPerlHost* IPerlMemShared2Host(struct IPerlMem* piPerl);
47 static CPerlHost* IPerlMemParse2Host(struct IPerlMem* piPerl);
48 static CPerlHost* IPerlEnv2Host(struct IPerlEnv* piPerl);
49 static CPerlHost* IPerlStdIO2Host(struct IPerlStdIO* piPerl);
50 static CPerlHost* IPerlLIO2Host(struct IPerlLIO* piPerl);
51 static CPerlHost* IPerlDir2Host(struct IPerlDir* piPerl);
52 static CPerlHost* IPerlSock2Host(struct IPerlSock* piPerl);
53 static CPerlHost* IPerlProc2Host(struct IPerlProc* piPerl);
55 BOOL PerlCreate(void);
56 int PerlParse(int argc, char** argv, char** env);
58 void PerlDestroy(void);
61 /* Locks provided but should be unnecessary as this is private pool */
62 inline void* Malloc(size_t size) { return m_pVMem->Malloc(size); };
63 inline void* Realloc(void* ptr, size_t size) { return m_pVMem->Realloc(ptr, size); };
64 inline void Free(void* ptr) { m_pVMem->Free(ptr); };
65 inline void* Calloc(size_t num, size_t size)
67 size_t count = num*size;
68 void* lpVoid = Malloc(count);
70 ZeroMemory(lpVoid, count);
73 inline void GetLock(void) { m_pVMem->GetLock(); };
74 inline void FreeLock(void) { m_pVMem->FreeLock(); };
75 inline int IsLocked(void) { return m_pVMem->IsLocked(); };
78 /* Locks used to serialize access to the pool */
79 inline void GetLockShared(void) { m_pVMemShared->GetLock(); };
80 inline void FreeLockShared(void) { m_pVMemShared->FreeLock(); };
81 inline int IsLockedShared(void) { return m_pVMemShared->IsLocked(); };
82 inline void* MallocShared(size_t size)
86 result = m_pVMemShared->Malloc(size);
90 inline void* ReallocShared(void* ptr, size_t size)
94 result = m_pVMemShared->Realloc(ptr, size);
98 inline void FreeShared(void* ptr)
101 m_pVMemShared->Free(ptr);
104 inline void* CallocShared(size_t num, size_t size)
106 size_t count = num*size;
107 void* lpVoid = MallocShared(count);
109 ZeroMemory(lpVoid, count);
114 /* Assume something else is using locks to mangaging serialize
117 inline void GetLockParse(void) { m_pVMemParse->GetLock(); };
118 inline void FreeLockParse(void) { m_pVMemParse->FreeLock(); };
119 inline int IsLockedParse(void) { return m_pVMemParse->IsLocked(); };
120 inline void* MallocParse(size_t size) { return m_pVMemParse->Malloc(size); };
121 inline void* ReallocParse(void* ptr, size_t size) { return m_pVMemParse->Realloc(ptr, size); };
122 inline void FreeParse(void* ptr) { m_pVMemParse->Free(ptr); };
123 inline void* CallocParse(size_t num, size_t size)
125 size_t count = num*size;
126 void* lpVoid = MallocParse(count);
128 ZeroMemory(lpVoid, count);
133 char *Getenv(const char *varname);
134 int Putenv(const char *envstring);
135 inline char *Getenv(const char *varname, unsigned long *len)
138 char *e = Getenv(varname);
143 void* CreateChildEnv(void) { return CreateLocalEnvironmentStrings(*m_pvDir); };
144 void FreeChildEnv(void* pStr) { FreeLocalEnvironmentStrings((char*)pStr); };
145 char* GetChildDir(void);
146 void FreeChildDir(char* pStr);
150 inline LPSTR GetIndex(DWORD &dwIndex)
152 if(dwIndex < m_dwEnvCount)
155 return m_lppEnvList[dwIndex-1];
161 LPSTR Find(LPCSTR lpStr);
162 void Add(LPCSTR lpStr);
164 LPSTR CreateLocalEnvironmentStrings(VDir &vDir);
165 void FreeLocalEnvironmentStrings(LPSTR lpStr);
166 LPSTR* Lookup(LPCSTR lpStr);
167 DWORD CalculateEnvironmentSpace(void);
172 virtual int Chdir(const char *dirname);
176 void Exit(int status);
177 void _Exit(int status);
178 int Execl(const char *cmdname, const char *arg0, const char *arg1, const char *arg2, const char *arg3);
179 int Execv(const char *cmdname, const char *const *argv);
180 int Execvp(const char *cmdname, const char *const *argv);
182 inline VMem* GetMemShared(void) { m_pVMemShared->AddRef(); return m_pVMemShared; };
183 inline VMem* GetMemParse(void) { m_pVMemParse->AddRef(); return m_pVMemParse; };
184 inline VDir* GetDir(void) { return m_pvDir; };
188 struct IPerlMem m_hostperlMem;
189 struct IPerlMem m_hostperlMemShared;
190 struct IPerlMem m_hostperlMemParse;
191 struct IPerlEnv m_hostperlEnv;
192 struct IPerlStdIO m_hostperlStdIO;
193 struct IPerlLIO m_hostperlLIO;
194 struct IPerlDir m_hostperlDir;
195 struct IPerlSock m_hostperlSock;
196 struct IPerlProc m_hostperlProc;
198 struct IPerlMem* m_pHostperlMem;
199 struct IPerlMem* m_pHostperlMemShared;
200 struct IPerlMem* m_pHostperlMemParse;
201 struct IPerlEnv* m_pHostperlEnv;
202 struct IPerlStdIO* m_pHostperlStdIO;
203 struct IPerlLIO* m_pHostperlLIO;
204 struct IPerlDir* m_pHostperlDir;
205 struct IPerlSock* m_pHostperlSock;
206 struct IPerlProc* m_pHostperlProc;
208 inline char* MapPathA(const char *pInName) { return m_pvDir->MapPathA(pInName); };
209 inline WCHAR* MapPathW(const WCHAR *pInName) { return m_pvDir->MapPathW(pInName); };
219 BOOL m_bTopLevel; // is this a toplevel host?
220 static long num_hosts;
222 inline int LastHost(void) { return num_hosts == 1L; };
223 struct interpreter *host_perl;
226 long CPerlHost::num_hosts = 0L;
228 extern "C" void win32_checkTLS(struct interpreter *host_perl);
230 #define STRUCT2RAWPTR(x, y) (CPerlHost*)(((LPBYTE)x)-offsetof(CPerlHost, y))
231 #ifdef CHECK_HOST_INTERP
232 inline CPerlHost* CheckInterp(CPerlHost *host)
234 win32_checkTLS(host->host_perl);
237 #define STRUCT2PTR(x, y) CheckInterp(STRUCT2RAWPTR(x, y))
239 #define STRUCT2PTR(x, y) STRUCT2RAWPTR(x, y)
242 inline CPerlHost* IPerlMem2Host(struct IPerlMem* piPerl)
244 return STRUCT2RAWPTR(piPerl, m_hostperlMem);
247 inline CPerlHost* IPerlMemShared2Host(struct IPerlMem* piPerl)
249 return STRUCT2RAWPTR(piPerl, m_hostperlMemShared);
252 inline CPerlHost* IPerlMemParse2Host(struct IPerlMem* piPerl)
254 return STRUCT2RAWPTR(piPerl, m_hostperlMemParse);
257 inline CPerlHost* IPerlEnv2Host(struct IPerlEnv* piPerl)
259 return STRUCT2PTR(piPerl, m_hostperlEnv);
262 inline CPerlHost* IPerlStdIO2Host(struct IPerlStdIO* piPerl)
264 return STRUCT2PTR(piPerl, m_hostperlStdIO);
267 inline CPerlHost* IPerlLIO2Host(struct IPerlLIO* piPerl)
269 return STRUCT2PTR(piPerl, m_hostperlLIO);
272 inline CPerlHost* IPerlDir2Host(struct IPerlDir* piPerl)
274 return STRUCT2PTR(piPerl, m_hostperlDir);
277 inline CPerlHost* IPerlSock2Host(struct IPerlSock* piPerl)
279 return STRUCT2PTR(piPerl, m_hostperlSock);
282 inline CPerlHost* IPerlProc2Host(struct IPerlProc* piPerl)
284 return STRUCT2PTR(piPerl, m_hostperlProc);
290 #define IPERL2HOST(x) IPerlMem2Host(x)
294 PerlMemMalloc(struct IPerlMem* piPerl, size_t size)
296 return IPERL2HOST(piPerl)->Malloc(size);
299 PerlMemRealloc(struct IPerlMem* piPerl, void* ptr, size_t size)
301 return IPERL2HOST(piPerl)->Realloc(ptr, size);
304 PerlMemFree(struct IPerlMem* piPerl, void* ptr)
306 IPERL2HOST(piPerl)->Free(ptr);
309 PerlMemCalloc(struct IPerlMem* piPerl, size_t num, size_t size)
311 return IPERL2HOST(piPerl)->Calloc(num, size);
315 PerlMemGetLock(struct IPerlMem* piPerl)
317 IPERL2HOST(piPerl)->GetLock();
321 PerlMemFreeLock(struct IPerlMem* piPerl)
323 IPERL2HOST(piPerl)->FreeLock();
327 PerlMemIsLocked(struct IPerlMem* piPerl)
329 return IPERL2HOST(piPerl)->IsLocked();
332 const struct IPerlMem perlMem =
344 #define IPERL2HOST(x) IPerlMemShared2Host(x)
348 PerlMemSharedMalloc(struct IPerlMem* piPerl, size_t size)
350 return IPERL2HOST(piPerl)->MallocShared(size);
353 PerlMemSharedRealloc(struct IPerlMem* piPerl, void* ptr, size_t size)
355 return IPERL2HOST(piPerl)->ReallocShared(ptr, size);
358 PerlMemSharedFree(struct IPerlMem* piPerl, void* ptr)
360 IPERL2HOST(piPerl)->FreeShared(ptr);
363 PerlMemSharedCalloc(struct IPerlMem* piPerl, size_t num, size_t size)
365 return IPERL2HOST(piPerl)->CallocShared(num, size);
369 PerlMemSharedGetLock(struct IPerlMem* piPerl)
371 IPERL2HOST(piPerl)->GetLockShared();
375 PerlMemSharedFreeLock(struct IPerlMem* piPerl)
377 IPERL2HOST(piPerl)->FreeLockShared();
381 PerlMemSharedIsLocked(struct IPerlMem* piPerl)
383 return IPERL2HOST(piPerl)->IsLockedShared();
386 const struct IPerlMem perlMemShared =
389 PerlMemSharedRealloc,
392 PerlMemSharedGetLock,
393 PerlMemSharedFreeLock,
394 PerlMemSharedIsLocked,
398 #define IPERL2HOST(x) IPerlMemParse2Host(x)
402 PerlMemParseMalloc(struct IPerlMem* piPerl, size_t size)
404 return IPERL2HOST(piPerl)->MallocParse(size);
407 PerlMemParseRealloc(struct IPerlMem* piPerl, void* ptr, size_t size)
409 return IPERL2HOST(piPerl)->ReallocParse(ptr, size);
412 PerlMemParseFree(struct IPerlMem* piPerl, void* ptr)
414 IPERL2HOST(piPerl)->FreeParse(ptr);
417 PerlMemParseCalloc(struct IPerlMem* piPerl, size_t num, size_t size)
419 return IPERL2HOST(piPerl)->CallocParse(num, size);
423 PerlMemParseGetLock(struct IPerlMem* piPerl)
425 IPERL2HOST(piPerl)->GetLockParse();
429 PerlMemParseFreeLock(struct IPerlMem* piPerl)
431 IPERL2HOST(piPerl)->FreeLockParse();
435 PerlMemParseIsLocked(struct IPerlMem* piPerl)
437 return IPERL2HOST(piPerl)->IsLockedParse();
440 const struct IPerlMem perlMemParse =
447 PerlMemParseFreeLock,
448 PerlMemParseIsLocked,
453 #define IPERL2HOST(x) IPerlEnv2Host(x)
457 PerlEnvGetenv(struct IPerlEnv* piPerl, const char *varname)
459 return IPERL2HOST(piPerl)->Getenv(varname);
463 PerlEnvPutenv(struct IPerlEnv* piPerl, const char *envstring)
465 return IPERL2HOST(piPerl)->Putenv(envstring);
469 PerlEnvGetenv_len(struct IPerlEnv* piPerl, const char* varname, unsigned long* len)
471 return IPERL2HOST(piPerl)->Getenv(varname, len);
475 PerlEnvUname(struct IPerlEnv* piPerl, struct utsname *name)
477 return win32_uname(name);
481 PerlEnvClearenv(struct IPerlEnv* piPerl)
483 IPERL2HOST(piPerl)->Clearenv();
487 PerlEnvGetChildenv(struct IPerlEnv* piPerl)
489 return IPERL2HOST(piPerl)->CreateChildEnv();
493 PerlEnvFreeChildenv(struct IPerlEnv* piPerl, void* childEnv)
495 IPERL2HOST(piPerl)->FreeChildEnv(childEnv);
499 PerlEnvGetChilddir(struct IPerlEnv* piPerl)
501 return IPERL2HOST(piPerl)->GetChildDir();
505 PerlEnvFreeChilddir(struct IPerlEnv* piPerl, char* childDir)
507 IPERL2HOST(piPerl)->FreeChildDir(childDir);
511 PerlEnvOsId(struct IPerlEnv* piPerl)
513 return win32_os_id();
517 PerlEnvLibPath(struct IPerlEnv* piPerl, WIN32_NO_REGISTRY_M_(const char *pl) STRLEN *const len)
519 return win32_get_privlib(WIN32_NO_REGISTRY_M_(pl) len);
523 PerlEnvSiteLibPath(struct IPerlEnv* piPerl, const char *pl, STRLEN *const len)
525 return win32_get_sitelib(pl, len);
529 PerlEnvVendorLibPath(struct IPerlEnv* piPerl, const char *pl,
532 return win32_get_vendorlib(pl, len);
536 PerlEnvGetChildIO(struct IPerlEnv* piPerl, child_IO_table* ptr)
538 win32_get_child_IO(ptr);
541 const struct IPerlEnv perlEnv =
555 PerlEnvVendorLibPath,
560 #define IPERL2HOST(x) IPerlStdIO2Host(x)
564 PerlStdIOStdin(struct IPerlStdIO* piPerl)
566 return win32_stdin();
570 PerlStdIOStdout(struct IPerlStdIO* piPerl)
572 return win32_stdout();
576 PerlStdIOStderr(struct IPerlStdIO* piPerl)
578 return win32_stderr();
582 PerlStdIOOpen(struct IPerlStdIO* piPerl, const char *path, const char *mode)
584 return win32_fopen(path, mode);
588 PerlStdIOClose(struct IPerlStdIO* piPerl, FILE* pf)
590 return win32_fclose((pf));
594 PerlStdIOEof(struct IPerlStdIO* piPerl, FILE* pf)
596 return win32_feof(pf);
600 PerlStdIOError(struct IPerlStdIO* piPerl, FILE* pf)
602 return win32_ferror(pf);
606 PerlStdIOClearerr(struct IPerlStdIO* piPerl, FILE* pf)
612 PerlStdIOGetc(struct IPerlStdIO* piPerl, FILE* pf)
614 return win32_getc(pf);
618 PerlStdIOGetBase(struct IPerlStdIO* piPerl, FILE* pf)
629 PerlStdIOGetBufsiz(struct IPerlStdIO* piPerl, FILE* pf)
633 return FILE_bufsiz(f);
640 PerlStdIOGetCnt(struct IPerlStdIO* piPerl, FILE* pf)
651 PerlStdIOGetPtr(struct IPerlStdIO* piPerl, FILE* pf)
662 PerlStdIOGets(struct IPerlStdIO* piPerl, char* s, int n, FILE* pf)
664 return win32_fgets(s, n, pf);
668 PerlStdIOPutc(struct IPerlStdIO* piPerl, int c, FILE* pf)
670 return win32_fputc(c, pf);
674 PerlStdIOPuts(struct IPerlStdIO* piPerl, const char *s, FILE* pf)
676 return win32_fputs(s, pf);
680 PerlStdIOFlush(struct IPerlStdIO* piPerl, FILE* pf)
682 return win32_fflush(pf);
686 PerlStdIOUngetc(struct IPerlStdIO* piPerl,int c, FILE* pf)
688 return win32_ungetc(c, pf);
692 PerlStdIOFileno(struct IPerlStdIO* piPerl, FILE* pf)
694 return win32_fileno(pf);
698 PerlStdIOFdopen(struct IPerlStdIO* piPerl, int fd, const char *mode)
700 return win32_fdopen(fd, mode);
704 PerlStdIOReopen(struct IPerlStdIO* piPerl, const char*path, const char*mode, FILE* pf)
706 return win32_freopen(path, mode, (FILE*)pf);
710 PerlStdIORead(struct IPerlStdIO* piPerl, void *buffer, Size_t size, Size_t count, FILE* pf)
712 return win32_fread(buffer, size, count, pf);
716 PerlStdIOWrite(struct IPerlStdIO* piPerl, const void *buffer, Size_t size, Size_t count, FILE* pf)
718 return win32_fwrite(buffer, size, count, pf);
722 PerlStdIOSetBuf(struct IPerlStdIO* piPerl, FILE* pf, char* buffer)
724 win32_setbuf(pf, buffer);
728 PerlStdIOSetVBuf(struct IPerlStdIO* piPerl, FILE* pf, char* buffer, int type, Size_t size)
730 return win32_setvbuf(pf, buffer, type, size);
734 PerlStdIOSetCnt(struct IPerlStdIO* piPerl, FILE* pf, int n)
736 #ifdef STDIO_CNT_LVALUE
743 PerlStdIOSetPtr(struct IPerlStdIO* piPerl, FILE* pf, STDCHAR * ptr)
745 #ifdef STDIO_PTR_LVALUE
752 PerlStdIOSetlinebuf(struct IPerlStdIO* piPerl, FILE* pf)
754 win32_setvbuf(pf, NULL, _IOLBF, 0);
758 PerlStdIOPrintf(struct IPerlStdIO* piPerl, FILE* pf, const char *format,...)
761 va_start(arglist, format);
762 return win32_vfprintf(pf, format, arglist);
766 PerlStdIOVprintf(struct IPerlStdIO* piPerl, FILE* pf, const char *format, va_list arglist)
768 return win32_vfprintf(pf, format, arglist);
772 PerlStdIOTell(struct IPerlStdIO* piPerl, FILE* pf)
774 return win32_ftell(pf);
778 PerlStdIOSeek(struct IPerlStdIO* piPerl, FILE* pf, Off_t offset, int origin)
780 return win32_fseek(pf, offset, origin);
784 PerlStdIORewind(struct IPerlStdIO* piPerl, FILE* pf)
790 PerlStdIOTmpfile(struct IPerlStdIO* piPerl)
792 return win32_tmpfile();
796 PerlStdIOGetpos(struct IPerlStdIO* piPerl, FILE* pf, Fpos_t *p)
798 return win32_fgetpos(pf, p);
802 PerlStdIOSetpos(struct IPerlStdIO* piPerl, FILE* pf, const Fpos_t *p)
804 return win32_fsetpos(pf, p);
807 PerlStdIOInit(struct IPerlStdIO* piPerl)
812 PerlStdIOInitOSExtras(struct IPerlStdIO* piPerl)
814 Perl_init_os_extras();
818 PerlStdIOOpenOSfhandle(struct IPerlStdIO* piPerl, intptr_t osfhandle, int flags)
820 return win32_open_osfhandle(osfhandle, flags);
824 PerlStdIOGetOSfhandle(struct IPerlStdIO* piPerl, int filenum)
826 return win32_get_osfhandle(filenum);
830 PerlStdIOFdupopen(struct IPerlStdIO* piPerl, FILE* pf)
836 int fileno = win32_dup(win32_fileno(pf));
838 /* open the file in the same mode */
839 if (PERLIO_FILE_flag(pf) & PERLIO_FILE_flag_RD) {
843 else if (PERLIO_FILE_flag(pf) & PERLIO_FILE_flag_WR) {
847 else if (PERLIO_FILE_flag(pf) & PERLIO_FILE_flag_RW) {
853 /* it appears that the binmode is attached to the
854 * file descriptor so binmode files will be handled
857 pfdup = win32_fdopen(fileno, mode);
859 /* move the file pointer to the same position */
860 if (!fgetpos(pf, &pos)) {
861 fsetpos(pfdup, &pos);
869 const struct IPerlStdIO perlStdIO =
908 PerlStdIOInitOSExtras,
914 #define IPERL2HOST(x) IPerlLIO2Host(x)
918 PerlLIOAccess(struct IPerlLIO* piPerl, const char *path, int mode)
920 return win32_access(path, mode);
924 PerlLIOChmod(struct IPerlLIO* piPerl, const char *filename, int pmode)
926 return win32_chmod(filename, pmode);
930 PerlLIOChown(struct IPerlLIO* piPerl, const char *filename, uid_t owner, gid_t group)
932 return chown(filename, owner, group);
936 PerlLIOChsize(struct IPerlLIO* piPerl, int handle, Off_t size)
938 return win32_chsize(handle, size);
942 PerlLIOClose(struct IPerlLIO* piPerl, int handle)
944 return win32_close(handle);
948 PerlLIODup(struct IPerlLIO* piPerl, int handle)
950 return win32_dup(handle);
954 PerlLIODup2(struct IPerlLIO* piPerl, int handle1, int handle2)
956 return win32_dup2(handle1, handle2);
960 PerlLIOFlock(struct IPerlLIO* piPerl, int fd, int oper)
962 return win32_flock(fd, oper);
966 PerlLIOFileStat(struct IPerlLIO* piPerl, int handle, Stat_t *buffer)
968 return win32_fstat(handle, buffer);
972 PerlLIOIOCtl(struct IPerlLIO* piPerl, int i, unsigned int u, char *data)
977 /* mauke says using memcpy avoids alignment issues */
978 memcpy(&u_long_arg, data, sizeof u_long_arg);
979 retval = win32_ioctlsocket((SOCKET)i, (long)u, &u_long_arg);
980 memcpy(data, &u_long_arg, sizeof u_long_arg);
985 PerlLIOIsatty(struct IPerlLIO* piPerl, int fd)
987 return win32_isatty(fd);
991 PerlLIOLink(struct IPerlLIO* piPerl, const char*oldname, const char *newname)
993 return win32_link(oldname, newname);
997 PerlLIOLseek(struct IPerlLIO* piPerl, int handle, Off_t offset, int origin)
999 return win32_lseek(handle, offset, origin);
1003 PerlLIOLstat(struct IPerlLIO* piPerl, const char *path, Stat_t *buffer)
1005 return win32_stat(path, buffer);
1009 PerlLIOMktemp(struct IPerlLIO* piPerl, char *Template)
1011 return mktemp(Template);
1015 PerlLIOOpen(struct IPerlLIO* piPerl, const char *filename, int oflag)
1017 return win32_open(filename, oflag);
1021 PerlLIOOpen3(struct IPerlLIO* piPerl, const char *filename, int oflag, int pmode)
1023 return win32_open(filename, oflag, pmode);
1027 PerlLIORead(struct IPerlLIO* piPerl, int handle, void *buffer, unsigned int count)
1029 return win32_read(handle, buffer, count);
1033 PerlLIORename(struct IPerlLIO* piPerl, const char *OldFileName, const char *newname)
1035 return win32_rename(OldFileName, newname);
1039 PerlLIOSetmode(struct IPerlLIO* piPerl, int handle, int mode)
1041 return win32_setmode(handle, mode);
1045 PerlLIONameStat(struct IPerlLIO* piPerl, const char *path, Stat_t *buffer)
1047 return win32_stat(path, buffer);
1051 PerlLIOTmpnam(struct IPerlLIO* piPerl, char *string)
1053 return tmpnam(string);
1057 PerlLIOUmask(struct IPerlLIO* piPerl, int pmode)
1059 return umask(pmode);
1063 PerlLIOUnlink(struct IPerlLIO* piPerl, const char *filename)
1065 return win32_unlink(filename);
1069 PerlLIOUtime(struct IPerlLIO* piPerl, const char *filename, struct utimbuf *times)
1071 return win32_utime(filename, times);
1075 PerlLIOWrite(struct IPerlLIO* piPerl, int handle, const void *buffer, unsigned int count)
1077 return win32_write(handle, buffer, count);
1080 const struct IPerlLIO perlLIO =
1112 #define IPERL2HOST(x) IPerlDir2Host(x)
1116 PerlDirMakedir(struct IPerlDir* piPerl, const char *dirname, int mode)
1118 return win32_mkdir(dirname, mode);
1122 PerlDirChdir(struct IPerlDir* piPerl, const char *dirname)
1124 return IPERL2HOST(piPerl)->Chdir(dirname);
1128 PerlDirRmdir(struct IPerlDir* piPerl, const char *dirname)
1130 return win32_rmdir(dirname);
1134 PerlDirClose(struct IPerlDir* piPerl, DIR *dirp)
1136 return win32_closedir(dirp);
1140 PerlDirOpen(struct IPerlDir* piPerl, const char *filename)
1142 return win32_opendir(filename);
1146 PerlDirRead(struct IPerlDir* piPerl, DIR *dirp)
1148 return win32_readdir(dirp);
1152 PerlDirRewind(struct IPerlDir* piPerl, DIR *dirp)
1154 win32_rewinddir(dirp);
1158 PerlDirSeek(struct IPerlDir* piPerl, DIR *dirp, long loc)
1160 win32_seekdir(dirp, loc);
1164 PerlDirTell(struct IPerlDir* piPerl, DIR *dirp)
1166 return win32_telldir(dirp);
1170 PerlDirMapPathA(struct IPerlDir* piPerl, const char* path)
1172 return IPERL2HOST(piPerl)->MapPathA(path);
1176 PerlDirMapPathW(struct IPerlDir* piPerl, const WCHAR* path)
1178 return IPERL2HOST(piPerl)->MapPathW(path);
1181 const struct IPerlDir perlDir =
1199 PerlSockHtonl(struct IPerlSock* piPerl, u_long hostlong)
1201 return win32_htonl(hostlong);
1205 PerlSockHtons(struct IPerlSock* piPerl, u_short hostshort)
1207 return win32_htons(hostshort);
1211 PerlSockNtohl(struct IPerlSock* piPerl, u_long netlong)
1213 return win32_ntohl(netlong);
1217 PerlSockNtohs(struct IPerlSock* piPerl, u_short netshort)
1219 return win32_ntohs(netshort);
1222 SOCKET PerlSockAccept(struct IPerlSock* piPerl, SOCKET s, struct sockaddr* addr, int* addrlen)
1224 return win32_accept(s, addr, addrlen);
1228 PerlSockBind(struct IPerlSock* piPerl, SOCKET s, const struct sockaddr* name, int namelen)
1230 return win32_bind(s, name, namelen);
1234 PerlSockConnect(struct IPerlSock* piPerl, SOCKET s, const struct sockaddr* name, int namelen)
1236 return win32_connect(s, name, namelen);
1240 PerlSockEndhostent(struct IPerlSock* piPerl)
1246 PerlSockEndnetent(struct IPerlSock* piPerl)
1252 PerlSockEndprotoent(struct IPerlSock* piPerl)
1254 win32_endprotoent();
1258 PerlSockEndservent(struct IPerlSock* piPerl)
1264 PerlSockGethostbyaddr(struct IPerlSock* piPerl, const char* addr, int len, int type)
1266 return win32_gethostbyaddr(addr, len, type);
1270 PerlSockGethostbyname(struct IPerlSock* piPerl, const char* name)
1272 return win32_gethostbyname(name);
1276 PerlSockGethostent(struct IPerlSock* piPerl)
1278 win32_croak_not_implemented("gethostent");
1283 PerlSockGethostname(struct IPerlSock* piPerl, char* name, int namelen)
1285 return win32_gethostname(name, namelen);
1289 PerlSockGetnetbyaddr(struct IPerlSock* piPerl, long net, int type)
1291 return win32_getnetbyaddr(net, type);
1295 PerlSockGetnetbyname(struct IPerlSock* piPerl, const char *name)
1297 return win32_getnetbyname((char*)name);
1301 PerlSockGetnetent(struct IPerlSock* piPerl)
1303 return win32_getnetent();
1306 int PerlSockGetpeername(struct IPerlSock* piPerl, SOCKET s, struct sockaddr* name, int* namelen)
1308 return win32_getpeername(s, name, namelen);
1312 PerlSockGetprotobyname(struct IPerlSock* piPerl, const char* name)
1314 return win32_getprotobyname(name);
1318 PerlSockGetprotobynumber(struct IPerlSock* piPerl, int number)
1320 return win32_getprotobynumber(number);
1324 PerlSockGetprotoent(struct IPerlSock* piPerl)
1326 return win32_getprotoent();
1330 PerlSockGetservbyname(struct IPerlSock* piPerl, const char* name, const char* proto)
1332 return win32_getservbyname(name, proto);
1336 PerlSockGetservbyport(struct IPerlSock* piPerl, int port, const char* proto)
1338 return win32_getservbyport(port, proto);
1342 PerlSockGetservent(struct IPerlSock* piPerl)
1344 return win32_getservent();
1348 PerlSockGetsockname(struct IPerlSock* piPerl, SOCKET s, struct sockaddr* name, int* namelen)
1350 return win32_getsockname(s, name, namelen);
1354 PerlSockGetsockopt(struct IPerlSock* piPerl, SOCKET s, int level, int optname, char* optval, int* optlen)
1356 return win32_getsockopt(s, level, optname, optval, optlen);
1360 PerlSockInetAddr(struct IPerlSock* piPerl, const char* cp)
1362 return win32_inet_addr(cp);
1366 PerlSockInetNtoa(struct IPerlSock* piPerl, struct in_addr in)
1368 return win32_inet_ntoa(in);
1372 PerlSockListen(struct IPerlSock* piPerl, SOCKET s, int backlog)
1374 return win32_listen(s, backlog);
1378 PerlSockRecv(struct IPerlSock* piPerl, SOCKET s, char* buffer, int len, int flags)
1380 return win32_recv(s, buffer, len, flags);
1384 PerlSockRecvfrom(struct IPerlSock* piPerl, SOCKET s, char* buffer, int len, int flags, struct sockaddr* from, int* fromlen)
1386 return win32_recvfrom(s, buffer, len, flags, from, fromlen);
1390 PerlSockSelect(struct IPerlSock* piPerl, int nfds, char* readfds, char* writefds, char* exceptfds, const struct timeval* timeout)
1392 return win32_select(nfds, (Perl_fd_set*)readfds, (Perl_fd_set*)writefds, (Perl_fd_set*)exceptfds, timeout);
1396 PerlSockSend(struct IPerlSock* piPerl, SOCKET s, const char* buffer, int len, int flags)
1398 return win32_send(s, buffer, len, flags);
1402 PerlSockSendto(struct IPerlSock* piPerl, SOCKET s, const char* buffer, int len, int flags, const struct sockaddr* to, int tolen)
1404 return win32_sendto(s, buffer, len, flags, to, tolen);
1408 PerlSockSethostent(struct IPerlSock* piPerl, int stayopen)
1410 win32_sethostent(stayopen);
1414 PerlSockSetnetent(struct IPerlSock* piPerl, int stayopen)
1416 win32_setnetent(stayopen);
1420 PerlSockSetprotoent(struct IPerlSock* piPerl, int stayopen)
1422 win32_setprotoent(stayopen);
1426 PerlSockSetservent(struct IPerlSock* piPerl, int stayopen)
1428 win32_setservent(stayopen);
1432 PerlSockSetsockopt(struct IPerlSock* piPerl, SOCKET s, int level, int optname, const char* optval, int optlen)
1434 return win32_setsockopt(s, level, optname, optval, optlen);
1438 PerlSockShutdown(struct IPerlSock* piPerl, SOCKET s, int how)
1440 return win32_shutdown(s, how);
1444 PerlSockSocket(struct IPerlSock* piPerl, int af, int type, int protocol)
1446 return win32_socket(af, type, protocol);
1450 PerlSockSocketpair(struct IPerlSock* piPerl, int domain, int type, int protocol, int* fds)
1452 return Perl_my_socketpair(domain, type, protocol, fds);
1456 PerlSockClosesocket(struct IPerlSock* piPerl, SOCKET s)
1458 return win32_closesocket(s);
1462 PerlSockIoctlsocket(struct IPerlSock* piPerl, SOCKET s, long cmd, u_long *argp)
1464 return win32_ioctlsocket(s, cmd, argp);
1467 const struct IPerlSock perlSock =
1478 PerlSockEndprotoent,
1480 PerlSockGethostname,
1481 PerlSockGetpeername,
1482 PerlSockGethostbyaddr,
1483 PerlSockGethostbyname,
1485 PerlSockGetnetbyaddr,
1486 PerlSockGetnetbyname,
1488 PerlSockGetprotobyname,
1489 PerlSockGetprotobynumber,
1490 PerlSockGetprotoent,
1491 PerlSockGetservbyname,
1492 PerlSockGetservbyport,
1494 PerlSockGetsockname,
1506 PerlSockSetprotoent,
1512 PerlSockClosesocket,
1518 #define EXECF_EXEC 1
1519 #define EXECF_SPAWN 2
1522 PerlProcAbort(struct IPerlProc* piPerl)
1528 PerlProcCrypt(struct IPerlProc* piPerl, const char* clear, const char* salt)
1530 return win32_crypt(clear, salt);
1533 PERL_CALLCONV_NO_RET void
1534 PerlProcExit(struct IPerlProc* piPerl, int status)
1539 PERL_CALLCONV_NO_RET void
1540 PerlProc_Exit(struct IPerlProc* piPerl, int status)
1546 PerlProcExecl(struct IPerlProc* piPerl, const char *cmdname, const char *arg0, const char *arg1, const char *arg2, const char *arg3)
1548 return execl(cmdname, arg0, arg1, arg2, arg3);
1552 PerlProcExecv(struct IPerlProc* piPerl, const char *cmdname, const char *const *argv)
1554 return win32_execvp(cmdname, argv);
1558 PerlProcExecvp(struct IPerlProc* piPerl, const char *cmdname, const char *const *argv)
1560 return win32_execvp(cmdname, argv);
1564 PerlProcGetuid(struct IPerlProc* piPerl)
1570 PerlProcGeteuid(struct IPerlProc* piPerl)
1576 PerlProcGetgid(struct IPerlProc* piPerl)
1582 PerlProcGetegid(struct IPerlProc* piPerl)
1588 PerlProcGetlogin(struct IPerlProc* piPerl)
1590 return g_getlogin();
1594 PerlProcKill(struct IPerlProc* piPerl, int pid, int sig)
1596 return win32_kill(pid, sig);
1600 PerlProcKillpg(struct IPerlProc* piPerl, int pid, int sig)
1602 return win32_kill(pid, -sig);
1606 PerlProcPauseProc(struct IPerlProc* piPerl)
1608 return win32_pause();
1612 PerlProcPopen(struct IPerlProc* piPerl, const char *command, const char *mode)
1615 PERL_FLUSHALL_FOR_CHILD;
1616 return win32_popen(command, mode);
1620 PerlProcPopenList(struct IPerlProc* piPerl, const char *mode, IV narg, SV **args)
1623 PERL_FLUSHALL_FOR_CHILD;
1624 return win32_popenlist(mode, narg, args);
1628 PerlProcPclose(struct IPerlProc* piPerl, PerlIO *stream)
1630 return win32_pclose(stream);
1634 PerlProcPipe(struct IPerlProc* piPerl, int *phandles)
1636 return win32_pipe(phandles, 512, O_BINARY);
1640 PerlProcSetuid(struct IPerlProc* piPerl, uid_t u)
1646 PerlProcSetgid(struct IPerlProc* piPerl, gid_t g)
1652 PerlProcSleep(struct IPerlProc* piPerl, unsigned int s)
1654 return win32_sleep(s);
1658 PerlProcTimes(struct IPerlProc* piPerl, struct tms *timebuf)
1660 return win32_times(timebuf);
1664 PerlProcWait(struct IPerlProc* piPerl, int *status)
1666 return win32_wait(status);
1670 PerlProcWaitpid(struct IPerlProc* piPerl, int pid, int *status, int flags)
1672 return win32_waitpid(pid, status, flags);
1676 PerlProcSignal(struct IPerlProc* piPerl, int sig, Sighandler_t subcode)
1678 return win32_signal(sig, subcode);
1682 PerlProcGetTimeOfDay(struct IPerlProc* piPerl, struct timeval *t, void *z)
1684 return win32_gettimeofday(t, z);
1688 static THREAD_RET_TYPE
1689 win32_start_child(LPVOID arg)
1691 PerlInterpreter *my_perl = (PerlInterpreter*)arg;
1693 HWND parent_message_hwnd;
1694 #ifdef PERL_SYNC_FORK
1695 static long sync_fork_id = 0;
1696 long id = ++sync_fork_id;
1700 PERL_SET_THX(my_perl);
1701 win32_checkTLS(my_perl);
1703 #ifdef PERL_SYNC_FORK
1706 w32_pseudo_id = GetCurrentThreadId();
1708 #ifdef PERL_USES_PL_PIDSTATUS
1709 hv_clear(PL_pidstatus);
1712 /* create message window and tell parent about it */
1713 parent_message_hwnd = w32_message_hwnd;
1714 w32_message_hwnd = win32_create_message_window();
1715 if (parent_message_hwnd != NULL)
1716 PostMessage(parent_message_hwnd, WM_USER_MESSAGE, w32_pseudo_id, (LPARAM)w32_message_hwnd);
1718 /* push a zero on the stack (we are the child) */
1726 /* continue from next op */
1727 PL_op = PL_op->op_next;
1731 volatile int oldscope = 1; /* We are responsible for all scopes */
1734 JMPENV_PUSH(status);
1738 /* We may have additional unclosed scopes if fork() was called
1739 * from within a BEGIN block. See perlfork.pod for more details.
1740 * We cannot clean up these other scopes because they belong to a
1741 * different interpreter, but we also cannot leave PL_scopestack_ix
1742 * dangling because that can trigger an assertion in perl_destruct().
1744 if (PL_scopestack_ix > oldscope) {
1745 PL_scopestack[oldscope-1] = PL_scopestack[PL_scopestack_ix-1];
1746 PL_scopestack_ix = oldscope;
1751 while (PL_scopestack_ix > oldscope)
1754 PL_curstash = PL_defstash;
1755 if (PL_curstash != PL_defstash) {
1756 SvREFCNT_dec(PL_curstash);
1757 PL_curstash = (HV *)SvREFCNT_inc(PL_defstash);
1759 if (PL_endav && !PL_minus_c) {
1760 PERL_SET_PHASE(PERL_PHASE_END);
1761 call_list(oldscope, PL_endav);
1763 status = STATUS_EXIT;
1767 POPSTACK_TO(PL_mainstack);
1768 PL_op = PL_restartop;
1769 PL_restartop = (OP*)NULL;
1772 PerlIO_printf(Perl_error_log, "panic: restartop\n");
1779 /* XXX hack to avoid perl_destruct() freeing optree */
1780 win32_checkTLS(my_perl);
1781 PL_main_root = (OP*)NULL;
1784 win32_checkTLS(my_perl);
1785 /* close the std handles to avoid fd leaks */
1787 do_close(PL_stdingv, FALSE);
1788 do_close(gv_fetchpv("STDOUT", TRUE, SVt_PVIO), FALSE); /* PL_stdoutgv - ISAGN */
1789 do_close(PL_stderrgv, FALSE);
1792 /* destroy everything (waits for any pseudo-forked children) */
1793 win32_checkTLS(my_perl);
1794 perl_destruct(my_perl);
1795 win32_checkTLS(my_perl);
1798 #ifdef PERL_SYNC_FORK
1801 return (DWORD)status;
1804 #endif /* USE_ITHREADS */
1807 PerlProcFork(struct IPerlProc* piPerl)
1815 if (w32_num_pseudo_children >= MAXIMUM_WAIT_OBJECTS) {
1819 h = new CPerlHost(*(CPerlHost*)w32_internal_host);
1820 PerlInterpreter *new_perl = perl_clone_using((PerlInterpreter*)aTHX,
1823 h->m_pHostperlMemShared,
1824 h->m_pHostperlMemParse,
1826 h->m_pHostperlStdIO,
1832 new_perl->Isys_intern.internal_host = h;
1833 h->host_perl = new_perl;
1834 # ifdef PERL_SYNC_FORK
1835 id = win32_start_child((LPVOID)new_perl);
1838 if (w32_message_hwnd == INVALID_HANDLE_VALUE)
1839 w32_message_hwnd = win32_create_message_window();
1840 new_perl->Isys_intern.message_hwnd = w32_message_hwnd;
1841 w32_pseudo_child_message_hwnds[w32_num_pseudo_children] =
1842 (w32_message_hwnd == NULL) ? (HWND)NULL : (HWND)INVALID_HANDLE_VALUE;
1843 # ifdef USE_RTL_THREAD_API
1844 handle = (HANDLE)_beginthreadex((void*)NULL, 0, win32_start_child,
1845 (void*)new_perl, 0, (unsigned*)&id);
1847 handle = CreateThread(NULL, 0, win32_start_child,
1848 (LPVOID)new_perl, 0, &id);
1850 PERL_SET_THX(aTHX); /* XXX perl_clone*() set TLS */
1855 w32_pseudo_child_handles[w32_num_pseudo_children] = handle;
1856 w32_pseudo_child_pids[w32_num_pseudo_children] = id;
1857 w32_pseudo_child_sigterm[w32_num_pseudo_children] = 0;
1858 ++w32_num_pseudo_children;
1862 win32_croak_not_implemented("fork()");
1864 #endif /* USE_ITHREADS */
1868 PerlProcGetpid(struct IPerlProc* piPerl)
1870 return win32_getpid();
1874 PerlProcDynaLoader(struct IPerlProc* piPerl, const char* filename)
1876 return win32_dynaload(filename);
1880 PerlProcGetOSError(struct IPerlProc* piPerl, SV* sv, DWORD dwErr)
1882 win32_str_os_error(sv, dwErr);
1886 PerlProcSpawnvp(struct IPerlProc* piPerl, int mode, const char *cmdname, const char *const *argv)
1888 return win32_spawnvp(mode, cmdname, argv);
1892 PerlProcLastHost(struct IPerlProc* piPerl)
1894 /* this dTHX is unused in an optimized build since CPerlHost::num_hosts
1897 CPerlHost *h = (CPerlHost*)w32_internal_host;
1898 return h->LastHost();
1901 const struct IPerlProc perlProc =
1935 PerlProcGetTimeOfDay
1943 CPerlHost::CPerlHost(void)
1945 /* Construct a host from scratch */
1946 InterlockedIncrement(&num_hosts);
1947 m_pvDir = new VDir();
1948 m_pVMem = new VMem();
1949 m_pVMemShared = new VMem();
1950 m_pVMemParse = new VMem();
1952 m_pvDir->Init(NULL, m_pVMem);
1955 m_lppEnvList = NULL;
1958 CopyMemory(&m_hostperlMem, &perlMem, sizeof(perlMem));
1959 CopyMemory(&m_hostperlMemShared, &perlMemShared, sizeof(perlMemShared));
1960 CopyMemory(&m_hostperlMemParse, &perlMemParse, sizeof(perlMemParse));
1961 CopyMemory(&m_hostperlEnv, &perlEnv, sizeof(perlEnv));
1962 CopyMemory(&m_hostperlStdIO, &perlStdIO, sizeof(perlStdIO));
1963 CopyMemory(&m_hostperlLIO, &perlLIO, sizeof(perlLIO));
1964 CopyMemory(&m_hostperlDir, &perlDir, sizeof(perlDir));
1965 CopyMemory(&m_hostperlSock, &perlSock, sizeof(perlSock));
1966 CopyMemory(&m_hostperlProc, &perlProc, sizeof(perlProc));
1968 m_pHostperlMem = &m_hostperlMem;
1969 m_pHostperlMemShared = &m_hostperlMemShared;
1970 m_pHostperlMemParse = &m_hostperlMemParse;
1971 m_pHostperlEnv = &m_hostperlEnv;
1972 m_pHostperlStdIO = &m_hostperlStdIO;
1973 m_pHostperlLIO = &m_hostperlLIO;
1974 m_pHostperlDir = &m_hostperlDir;
1975 m_pHostperlSock = &m_hostperlSock;
1976 m_pHostperlProc = &m_hostperlProc;
1979 #define SETUPEXCHANGE(xptr, iptr, table) \
1990 CPerlHost::CPerlHost(struct IPerlMem** ppMem, struct IPerlMem** ppMemShared,
1991 struct IPerlMem** ppMemParse, struct IPerlEnv** ppEnv,
1992 struct IPerlStdIO** ppStdIO, struct IPerlLIO** ppLIO,
1993 struct IPerlDir** ppDir, struct IPerlSock** ppSock,
1994 struct IPerlProc** ppProc)
1996 InterlockedIncrement(&num_hosts);
1997 m_pvDir = new VDir(0);
1998 m_pVMem = new VMem();
1999 m_pVMemShared = new VMem();
2000 m_pVMemParse = new VMem();
2002 m_pvDir->Init(NULL, m_pVMem);
2005 m_lppEnvList = NULL;
2006 m_bTopLevel = FALSE;
2008 CopyMemory(&m_hostperlMem, &perlMem, sizeof(perlMem));
2009 CopyMemory(&m_hostperlMemShared, &perlMemShared, sizeof(perlMemShared));
2010 CopyMemory(&m_hostperlMemParse, &perlMemParse, sizeof(perlMemParse));
2011 CopyMemory(&m_hostperlEnv, &perlEnv, sizeof(perlEnv));
2012 CopyMemory(&m_hostperlStdIO, &perlStdIO, sizeof(perlStdIO));
2013 CopyMemory(&m_hostperlLIO, &perlLIO, sizeof(perlLIO));
2014 CopyMemory(&m_hostperlDir, &perlDir, sizeof(perlDir));
2015 CopyMemory(&m_hostperlSock, &perlSock, sizeof(perlSock));
2016 CopyMemory(&m_hostperlProc, &perlProc, sizeof(perlProc));
2018 SETUPEXCHANGE(ppMem, m_pHostperlMem, m_hostperlMem);
2019 SETUPEXCHANGE(ppMemShared, m_pHostperlMemShared, m_hostperlMemShared);
2020 SETUPEXCHANGE(ppMemParse, m_pHostperlMemParse, m_hostperlMemParse);
2021 SETUPEXCHANGE(ppEnv, m_pHostperlEnv, m_hostperlEnv);
2022 SETUPEXCHANGE(ppStdIO, m_pHostperlStdIO, m_hostperlStdIO);
2023 SETUPEXCHANGE(ppLIO, m_pHostperlLIO, m_hostperlLIO);
2024 SETUPEXCHANGE(ppDir, m_pHostperlDir, m_hostperlDir);
2025 SETUPEXCHANGE(ppSock, m_pHostperlSock, m_hostperlSock);
2026 SETUPEXCHANGE(ppProc, m_pHostperlProc, m_hostperlProc);
2028 #undef SETUPEXCHANGE
2030 CPerlHost::CPerlHost(CPerlHost& host)
2032 /* Construct a host from another host */
2033 InterlockedIncrement(&num_hosts);
2034 m_pVMem = new VMem();
2035 m_pVMemShared = host.GetMemShared();
2036 m_pVMemParse = host.GetMemParse();
2038 /* duplicate directory info */
2039 m_pvDir = new VDir(0);
2040 m_pvDir->Init(host.GetDir(), m_pVMem);
2042 CopyMemory(&m_hostperlMem, &perlMem, sizeof(perlMem));
2043 CopyMemory(&m_hostperlMemShared, &perlMemShared, sizeof(perlMemShared));
2044 CopyMemory(&m_hostperlMemParse, &perlMemParse, sizeof(perlMemParse));
2045 CopyMemory(&m_hostperlEnv, &perlEnv, sizeof(perlEnv));
2046 CopyMemory(&m_hostperlStdIO, &perlStdIO, sizeof(perlStdIO));
2047 CopyMemory(&m_hostperlLIO, &perlLIO, sizeof(perlLIO));
2048 CopyMemory(&m_hostperlDir, &perlDir, sizeof(perlDir));
2049 CopyMemory(&m_hostperlSock, &perlSock, sizeof(perlSock));
2050 CopyMemory(&m_hostperlProc, &perlProc, sizeof(perlProc));
2051 m_pHostperlMem = &m_hostperlMem;
2052 m_pHostperlMemShared = &m_hostperlMemShared;
2053 m_pHostperlMemParse = &m_hostperlMemParse;
2054 m_pHostperlEnv = &m_hostperlEnv;
2055 m_pHostperlStdIO = &m_hostperlStdIO;
2056 m_pHostperlLIO = &m_hostperlLIO;
2057 m_pHostperlDir = &m_hostperlDir;
2058 m_pHostperlSock = &m_hostperlSock;
2059 m_pHostperlProc = &m_hostperlProc;
2062 m_lppEnvList = NULL;
2063 m_bTopLevel = FALSE;
2065 /* duplicate environment info */
2068 while(lpPtr = host.GetIndex(dwIndex))
2072 CPerlHost::~CPerlHost(void)
2075 InterlockedDecrement(&num_hosts);
2077 m_pVMemParse->Release();
2078 m_pVMemShared->Release();
2083 CPerlHost::Find(LPCSTR lpStr)
2086 LPSTR* lppPtr = Lookup(lpStr);
2087 if(lppPtr != NULL) {
2088 for(lpPtr = *lppPtr; *lpPtr != '\0' && *lpPtr != '='; ++lpPtr)
2100 lookup(const void *arg1, const void *arg2)
2101 { // Compare strings
2105 ptr1 = *(char**)arg1;
2106 ptr2 = *(char**)arg2;
2110 if(c1 == '\0' || c1 == '=') {
2111 if(c2 == '\0' || c2 == '=')
2114 return -1; // string 1 < string 2
2116 else if(c2 == '\0' || c2 == '=')
2117 return 1; // string 1 > string 2
2123 return -1; // string 1 < string 2
2125 return 1; // string 1 > string 2
2133 CPerlHost::Lookup(LPCSTR lpStr)
2136 if (!m_lppEnvList || !m_dwEnvCount)
2141 return (LPSTR*)bsearch(&lpStr, m_lppEnvList, m_dwEnvCount, sizeof(LPSTR), lookup);
2145 compare(const void *arg1, const void *arg2)
2146 { // Compare strings
2150 ptr1 = *(char**)arg1;
2151 ptr2 = *(char**)arg2;
2155 if(c1 == '\0' || c1 == '=') {
2159 return -1; // string 1 < string 2
2161 else if(c2 == '\0' || c2 == '=')
2162 return 1; // string 1 > string 2
2168 return -1; // string 1 < string 2
2170 return 1; // string 1 > string 2
2178 CPerlHost::Add(LPCSTR lpStr)
2181 STRLEN length = strlen(lpStr)+1;
2184 lpPtr = Lookup(lpStr);
2185 if (lpPtr != NULL) {
2186 // must allocate things via host memory allocation functions
2187 // rather than perl's Renew() et al, as the perl interpreter
2188 // may either not be initialized enough when we allocate these,
2189 // or may already be dead when we go to free these
2190 *lpPtr = (char*)Realloc(*lpPtr, length * sizeof(char));
2191 strcpy(*lpPtr, lpStr);
2194 m_lppEnvList = (LPSTR*)Realloc(m_lppEnvList, (m_dwEnvCount+1) * sizeof(LPSTR));
2196 m_lppEnvList[m_dwEnvCount] = (char*)Malloc(length * sizeof(char));
2197 if (m_lppEnvList[m_dwEnvCount] != NULL) {
2198 strcpy(m_lppEnvList[m_dwEnvCount], lpStr);
2200 qsort(m_lppEnvList, m_dwEnvCount, sizeof(LPSTR), compare);
2207 CPerlHost::CalculateEnvironmentSpace(void)
2211 for(index = 0; index < m_dwEnvCount; ++index)
2212 dwSize += strlen(m_lppEnvList[index]) + 1;
2218 CPerlHost::FreeLocalEnvironmentStrings(LPSTR lpStr)
2224 CPerlHost::GetChildDir(void)
2229 Newx(ptr, MAX_PATH+1, char);
2230 m_pvDir->GetCurrentDirectoryA(MAX_PATH+1, ptr);
2231 length = strlen(ptr);
2233 if ((ptr[length-1] == '\\') || (ptr[length-1] == '/'))
2240 CPerlHost::FreeChildDir(char* pStr)
2246 CPerlHost::CreateLocalEnvironmentStrings(VDir &vDir)
2248 LPSTR lpStr, lpPtr, lpEnvPtr, lpTmp, lpLocalEnv, lpAllocPtr;
2249 DWORD dwSize, dwEnvIndex;
2250 int nLength, compVal;
2252 // get the process environment strings
2253 lpAllocPtr = lpTmp = (LPSTR)win32_getenvironmentstrings();
2255 // step over current directory stuff
2256 while(*lpTmp == '=')
2257 lpTmp += strlen(lpTmp) + 1;
2259 // save the start of the environment strings
2261 for(dwSize = 1; *lpTmp != '\0'; lpTmp += strlen(lpTmp) + 1) {
2262 // calculate the size of the environment strings
2263 dwSize += strlen(lpTmp) + 1;
2266 // add the size of current directories
2267 dwSize += vDir.CalculateEnvironmentSpace();
2269 // add the additional space used by changes made to the environment
2270 dwSize += CalculateEnvironmentSpace();
2272 Newx(lpStr, dwSize, char);
2275 // build the local environment
2276 lpStr = vDir.BuildEnvironmentSpace(lpStr);
2279 lpLocalEnv = GetIndex(dwEnvIndex);
2280 while(*lpEnvPtr != '\0') {
2282 // all environment overrides have been added
2283 // so copy string into place
2284 strcpy(lpStr, lpEnvPtr);
2285 nLength = strlen(lpEnvPtr) + 1;
2287 lpEnvPtr += nLength;
2290 // determine which string to copy next
2291 compVal = compare(&lpEnvPtr, &lpLocalEnv);
2293 strcpy(lpStr, lpEnvPtr);
2294 nLength = strlen(lpEnvPtr) + 1;
2296 lpEnvPtr += nLength;
2299 char *ptr = strchr(lpLocalEnv, '=');
2301 strcpy(lpStr, lpLocalEnv);
2302 lpStr += strlen(lpLocalEnv) + 1;
2304 lpLocalEnv = GetIndex(dwEnvIndex);
2306 // this string was replaced
2307 lpEnvPtr += strlen(lpEnvPtr) + 1;
2314 // still have environment overrides to add
2315 // so copy the strings into place if not an override
2316 char *ptr = strchr(lpLocalEnv, '=');
2318 strcpy(lpStr, lpLocalEnv);
2319 lpStr += strlen(lpLocalEnv) + 1;
2321 lpLocalEnv = GetIndex(dwEnvIndex);
2328 // release the process environment strings
2329 win32_freeenvironmentstrings(lpAllocPtr);
2335 CPerlHost::Reset(void)
2337 if(m_lppEnvList != NULL) {
2338 for(DWORD index = 0; index < m_dwEnvCount; ++index) {
2339 Free(m_lppEnvList[index]);
2340 m_lppEnvList[index] = NULL;
2345 m_lppEnvList = NULL;
2349 CPerlHost::Clearenv(void)
2352 LPSTR lpPtr, lpStr, lpEnvPtr;
2353 if (m_lppEnvList != NULL) {
2354 /* set every entry to an empty string */
2355 for(DWORD index = 0; index < m_dwEnvCount; ++index) {
2356 char* ptr = strchr(m_lppEnvList[index], '=');
2363 /* get the process environment strings */
2364 lpStr = lpEnvPtr = (LPSTR)win32_getenvironmentstrings();
2366 /* step over current directory stuff */
2367 while(*lpStr == '=')
2368 lpStr += strlen(lpStr) + 1;
2371 lpPtr = strchr(lpStr, '=');
2377 (void)win32_putenv(lpStr);
2380 lpStr += strlen(lpStr) + 1;
2383 win32_freeenvironmentstrings(lpEnvPtr);
2388 CPerlHost::Getenv(const char *varname)
2391 char *pEnv = Find(varname);
2395 return win32_getenv(varname);
2399 CPerlHost::Putenv(const char *envstring)
2403 return win32_putenv(envstring);
2409 CPerlHost::Chdir(const char *dirname)
2416 ret = m_pvDir->SetCurrentDirectoryA((char*)dirname);
2423 #endif /* ___PerlHost_H___ */