fix typo in config.vc; regenerate win32 config_H.* files
[p5sagit/p5-mst-13.2.git] / win32 / perlhost.h
CommitLineData
7766f137 1/* perlhost.h
2 *
f3dccfae 3 * (c) 1999 Microsoft Corporation. All rights reserved.
7766f137 4 * Portions (c) 1999 ActiveState Tool Corp, http://www.ActiveState.com/
5 *
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.
8 */
9
10#ifndef ___PerlHost_H___
11#define ___PerlHost_H___
12
71d280e3 13#include <signal.h>
7766f137 14#include "iperlsys.h"
15#include "vmem.h"
16#include "vdir.h"
17
7766f137 18START_EXTERN_C
4ea817c6 19extern char * g_win32_get_privlib(const char *pl);
20extern char * g_win32_get_sitelib(const char *pl);
21extern char * g_win32_get_vendorlib(const char *pl);
7766f137 22extern char * g_getlogin(void);
23extern int do_spawn2(char *cmd, int exectype);
7766f137 24END_EXTERN_C
7766f137 25
26class CPerlHost
27{
28public:
5f1a76d0 29 /* Constructors */
7766f137 30 CPerlHost(void);
31 CPerlHost(struct IPerlMem** ppMem, struct IPerlMem** ppMemShared,
32 struct IPerlMem** ppMemParse, struct IPerlEnv** ppEnv,
33 struct IPerlStdIO** ppStdIO, struct IPerlLIO** ppLIO,
34 struct IPerlDir** ppDir, struct IPerlSock** ppSock,
35 struct IPerlProc** ppProc);
36 CPerlHost(CPerlHost& host);
37 ~CPerlHost(void);
38
39 static CPerlHost* IPerlMem2Host(struct IPerlMem* piPerl);
40 static CPerlHost* IPerlMemShared2Host(struct IPerlMem* piPerl);
41 static CPerlHost* IPerlMemParse2Host(struct IPerlMem* piPerl);
42 static CPerlHost* IPerlEnv2Host(struct IPerlEnv* piPerl);
43 static CPerlHost* IPerlStdIO2Host(struct IPerlStdIO* piPerl);
44 static CPerlHost* IPerlLIO2Host(struct IPerlLIO* piPerl);
45 static CPerlHost* IPerlDir2Host(struct IPerlDir* piPerl);
46 static CPerlHost* IPerlSock2Host(struct IPerlSock* piPerl);
47 static CPerlHost* IPerlProc2Host(struct IPerlProc* piPerl);
48
49 BOOL PerlCreate(void);
50 int PerlParse(int argc, char** argv, char** env);
51 int PerlRun(void);
52 void PerlDestroy(void);
53
54/* IPerlMem */
f3dccfae 55 /* Locks provided but should be unnecessary as this is private pool */
7766f137 56 inline void* Malloc(size_t size) { return m_pVMem->Malloc(size); };
57 inline void* Realloc(void* ptr, size_t size) { return m_pVMem->Realloc(ptr, size); };
58 inline void Free(void* ptr) { m_pVMem->Free(ptr); };
59 inline void* Calloc(size_t num, size_t size)
60 {
61 size_t count = num*size;
62 void* lpVoid = Malloc(count);
63 if (lpVoid)
64 ZeroMemory(lpVoid, count);
65 return lpVoid;
66 };
67 inline void GetLock(void) { m_pVMem->GetLock(); };
68 inline void FreeLock(void) { m_pVMem->FreeLock(); };
69 inline int IsLocked(void) { return m_pVMem->IsLocked(); };
70
71/* IPerlMemShared */
f3dccfae 72 /* Locks used to serialize access to the pool */
73 inline void GetLockShared(void) { m_pVMemShared->GetLock(); };
74 inline void FreeLockShared(void) { m_pVMemShared->FreeLock(); };
75 inline int IsLockedShared(void) { return m_pVMemShared->IsLocked(); };
7766f137 76 inline void* MallocShared(size_t size)
77 {
f3dccfae 78 void *result;
79 GetLockShared();
80 result = m_pVMemShared->Malloc(size);
7fcdafbd 81 FreeLockShared();
f3dccfae 82 return result;
83 };
84 inline void* ReallocShared(void* ptr, size_t size)
85 {
86 void *result;
87 GetLockShared();
88 result = m_pVMemShared->Realloc(ptr, size);
7fcdafbd 89 FreeLockShared();
f3dccfae 90 return result;
91 };
92 inline void FreeShared(void* ptr)
93 {
94 GetLockShared();
95 m_pVMemShared->Free(ptr);
7fcdafbd 96 FreeLockShared();
7766f137 97 };
7766f137 98 inline void* CallocShared(size_t num, size_t size)
99 {
100 size_t count = num*size;
101 void* lpVoid = MallocShared(count);
102 if (lpVoid)
103 ZeroMemory(lpVoid, count);
104 return lpVoid;
105 };
7766f137 106
107/* IPerlMemParse */
f3dccfae 108 /* Assume something else is using locks to mangaging serialize
109 on a batch basis
110 */
111 inline void GetLockParse(void) { m_pVMemParse->GetLock(); };
112 inline void FreeLockParse(void) { m_pVMemParse->FreeLock(); };
113 inline int IsLockedParse(void) { return m_pVMemParse->IsLocked(); };
7766f137 114 inline void* MallocParse(size_t size) { return m_pVMemParse->Malloc(size); };
115 inline void* ReallocParse(void* ptr, size_t size) { return m_pVMemParse->Realloc(ptr, size); };
116 inline void FreeParse(void* ptr) { m_pVMemParse->Free(ptr); };
117 inline void* CallocParse(size_t num, size_t size)
118 {
119 size_t count = num*size;
120 void* lpVoid = MallocParse(count);
121 if (lpVoid)
122 ZeroMemory(lpVoid, count);
123 return lpVoid;
124 };
7766f137 125
126/* IPerlEnv */
127 char *Getenv(const char *varname);
128 int Putenv(const char *envstring);
129 inline char *Getenv(const char *varname, unsigned long *len)
130 {
131 *len = 0;
132 char *e = Getenv(varname);
133 if (e)
134 *len = strlen(e);
135 return e;
136 }
137 void* CreateChildEnv(void) { return CreateLocalEnvironmentStrings(*m_pvDir); };
138 void FreeChildEnv(void* pStr) { FreeLocalEnvironmentStrings((char*)pStr); };
139 char* GetChildDir(void);
140 void FreeChildDir(char* pStr);
141 void Reset(void);
142 void Clearenv(void);
143
144 inline LPSTR GetIndex(DWORD &dwIndex)
145 {
146 if(dwIndex < m_dwEnvCount)
147 {
148 ++dwIndex;
149 return m_lppEnvList[dwIndex-1];
150 }
151 return NULL;
152 };
153
154protected:
155 LPSTR Find(LPCSTR lpStr);
156 void Add(LPCSTR lpStr);
157
158 LPSTR CreateLocalEnvironmentStrings(VDir &vDir);
159 void FreeLocalEnvironmentStrings(LPSTR lpStr);
160 LPSTR* Lookup(LPCSTR lpStr);
161 DWORD CalculateEnvironmentSpace(void);
162
163public:
164
165/* IPerlDIR */
166 virtual int Chdir(const char *dirname);
167
168/* IPerllProc */
169 void Abort(void);
170 void Exit(int status);
171 void _Exit(int status);
172 int Execl(const char *cmdname, const char *arg0, const char *arg1, const char *arg2, const char *arg3);
173 int Execv(const char *cmdname, const char *const *argv);
174 int Execvp(const char *cmdname, const char *const *argv);
175
176 inline VMem* GetMemShared(void) { m_pVMemShared->AddRef(); return m_pVMemShared; };
177 inline VMem* GetMemParse(void) { m_pVMemParse->AddRef(); return m_pVMemParse; };
178 inline VDir* GetDir(void) { return m_pvDir; };
179
180public:
181
182 struct IPerlMem m_hostperlMem;
183 struct IPerlMem m_hostperlMemShared;
184 struct IPerlMem m_hostperlMemParse;
185 struct IPerlEnv m_hostperlEnv;
186 struct IPerlStdIO m_hostperlStdIO;
187 struct IPerlLIO m_hostperlLIO;
188 struct IPerlDir m_hostperlDir;
189 struct IPerlSock m_hostperlSock;
190 struct IPerlProc m_hostperlProc;
191
192 struct IPerlMem* m_pHostperlMem;
193 struct IPerlMem* m_pHostperlMemShared;
194 struct IPerlMem* m_pHostperlMemParse;
195 struct IPerlEnv* m_pHostperlEnv;
196 struct IPerlStdIO* m_pHostperlStdIO;
197 struct IPerlLIO* m_pHostperlLIO;
198 struct IPerlDir* m_pHostperlDir;
199 struct IPerlSock* m_pHostperlSock;
200 struct IPerlProc* m_pHostperlProc;
201
202 inline char* MapPathA(const char *pInName) { return m_pvDir->MapPathA(pInName); };
203 inline WCHAR* MapPathW(const WCHAR *pInName) { return m_pvDir->MapPathW(pInName); };
204protected:
205
206 VDir* m_pvDir;
207 VMem* m_pVMem;
208 VMem* m_pVMemShared;
209 VMem* m_pVMemParse;
210
211 DWORD m_dwEnvCount;
212 LPSTR* m_lppEnvList;
5f1a76d0 213 static long num_hosts;
214public:
215 inline int LastHost(void) { return num_hosts == 1L; };
7766f137 216};
217
5f1a76d0 218long CPerlHost::num_hosts = 0L;
219
7766f137 220
221#define STRUCT2PTR(x, y) (CPerlHost*)(((LPBYTE)x)-offsetof(CPerlHost, y))
222
223inline CPerlHost* IPerlMem2Host(struct IPerlMem* piPerl)
224{
225 return STRUCT2PTR(piPerl, m_hostperlMem);
226}
227
228inline CPerlHost* IPerlMemShared2Host(struct IPerlMem* piPerl)
229{
230 return STRUCT2PTR(piPerl, m_hostperlMemShared);
231}
232
233inline CPerlHost* IPerlMemParse2Host(struct IPerlMem* piPerl)
234{
235 return STRUCT2PTR(piPerl, m_hostperlMemParse);
236}
237
238inline CPerlHost* IPerlEnv2Host(struct IPerlEnv* piPerl)
239{
240 return STRUCT2PTR(piPerl, m_hostperlEnv);
241}
242
243inline CPerlHost* IPerlStdIO2Host(struct IPerlStdIO* piPerl)
244{
245 return STRUCT2PTR(piPerl, m_hostperlStdIO);
246}
247
248inline CPerlHost* IPerlLIO2Host(struct IPerlLIO* piPerl)
249{
250 return STRUCT2PTR(piPerl, m_hostperlLIO);
251}
252
253inline CPerlHost* IPerlDir2Host(struct IPerlDir* piPerl)
254{
255 return STRUCT2PTR(piPerl, m_hostperlDir);
256}
257
258inline CPerlHost* IPerlSock2Host(struct IPerlSock* piPerl)
259{
260 return STRUCT2PTR(piPerl, m_hostperlSock);
261}
262
263inline CPerlHost* IPerlProc2Host(struct IPerlProc* piPerl)
264{
265 return STRUCT2PTR(piPerl, m_hostperlProc);
266}
267
268
269
270#undef IPERL2HOST
271#define IPERL2HOST(x) IPerlMem2Host(x)
272
273/* IPerlMem */
274void*
275PerlMemMalloc(struct IPerlMem* piPerl, size_t size)
276{
277 return IPERL2HOST(piPerl)->Malloc(size);
278}
279void*
280PerlMemRealloc(struct IPerlMem* piPerl, void* ptr, size_t size)
281{
282 return IPERL2HOST(piPerl)->Realloc(ptr, size);
283}
284void
285PerlMemFree(struct IPerlMem* piPerl, void* ptr)
286{
287 IPERL2HOST(piPerl)->Free(ptr);
288}
289void*
290PerlMemCalloc(struct IPerlMem* piPerl, size_t num, size_t size)
291{
292 return IPERL2HOST(piPerl)->Calloc(num, size);
293}
294
295void
296PerlMemGetLock(struct IPerlMem* piPerl)
297{
298 IPERL2HOST(piPerl)->GetLock();
299}
300
301void
302PerlMemFreeLock(struct IPerlMem* piPerl)
303{
304 IPERL2HOST(piPerl)->FreeLock();
305}
306
307int
308PerlMemIsLocked(struct IPerlMem* piPerl)
309{
310 return IPERL2HOST(piPerl)->IsLocked();
311}
312
313struct IPerlMem perlMem =
314{
315 PerlMemMalloc,
316 PerlMemRealloc,
317 PerlMemFree,
318 PerlMemCalloc,
319 PerlMemGetLock,
320 PerlMemFreeLock,
321 PerlMemIsLocked,
322};
323
324#undef IPERL2HOST
325#define IPERL2HOST(x) IPerlMemShared2Host(x)
326
327/* IPerlMemShared */
328void*
329PerlMemSharedMalloc(struct IPerlMem* piPerl, size_t size)
330{
331 return IPERL2HOST(piPerl)->MallocShared(size);
332}
333void*
334PerlMemSharedRealloc(struct IPerlMem* piPerl, void* ptr, size_t size)
335{
336 return IPERL2HOST(piPerl)->ReallocShared(ptr, size);
337}
338void
339PerlMemSharedFree(struct IPerlMem* piPerl, void* ptr)
340{
341 IPERL2HOST(piPerl)->FreeShared(ptr);
342}
343void*
344PerlMemSharedCalloc(struct IPerlMem* piPerl, size_t num, size_t size)
345{
346 return IPERL2HOST(piPerl)->CallocShared(num, size);
347}
348
349void
350PerlMemSharedGetLock(struct IPerlMem* piPerl)
351{
352 IPERL2HOST(piPerl)->GetLockShared();
353}
354
355void
356PerlMemSharedFreeLock(struct IPerlMem* piPerl)
357{
358 IPERL2HOST(piPerl)->FreeLockShared();
359}
360
361int
362PerlMemSharedIsLocked(struct IPerlMem* piPerl)
363{
364 return IPERL2HOST(piPerl)->IsLockedShared();
365}
366
367struct IPerlMem perlMemShared =
368{
369 PerlMemSharedMalloc,
370 PerlMemSharedRealloc,
371 PerlMemSharedFree,
372 PerlMemSharedCalloc,
373 PerlMemSharedGetLock,
374 PerlMemSharedFreeLock,
375 PerlMemSharedIsLocked,
376};
377
378#undef IPERL2HOST
379#define IPERL2HOST(x) IPerlMemParse2Host(x)
380
381/* IPerlMemParse */
382void*
383PerlMemParseMalloc(struct IPerlMem* piPerl, size_t size)
384{
385 return IPERL2HOST(piPerl)->MallocParse(size);
386}
387void*
388PerlMemParseRealloc(struct IPerlMem* piPerl, void* ptr, size_t size)
389{
390 return IPERL2HOST(piPerl)->ReallocParse(ptr, size);
391}
392void
393PerlMemParseFree(struct IPerlMem* piPerl, void* ptr)
394{
395 IPERL2HOST(piPerl)->FreeParse(ptr);
396}
397void*
398PerlMemParseCalloc(struct IPerlMem* piPerl, size_t num, size_t size)
399{
400 return IPERL2HOST(piPerl)->CallocParse(num, size);
401}
402
403void
404PerlMemParseGetLock(struct IPerlMem* piPerl)
405{
406 IPERL2HOST(piPerl)->GetLockParse();
407}
408
409void
410PerlMemParseFreeLock(struct IPerlMem* piPerl)
411{
412 IPERL2HOST(piPerl)->FreeLockParse();
413}
414
415int
416PerlMemParseIsLocked(struct IPerlMem* piPerl)
417{
418 return IPERL2HOST(piPerl)->IsLockedParse();
419}
420
421struct IPerlMem perlMemParse =
422{
423 PerlMemParseMalloc,
424 PerlMemParseRealloc,
425 PerlMemParseFree,
426 PerlMemParseCalloc,
427 PerlMemParseGetLock,
428 PerlMemParseFreeLock,
429 PerlMemParseIsLocked,
430};
431
432
433#undef IPERL2HOST
434#define IPERL2HOST(x) IPerlEnv2Host(x)
435
436/* IPerlEnv */
437char*
438PerlEnvGetenv(struct IPerlEnv* piPerl, const char *varname)
439{
440 return IPERL2HOST(piPerl)->Getenv(varname);
441};
442
443int
444PerlEnvPutenv(struct IPerlEnv* piPerl, const char *envstring)
445{
446 return IPERL2HOST(piPerl)->Putenv(envstring);
447};
448
449char*
450PerlEnvGetenv_len(struct IPerlEnv* piPerl, const char* varname, unsigned long* len)
451{
452 return IPERL2HOST(piPerl)->Getenv(varname, len);
453}
454
455int
456PerlEnvUname(struct IPerlEnv* piPerl, struct utsname *name)
457{
458 return win32_uname(name);
459}
460
461void
462PerlEnvClearenv(struct IPerlEnv* piPerl)
463{
464 IPERL2HOST(piPerl)->Clearenv();
465}
466
467void*
468PerlEnvGetChildenv(struct IPerlEnv* piPerl)
469{
470 return IPERL2HOST(piPerl)->CreateChildEnv();
471}
472
473void
474PerlEnvFreeChildenv(struct IPerlEnv* piPerl, void* childEnv)
475{
476 IPERL2HOST(piPerl)->FreeChildEnv(childEnv);
477}
478
479char*
480PerlEnvGetChilddir(struct IPerlEnv* piPerl)
481{
482 return IPERL2HOST(piPerl)->GetChildDir();
483}
484
485void
486PerlEnvFreeChilddir(struct IPerlEnv* piPerl, char* childDir)
487{
488 IPERL2HOST(piPerl)->FreeChildDir(childDir);
489}
490
491unsigned long
492PerlEnvOsId(struct IPerlEnv* piPerl)
493{
494 return win32_os_id();
495}
496
497char*
4ea817c6 498PerlEnvLibPath(struct IPerlEnv* piPerl, const char *pl)
7766f137 499{
500 return g_win32_get_privlib(pl);
501}
502
503char*
4ea817c6 504PerlEnvSiteLibPath(struct IPerlEnv* piPerl, const char *pl)
7766f137 505{
506 return g_win32_get_sitelib(pl);
507}
508
4ea817c6 509char*
510PerlEnvVendorLibPath(struct IPerlEnv* piPerl, const char *pl)
511{
512 return g_win32_get_vendorlib(pl);
513}
514
635bbe87 515void
516PerlEnvGetChildIO(struct IPerlEnv* piPerl, child_IO_table* ptr)
517{
518 win32_get_child_IO(ptr);
519}
520
f3dccfae 521struct IPerlEnv perlEnv =
7766f137 522{
523 PerlEnvGetenv,
524 PerlEnvPutenv,
525 PerlEnvGetenv_len,
526 PerlEnvUname,
527 PerlEnvClearenv,
528 PerlEnvGetChildenv,
529 PerlEnvFreeChildenv,
530 PerlEnvGetChilddir,
531 PerlEnvFreeChilddir,
532 PerlEnvOsId,
533 PerlEnvLibPath,
534 PerlEnvSiteLibPath,
4ea817c6 535 PerlEnvVendorLibPath,
635bbe87 536 PerlEnvGetChildIO,
7766f137 537};
538
539#undef IPERL2HOST
540#define IPERL2HOST(x) IPerlStdIO2Host(x)
541
542/* PerlStdIO */
adb71456 543FILE*
7766f137 544PerlStdIOStdin(struct IPerlStdIO* piPerl)
545{
adb71456 546 return win32_stdin();
7766f137 547}
548
adb71456 549FILE*
7766f137 550PerlStdIOStdout(struct IPerlStdIO* piPerl)
551{
adb71456 552 return win32_stdout();
7766f137 553}
554
adb71456 555FILE*
7766f137 556PerlStdIOStderr(struct IPerlStdIO* piPerl)
557{
adb71456 558 return win32_stderr();
7766f137 559}
560
adb71456 561FILE*
7766f137 562PerlStdIOOpen(struct IPerlStdIO* piPerl, const char *path, const char *mode)
563{
adb71456 564 return win32_fopen(path, mode);
7766f137 565}
566
567int
adb71456 568PerlStdIOClose(struct IPerlStdIO* piPerl, FILE* pf)
7766f137 569{
adb71456 570 return win32_fclose((pf));
7766f137 571}
572
573int
adb71456 574PerlStdIOEof(struct IPerlStdIO* piPerl, FILE* pf)
7766f137 575{
adb71456 576 return win32_feof(pf);
7766f137 577}
578
579int
adb71456 580PerlStdIOError(struct IPerlStdIO* piPerl, FILE* pf)
7766f137 581{
adb71456 582 return win32_ferror(pf);
7766f137 583}
584
585void
adb71456 586PerlStdIOClearerr(struct IPerlStdIO* piPerl, FILE* pf)
7766f137 587{
adb71456 588 win32_clearerr(pf);
7766f137 589}
590
591int
adb71456 592PerlStdIOGetc(struct IPerlStdIO* piPerl, FILE* pf)
7766f137 593{
adb71456 594 return win32_getc(pf);
7766f137 595}
596
597char*
adb71456 598PerlStdIOGetBase(struct IPerlStdIO* piPerl, FILE* pf)
7766f137 599{
600#ifdef FILE_base
adb71456 601 FILE *f = pf;
7766f137 602 return FILE_base(f);
603#else
604 return Nullch;
605#endif
606}
607
608int
adb71456 609PerlStdIOGetBufsiz(struct IPerlStdIO* piPerl, FILE* pf)
7766f137 610{
611#ifdef FILE_bufsiz
adb71456 612 FILE *f = pf;
7766f137 613 return FILE_bufsiz(f);
614#else
615 return (-1);
616#endif
617}
618
619int
adb71456 620PerlStdIOGetCnt(struct IPerlStdIO* piPerl, FILE* pf)
7766f137 621{
622#ifdef USE_STDIO_PTR
adb71456 623 FILE *f = pf;
7766f137 624 return FILE_cnt(f);
625#else
626 return (-1);
627#endif
628}
629
630char*
adb71456 631PerlStdIOGetPtr(struct IPerlStdIO* piPerl, FILE* pf)
7766f137 632{
633#ifdef USE_STDIO_PTR
adb71456 634 FILE *f = pf;
7766f137 635 return FILE_ptr(f);
636#else
637 return Nullch;
638#endif
639}
640
641char*
adb71456 642PerlStdIOGets(struct IPerlStdIO* piPerl, FILE* pf, char* s, int n)
7766f137 643{
adb71456 644 return win32_fgets(s, n, pf);
7766f137 645}
646
647int
adb71456 648PerlStdIOPutc(struct IPerlStdIO* piPerl, FILE* pf, int c)
7766f137 649{
adb71456 650 return win32_fputc(c, pf);
7766f137 651}
652
653int
adb71456 654PerlStdIOPuts(struct IPerlStdIO* piPerl, FILE* pf, const char *s)
7766f137 655{
adb71456 656 return win32_fputs(s, pf);
7766f137 657}
658
659int
adb71456 660PerlStdIOFlush(struct IPerlStdIO* piPerl, FILE* pf)
7766f137 661{
adb71456 662 return win32_fflush(pf);
7766f137 663}
664
665int
adb71456 666PerlStdIOUngetc(struct IPerlStdIO* piPerl,int c, FILE* pf)
7766f137 667{
adb71456 668 return win32_ungetc(c, pf);
7766f137 669}
670
671int
adb71456 672PerlStdIOFileno(struct IPerlStdIO* piPerl, FILE* pf)
7766f137 673{
adb71456 674 return win32_fileno(pf);
7766f137 675}
676
adb71456 677FILE*
7766f137 678PerlStdIOFdopen(struct IPerlStdIO* piPerl, int fd, const char *mode)
679{
adb71456 680 return win32_fdopen(fd, mode);
7766f137 681}
682
adb71456 683FILE*
684PerlStdIOReopen(struct IPerlStdIO* piPerl, const char*path, const char*mode, FILE* pf)
7766f137 685{
adb71456 686 return win32_freopen(path, mode, (FILE*)pf);
7766f137 687}
688
689SSize_t
adb71456 690PerlStdIORead(struct IPerlStdIO* piPerl, void *buffer, Size_t size, Size_t count, FILE* pf)
7766f137 691{
adb71456 692 return win32_fread(buffer, size, count, pf);
7766f137 693}
694
695SSize_t
adb71456 696PerlStdIOWrite(struct IPerlStdIO* piPerl, const void *buffer, Size_t size, Size_t count, FILE* pf)
7766f137 697{
adb71456 698 return win32_fwrite(buffer, size, count, pf);
7766f137 699}
700
701void
adb71456 702PerlStdIOSetBuf(struct IPerlStdIO* piPerl, FILE* pf, char* buffer)
7766f137 703{
adb71456 704 win32_setbuf(pf, buffer);
7766f137 705}
706
707int
adb71456 708PerlStdIOSetVBuf(struct IPerlStdIO* piPerl, FILE* pf, char* buffer, int type, Size_t size)
7766f137 709{
adb71456 710 return win32_setvbuf(pf, buffer, type, size);
7766f137 711}
712
713void
adb71456 714PerlStdIOSetCnt(struct IPerlStdIO* piPerl, FILE* pf, int n)
7766f137 715{
716#ifdef STDIO_CNT_LVALUE
adb71456 717 FILE *f = pf;
7766f137 718 FILE_cnt(f) = n;
719#endif
720}
721
722void
adb71456 723PerlStdIOSetPtr(struct IPerlStdIO* piPerl, FILE* pf, char * ptr)
7766f137 724{
725#ifdef STDIO_PTR_LVALUE
adb71456 726 FILE *f = pf;
7766f137 727 FILE_ptr(f) = ptr;
7766f137 728#endif
729}
730
731void
adb71456 732PerlStdIOSetlinebuf(struct IPerlStdIO* piPerl, FILE* pf)
7766f137 733{
adb71456 734 win32_setvbuf(pf, NULL, _IOLBF, 0);
7766f137 735}
736
737int
adb71456 738PerlStdIOPrintf(struct IPerlStdIO* piPerl, FILE* pf, const char *format,...)
7766f137 739{
740 va_list(arglist);
741 va_start(arglist, format);
adb71456 742 return win32_vfprintf(pf, format, arglist);
7766f137 743}
744
745int
adb71456 746PerlStdIOVprintf(struct IPerlStdIO* piPerl, FILE* pf, const char *format, va_list arglist)
7766f137 747{
adb71456 748 return win32_vfprintf(pf, format, arglist);
7766f137 749}
750
751long
adb71456 752PerlStdIOTell(struct IPerlStdIO* piPerl, FILE* pf)
7766f137 753{
adb71456 754 return win32_ftell(pf);
7766f137 755}
756
757int
adb71456 758PerlStdIOSeek(struct IPerlStdIO* piPerl, FILE* pf, off_t offset, int origin)
7766f137 759{
adb71456 760 return win32_fseek(pf, offset, origin);
7766f137 761}
762
763void
adb71456 764PerlStdIORewind(struct IPerlStdIO* piPerl, FILE* pf)
7766f137 765{
adb71456 766 win32_rewind(pf);
7766f137 767}
768
adb71456 769FILE*
7766f137 770PerlStdIOTmpfile(struct IPerlStdIO* piPerl)
771{
adb71456 772 return win32_tmpfile();
7766f137 773}
774
775int
adb71456 776PerlStdIOGetpos(struct IPerlStdIO* piPerl, FILE* pf, Fpos_t *p)
7766f137 777{
adb71456 778 return win32_fgetpos(pf, p);
7766f137 779}
780
781int
adb71456 782PerlStdIOSetpos(struct IPerlStdIO* piPerl, FILE* pf, const Fpos_t *p)
7766f137 783{
adb71456 784 return win32_fsetpos(pf, p);
7766f137 785}
786void
787PerlStdIOInit(struct IPerlStdIO* piPerl)
788{
789}
790
791void
792PerlStdIOInitOSExtras(struct IPerlStdIO* piPerl)
793{
794 Perl_init_os_extras();
795}
796
797int
798PerlStdIOOpenOSfhandle(struct IPerlStdIO* piPerl, long osfhandle, int flags)
799{
800 return win32_open_osfhandle(osfhandle, flags);
801}
802
803int
804PerlStdIOGetOSfhandle(struct IPerlStdIO* piPerl, int filenum)
805{
806 return win32_get_osfhandle(filenum);
807}
808
adb71456 809FILE*
810PerlStdIOFdupopen(struct IPerlStdIO* piPerl, FILE* pf)
7766f137 811{
adb71456 812 FILE* pfdup;
7766f137 813 fpos_t pos;
814 char mode[3];
adb71456 815 int fileno = win32_dup(win32_fileno(pf));
7766f137 816
817 /* open the file in the same mode */
4ce4f76e 818#ifdef __BORLANDC__
adb71456 819 if((pf)->flags & _F_READ) {
4ce4f76e 820 mode[0] = 'r';
821 mode[1] = 0;
822 }
adb71456 823 else if((pf)->flags & _F_WRIT) {
4ce4f76e 824 mode[0] = 'a';
825 mode[1] = 0;
826 }
adb71456 827 else if((pf)->flags & _F_RDWR) {
4ce4f76e 828 mode[0] = 'r';
829 mode[1] = '+';
830 mode[2] = 0;
831 }
832#else
adb71456 833 if((pf)->_flag & _IOREAD) {
7766f137 834 mode[0] = 'r';
835 mode[1] = 0;
836 }
adb71456 837 else if((pf)->_flag & _IOWRT) {
7766f137 838 mode[0] = 'a';
839 mode[1] = 0;
840 }
adb71456 841 else if((pf)->_flag & _IORW) {
7766f137 842 mode[0] = 'r';
843 mode[1] = '+';
844 mode[2] = 0;
845 }
4ce4f76e 846#endif
7766f137 847
f3dccfae 848 /* it appears that the binmode is attached to the
7766f137 849 * file descriptor so binmode files will be handled
850 * correctly
851 */
adb71456 852 pfdup = win32_fdopen(fileno, mode);
7766f137 853
854 /* move the file pointer to the same position */
adb71456 855 if (!fgetpos(pf, &pos)) {
856 fsetpos(pfdup, &pos);
7766f137 857 }
858 return pfdup;
859}
860
f3dccfae 861struct IPerlStdIO perlStdIO =
7766f137 862{
863 PerlStdIOStdin,
864 PerlStdIOStdout,
865 PerlStdIOStderr,
866 PerlStdIOOpen,
867 PerlStdIOClose,
868 PerlStdIOEof,
869 PerlStdIOError,
870 PerlStdIOClearerr,
871 PerlStdIOGetc,
872 PerlStdIOGetBase,
873 PerlStdIOGetBufsiz,
874 PerlStdIOGetCnt,
875 PerlStdIOGetPtr,
876 PerlStdIOGets,
877 PerlStdIOPutc,
878 PerlStdIOPuts,
879 PerlStdIOFlush,
880 PerlStdIOUngetc,
881 PerlStdIOFileno,
882 PerlStdIOFdopen,
883 PerlStdIOReopen,
884 PerlStdIORead,
885 PerlStdIOWrite,
886 PerlStdIOSetBuf,
887 PerlStdIOSetVBuf,
888 PerlStdIOSetCnt,
adb71456 889 PerlStdIOSetPtr,
7766f137 890 PerlStdIOSetlinebuf,
891 PerlStdIOPrintf,
892 PerlStdIOVprintf,
893 PerlStdIOTell,
894 PerlStdIOSeek,
895 PerlStdIORewind,
896 PerlStdIOTmpfile,
897 PerlStdIOGetpos,
898 PerlStdIOSetpos,
899 PerlStdIOInit,
900 PerlStdIOInitOSExtras,
901 PerlStdIOFdupopen,
902};
903
904
905#undef IPERL2HOST
906#define IPERL2HOST(x) IPerlLIO2Host(x)
907
908/* IPerlLIO */
909int
910PerlLIOAccess(struct IPerlLIO* piPerl, const char *path, int mode)
911{
912 return win32_access(path, mode);
913}
914
915int
916PerlLIOChmod(struct IPerlLIO* piPerl, const char *filename, int pmode)
917{
918 return win32_chmod(filename, pmode);
919}
920
921int
922PerlLIOChown(struct IPerlLIO* piPerl, const char *filename, uid_t owner, gid_t group)
923{
924 return chown(filename, owner, group);
925}
926
927int
928PerlLIOChsize(struct IPerlLIO* piPerl, int handle, long size)
929{
930 return chsize(handle, size);
931}
932
933int
934PerlLIOClose(struct IPerlLIO* piPerl, int handle)
935{
936 return win32_close(handle);
937}
938
939int
940PerlLIODup(struct IPerlLIO* piPerl, int handle)
941{
942 return win32_dup(handle);
943}
944
945int
946PerlLIODup2(struct IPerlLIO* piPerl, int handle1, int handle2)
947{
948 return win32_dup2(handle1, handle2);
949}
950
951int
952PerlLIOFlock(struct IPerlLIO* piPerl, int fd, int oper)
953{
954 return win32_flock(fd, oper);
955}
956
957int
958PerlLIOFileStat(struct IPerlLIO* piPerl, int handle, struct stat *buffer)
959{
1889e8b0 960 return win32_fstat(handle, buffer);
7766f137 961}
962
963int
964PerlLIOIOCtl(struct IPerlLIO* piPerl, int i, unsigned int u, char *data)
965{
966 return win32_ioctlsocket((SOCKET)i, (long)u, (u_long*)data);
967}
968
969int
970PerlLIOIsatty(struct IPerlLIO* piPerl, int fd)
971{
972 return isatty(fd);
973}
974
975int
976PerlLIOLink(struct IPerlLIO* piPerl, const char*oldname, const char *newname)
977{
978 return win32_link(oldname, newname);
979}
980
981long
982PerlLIOLseek(struct IPerlLIO* piPerl, int handle, long offset, int origin)
983{
984 return win32_lseek(handle, offset, origin);
985}
986
987int
988PerlLIOLstat(struct IPerlLIO* piPerl, const char *path, struct stat *buffer)
989{
990 return win32_stat(path, buffer);
991}
992
993char*
994PerlLIOMktemp(struct IPerlLIO* piPerl, char *Template)
995{
996 return mktemp(Template);
997}
998
999int
1000PerlLIOOpen(struct IPerlLIO* piPerl, const char *filename, int oflag)
1001{
1002 return win32_open(filename, oflag);
1003}
1004
1005int
1006PerlLIOOpen3(struct IPerlLIO* piPerl, const char *filename, int oflag, int pmode)
1007{
1008 return win32_open(filename, oflag, pmode);
1009}
1010
1011int
1012PerlLIORead(struct IPerlLIO* piPerl, int handle, void *buffer, unsigned int count)
1013{
1014 return win32_read(handle, buffer, count);
1015}
1016
1017int
1018PerlLIORename(struct IPerlLIO* piPerl, const char *OldFileName, const char *newname)
1019{
1020 return win32_rename(OldFileName, newname);
1021}
1022
1023int
1024PerlLIOSetmode(struct IPerlLIO* piPerl, int handle, int mode)
1025{
1026 return win32_setmode(handle, mode);
1027}
1028
1029int
1030PerlLIONameStat(struct IPerlLIO* piPerl, const char *path, struct stat *buffer)
1031{
1032 return win32_stat(path, buffer);
1033}
1034
1035char*
1036PerlLIOTmpnam(struct IPerlLIO* piPerl, char *string)
1037{
1038 return tmpnam(string);
1039}
1040
1041int
1042PerlLIOUmask(struct IPerlLIO* piPerl, int pmode)
1043{
1044 return umask(pmode);
1045}
1046
1047int
1048PerlLIOUnlink(struct IPerlLIO* piPerl, const char *filename)
1049{
1050 return win32_unlink(filename);
1051}
1052
1053int
1054PerlLIOUtime(struct IPerlLIO* piPerl, char *filename, struct utimbuf *times)
1055{
1056 return win32_utime(filename, times);
1057}
1058
1059int
1060PerlLIOWrite(struct IPerlLIO* piPerl, int handle, const void *buffer, unsigned int count)
1061{
1062 return win32_write(handle, buffer, count);
1063}
1064
1065struct IPerlLIO perlLIO =
1066{
1067 PerlLIOAccess,
1068 PerlLIOChmod,
1069 PerlLIOChown,
1070 PerlLIOChsize,
1071 PerlLIOClose,
1072 PerlLIODup,
1073 PerlLIODup2,
1074 PerlLIOFlock,
1075 PerlLIOFileStat,
1076 PerlLIOIOCtl,
1077 PerlLIOIsatty,
1078 PerlLIOLink,
1079 PerlLIOLseek,
1080 PerlLIOLstat,
1081 PerlLIOMktemp,
1082 PerlLIOOpen,
1083 PerlLIOOpen3,
1084 PerlLIORead,
1085 PerlLIORename,
1086 PerlLIOSetmode,
1087 PerlLIONameStat,
1088 PerlLIOTmpnam,
1089 PerlLIOUmask,
1090 PerlLIOUnlink,
1091 PerlLIOUtime,
1092 PerlLIOWrite,
1093};
1094
1095
1096#undef IPERL2HOST
1097#define IPERL2HOST(x) IPerlDir2Host(x)
1098
1099/* IPerlDIR */
1100int
1101PerlDirMakedir(struct IPerlDir* piPerl, const char *dirname, int mode)
1102{
1103 return win32_mkdir(dirname, mode);
1104}
1105
1106int
1107PerlDirChdir(struct IPerlDir* piPerl, const char *dirname)
1108{
1109 return IPERL2HOST(piPerl)->Chdir(dirname);
1110}
1111
1112int
1113PerlDirRmdir(struct IPerlDir* piPerl, const char *dirname)
1114{
1115 return win32_rmdir(dirname);
1116}
1117
1118int
1119PerlDirClose(struct IPerlDir* piPerl, DIR *dirp)
1120{
1121 return win32_closedir(dirp);
1122}
1123
1124DIR*
1125PerlDirOpen(struct IPerlDir* piPerl, char *filename)
1126{
1127 return win32_opendir(filename);
1128}
1129
1130struct direct *
1131PerlDirRead(struct IPerlDir* piPerl, DIR *dirp)
1132{
1133 return win32_readdir(dirp);
1134}
1135
1136void
1137PerlDirRewind(struct IPerlDir* piPerl, DIR *dirp)
1138{
1139 win32_rewinddir(dirp);
1140}
1141
1142void
1143PerlDirSeek(struct IPerlDir* piPerl, DIR *dirp, long loc)
1144{
1145 win32_seekdir(dirp, loc);
1146}
1147
1148long
1149PerlDirTell(struct IPerlDir* piPerl, DIR *dirp)
1150{
1151 return win32_telldir(dirp);
1152}
1153
1154char*
1155PerlDirMapPathA(struct IPerlDir* piPerl, const char* path)
1156{
1157 return IPERL2HOST(piPerl)->MapPathA(path);
1158}
1159
1160WCHAR*
1161PerlDirMapPathW(struct IPerlDir* piPerl, const WCHAR* path)
1162{
1163 return IPERL2HOST(piPerl)->MapPathW(path);
1164}
1165
1166struct IPerlDir perlDir =
1167{
1168 PerlDirMakedir,
1169 PerlDirChdir,
1170 PerlDirRmdir,
1171 PerlDirClose,
1172 PerlDirOpen,
1173 PerlDirRead,
1174 PerlDirRewind,
1175 PerlDirSeek,
1176 PerlDirTell,
1177 PerlDirMapPathA,
1178 PerlDirMapPathW,
1179};
1180
1181
1182/* IPerlSock */
1183u_long
1184PerlSockHtonl(struct IPerlSock* piPerl, u_long hostlong)
1185{
1186 return win32_htonl(hostlong);
1187}
1188
1189u_short
1190PerlSockHtons(struct IPerlSock* piPerl, u_short hostshort)
1191{
1192 return win32_htons(hostshort);
1193}
1194
1195u_long
1196PerlSockNtohl(struct IPerlSock* piPerl, u_long netlong)
1197{
1198 return win32_ntohl(netlong);
1199}
1200
1201u_short
1202PerlSockNtohs(struct IPerlSock* piPerl, u_short netshort)
1203{
1204 return win32_ntohs(netshort);
1205}
1206
1207SOCKET PerlSockAccept(struct IPerlSock* piPerl, SOCKET s, struct sockaddr* addr, int* addrlen)
1208{
1209 return win32_accept(s, addr, addrlen);
1210}
1211
1212int
1213PerlSockBind(struct IPerlSock* piPerl, SOCKET s, const struct sockaddr* name, int namelen)
1214{
1215 return win32_bind(s, name, namelen);
1216}
1217
1218int
1219PerlSockConnect(struct IPerlSock* piPerl, SOCKET s, const struct sockaddr* name, int namelen)
1220{
1221 return win32_connect(s, name, namelen);
1222}
1223
1224void
1225PerlSockEndhostent(struct IPerlSock* piPerl)
1226{
1227 win32_endhostent();
1228}
1229
1230void
1231PerlSockEndnetent(struct IPerlSock* piPerl)
1232{
1233 win32_endnetent();
1234}
1235
1236void
1237PerlSockEndprotoent(struct IPerlSock* piPerl)
1238{
1239 win32_endprotoent();
1240}
1241
1242void
1243PerlSockEndservent(struct IPerlSock* piPerl)
1244{
1245 win32_endservent();
1246}
1247
1248struct hostent*
1249PerlSockGethostbyaddr(struct IPerlSock* piPerl, const char* addr, int len, int type)
1250{
1251 return win32_gethostbyaddr(addr, len, type);
1252}
1253
1254struct hostent*
1255PerlSockGethostbyname(struct IPerlSock* piPerl, const char* name)
1256{
1257 return win32_gethostbyname(name);
1258}
1259
1260struct hostent*
1261PerlSockGethostent(struct IPerlSock* piPerl)
1262{
acfe0abc 1263 dTHX;
7766f137 1264 Perl_croak(aTHX_ "gethostent not implemented!\n");
1265 return NULL;
1266}
1267
1268int
1269PerlSockGethostname(struct IPerlSock* piPerl, char* name, int namelen)
1270{
1271 return win32_gethostname(name, namelen);
1272}
1273
1274struct netent *
1275PerlSockGetnetbyaddr(struct IPerlSock* piPerl, long net, int type)
1276{
1277 return win32_getnetbyaddr(net, type);
1278}
1279
1280struct netent *
1281PerlSockGetnetbyname(struct IPerlSock* piPerl, const char *name)
1282{
1283 return win32_getnetbyname((char*)name);
1284}
1285
1286struct netent *
1287PerlSockGetnetent(struct IPerlSock* piPerl)
1288{
1289 return win32_getnetent();
1290}
1291
1292int PerlSockGetpeername(struct IPerlSock* piPerl, SOCKET s, struct sockaddr* name, int* namelen)
1293{
1294 return win32_getpeername(s, name, namelen);
1295}
1296
1297struct protoent*
1298PerlSockGetprotobyname(struct IPerlSock* piPerl, const char* name)
1299{
1300 return win32_getprotobyname(name);
1301}
1302
1303struct protoent*
1304PerlSockGetprotobynumber(struct IPerlSock* piPerl, int number)
1305{
1306 return win32_getprotobynumber(number);
1307}
1308
1309struct protoent*
1310PerlSockGetprotoent(struct IPerlSock* piPerl)
1311{
1312 return win32_getprotoent();
1313}
1314
1315struct servent*
1316PerlSockGetservbyname(struct IPerlSock* piPerl, const char* name, const char* proto)
1317{
1318 return win32_getservbyname(name, proto);
1319}
1320
1321struct servent*
1322PerlSockGetservbyport(struct IPerlSock* piPerl, int port, const char* proto)
1323{
1324 return win32_getservbyport(port, proto);
1325}
1326
1327struct servent*
1328PerlSockGetservent(struct IPerlSock* piPerl)
1329{
1330 return win32_getservent();
1331}
1332
1333int
1334PerlSockGetsockname(struct IPerlSock* piPerl, SOCKET s, struct sockaddr* name, int* namelen)
1335{
1336 return win32_getsockname(s, name, namelen);
1337}
1338
1339int
1340PerlSockGetsockopt(struct IPerlSock* piPerl, SOCKET s, int level, int optname, char* optval, int* optlen)
1341{
1342 return win32_getsockopt(s, level, optname, optval, optlen);
1343}
1344
1345unsigned long
1346PerlSockInetAddr(struct IPerlSock* piPerl, const char* cp)
1347{
1348 return win32_inet_addr(cp);
1349}
1350
1351char*
1352PerlSockInetNtoa(struct IPerlSock* piPerl, struct in_addr in)
1353{
1354 return win32_inet_ntoa(in);
1355}
1356
1357int
1358PerlSockListen(struct IPerlSock* piPerl, SOCKET s, int backlog)
1359{
1360 return win32_listen(s, backlog);
1361}
1362
1363int
1364PerlSockRecv(struct IPerlSock* piPerl, SOCKET s, char* buffer, int len, int flags)
1365{
1366 return win32_recv(s, buffer, len, flags);
1367}
1368
1369int
1370PerlSockRecvfrom(struct IPerlSock* piPerl, SOCKET s, char* buffer, int len, int flags, struct sockaddr* from, int* fromlen)
1371{
1372 return win32_recvfrom(s, buffer, len, flags, from, fromlen);
1373}
1374
1375int
1376PerlSockSelect(struct IPerlSock* piPerl, int nfds, char* readfds, char* writefds, char* exceptfds, const struct timeval* timeout)
1377{
1378 return win32_select(nfds, (Perl_fd_set*)readfds, (Perl_fd_set*)writefds, (Perl_fd_set*)exceptfds, timeout);
1379}
1380
1381int
1382PerlSockSend(struct IPerlSock* piPerl, SOCKET s, const char* buffer, int len, int flags)
1383{
1384 return win32_send(s, buffer, len, flags);
1385}
1386
1387int
1388PerlSockSendto(struct IPerlSock* piPerl, SOCKET s, const char* buffer, int len, int flags, const struct sockaddr* to, int tolen)
1389{
1390 return win32_sendto(s, buffer, len, flags, to, tolen);
1391}
1392
1393void
1394PerlSockSethostent(struct IPerlSock* piPerl, int stayopen)
1395{
1396 win32_sethostent(stayopen);
1397}
1398
1399void
1400PerlSockSetnetent(struct IPerlSock* piPerl, int stayopen)
1401{
1402 win32_setnetent(stayopen);
1403}
1404
1405void
1406PerlSockSetprotoent(struct IPerlSock* piPerl, int stayopen)
1407{
1408 win32_setprotoent(stayopen);
1409}
1410
1411void
1412PerlSockSetservent(struct IPerlSock* piPerl, int stayopen)
1413{
1414 win32_setservent(stayopen);
1415}
1416
1417int
1418PerlSockSetsockopt(struct IPerlSock* piPerl, SOCKET s, int level, int optname, const char* optval, int optlen)
1419{
1420 return win32_setsockopt(s, level, optname, optval, optlen);
1421}
1422
1423int
1424PerlSockShutdown(struct IPerlSock* piPerl, SOCKET s, int how)
1425{
1426 return win32_shutdown(s, how);
1427}
1428
1429SOCKET
1430PerlSockSocket(struct IPerlSock* piPerl, int af, int type, int protocol)
1431{
1432 return win32_socket(af, type, protocol);
1433}
1434
1435int
1436PerlSockSocketpair(struct IPerlSock* piPerl, int domain, int type, int protocol, int* fds)
1437{
acfe0abc 1438 dTHX;
7766f137 1439 Perl_croak(aTHX_ "socketpair not implemented!\n");
1440 return 0;
1441}
1442
1443int
1444PerlSockClosesocket(struct IPerlSock* piPerl, SOCKET s)
1445{
1446 return win32_closesocket(s);
1447}
1448
1449int
1450PerlSockIoctlsocket(struct IPerlSock* piPerl, SOCKET s, long cmd, u_long *argp)
1451{
1452 return win32_ioctlsocket(s, cmd, argp);
1453}
1454
1455struct IPerlSock perlSock =
1456{
1457 PerlSockHtonl,
1458 PerlSockHtons,
1459 PerlSockNtohl,
1460 PerlSockNtohs,
1461 PerlSockAccept,
1462 PerlSockBind,
1463 PerlSockConnect,
1464 PerlSockEndhostent,
1465 PerlSockEndnetent,
1466 PerlSockEndprotoent,
1467 PerlSockEndservent,
1468 PerlSockGethostname,
1469 PerlSockGetpeername,
1470 PerlSockGethostbyaddr,
1471 PerlSockGethostbyname,
1472 PerlSockGethostent,
1473 PerlSockGetnetbyaddr,
1474 PerlSockGetnetbyname,
1475 PerlSockGetnetent,
1476 PerlSockGetprotobyname,
1477 PerlSockGetprotobynumber,
1478 PerlSockGetprotoent,
1479 PerlSockGetservbyname,
1480 PerlSockGetservbyport,
1481 PerlSockGetservent,
1482 PerlSockGetsockname,
1483 PerlSockGetsockopt,
1484 PerlSockInetAddr,
1485 PerlSockInetNtoa,
1486 PerlSockListen,
1487 PerlSockRecv,
1488 PerlSockRecvfrom,
1489 PerlSockSelect,
1490 PerlSockSend,
1491 PerlSockSendto,
1492 PerlSockSethostent,
1493 PerlSockSetnetent,
1494 PerlSockSetprotoent,
1495 PerlSockSetservent,
1496 PerlSockSetsockopt,
1497 PerlSockShutdown,
1498 PerlSockSocket,
1499 PerlSockSocketpair,
1500 PerlSockClosesocket,
1501};
1502
1503
1504/* IPerlProc */
1505
1506#define EXECF_EXEC 1
1507#define EXECF_SPAWN 2
1508
1509void
1510PerlProcAbort(struct IPerlProc* piPerl)
1511{
1512 win32_abort();
1513}
1514
1515char *
1516PerlProcCrypt(struct IPerlProc* piPerl, const char* clear, const char* salt)
1517{
1518 return win32_crypt(clear, salt);
1519}
1520
1521void
1522PerlProcExit(struct IPerlProc* piPerl, int status)
1523{
1524 exit(status);
1525}
1526
1527void
1528PerlProc_Exit(struct IPerlProc* piPerl, int status)
1529{
1530 _exit(status);
1531}
1532
1533int
1534PerlProcExecl(struct IPerlProc* piPerl, const char *cmdname, const char *arg0, const char *arg1, const char *arg2, const char *arg3)
1535{
1536 return execl(cmdname, arg0, arg1, arg2, arg3);
1537}
1538
1539int
1540PerlProcExecv(struct IPerlProc* piPerl, const char *cmdname, const char *const *argv)
1541{
1542 return win32_execvp(cmdname, argv);
1543}
1544
1545int
1546PerlProcExecvp(struct IPerlProc* piPerl, const char *cmdname, const char *const *argv)
1547{
1548 return win32_execvp(cmdname, argv);
1549}
1550
1551uid_t
1552PerlProcGetuid(struct IPerlProc* piPerl)
1553{
1554 return getuid();
1555}
1556
1557uid_t
1558PerlProcGeteuid(struct IPerlProc* piPerl)
1559{
1560 return geteuid();
1561}
1562
1563gid_t
1564PerlProcGetgid(struct IPerlProc* piPerl)
1565{
1566 return getgid();
1567}
1568
1569gid_t
1570PerlProcGetegid(struct IPerlProc* piPerl)
1571{
1572 return getegid();
1573}
1574
1575char *
1576PerlProcGetlogin(struct IPerlProc* piPerl)
1577{
1578 return g_getlogin();
1579}
1580
1581int
1582PerlProcKill(struct IPerlProc* piPerl, int pid, int sig)
1583{
1584 return win32_kill(pid, sig);
1585}
1586
1587int
1588PerlProcKillpg(struct IPerlProc* piPerl, int pid, int sig)
1589{
acfe0abc 1590 dTHX;
7766f137 1591 Perl_croak(aTHX_ "killpg not implemented!\n");
1592 return 0;
1593}
1594
1595int
1596PerlProcPauseProc(struct IPerlProc* piPerl)
1597{
1598 return win32_sleep((32767L << 16) + 32767);
1599}
1600
1601PerlIO*
1602PerlProcPopen(struct IPerlProc* piPerl, const char *command, const char *mode)
1603{
acfe0abc 1604 dTHX;
7766f137 1605 PERL_FLUSHALL_FOR_CHILD;
adb71456 1606 return win32_popen(command, mode);
7766f137 1607}
1608
8c0134a8 1609PerlIO*
1610PerlProcPopenList(struct IPerlProc* piPerl, const char *mode, IV narg, SV **args)
1611{
acfe0abc 1612 dTHX;
8c0134a8 1613 PERL_FLUSHALL_FOR_CHILD;
1614 return win32_popenlist(mode, narg, args);
1615}
1616
7766f137 1617int
1618PerlProcPclose(struct IPerlProc* piPerl, PerlIO *stream)
1619{
adb71456 1620 return win32_pclose(stream);
7766f137 1621}
1622
1623int
1624PerlProcPipe(struct IPerlProc* piPerl, int *phandles)
1625{
1626 return win32_pipe(phandles, 512, O_BINARY);
1627}
1628
1629int
1630PerlProcSetuid(struct IPerlProc* piPerl, uid_t u)
1631{
1632 return setuid(u);
1633}
1634
1635int
1636PerlProcSetgid(struct IPerlProc* piPerl, gid_t g)
1637{
1638 return setgid(g);
1639}
1640
1641int
1642PerlProcSleep(struct IPerlProc* piPerl, unsigned int s)
1643{
1644 return win32_sleep(s);
1645}
1646
1647int
1648PerlProcTimes(struct IPerlProc* piPerl, struct tms *timebuf)
1649{
1650 return win32_times(timebuf);
1651}
1652
1653int
1654PerlProcWait(struct IPerlProc* piPerl, int *status)
1655{
1656 return win32_wait(status);
1657}
1658
1659int
1660PerlProcWaitpid(struct IPerlProc* piPerl, int pid, int *status, int flags)
1661{
1662 return win32_waitpid(pid, status, flags);
1663}
1664
1665Sighandler_t
1666PerlProcSignal(struct IPerlProc* piPerl, int sig, Sighandler_t subcode)
1667{
71d280e3 1668 return signal(sig, subcode);
7766f137 1669}
1670
8454a2ba 1671#ifdef USE_ITHREADS
c00206c8 1672static THREAD_RET_TYPE
7766f137 1673win32_start_child(LPVOID arg)
1674{
1675 PerlInterpreter *my_perl = (PerlInterpreter*)arg;
1676 GV *tmpgv;
1677 int status;
7766f137 1678#ifdef PERL_SYNC_FORK
1679 static long sync_fork_id = 0;
1680 long id = ++sync_fork_id;
1681#endif
1682
1683
ba869deb 1684 PERL_SET_THX(my_perl);
7766f137 1685
1686 /* set $$ to pseudo id */
1687#ifdef PERL_SYNC_FORK
1688 w32_pseudo_id = id;
1689#else
1690 w32_pseudo_id = GetCurrentThreadId();
922b1888 1691 if (IsWin95()) {
1692 int pid = (int)w32_pseudo_id;
1693 if (pid < 0)
1694 w32_pseudo_id = -pid;
1695 }
7766f137 1696#endif
1697 if (tmpgv = gv_fetchpv("$", TRUE, SVt_PV))
1698 sv_setiv(GvSV(tmpgv), -(IV)w32_pseudo_id);
1699 hv_clear(PL_pidstatus);
1700
1701 /* push a zero on the stack (we are the child) */
1702 {
39644a26 1703 dSP;
7766f137 1704 dTARGET;
1705 PUSHi(0);
1706 PUTBACK;
1707 }
1708
1709 /* continue from next op */
1710 PL_op = PL_op->op_next;
1711
1712 {
1713 dJMPENV;
5db10396 1714 volatile int oldscope = PL_scopestack_ix;
7766f137 1715
1716restart:
1717 JMPENV_PUSH(status);
1718 switch (status) {
1719 case 0:
1720 CALLRUNOPS(aTHX);
1721 status = 0;
1722 break;
1723 case 2:
1724 while (PL_scopestack_ix > oldscope)
1725 LEAVE;
1726 FREETMPS;
1727 PL_curstash = PL_defstash;
1728 if (PL_endav && !PL_minus_c)
1729 call_list(oldscope, PL_endav);
1730 status = STATUS_NATIVE_EXPORT;
1731 break;
1732 case 3:
1733 if (PL_restartop) {
1734 POPSTACK_TO(PL_mainstack);
1735 PL_op = PL_restartop;
1736 PL_restartop = Nullop;
1737 goto restart;
1738 }
1739 PerlIO_printf(Perl_error_log, "panic: restartop\n");
1740 FREETMPS;
1741 status = 1;
1742 break;
1743 }
1744 JMPENV_POP;
1745
1746 /* XXX hack to avoid perl_destruct() freeing optree */
1747 PL_main_root = Nullop;
1748 }
1749
1c0ca838 1750 /* close the std handles to avoid fd leaks */
1751 {
1752 do_close(gv_fetchpv("STDIN", TRUE, SVt_PVIO), FALSE);
1753 do_close(gv_fetchpv("STDOUT", TRUE, SVt_PVIO), FALSE);
1754 do_close(gv_fetchpv("STDERR", TRUE, SVt_PVIO), FALSE);
1755 }
1756
7766f137 1757 /* destroy everything (waits for any pseudo-forked children) */
1758 perl_destruct(my_perl);
1759 perl_free(my_perl);
1760
1761#ifdef PERL_SYNC_FORK
1762 return id;
1763#else
1764 return (DWORD)status;
1765#endif
1766}
8454a2ba 1767#endif /* USE_ITHREADS */
7766f137 1768
1769int
1770PerlProcFork(struct IPerlProc* piPerl)
1771{
acfe0abc 1772 dTHX;
8454a2ba 1773#ifdef USE_ITHREADS
7766f137 1774 DWORD id;
1775 HANDLE handle;
7a955601 1776 CPerlHost *h;
1777
1778 if (w32_num_pseudo_children >= MAXIMUM_WAIT_OBJECTS) {
1779 errno = EAGAIN;
1780 return -1;
1781 }
1782 h = new CPerlHost(*(CPerlHost*)w32_internal_host);
acfe0abc 1783 PerlInterpreter *new_perl = perl_clone_using((PerlInterpreter*)aTHX, 1,
7766f137 1784 h->m_pHostperlMem,
1785 h->m_pHostperlMemShared,
1786 h->m_pHostperlMemParse,
1787 h->m_pHostperlEnv,
1788 h->m_pHostperlStdIO,
1789 h->m_pHostperlLIO,
1790 h->m_pHostperlDir,
1791 h->m_pHostperlSock,
1792 h->m_pHostperlProc
1793 );
ad4e2db7 1794 new_perl->Isys_intern.internal_host = h;
8454a2ba 1795# ifdef PERL_SYNC_FORK
7766f137 1796 id = win32_start_child((LPVOID)new_perl);
acfe0abc 1797 PERL_SET_THX(aTHX);
8454a2ba 1798# else
c00206c8 1799# ifdef USE_RTL_THREAD_API
1800 handle = (HANDLE)_beginthreadex((void*)NULL, 0, win32_start_child,
1801 (void*)new_perl, 0, (unsigned*)&id);
1802# else
7766f137 1803 handle = CreateThread(NULL, 0, win32_start_child,
1804 (LPVOID)new_perl, 0, &id);
c00206c8 1805# endif
acfe0abc 1806 PERL_SET_THX(aTHX); /* XXX perl_clone*() set TLS */
60fa28ff 1807 if (!handle) {
1808 errno = EAGAIN;
1809 return -1;
1810 }
922b1888 1811 if (IsWin95()) {
1812 int pid = (int)id;
1813 if (pid < 0)
1814 id = -pid;
1815 }
7766f137 1816 w32_pseudo_child_handles[w32_num_pseudo_children] = handle;
1817 w32_pseudo_child_pids[w32_num_pseudo_children] = id;
1818 ++w32_num_pseudo_children;
8454a2ba 1819# endif
7766f137 1820 return -(int)id;
8454a2ba 1821#else
1822 Perl_croak(aTHX_ "fork() not implemented!\n");
1823 return -1;
1824#endif /* USE_ITHREADS */
7766f137 1825}
1826
1827int
1828PerlProcGetpid(struct IPerlProc* piPerl)
1829{
1830 return win32_getpid();
1831}
1832
1833void*
1834PerlProcDynaLoader(struct IPerlProc* piPerl, const char* filename)
1835{
1836 return win32_dynaload(filename);
1837}
1838
1839void
1840PerlProcGetOSError(struct IPerlProc* piPerl, SV* sv, DWORD dwErr)
1841{
1842 win32_str_os_error(sv, dwErr);
1843}
1844
1845BOOL
1846PerlProcDoCmd(struct IPerlProc* piPerl, char *cmd)
1847{
1848 do_spawn2(cmd, EXECF_EXEC);
1849 return FALSE;
1850}
1851
1852int
1853PerlProcSpawn(struct IPerlProc* piPerl, char* cmds)
1854{
1855 return do_spawn2(cmds, EXECF_SPAWN);
1856}
1857
1858int
1859PerlProcSpawnvp(struct IPerlProc* piPerl, int mode, const char *cmdname, const char *const *argv)
1860{
1861 return win32_spawnvp(mode, cmdname, argv);
1862}
1863
1864int
1865PerlProcASpawn(struct IPerlProc* piPerl, void *vreally, void **vmark, void **vsp)
1866{
1867 return do_aspawn(vreally, vmark, vsp);
1868}
1869
5f1a76d0 1870int
1871PerlProcLastHost(struct IPerlProc* piPerl)
1872{
acfe0abc 1873 dTHX;
5f1a76d0 1874 CPerlHost *h = (CPerlHost*)w32_internal_host;
1875 return h->LastHost();
1876}
1877
7766f137 1878struct IPerlProc perlProc =
1879{
1880 PerlProcAbort,
1881 PerlProcCrypt,
1882 PerlProcExit,
1883 PerlProc_Exit,
1884 PerlProcExecl,
1885 PerlProcExecv,
1886 PerlProcExecvp,
1887 PerlProcGetuid,
1888 PerlProcGeteuid,
1889 PerlProcGetgid,
1890 PerlProcGetegid,
1891 PerlProcGetlogin,
1892 PerlProcKill,
1893 PerlProcKillpg,
1894 PerlProcPauseProc,
1895 PerlProcPopen,
1896 PerlProcPclose,
1897 PerlProcPipe,
1898 PerlProcSetuid,
1899 PerlProcSetgid,
1900 PerlProcSleep,
1901 PerlProcTimes,
1902 PerlProcWait,
1903 PerlProcWaitpid,
1904 PerlProcSignal,
1905 PerlProcFork,
1906 PerlProcGetpid,
1907 PerlProcDynaLoader,
1908 PerlProcGetOSError,
1909 PerlProcDoCmd,
1910 PerlProcSpawn,
1911 PerlProcSpawnvp,
1912 PerlProcASpawn,
8c0134a8 1913 PerlProcLastHost,
1914 PerlProcPopenList
7766f137 1915};
1916
1917
1918/*
1919 * CPerlHost
1920 */
1921
1922CPerlHost::CPerlHost(void)
1923{
5f1a76d0 1924 /* Construct a host from scratch */
1925 InterlockedIncrement(&num_hosts);
7766f137 1926 m_pvDir = new VDir();
1927 m_pVMem = new VMem();
1928 m_pVMemShared = new VMem();
1929 m_pVMemParse = new VMem();
1930
1931 m_pvDir->Init(NULL, m_pVMem);
1932
1933 m_dwEnvCount = 0;
1934 m_lppEnvList = NULL;
1935
1936 CopyMemory(&m_hostperlMem, &perlMem, sizeof(perlMem));
1937 CopyMemory(&m_hostperlMemShared, &perlMemShared, sizeof(perlMemShared));
1938 CopyMemory(&m_hostperlMemParse, &perlMemParse, sizeof(perlMemParse));
1939 CopyMemory(&m_hostperlEnv, &perlEnv, sizeof(perlEnv));
1940 CopyMemory(&m_hostperlStdIO, &perlStdIO, sizeof(perlStdIO));
1941 CopyMemory(&m_hostperlLIO, &perlLIO, sizeof(perlLIO));
1942 CopyMemory(&m_hostperlDir, &perlDir, sizeof(perlDir));
1943 CopyMemory(&m_hostperlSock, &perlSock, sizeof(perlSock));
1944 CopyMemory(&m_hostperlProc, &perlProc, sizeof(perlProc));
1945
1946 m_pHostperlMem = &m_hostperlMem;
1947 m_pHostperlMemShared = &m_hostperlMemShared;
1948 m_pHostperlMemParse = &m_hostperlMemParse;
1949 m_pHostperlEnv = &m_hostperlEnv;
1950 m_pHostperlStdIO = &m_hostperlStdIO;
1951 m_pHostperlLIO = &m_hostperlLIO;
1952 m_pHostperlDir = &m_hostperlDir;
1953 m_pHostperlSock = &m_hostperlSock;
1954 m_pHostperlProc = &m_hostperlProc;
1955}
1956
1957#define SETUPEXCHANGE(xptr, iptr, table) \
1958 STMT_START { \
1959 if (xptr) { \
1960 iptr = *xptr; \
1961 *xptr = &table; \
1962 } \
1963 else { \
1964 iptr = &table; \
1965 } \
1966 } STMT_END
1967
1968CPerlHost::CPerlHost(struct IPerlMem** ppMem, struct IPerlMem** ppMemShared,
1969 struct IPerlMem** ppMemParse, struct IPerlEnv** ppEnv,
1970 struct IPerlStdIO** ppStdIO, struct IPerlLIO** ppLIO,
1971 struct IPerlDir** ppDir, struct IPerlSock** ppSock,
1972 struct IPerlProc** ppProc)
1973{
5f1a76d0 1974 InterlockedIncrement(&num_hosts);
f7aeb604 1975 m_pvDir = new VDir(0);
7766f137 1976 m_pVMem = new VMem();
1977 m_pVMemShared = new VMem();
1978 m_pVMemParse = new VMem();
1979
1980 m_pvDir->Init(NULL, m_pVMem);
1981
1982 m_dwEnvCount = 0;
1983 m_lppEnvList = NULL;
1984
1985 CopyMemory(&m_hostperlMem, &perlMem, sizeof(perlMem));
1986 CopyMemory(&m_hostperlMemShared, &perlMemShared, sizeof(perlMemShared));
1987 CopyMemory(&m_hostperlMemParse, &perlMemParse, sizeof(perlMemParse));
1988 CopyMemory(&m_hostperlEnv, &perlEnv, sizeof(perlEnv));
1989 CopyMemory(&m_hostperlStdIO, &perlStdIO, sizeof(perlStdIO));
1990 CopyMemory(&m_hostperlLIO, &perlLIO, sizeof(perlLIO));
1991 CopyMemory(&m_hostperlDir, &perlDir, sizeof(perlDir));
1992 CopyMemory(&m_hostperlSock, &perlSock, sizeof(perlSock));
1993 CopyMemory(&m_hostperlProc, &perlProc, sizeof(perlProc));
1994
1995 SETUPEXCHANGE(ppMem, m_pHostperlMem, m_hostperlMem);
1996 SETUPEXCHANGE(ppMemShared, m_pHostperlMemShared, m_hostperlMemShared);
1997 SETUPEXCHANGE(ppMemParse, m_pHostperlMemParse, m_hostperlMemParse);
1998 SETUPEXCHANGE(ppEnv, m_pHostperlEnv, m_hostperlEnv);
1999 SETUPEXCHANGE(ppStdIO, m_pHostperlStdIO, m_hostperlStdIO);
2000 SETUPEXCHANGE(ppLIO, m_pHostperlLIO, m_hostperlLIO);
2001 SETUPEXCHANGE(ppDir, m_pHostperlDir, m_hostperlDir);
2002 SETUPEXCHANGE(ppSock, m_pHostperlSock, m_hostperlSock);
2003 SETUPEXCHANGE(ppProc, m_pHostperlProc, m_hostperlProc);
2004}
2005#undef SETUPEXCHANGE
2006
2007CPerlHost::CPerlHost(CPerlHost& host)
2008{
5f1a76d0 2009 /* Construct a host from another host */
2010 InterlockedIncrement(&num_hosts);
7766f137 2011 m_pVMem = new VMem();
2012 m_pVMemShared = host.GetMemShared();
2013 m_pVMemParse = host.GetMemParse();
2014
2015 /* duplicate directory info */
f7aeb604 2016 m_pvDir = new VDir(0);
7766f137 2017 m_pvDir->Init(host.GetDir(), m_pVMem);
2018
2019 CopyMemory(&m_hostperlMem, &perlMem, sizeof(perlMem));
2020 CopyMemory(&m_hostperlMemShared, &perlMemShared, sizeof(perlMemShared));
2021 CopyMemory(&m_hostperlMemParse, &perlMemParse, sizeof(perlMemParse));
2022 CopyMemory(&m_hostperlEnv, &perlEnv, sizeof(perlEnv));
2023 CopyMemory(&m_hostperlStdIO, &perlStdIO, sizeof(perlStdIO));
2024 CopyMemory(&m_hostperlLIO, &perlLIO, sizeof(perlLIO));
2025 CopyMemory(&m_hostperlDir, &perlDir, sizeof(perlDir));
2026 CopyMemory(&m_hostperlSock, &perlSock, sizeof(perlSock));
2027 CopyMemory(&m_hostperlProc, &perlProc, sizeof(perlProc));
ad4e2db7 2028 m_pHostperlMem = &m_hostperlMem;
2029 m_pHostperlMemShared = &m_hostperlMemShared;
2030 m_pHostperlMemParse = &m_hostperlMemParse;
2031 m_pHostperlEnv = &m_hostperlEnv;
2032 m_pHostperlStdIO = &m_hostperlStdIO;
2033 m_pHostperlLIO = &m_hostperlLIO;
2034 m_pHostperlDir = &m_hostperlDir;
2035 m_pHostperlSock = &m_hostperlSock;
2036 m_pHostperlProc = &m_hostperlProc;
7766f137 2037
2038 m_dwEnvCount = 0;
2039 m_lppEnvList = NULL;
2040
2041 /* duplicate environment info */
2042 LPSTR lpPtr;
2043 DWORD dwIndex = 0;
2044 while(lpPtr = host.GetIndex(dwIndex))
2045 Add(lpPtr);
2046}
2047
2048CPerlHost::~CPerlHost(void)
2049{
2050// Reset();
5f1a76d0 2051 InterlockedDecrement(&num_hosts);
7766f137 2052 delete m_pvDir;
2053 m_pVMemParse->Release();
2054 m_pVMemShared->Release();
2055 m_pVMem->Release();
2056}
2057
2058LPSTR
2059CPerlHost::Find(LPCSTR lpStr)
2060{
2061 LPSTR lpPtr;
2062 LPSTR* lppPtr = Lookup(lpStr);
2063 if(lppPtr != NULL) {
2064 for(lpPtr = *lppPtr; *lpPtr != '\0' && *lpPtr != '='; ++lpPtr)
2065 ;
2066
2067 if(*lpPtr == '=')
2068 ++lpPtr;
2069
2070 return lpPtr;
2071 }
2072 return NULL;
2073}
2074
2075int
2076lookup(const void *arg1, const void *arg2)
2077{ // Compare strings
2078 char*ptr1, *ptr2;
2079 char c1,c2;
2080
2081 ptr1 = *(char**)arg1;
2082 ptr2 = *(char**)arg2;
2083 for(;;) {
2084 c1 = *ptr1++;
2085 c2 = *ptr2++;
2086 if(c1 == '\0' || c1 == '=') {
2087 if(c2 == '\0' || c2 == '=')
2088 break;
2089
2090 return -1; // string 1 < string 2
2091 }
2092 else if(c2 == '\0' || c2 == '=')
2093 return 1; // string 1 > string 2
2094 else if(c1 != c2) {
2095 c1 = toupper(c1);
2096 c2 = toupper(c2);
2097 if(c1 != c2) {
2098 if(c1 < c2)
2099 return -1; // string 1 < string 2
2100
2101 return 1; // string 1 > string 2
2102 }
2103 }
2104 }
2105 return 0;
2106}
2107
2108LPSTR*
2109CPerlHost::Lookup(LPCSTR lpStr)
2110{
2111 return (LPSTR*)bsearch(&lpStr, m_lppEnvList, m_dwEnvCount, sizeof(LPSTR), lookup);
2112}
2113
2114int
2115compare(const void *arg1, const void *arg2)
2116{ // Compare strings
2117 char*ptr1, *ptr2;
2118 char c1,c2;
2119
2120 ptr1 = *(char**)arg1;
2121 ptr2 = *(char**)arg2;
2122 for(;;) {
2123 c1 = *ptr1++;
2124 c2 = *ptr2++;
2125 if(c1 == '\0' || c1 == '=') {
2126 if(c1 == c2)
2127 break;
2128
2129 return -1; // string 1 < string 2
2130 }
2131 else if(c2 == '\0' || c2 == '=')
2132 return 1; // string 1 > string 2
2133 else if(c1 != c2) {
2134 c1 = toupper(c1);
2135 c2 = toupper(c2);
2136 if(c1 != c2) {
2137 if(c1 < c2)
2138 return -1; // string 1 < string 2
f3dccfae 2139
7766f137 2140 return 1; // string 1 > string 2
2141 }
2142 }
2143 }
2144 return 0;
2145}
2146
2147void
2148CPerlHost::Add(LPCSTR lpStr)
2149{
acfe0abc 2150 dTHX;
7766f137 2151 char szBuffer[1024];
2152 LPSTR *lpPtr;
2153 int index, length = strlen(lpStr)+1;
2154
2155 for(index = 0; lpStr[index] != '\0' && lpStr[index] != '='; ++index)
2156 szBuffer[index] = lpStr[index];
2157
2158 szBuffer[index] = '\0';
2159
2160 // replacing ?
2161 lpPtr = Lookup(szBuffer);
2162 if(lpPtr != NULL) {
2163 Renew(*lpPtr, length, char);
2164 strcpy(*lpPtr, lpStr);
2165 }
2166 else {
2167 ++m_dwEnvCount;
2168 Renew(m_lppEnvList, m_dwEnvCount, LPSTR);
2169 New(1, m_lppEnvList[m_dwEnvCount-1], length, char);
2170 if(m_lppEnvList[m_dwEnvCount-1] != NULL) {
2171 strcpy(m_lppEnvList[m_dwEnvCount-1], lpStr);
2172 qsort(m_lppEnvList, m_dwEnvCount, sizeof(LPSTR), compare);
2173 }
2174 else
2175 --m_dwEnvCount;
2176 }
2177}
2178
2179DWORD
2180CPerlHost::CalculateEnvironmentSpace(void)
2181{
2182 DWORD index;
2183 DWORD dwSize = 0;
2184 for(index = 0; index < m_dwEnvCount; ++index)
2185 dwSize += strlen(m_lppEnvList[index]) + 1;
2186
2187 return dwSize;
2188}
2189
2190void
2191CPerlHost::FreeLocalEnvironmentStrings(LPSTR lpStr)
2192{
acfe0abc 2193 dTHX;
7766f137 2194 Safefree(lpStr);
2195}
2196
2197char*
2198CPerlHost::GetChildDir(void)
2199{
acfe0abc 2200 dTHX;
7766f137 2201 int length;
2202 char* ptr;
2203 New(0, ptr, MAX_PATH+1, char);
2204 if(ptr) {
2205 m_pvDir->GetCurrentDirectoryA(MAX_PATH+1, ptr);
17e29069 2206 length = strlen(ptr);
2207 if (length > 3) {
2208 if ((ptr[length-1] == '\\') || (ptr[length-1] == '/'))
2209 ptr[length-1] = 0;
7766f137 2210 }
2211 }
2212 return ptr;
2213}
2214
2215void
2216CPerlHost::FreeChildDir(char* pStr)
2217{
acfe0abc 2218 dTHX;
7766f137 2219 Safefree(pStr);
2220}
2221
2222LPSTR
2223CPerlHost::CreateLocalEnvironmentStrings(VDir &vDir)
2224{
acfe0abc 2225 dTHX;
7766f137 2226 LPSTR lpStr, lpPtr, lpEnvPtr, lpTmp, lpLocalEnv, lpAllocPtr;
2227 DWORD dwSize, dwEnvIndex;
2228 int nLength, compVal;
2229
2230 // get the process environment strings
2231 lpAllocPtr = lpTmp = (LPSTR)GetEnvironmentStrings();
2232
2233 // step over current directory stuff
2234 while(*lpTmp == '=')
2235 lpTmp += strlen(lpTmp) + 1;
2236
2237 // save the start of the environment strings
2238 lpEnvPtr = lpTmp;
2239 for(dwSize = 1; *lpTmp != '\0'; lpTmp += strlen(lpTmp) + 1) {
2240 // calculate the size of the environment strings
2241 dwSize += strlen(lpTmp) + 1;
2242 }
2243
2244 // add the size of current directories
2245 dwSize += vDir.CalculateEnvironmentSpace();
2246
2247 // add the additional space used by changes made to the environment
2248 dwSize += CalculateEnvironmentSpace();
2249
2250 New(1, lpStr, dwSize, char);
2251 lpPtr = lpStr;
2252 if(lpStr != NULL) {
2253 // build the local environment
2254 lpStr = vDir.BuildEnvironmentSpace(lpStr);
2255
2256 dwEnvIndex = 0;
2257 lpLocalEnv = GetIndex(dwEnvIndex);
2258 while(*lpEnvPtr != '\0') {
ec00bdd8 2259 if(!lpLocalEnv) {
7766f137 2260 // all environment overrides have been added
2261 // so copy string into place
2262 strcpy(lpStr, lpEnvPtr);
2263 nLength = strlen(lpEnvPtr) + 1;
2264 lpStr += nLength;
2265 lpEnvPtr += nLength;
2266 }
2267 else {
2268 // determine which string to copy next
2269 compVal = compare(&lpEnvPtr, &lpLocalEnv);
2270 if(compVal < 0) {
2271 strcpy(lpStr, lpEnvPtr);
2272 nLength = strlen(lpEnvPtr) + 1;
2273 lpStr += nLength;
2274 lpEnvPtr += nLength;
2275 }
2276 else {
2277 char *ptr = strchr(lpLocalEnv, '=');
2278 if(ptr && ptr[1]) {
2279 strcpy(lpStr, lpLocalEnv);
2280 lpStr += strlen(lpLocalEnv) + 1;
2281 }
2282 lpLocalEnv = GetIndex(dwEnvIndex);
2283 if(compVal == 0) {
2284 // this string was replaced
2285 lpEnvPtr += strlen(lpEnvPtr) + 1;
2286 }
2287 }
2288 }
2289 }
2290
ec00bdd8 2291 while(lpLocalEnv) {
2292 // still have environment overrides to add
1784c7b8 2293 // so copy the strings into place if not an override
2294 char *ptr = strchr(lpLocalEnv, '=');
2295 if(ptr && ptr[1]) {
2296 strcpy(lpStr, lpLocalEnv);
2297 lpStr += strlen(lpLocalEnv) + 1;
2298 }
ec00bdd8 2299 lpLocalEnv = GetIndex(dwEnvIndex);
2300 }
2301
7766f137 2302 // add final NULL
2303 *lpStr = '\0';
2304 }
2305
2306 // release the process environment strings
2307 FreeEnvironmentStrings(lpAllocPtr);
2308
2309 return lpPtr;
2310}
2311
2312void
2313CPerlHost::Reset(void)
2314{
acfe0abc 2315 dTHX;
7766f137 2316 if(m_lppEnvList != NULL) {
2317 for(DWORD index = 0; index < m_dwEnvCount; ++index) {
2318 Safefree(m_lppEnvList[index]);
2319 m_lppEnvList[index] = NULL;
2320 }
2321 }
2322 m_dwEnvCount = 0;
2323}
2324
2325void
2326CPerlHost::Clearenv(void)
2327{
acfe0abc 2328 dTHX;
7766f137 2329 char ch;
2330 LPSTR lpPtr, lpStr, lpEnvPtr;
2fb9ab56 2331 if (m_lppEnvList != NULL) {
7766f137 2332 /* set every entry to an empty string */
2333 for(DWORD index = 0; index < m_dwEnvCount; ++index) {
2334 char* ptr = strchr(m_lppEnvList[index], '=');
2335 if(ptr) {
2336 *++ptr = 0;
2337 }
2338 }
2339 }
2340
2341 /* get the process environment strings */
2342 lpStr = lpEnvPtr = (LPSTR)GetEnvironmentStrings();
2343
2344 /* step over current directory stuff */
2345 while(*lpStr == '=')
2346 lpStr += strlen(lpStr) + 1;
2347
2348 while(*lpStr) {
2349 lpPtr = strchr(lpStr, '=');
2350 if(lpPtr) {
2351 ch = *++lpPtr;
2352 *lpPtr = 0;
2353 Add(lpStr);
2fb9ab56 2354 if (!w32_pseudo_id)
2355 (void)win32_putenv(lpStr);
7766f137 2356 *lpPtr = ch;
2357 }
2358 lpStr += strlen(lpStr) + 1;
2359 }
2360
2361 FreeEnvironmentStrings(lpEnvPtr);
2362}
2363
2364
2365char*
2366CPerlHost::Getenv(const char *varname)
2367{
acfe0abc 2368 dTHX;
2fb9ab56 2369 if (w32_pseudo_id) {
2370 char *pEnv = Find(varname);
4354e59a 2371 if (pEnv && *pEnv)
2fb9ab56 2372 return pEnv;
7766f137 2373 }
2fb9ab56 2374 return win32_getenv(varname);
7766f137 2375}
2376
2377int
2378CPerlHost::Putenv(const char *envstring)
2379{
acfe0abc 2380 dTHX;
7766f137 2381 Add(envstring);
2fb9ab56 2382 if (!w32_pseudo_id)
2383 return win32_putenv(envstring);
2384
7766f137 2385 return 0;
2386}
2387
2388int
2389CPerlHost::Chdir(const char *dirname)
2390{
acfe0abc 2391 dTHX;
7766f137 2392 int ret;
9ec3348a 2393 if (!dirname) {
2394 errno = ENOENT;
2395 return -1;
2396 }
7766f137 2397 if (USING_WIDE()) {
2398 WCHAR wBuffer[MAX_PATH];
2399 A2WHELPER(dirname, wBuffer, sizeof(wBuffer));
2400 ret = m_pvDir->SetCurrentDirectoryW(wBuffer);
2401 }
2402 else
2403 ret = m_pvDir->SetCurrentDirectoryA((char*)dirname);
2404 if(ret < 0) {
2405 errno = ENOENT;
2406 }
2407 return ret;
2408}
2409
2410#endif /* ___PerlHost_H___ */