sundry cleanups for cloned interpreters (only known failure mode
[p5sagit/p5-mst-13.2.git] / win32 / perllib.c
CommitLineData
0a753a76 1/*
2 * "The Road goes ever on and on, down from the door where it began."
3 */
4
0a753a76 5
6#include "EXTERN.h"
7#include "perl.h"
0cb96387 8
9#ifdef PERL_OBJECT
10#define NO_XSLOCKS
11#endif
12
96e4d5b1 13#include "XSUB.h"
0a753a76 14
32e30700 15#ifdef PERL_IMPLICIT_SYS
0cb96387 16#include "win32iop.h"
17#include <fcntl.h>
18#endif
19
20
21/* Register any extra external extensions */
22char *staticlinkmodules[] = {
23 "DynaLoader",
24 NULL,
25};
26
27EXTERN_C void boot_DynaLoader (pTHXo_ CV* cv);
28
29static void
30xs_init(pTHXo)
31{
32 char *file = __FILE__;
33 dXSUB_SYS;
34 newXS("DynaLoader::boot_DynaLoader", boot_DynaLoader, file);
35}
36
32e30700 37#ifdef PERL_IMPLICIT_SYS
38/* IPerlMem */
0cb96387 39void*
32e30700 40PerlMemMalloc(struct IPerlMem *I, size_t size)
0cb96387 41{
42 return win32_malloc(size);
43}
44void*
32e30700 45PerlMemRealloc(struct IPerlMem *I, void* ptr, size_t size)
0cb96387 46{
47 return win32_realloc(ptr, size);
48}
49void
32e30700 50PerlMemFree(struct IPerlMem *I, void* ptr)
0cb96387 51{
52 win32_free(ptr);
53}
54
55struct IPerlMem perlMem =
56{
57 PerlMemMalloc,
58 PerlMemRealloc,
59 PerlMemFree,
60};
61
62
32e30700 63/* IPerlEnv */
0cb96387 64extern char * g_win32_get_privlib(char *pl);
65extern char * g_win32_get_sitelib(char *pl);
66
67
68char*
32e30700 69PerlEnvGetenv(struct IPerlEnv *I, const char *varname)
0cb96387 70{
71 return win32_getenv(varname);
72};
73int
32e30700 74PerlEnvPutenv(struct IPerlEnv *I, const char *envstring)
0cb96387 75{
76 return win32_putenv(envstring);
77};
78
79char*
32e30700 80PerlEnvGetenv_len(struct IPerlEnv *I, const char* varname, unsigned long* len)
0cb96387 81{
82 char *e = win32_getenv(varname);
83 if (e)
84 *len = strlen(e);
85 return e;
86}
87
88int
32e30700 89PerlEnvUname(struct IPerlEnv *I, struct utsname *name)
0cb96387 90{
91 return win32_uname(name);
92}
93
3075ddba 94void
32e30700 95PerlEnvClearenv(struct IPerlEnv *I)
3075ddba 96{
97 dTHXo;
98 char *envv = GetEnvironmentStrings();
99 char *cur = envv;
100 STRLEN len;
101 while (*cur) {
102 char *end = strchr(cur,'=');
103 if (end && end != cur) {
104 *end = '\0';
105 my_setenv(cur,Nullch);
106 *end = '=';
107 cur = end + strlen(end+1)+2;
108 }
109 else if ((len = strlen(cur)))
110 cur += len+1;
111 }
112 FreeEnvironmentStrings(envv);
113}
114
115void*
32e30700 116PerlEnvGetChildEnv(struct IPerlEnv *I)
3075ddba 117{
118 return NULL;
119}
120
121void
32e30700 122PerlEnvFreeChildEnv(struct IPerlEnv *I, void* env)
3075ddba 123{
124}
125
126char*
32e30700 127PerlEnvGetChildDir(struct IPerlEnv *I)
3075ddba 128{
129 return NULL;
130}
131
132void
32e30700 133PerlEnvFreeChildDir(struct IPerlEnv *I, char* dir)
3075ddba 134{
135}
136
0cb96387 137unsigned long
32e30700 138PerlEnvOsId(struct IPerlEnv *I)
0cb96387 139{
140 return win32_os_id();
141}
142
143char*
32e30700 144PerlEnvLibPath(struct IPerlEnv *I, char *pl)
0cb96387 145{
146 return g_win32_get_privlib(pl);
147}
148
149char*
32e30700 150PerlEnvSiteLibPath(struct IPerlEnv *I, char *pl)
0cb96387 151{
152 return g_win32_get_sitelib(pl);
153}
154
155struct IPerlEnv perlEnv =
156{
157 PerlEnvGetenv,
158 PerlEnvPutenv,
159 PerlEnvGetenv_len,
160 PerlEnvUname,
3075ddba 161 PerlEnvClearenv,
162 PerlEnvGetChildEnv,
163 PerlEnvFreeChildEnv,
164 PerlEnvGetChildDir,
165 PerlEnvFreeChildDir,
0cb96387 166 PerlEnvOsId,
167 PerlEnvLibPath,
168 PerlEnvSiteLibPath,
169};
170
171
32e30700 172/* PerlStdIO */
0cb96387 173PerlIO*
32e30700 174PerlStdIOStdin(struct IPerlStdIO *I)
0cb96387 175{
176 return (PerlIO*)win32_stdin();
177}
178
179PerlIO*
32e30700 180PerlStdIOStdout(struct IPerlStdIO *I)
0cb96387 181{
182 return (PerlIO*)win32_stdout();
183}
184
185PerlIO*
32e30700 186PerlStdIOStderr(struct IPerlStdIO *I)
0cb96387 187{
188 return (PerlIO*)win32_stderr();
189}
190
191PerlIO*
32e30700 192PerlStdIOOpen(struct IPerlStdIO *I, const char *path, const char *mode)
0cb96387 193{
194 return (PerlIO*)win32_fopen(path, mode);
195}
196
197int
32e30700 198PerlStdIOClose(struct IPerlStdIO *I, PerlIO* pf)
0cb96387 199{
200 return win32_fclose(((FILE*)pf));
201}
202
203int
32e30700 204PerlStdIOEof(struct IPerlStdIO *I, PerlIO* pf)
0cb96387 205{
206 return win32_feof((FILE*)pf);
207}
208
209int
32e30700 210PerlStdIOError(struct IPerlStdIO *I, PerlIO* pf)
0cb96387 211{
212 return win32_ferror((FILE*)pf);
213}
214
215void
32e30700 216PerlStdIOClearerr(struct IPerlStdIO *I, PerlIO* pf)
0cb96387 217{
218 win32_clearerr((FILE*)pf);
219}
220
221int
32e30700 222PerlStdIOGetc(struct IPerlStdIO *I, PerlIO* pf)
0cb96387 223{
224 return win32_getc((FILE*)pf);
225}
226
227char*
32e30700 228PerlStdIOGetBase(struct IPerlStdIO *I, PerlIO* pf)
0cb96387 229{
230#ifdef FILE_base
231 FILE *f = (FILE*)pf;
232 return FILE_base(f);
233#else
234 return Nullch;
235#endif
236}
237
238int
32e30700 239PerlStdIOGetBufsiz(struct IPerlStdIO *I, PerlIO* pf)
0cb96387 240{
241#ifdef FILE_bufsiz
242 FILE *f = (FILE*)pf;
243 return FILE_bufsiz(f);
244#else
245 return (-1);
246#endif
247}
248
249int
32e30700 250PerlStdIOGetCnt(struct IPerlStdIO *I, PerlIO* pf)
0cb96387 251{
252#ifdef USE_STDIO_PTR
253 FILE *f = (FILE*)pf;
254 return FILE_cnt(f);
255#else
256 return (-1);
257#endif
258}
259
260char*
32e30700 261PerlStdIOGetPtr(struct IPerlStdIO *I, PerlIO* pf)
0cb96387 262{
263#ifdef USE_STDIO_PTR
264 FILE *f = (FILE*)pf;
265 return FILE_ptr(f);
266#else
267 return Nullch;
268#endif
269}
270
271char*
32e30700 272PerlStdIOGets(struct IPerlStdIO *I, PerlIO* pf, char* s, int n)
0cb96387 273{
274 return win32_fgets(s, n, (FILE*)pf);
275}
276
277int
32e30700 278PerlStdIOPutc(struct IPerlStdIO *I, PerlIO* pf, int c)
0cb96387 279{
280 return win32_fputc(c, (FILE*)pf);
281}
282
283int
32e30700 284PerlStdIOPuts(struct IPerlStdIO *I, PerlIO* pf, const char *s)
0cb96387 285{
286 return win32_fputs(s, (FILE*)pf);
287}
288
289int
32e30700 290PerlStdIOFlush(struct IPerlStdIO *I, PerlIO* pf)
0cb96387 291{
292 return win32_fflush((FILE*)pf);
293}
294
295int
32e30700 296PerlStdIOUngetc(struct IPerlStdIO *I, PerlIO* pf,int c)
0cb96387 297{
298 return win32_ungetc(c, (FILE*)pf);
299}
300
301int
32e30700 302PerlStdIOFileno(struct IPerlStdIO *I, PerlIO* pf)
0cb96387 303{
304 return win32_fileno((FILE*)pf);
305}
306
307PerlIO*
32e30700 308PerlStdIOFdopen(struct IPerlStdIO *I, int fd, const char *mode)
0cb96387 309{
310 return (PerlIO*)win32_fdopen(fd, mode);
311}
312
313PerlIO*
32e30700 314PerlStdIOReopen(struct IPerlStdIO *I, const char*path, const char*mode, PerlIO* pf)
0cb96387 315{
316 return (PerlIO*)win32_freopen(path, mode, (FILE*)pf);
317}
318
319SSize_t
32e30700 320PerlStdIORead(struct IPerlStdIO *I, PerlIO* pf, void *buffer, Size_t size)
0cb96387 321{
322 return win32_fread(buffer, 1, size, (FILE*)pf);
323}
324
325SSize_t
32e30700 326PerlStdIOWrite(struct IPerlStdIO *I, PerlIO* pf, const void *buffer, Size_t size)
0cb96387 327{
328 return win32_fwrite(buffer, 1, size, (FILE*)pf);
329}
330
331void
32e30700 332PerlStdIOSetBuf(struct IPerlStdIO *I, PerlIO* pf, char* buffer)
0cb96387 333{
334 win32_setbuf((FILE*)pf, buffer);
335}
336
337int
32e30700 338PerlStdIOSetVBuf(struct IPerlStdIO *I, PerlIO* pf, char* buffer, int type, Size_t size)
0cb96387 339{
340 return win32_setvbuf((FILE*)pf, buffer, type, size);
341}
342
343void
32e30700 344PerlStdIOSetCnt(struct IPerlStdIO *I, PerlIO* pf, int n)
0cb96387 345{
346#ifdef STDIO_CNT_LVALUE
347 FILE *f = (FILE*)pf;
348 FILE_cnt(f) = n;
349#endif
350}
351
352void
32e30700 353PerlStdIOSetPtrCnt(struct IPerlStdIO *I, PerlIO* pf, char * ptr, int n)
0cb96387 354{
355#ifdef STDIO_PTR_LVALUE
356 FILE *f = (FILE*)pf;
357 FILE_ptr(f) = ptr;
358 FILE_cnt(f) = n;
359#endif
360}
361
362void
32e30700 363PerlStdIOSetlinebuf(struct IPerlStdIO *I, PerlIO* pf)
0cb96387 364{
365 win32_setvbuf((FILE*)pf, NULL, _IOLBF, 0);
366}
367
368int
32e30700 369PerlStdIOPrintf(struct IPerlStdIO *I, PerlIO* pf, const char *format,...)
0cb96387 370{
371 va_list(arglist);
372 va_start(arglist, format);
373 return win32_vfprintf((FILE*)pf, format, arglist);
374}
375
376int
32e30700 377PerlStdIOVprintf(struct IPerlStdIO *I, PerlIO* pf, const char *format, va_list arglist)
0cb96387 378{
379 return win32_vfprintf((FILE*)pf, format, arglist);
380}
381
382long
32e30700 383PerlStdIOTell(struct IPerlStdIO *I, PerlIO* pf)
0cb96387 384{
385 return win32_ftell((FILE*)pf);
386}
387
388int
32e30700 389PerlStdIOSeek(struct IPerlStdIO *I, PerlIO* pf, off_t offset, int origin)
0cb96387 390{
391 return win32_fseek((FILE*)pf, offset, origin);
392}
393
394void
32e30700 395PerlStdIORewind(struct IPerlStdIO *I, PerlIO* pf)
0cb96387 396{
397 win32_rewind((FILE*)pf);
398}
399
400PerlIO*
32e30700 401PerlStdIOTmpfile(struct IPerlStdIO *I)
0cb96387 402{
403 return (PerlIO*)win32_tmpfile();
404}
405
406int
32e30700 407PerlStdIOGetpos(struct IPerlStdIO *I, PerlIO* pf, Fpos_t *p)
0cb96387 408{
409 return win32_fgetpos((FILE*)pf, p);
410}
411
412int
32e30700 413PerlStdIOSetpos(struct IPerlStdIO *I, PerlIO* pf, const Fpos_t *p)
0cb96387 414{
415 return win32_fsetpos((FILE*)pf, p);
416}
417void
32e30700 418PerlStdIOInit(struct IPerlStdIO *I)
0cb96387 419{
420}
421
422void
32e30700 423PerlStdIOInitOSExtras(struct IPerlStdIO *I)
0cb96387 424{
425 Perl_init_os_extras();
426}
427
428int
32e30700 429PerlStdIOOpenOSfhandle(struct IPerlStdIO *I, long osfhandle, int flags)
0cb96387 430{
431 return win32_open_osfhandle(osfhandle, flags);
432}
433
434int
32e30700 435PerlStdIOGetOSfhandle(struct IPerlStdIO *I, int filenum)
0cb96387 436{
437 return win32_get_osfhandle(filenum);
438}
439
440
441struct IPerlStdIO perlStdIO =
442{
443 PerlStdIOStdin,
444 PerlStdIOStdout,
445 PerlStdIOStderr,
446 PerlStdIOOpen,
447 PerlStdIOClose,
448 PerlStdIOEof,
449 PerlStdIOError,
450 PerlStdIOClearerr,
451 PerlStdIOGetc,
452 PerlStdIOGetBase,
453 PerlStdIOGetBufsiz,
454 PerlStdIOGetCnt,
455 PerlStdIOGetPtr,
456 PerlStdIOGets,
457 PerlStdIOPutc,
458 PerlStdIOPuts,
459 PerlStdIOFlush,
460 PerlStdIOUngetc,
461 PerlStdIOFileno,
462 PerlStdIOFdopen,
463 PerlStdIOReopen,
464 PerlStdIORead,
465 PerlStdIOWrite,
466 PerlStdIOSetBuf,
467 PerlStdIOSetVBuf,
468 PerlStdIOSetCnt,
469 PerlStdIOSetPtrCnt,
470 PerlStdIOSetlinebuf,
471 PerlStdIOPrintf,
472 PerlStdIOVprintf,
473 PerlStdIOTell,
474 PerlStdIOSeek,
475 PerlStdIORewind,
476 PerlStdIOTmpfile,
477 PerlStdIOGetpos,
478 PerlStdIOSetpos,
479 PerlStdIOInit,
480 PerlStdIOInitOSExtras,
481};
482
483
32e30700 484/* IPerlLIO */
0cb96387 485int
32e30700 486PerlLIOAccess(struct IPerlLIO *I, const char *path, int mode)
0cb96387 487{
488 return access(path, mode);
489}
490
491int
32e30700 492PerlLIOChmod(struct IPerlLIO *I, const char *filename, int pmode)
0cb96387 493{
494 return chmod(filename, pmode);
495}
496
497int
32e30700 498PerlLIOChown(struct IPerlLIO *I, const char *filename, uid_t owner, gid_t group)
0cb96387 499{
500 return chown(filename, owner, group);
501}
502
503int
32e30700 504PerlLIOChsize(struct IPerlLIO *I, int handle, long size)
0cb96387 505{
506 return chsize(handle, size);
507}
508
509int
32e30700 510PerlLIOClose(struct IPerlLIO *I, int handle)
0cb96387 511{
512 return win32_close(handle);
513}
514
515int
32e30700 516PerlLIODup(struct IPerlLIO *I, int handle)
0cb96387 517{
518 return win32_dup(handle);
519}
520
521int
32e30700 522PerlLIODup2(struct IPerlLIO *I, int handle1, int handle2)
0cb96387 523{
524 return win32_dup2(handle1, handle2);
525}
526
527int
32e30700 528PerlLIOFlock(struct IPerlLIO *I, int fd, int oper)
0cb96387 529{
530 return win32_flock(fd, oper);
531}
532
533int
32e30700 534PerlLIOFileStat(struct IPerlLIO *I, int handle, struct stat *buffer)
0cb96387 535{
536 return fstat(handle, buffer);
537}
538
539int
32e30700 540PerlLIOIOCtl(struct IPerlLIO *I, int i, unsigned int u, char *data)
0cb96387 541{
542 return win32_ioctlsocket((SOCKET)i, (long)u, (u_long*)data);
543}
544
545int
32e30700 546PerlLIOIsatty(struct IPerlLIO *I, int fd)
0cb96387 547{
548 return isatty(fd);
549}
550
6b980173 551int
ed094faf 552PerlLIOLink(struct IPerlLIO *I, const char*oldname, const char *newname)
6b980173 553{
554 return win32_link(oldname, newname);
555}
556
0cb96387 557long
32e30700 558PerlLIOLseek(struct IPerlLIO *I, int handle, long offset, int origin)
0cb96387 559{
560 return win32_lseek(handle, offset, origin);
561}
562
563int
564PerlLIOLstat(struct IPerlLIO* p, const char *path, struct stat *buffer)
565{
566 return win32_stat(path, buffer);
567}
568
569char*
32e30700 570PerlLIOMktemp(struct IPerlLIO *I, char *Template)
0cb96387 571{
572 return mktemp(Template);
573}
574
575int
32e30700 576PerlLIOOpen(struct IPerlLIO *I, const char *filename, int oflag)
0cb96387 577{
578 return win32_open(filename, oflag);
579}
580
581int
32e30700 582PerlLIOOpen3(struct IPerlLIO *I, const char *filename, int oflag, int pmode)
0cb96387 583{
584 int ret;
585 if(stricmp(filename, "/dev/null") == 0)
586 ret = open("NUL", oflag, pmode);
587 else
588 ret = open(filename, oflag, pmode);
589
590 return ret;
591}
592
593int
32e30700 594PerlLIORead(struct IPerlLIO *I, int handle, void *buffer, unsigned int count)
0cb96387 595{
596 return win32_read(handle, buffer, count);
597}
598
599int
32e30700 600PerlLIORename(struct IPerlLIO *I, const char *OldFileName, const char *newname)
0cb96387 601{
602 return win32_rename(OldFileName, newname);
603}
604
605int
32e30700 606PerlLIOSetmode(struct IPerlLIO *I, int handle, int mode)
0cb96387 607{
608 return win32_setmode(handle, mode);
609}
610
611int
32e30700 612PerlLIONameStat(struct IPerlLIO *I, const char *path, struct stat *buffer)
0cb96387 613{
614 return win32_stat(path, buffer);
615}
616
617char*
32e30700 618PerlLIOTmpnam(struct IPerlLIO *I, char *string)
0cb96387 619{
620 return tmpnam(string);
621}
622
623int
32e30700 624PerlLIOUmask(struct IPerlLIO *I, int pmode)
0cb96387 625{
626 return umask(pmode);
627}
628
629int
32e30700 630PerlLIOUnlink(struct IPerlLIO *I, const char *filename)
0cb96387 631{
632 chmod(filename, S_IREAD | S_IWRITE);
633 return unlink(filename);
634}
635
636int
32e30700 637PerlLIOUtime(struct IPerlLIO *I, char *filename, struct utimbuf *times)
0cb96387 638{
639 return win32_utime(filename, times);
640}
641
642int
32e30700 643PerlLIOWrite(struct IPerlLIO *I, int handle, const void *buffer, unsigned int count)
0cb96387 644{
645 return win32_write(handle, buffer, count);
646}
647
648struct IPerlLIO perlLIO =
649{
650 PerlLIOAccess,
651 PerlLIOChmod,
652 PerlLIOChown,
653 PerlLIOChsize,
654 PerlLIOClose,
655 PerlLIODup,
656 PerlLIODup2,
657 PerlLIOFlock,
658 PerlLIOFileStat,
659 PerlLIOIOCtl,
660 PerlLIOIsatty,
6b980173 661 PerlLIOLink,
0cb96387 662 PerlLIOLseek,
663 PerlLIOLstat,
664 PerlLIOMktemp,
665 PerlLIOOpen,
666 PerlLIOOpen3,
667 PerlLIORead,
668 PerlLIORename,
669 PerlLIOSetmode,
670 PerlLIONameStat,
671 PerlLIOTmpnam,
672 PerlLIOUmask,
673 PerlLIOUnlink,
674 PerlLIOUtime,
675 PerlLIOWrite,
676};
677
32e30700 678/* IPerlDIR */
0cb96387 679int
32e30700 680PerlDirMakedir(struct IPerlDir *I, const char *dirname, int mode)
0cb96387 681{
682 return win32_mkdir(dirname, mode);
683}
684
685int
32e30700 686PerlDirChdir(struct IPerlDir *I, const char *dirname)
0cb96387 687{
688 return win32_chdir(dirname);
689}
690
691int
32e30700 692PerlDirRmdir(struct IPerlDir *I, const char *dirname)
0cb96387 693{
694 return win32_rmdir(dirname);
695}
696
697int
32e30700 698PerlDirClose(struct IPerlDir *I, DIR *dirp)
0cb96387 699{
700 return win32_closedir(dirp);
701}
702
703DIR*
32e30700 704PerlDirOpen(struct IPerlDir *I, char *filename)
0cb96387 705{
706 return win32_opendir(filename);
707}
708
709struct direct *
32e30700 710PerlDirRead(struct IPerlDir *I, DIR *dirp)
0cb96387 711{
712 return win32_readdir(dirp);
713}
714
715void
32e30700 716PerlDirRewind(struct IPerlDir *I, DIR *dirp)
0cb96387 717{
718 win32_rewinddir(dirp);
719}
720
721void
32e30700 722PerlDirSeek(struct IPerlDir *I, DIR *dirp, long loc)
0cb96387 723{
724 win32_seekdir(dirp, loc);
725}
726
727long
32e30700 728PerlDirTell(struct IPerlDir *I, DIR *dirp)
0cb96387 729{
730 return win32_telldir(dirp);
731}
732
733struct IPerlDir perlDir =
734{
735 PerlDirMakedir,
736 PerlDirChdir,
737 PerlDirRmdir,
738 PerlDirClose,
739 PerlDirOpen,
740 PerlDirRead,
741 PerlDirRewind,
742 PerlDirSeek,
743 PerlDirTell,
744};
745
746
32e30700 747/* IPerlSock */
0cb96387 748u_long
32e30700 749PerlSockHtonl(struct IPerlSock *I, u_long hostlong)
0cb96387 750{
751 return win32_htonl(hostlong);
752}
753
754u_short
32e30700 755PerlSockHtons(struct IPerlSock *I, u_short hostshort)
0cb96387 756{
757 return win32_htons(hostshort);
758}
759
760u_long
32e30700 761PerlSockNtohl(struct IPerlSock *I, u_long netlong)
0cb96387 762{
763 return win32_ntohl(netlong);
764}
765
766u_short
32e30700 767PerlSockNtohs(struct IPerlSock *I, u_short netshort)
0cb96387 768{
769 return win32_ntohs(netshort);
770}
771
32e30700 772SOCKET PerlSockAccept(struct IPerlSock *I, SOCKET s, struct sockaddr* addr, int* addrlen)
0cb96387 773{
774 return win32_accept(s, addr, addrlen);
775}
776
777int
32e30700 778PerlSockBind(struct IPerlSock *I, SOCKET s, const struct sockaddr* name, int namelen)
0cb96387 779{
780 return win32_bind(s, name, namelen);
781}
782
783int
32e30700 784PerlSockConnect(struct IPerlSock *I, SOCKET s, const struct sockaddr* name, int namelen)
0cb96387 785{
786 return win32_connect(s, name, namelen);
787}
788
789void
32e30700 790PerlSockEndhostent(struct IPerlSock *I)
0cb96387 791{
792 win32_endhostent();
793}
794
795void
32e30700 796PerlSockEndnetent(struct IPerlSock *I)
0cb96387 797{
798 win32_endnetent();
799}
800
801void
32e30700 802PerlSockEndprotoent(struct IPerlSock *I)
0cb96387 803{
804 win32_endprotoent();
805}
806
807void
32e30700 808PerlSockEndservent(struct IPerlSock *I)
0cb96387 809{
810 win32_endservent();
811}
812
813struct hostent*
32e30700 814PerlSockGethostbyaddr(struct IPerlSock *I, const char* addr, int len, int type)
0cb96387 815{
816 return win32_gethostbyaddr(addr, len, type);
817}
818
819struct hostent*
32e30700 820PerlSockGethostbyname(struct IPerlSock *I, const char* name)
0cb96387 821{
822 return win32_gethostbyname(name);
823}
824
825struct hostent*
32e30700 826PerlSockGethostent(struct IPerlSock *I)
0cb96387 827{
c5be433b 828 dTHXo;
32e30700 829 Perl_croak(aTHX_ "gethostent not implemented!\n");
0cb96387 830 return NULL;
831}
832
833int
32e30700 834PerlSockGethostname(struct IPerlSock *I, char* name, int namelen)
0cb96387 835{
836 return win32_gethostname(name, namelen);
837}
838
839struct netent *
32e30700 840PerlSockGetnetbyaddr(struct IPerlSock *I, long net, int type)
0cb96387 841{
842 return win32_getnetbyaddr(net, type);
843}
844
845struct netent *
32e30700 846PerlSockGetnetbyname(struct IPerlSock *I, const char *name)
0cb96387 847{
848 return win32_getnetbyname((char*)name);
849}
850
851struct netent *
32e30700 852PerlSockGetnetent(struct IPerlSock *I)
0cb96387 853{
854 return win32_getnetent();
855}
856
32e30700 857int PerlSockGetpeername(struct IPerlSock *I, SOCKET s, struct sockaddr* name, int* namelen)
0cb96387 858{
859 return win32_getpeername(s, name, namelen);
860}
861
862struct protoent*
32e30700 863PerlSockGetprotobyname(struct IPerlSock *I, const char* name)
0cb96387 864{
865 return win32_getprotobyname(name);
866}
867
868struct protoent*
32e30700 869PerlSockGetprotobynumber(struct IPerlSock *I, int number)
0cb96387 870{
871 return win32_getprotobynumber(number);
872}
873
874struct protoent*
32e30700 875PerlSockGetprotoent(struct IPerlSock *I)
0cb96387 876{
877 return win32_getprotoent();
878}
879
880struct servent*
32e30700 881PerlSockGetservbyname(struct IPerlSock *I, const char* name, const char* proto)
0cb96387 882{
883 return win32_getservbyname(name, proto);
884}
885
886struct servent*
32e30700 887PerlSockGetservbyport(struct IPerlSock *I, int port, const char* proto)
0cb96387 888{
889 return win32_getservbyport(port, proto);
890}
891
892struct servent*
32e30700 893PerlSockGetservent(struct IPerlSock *I)
0cb96387 894{
895 return win32_getservent();
896}
897
898int
32e30700 899PerlSockGetsockname(struct IPerlSock *I, SOCKET s, struct sockaddr* name, int* namelen)
0cb96387 900{
901 return win32_getsockname(s, name, namelen);
902}
903
904int
32e30700 905PerlSockGetsockopt(struct IPerlSock *I, SOCKET s, int level, int optname, char* optval, int* optlen)
0cb96387 906{
907 return win32_getsockopt(s, level, optname, optval, optlen);
908}
909
910unsigned long
32e30700 911PerlSockInetAddr(struct IPerlSock *I, const char* cp)
0cb96387 912{
913 return win32_inet_addr(cp);
914}
915
916char*
32e30700 917PerlSockInetNtoa(struct IPerlSock *I, struct in_addr in)
0cb96387 918{
919 return win32_inet_ntoa(in);
920}
921
922int
32e30700 923PerlSockListen(struct IPerlSock *I, SOCKET s, int backlog)
0cb96387 924{
925 return win32_listen(s, backlog);
926}
927
928int
32e30700 929PerlSockRecv(struct IPerlSock *I, SOCKET s, char* buffer, int len, int flags)
0cb96387 930{
931 return win32_recv(s, buffer, len, flags);
932}
933
934int
32e30700 935PerlSockRecvfrom(struct IPerlSock *I, SOCKET s, char* buffer, int len, int flags, struct sockaddr* from, int* fromlen)
0cb96387 936{
937 return win32_recvfrom(s, buffer, len, flags, from, fromlen);
938}
939
940int
32e30700 941PerlSockSelect(struct IPerlSock *I, int nfds, char* readfds, char* writefds, char* exceptfds, const struct timeval* timeout)
0cb96387 942{
943 return win32_select(nfds, (Perl_fd_set*)readfds, (Perl_fd_set*)writefds, (Perl_fd_set*)exceptfds, timeout);
944}
945
946int
32e30700 947PerlSockSend(struct IPerlSock *I, SOCKET s, const char* buffer, int len, int flags)
0cb96387 948{
949 return win32_send(s, buffer, len, flags);
950}
951
952int
32e30700 953PerlSockSendto(struct IPerlSock *I, SOCKET s, const char* buffer, int len, int flags, const struct sockaddr* to, int tolen)
0cb96387 954{
955 return win32_sendto(s, buffer, len, flags, to, tolen);
956}
957
958void
32e30700 959PerlSockSethostent(struct IPerlSock *I, int stayopen)
0cb96387 960{
961 win32_sethostent(stayopen);
962}
963
964void
32e30700 965PerlSockSetnetent(struct IPerlSock *I, int stayopen)
0cb96387 966{
967 win32_setnetent(stayopen);
968}
969
970void
32e30700 971PerlSockSetprotoent(struct IPerlSock *I, int stayopen)
0cb96387 972{
973 win32_setprotoent(stayopen);
974}
975
976void
32e30700 977PerlSockSetservent(struct IPerlSock *I, int stayopen)
0cb96387 978{
979 win32_setservent(stayopen);
980}
981
982int
32e30700 983PerlSockSetsockopt(struct IPerlSock *I, SOCKET s, int level, int optname, const char* optval, int optlen)
0cb96387 984{
985 return win32_setsockopt(s, level, optname, optval, optlen);
986}
987
988int
32e30700 989PerlSockShutdown(struct IPerlSock *I, SOCKET s, int how)
0cb96387 990{
991 return win32_shutdown(s, how);
992}
993
994SOCKET
32e30700 995PerlSockSocket(struct IPerlSock *I, int af, int type, int protocol)
0cb96387 996{
997 return win32_socket(af, type, protocol);
998}
999
1000int
32e30700 1001PerlSockSocketpair(struct IPerlSock *I, int domain, int type, int protocol, int* fds)
0cb96387 1002{
c5be433b 1003 dTHXo;
32e30700 1004 Perl_croak(aTHX_ "socketpair not implemented!\n");
0cb96387 1005 return 0;
1006}
1007
1008int
32e30700 1009PerlSockClosesocket(struct IPerlSock *I, SOCKET s)
0cb96387 1010{
1011 return win32_closesocket(s);
1012}
1013
1014int
32e30700 1015PerlSockIoctlsocket(struct IPerlSock *I, SOCKET s, long cmd, u_long *argp)
0cb96387 1016{
1017 return win32_ioctlsocket(s, cmd, argp);
1018}
1019
1020struct IPerlSock perlSock =
1021{
1022 PerlSockHtonl,
1023 PerlSockHtons,
1024 PerlSockNtohl,
1025 PerlSockNtohs,
1026 PerlSockAccept,
1027 PerlSockBind,
1028 PerlSockConnect,
1029 PerlSockEndhostent,
1030 PerlSockEndnetent,
1031 PerlSockEndprotoent,
1032 PerlSockEndservent,
1033 PerlSockGethostname,
1034 PerlSockGetpeername,
1035 PerlSockGethostbyaddr,
1036 PerlSockGethostbyname,
1037 PerlSockGethostent,
1038 PerlSockGetnetbyaddr,
1039 PerlSockGetnetbyname,
1040 PerlSockGetnetent,
1041 PerlSockGetprotobyname,
1042 PerlSockGetprotobynumber,
1043 PerlSockGetprotoent,
1044 PerlSockGetservbyname,
1045 PerlSockGetservbyport,
1046 PerlSockGetservent,
1047 PerlSockGetsockname,
1048 PerlSockGetsockopt,
1049 PerlSockInetAddr,
1050 PerlSockInetNtoa,
1051 PerlSockListen,
1052 PerlSockRecv,
1053 PerlSockRecvfrom,
1054 PerlSockSelect,
1055 PerlSockSend,
1056 PerlSockSendto,
1057 PerlSockSethostent,
1058 PerlSockSetnetent,
1059 PerlSockSetprotoent,
1060 PerlSockSetservent,
1061 PerlSockSetsockopt,
1062 PerlSockShutdown,
1063 PerlSockSocket,
1064 PerlSockSocketpair,
1065 PerlSockClosesocket,
1066};
1067
1068
32e30700 1069/* IPerlProc */
0cb96387 1070
1071#define EXECF_EXEC 1
1072#define EXECF_SPAWN 2
1073
1074extern char * g_getlogin(void);
1075extern int do_spawn2(char *cmd, int exectype);
32e30700 1076#ifdef PERL_OBJECT
0cb96387 1077extern int g_do_aspawn(void *vreally, void **vmark, void **vsp);
32e30700 1078#define do_aspawn g_do_aspawn
1079#endif
1080EXTERN_C PerlInterpreter* perl_alloc_using(struct IPerlMem* pMem,
1081 struct IPerlEnv* pEnv, struct IPerlStdIO* pStdIO,
1082 struct IPerlLIO* pLIO, struct IPerlDir* pDir,
1083 struct IPerlSock* pSock, struct IPerlProc* pProc);
0cb96387 1084
1085void
32e30700 1086PerlProcAbort(struct IPerlProc *I)
0cb96387 1087{
1088 win32_abort();
1089}
1090
1091char *
32e30700 1092PerlProcCrypt(struct IPerlProc *I, const char* clear, const char* salt)
0cb96387 1093{
1094 return win32_crypt(clear, salt);
1095}
1096
1097void
32e30700 1098PerlProcExit(struct IPerlProc *I, int status)
0cb96387 1099{
1100 exit(status);
1101}
1102
1103void
32e30700 1104PerlProc_Exit(struct IPerlProc *I, int status)
0cb96387 1105{
1106 _exit(status);
1107}
1108
1109int
32e30700 1110PerlProcExecl(struct IPerlProc *I, const char *cmdname, const char *arg0, const char *arg1, const char *arg2, const char *arg3)
0cb96387 1111{
1112 return execl(cmdname, arg0, arg1, arg2, arg3);
1113}
1114
1115int
32e30700 1116PerlProcExecv(struct IPerlProc *I, const char *cmdname, const char *const *argv)
0cb96387 1117{
1118 return win32_execvp(cmdname, argv);
1119}
1120
1121int
32e30700 1122PerlProcExecvp(struct IPerlProc *I, const char *cmdname, const char *const *argv)
0cb96387 1123{
1124 return win32_execvp(cmdname, argv);
1125}
1126
1127uid_t
32e30700 1128PerlProcGetuid(struct IPerlProc *I)
0cb96387 1129{
1130 return getuid();
1131}
1132
1133uid_t
32e30700 1134PerlProcGeteuid(struct IPerlProc *I)
0cb96387 1135{
1136 return geteuid();
1137}
1138
1139gid_t
32e30700 1140PerlProcGetgid(struct IPerlProc *I)
0cb96387 1141{
1142 return getgid();
1143}
1144
1145gid_t
32e30700 1146PerlProcGetegid(struct IPerlProc *I)
0cb96387 1147{
1148 return getegid();
1149}
1150
1151char *
32e30700 1152PerlProcGetlogin(struct IPerlProc *I)
0cb96387 1153{
1154 return g_getlogin();
1155}
1156
1157int
32e30700 1158PerlProcKill(struct IPerlProc *I, int pid, int sig)
0cb96387 1159{
1160 return win32_kill(pid, sig);
1161}
1162
1163int
32e30700 1164PerlProcKillpg(struct IPerlProc *I, int pid, int sig)
0cb96387 1165{
c5be433b 1166 dTHXo;
32e30700 1167 Perl_croak(aTHX_ "killpg not implemented!\n");
0cb96387 1168 return 0;
1169}
1170
1171int
32e30700 1172PerlProcPauseProc(struct IPerlProc *I)
0cb96387 1173{
1174 return win32_sleep((32767L << 16) + 32767);
1175}
1176
1177PerlIO*
32e30700 1178PerlProcPopen(struct IPerlProc *I, const char *command, const char *mode)
0cb96387 1179{
12b99c39 1180 dTHXo;
32e30700 1181 PERL_FLUSHALL_FOR_CHILD;
0cb96387 1182 return (PerlIO*)win32_popen(command, mode);
1183}
1184
1185int
32e30700 1186PerlProcPclose(struct IPerlProc *I, PerlIO *stream)
0cb96387 1187{
1188 return win32_pclose((FILE*)stream);
1189}
1190
1191int
32e30700 1192PerlProcPipe(struct IPerlProc *I, int *phandles)
0cb96387 1193{
1194 return win32_pipe(phandles, 512, O_BINARY);
1195}
1196
1197int
32e30700 1198PerlProcSetuid(struct IPerlProc *I, uid_t u)
0cb96387 1199{
1200 return setuid(u);
1201}
1202
1203int
32e30700 1204PerlProcSetgid(struct IPerlProc *I, gid_t g)
0cb96387 1205{
1206 return setgid(g);
1207}
1208
1209int
32e30700 1210PerlProcSleep(struct IPerlProc *I, unsigned int s)
0cb96387 1211{
1212 return win32_sleep(s);
1213}
1214
1215int
32e30700 1216PerlProcTimes(struct IPerlProc *I, struct tms *timebuf)
0cb96387 1217{
1218 return win32_times(timebuf);
1219}
1220
1221int
32e30700 1222PerlProcWait(struct IPerlProc *I, int *status)
0cb96387 1223{
1224 return win32_wait(status);
1225}
1226
1227int
32e30700 1228PerlProcWaitpid(struct IPerlProc *I, int pid, int *status, int flags)
0cb96387 1229{
1230 return win32_waitpid(pid, status, flags);
1231}
1232
1233Sighandler_t
32e30700 1234PerlProcSignal(struct IPerlProc *I, int sig, Sighandler_t subcode)
0cb96387 1235{
1236 return 0;
1237}
1238
1239void*
32e30700 1240PerlProcDynaLoader(struct IPerlProc *I, const char* filename)
0cb96387 1241{
1242 return win32_dynaload(filename);
1243}
1244
1245void
32e30700 1246PerlProcGetOSError(struct IPerlProc *I, SV* sv, DWORD dwErr)
0cb96387 1247{
32e30700 1248 win32_str_os_error(sv, dwErr);
0cb96387 1249}
1250
1251BOOL
32e30700 1252PerlProcDoCmd(struct IPerlProc *I, char *cmd)
0cb96387 1253{
1254 do_spawn2(cmd, EXECF_EXEC);
1255 return FALSE;
1256}
1257
1258int
32e30700 1259PerlProcSpawn(struct IPerlProc *I, char* cmds)
0cb96387 1260{
1261 return do_spawn2(cmds, EXECF_SPAWN);
1262}
1263
1264int
32e30700 1265PerlProcSpawnvp(struct IPerlProc *I, int mode, const char *cmdname, const char *const *argv)
0cb96387 1266{
1267 return win32_spawnvp(mode, cmdname, argv);
1268}
1269
1270int
32e30700 1271PerlProcASpawn(struct IPerlProc *I, void *vreally, void **vmark, void **vsp)
0cb96387 1272{
32e30700 1273 return do_aspawn(vreally, vmark, vsp);
0cb96387 1274}
1275
1276struct IPerlProc perlProc =
1277{
1278 PerlProcAbort,
1279 PerlProcCrypt,
1280 PerlProcExit,
1281 PerlProc_Exit,
1282 PerlProcExecl,
1283 PerlProcExecv,
1284 PerlProcExecvp,
1285 PerlProcGetuid,
1286 PerlProcGeteuid,
1287 PerlProcGetgid,
1288 PerlProcGetegid,
1289 PerlProcGetlogin,
1290 PerlProcKill,
1291 PerlProcKillpg,
1292 PerlProcPauseProc,
1293 PerlProcPopen,
1294 PerlProcPclose,
1295 PerlProcPipe,
1296 PerlProcSetuid,
1297 PerlProcSetgid,
1298 PerlProcSleep,
1299 PerlProcTimes,
1300 PerlProcWait,
1301 PerlProcWaitpid,
1302 PerlProcSignal,
1303 PerlProcDynaLoader,
1304 PerlProcGetOSError,
1305 PerlProcDoCmd,
1306 PerlProcSpawn,
1307 PerlProcSpawnvp,
1308 PerlProcASpawn,
1309};
1310
32e30700 1311/*#include "perlhost.h" */
0cb96387 1312
0cb96387 1313
32e30700 1314EXTERN_C void
1315perl_get_host_info(struct IPerlMemInfo* perlMemInfo,
1316 struct IPerlEnvInfo* perlEnvInfo,
1317 struct IPerlStdIOInfo* perlStdIOInfo,
1318 struct IPerlLIOInfo* perlLIOInfo,
1319 struct IPerlDirInfo* perlDirInfo,
1320 struct IPerlSockInfo* perlSockInfo,
1321 struct IPerlProcInfo* perlProcInfo)
0cb96387 1322{
1323 if(perlMemInfo) {
1324 Copy(&perlMem, &perlMemInfo->perlMemList, perlMemInfo->nCount, void*);
1325 perlMemInfo->nCount = (sizeof(struct IPerlMem)/sizeof(void*));
1326 }
1327 if(perlEnvInfo) {
1328 Copy(&perlEnv, &perlEnvInfo->perlEnvList, perlEnvInfo->nCount, void*);
1329 perlEnvInfo->nCount = (sizeof(struct IPerlEnv)/sizeof(void*));
1330 }
1331 if(perlStdIOInfo) {
1332 Copy(&perlStdIO, &perlStdIOInfo->perlStdIOList, perlStdIOInfo->nCount, void*);
1333 perlStdIOInfo->nCount = (sizeof(struct IPerlStdIO)/sizeof(void*));
1334 }
1335 if(perlLIOInfo) {
1336 Copy(&perlLIO, &perlLIOInfo->perlLIOList, perlLIOInfo->nCount, void*);
1337 perlLIOInfo->nCount = (sizeof(struct IPerlLIO)/sizeof(void*));
1338 }
1339 if(perlDirInfo) {
1340 Copy(&perlDir, &perlDirInfo->perlDirList, perlDirInfo->nCount, void*);
1341 perlDirInfo->nCount = (sizeof(struct IPerlDir)/sizeof(void*));
1342 }
1343 if(perlSockInfo) {
1344 Copy(&perlSock, &perlSockInfo->perlSockList, perlSockInfo->nCount, void*);
1345 perlSockInfo->nCount = (sizeof(struct IPerlSock)/sizeof(void*));
1346 }
1347 if(perlProcInfo) {
1348 Copy(&perlProc, &perlProcInfo->perlProcList, perlProcInfo->nCount, void*);
1349 perlProcInfo->nCount = (sizeof(struct IPerlProc)/sizeof(void*));
1350 }
1351}
1352
32e30700 1353#ifdef PERL_OBJECT
1354
1355EXTERN_C PerlInterpreter* perl_alloc_using(struct IPerlMem* pMem,
1356 struct IPerlEnv* pEnv, struct IPerlStdIO* pStdIO,
1357 struct IPerlLIO* pLIO, struct IPerlDir* pDir,
1358 struct IPerlSock* pSock, struct IPerlProc* pProc)
0cb96387 1359{
1360 CPerlObj* pPerl = NULL;
1361 try
1362 {
1363 pPerl = Perl_alloc(pMem, pEnv, pStdIO, pLIO, pDir, pSock, pProc);
1364 }
1365 catch(...)
1366 {
1367 win32_fprintf(stderr, "%s\n", "Error: Unable to allocate memory");
1368 pPerl = NULL;
1369 }
1370 if(pPerl)
1371 {
1372 SetPerlInterpreter(pPerl);
c5be433b 1373 return (PerlInterpreter*)pPerl;
0cb96387 1374 }
1375 SetPerlInterpreter(NULL);
1376 return NULL;
1377}
1378
1379#undef perl_alloc
1380#undef perl_construct
1381#undef perl_destruct
1382#undef perl_free
1383#undef perl_run
1384#undef perl_parse
1385EXTERN_C PerlInterpreter* perl_alloc(void)
1386{
1387 CPerlObj* pPerl = NULL;
1388 try
1389 {
1390 pPerl = Perl_alloc(&perlMem, &perlEnv, &perlStdIO, &perlLIO,
1391 &perlDir, &perlSock, &perlProc);
1392 }
1393 catch(...)
1394 {
1395 win32_fprintf(stderr, "%s\n", "Error: Unable to allocate memory");
1396 pPerl = NULL;
1397 }
1398 if(pPerl)
1399 {
1400 SetPerlInterpreter(pPerl);
c5be433b 1401 return (PerlInterpreter*)pPerl;
0cb96387 1402 }
1403 SetPerlInterpreter(NULL);
1404 return NULL;
1405}
1406
1407EXTERN_C void perl_construct(PerlInterpreter* sv_interp)
1408{
c5be433b 1409 CPerlObj* pPerl = (CPerlObj*)sv_interp;
0cb96387 1410 try
1411 {
1412 pPerl->perl_construct();
1413 }
1414 catch(...)
1415 {
1416 win32_fprintf(stderr, "%s\n",
1417 "Error: Unable to construct data structures");
1418 pPerl->perl_free();
1419 SetPerlInterpreter(NULL);
1420 }
1421}
1422
1423EXTERN_C void perl_destruct(PerlInterpreter* sv_interp)
1424{
c5be433b 1425 CPerlObj* pPerl = (CPerlObj*)sv_interp;
0cb96387 1426 try
1427 {
1428 pPerl->perl_destruct();
1429 }
1430 catch(...)
1431 {
1432 }
1433}
1434
1435EXTERN_C void perl_free(PerlInterpreter* sv_interp)
1436{
c5be433b 1437 CPerlObj* pPerl = (CPerlObj*)sv_interp;
0cb96387 1438 try
1439 {
1440 pPerl->perl_free();
1441 }
1442 catch(...)
1443 {
1444 }
1445 SetPerlInterpreter(NULL);
1446}
1447
1448EXTERN_C int perl_run(PerlInterpreter* sv_interp)
1449{
c5be433b 1450 CPerlObj* pPerl = (CPerlObj*)sv_interp;
0cb96387 1451 int retVal;
1452 try
1453 {
1454 retVal = pPerl->perl_run();
1455 }
1456/*
1457 catch(int x)
1458 {
1459 // this is where exit() should arrive
1460 retVal = x;
1461 }
1462*/
1463 catch(...)
1464 {
1465 win32_fprintf(stderr, "Error: Runtime exception\n");
1466 retVal = -1;
1467 }
1468 return retVal;
1469}
1470
1471EXTERN_C int perl_parse(PerlInterpreter* sv_interp, void (*xsinit)(CPerlObj*), int argc, char** argv, char** env)
1472{
1473 int retVal;
c5be433b 1474 CPerlObj* pPerl = (CPerlObj*)sv_interp;
0cb96387 1475 try
1476 {
3075ddba 1477 retVal = pPerl->perl_parse(xsinit, argc, argv, env);
0cb96387 1478 }
1479/*
1480 catch(int x)
1481 {
1482 // this is where exit() should arrive
1483 retVal = x;
1484 }
1485*/
1486 catch(...)
1487 {
1488 win32_fprintf(stderr, "Error: Parse exception\n");
1489 retVal = -1;
1490 }
1491 *win32_errno() = 0;
1492 return retVal;
1493}
1494
1495#undef PL_perl_destruct_level
1496#define PL_perl_destruct_level int dummy
32e30700 1497
1498#else /* !PERL_OBJECT */
1499
1500EXTERN_C PerlInterpreter*
1501perl_alloc(void)
1502{
1503 return perl_alloc_using(&perlMem, &perlEnv, &perlStdIO, &perlLIO,
1504 &perlDir, &perlSock, &perlProc);
1505}
1506
0cb96387 1507#endif /* PERL_OBJECT */
0a753a76 1508
32e30700 1509#endif /* PERL_IMPLICIT_SYS */
1510
3075ddba 1511extern HANDLE w32_perldll_handle;
c5be433b 1512static DWORD g_TlsAllocIndex;
1513
1514EXTERN_C DllExport bool
1515SetPerlInterpreter(void *interp)
1516{
1517 return TlsSetValue(g_TlsAllocIndex, interp);
1518}
1519
1520EXTERN_C DllExport void*
1521GetPerlInterpreter(void)
1522{
1523 return TlsGetValue(g_TlsAllocIndex);
1524}
1525
1526EXTERN_C DllExport int
0cb96387 1527RunPerl(int argc, char **argv, char **env)
0a753a76 1528{
68dc0745 1529 int exitstatus;
ed094faf 1530 PerlInterpreter *my_perl, *new_perl = NULL;
4f63d024 1531 struct perl_thread *thr;
0a753a76 1532
0cb96387 1533#ifndef __BORLANDC__
1534 /* XXX this _may_ be a problem on some compilers (e.g. Borland) that
1535 * want to free() argv after main() returns. As luck would have it,
1536 * Borland's CRT does the right thing to argv[0] already. */
1537 char szModuleName[MAX_PATH];
1538 char *ptr;
1539
1540 GetModuleFileName(NULL, szModuleName, sizeof(szModuleName));
1541 (void)win32_longpath(szModuleName);
1542 argv[0] = szModuleName;
1543#endif
1544
22239a37 1545#ifdef PERL_GLOBAL_STRUCT
1546#define PERLVAR(var,type) /**/
51371543 1547#define PERLVARA(var,type) /**/
533c011a 1548#define PERLVARI(var,type,init) PL_Vars.var = init;
1549#define PERLVARIC(var,type,init) PL_Vars.var = init;
22239a37 1550#include "perlvars.h"
1551#undef PERLVAR
51371543 1552#undef PERLVARA
22239a37 1553#undef PERLVARI
3fe35a81 1554#undef PERLVARIC
22239a37 1555#endif
1556
0a753a76 1557 PERL_SYS_INIT(&argc,&argv);
1558
68dc0745 1559 if (!(my_perl = perl_alloc()))
1560 return (1);
1561 perl_construct( my_perl );
b28d0864 1562 PL_perl_destruct_level = 0;
0a753a76 1563
4f63d024 1564 exitstatus = perl_parse(my_perl, xs_init, argc, argv, env);
0a753a76 1565 if (!exitstatus) {
971a9dd3 1566#ifdef USE_ITHREADS /* XXXXXX testing */
ed094faf 1567 extern PerlInterpreter * perl_clone(pTHXx_ IV flags);
d18c6117 1568
ed094faf 1569 new_perl = perl_clone(my_perl, 0);
971a9dd3 1570 Perl_push_scope(new_perl); /* ENTER; (hack in lieu of perl_destruct()) */
d18c6117 1571 exitstatus = perl_run( new_perl );
971a9dd3 1572 SetPerlInterpreter(my_perl);
d18c6117 1573#else
0a753a76 1574 exitstatus = perl_run( my_perl );
d18c6117 1575#endif
0a753a76 1576 }
1577
0a753a76 1578 perl_destruct( my_perl );
1579 perl_free( my_perl );
ed094faf 1580#ifdef USE_ITHREADS
1581 if (new_perl) {
1582 SetPerlInterpreter(new_perl);
1583 perl_destruct(new_perl);
1584 perl_free(new_perl);
1585 }
1586#endif
0a753a76 1587
1588 PERL_SYS_TERM();
1589
68dc0745 1590 return (exitstatus);
0a753a76 1591}
1592
68dc0745 1593BOOL APIENTRY
1594DllMain(HANDLE hModule, /* DLL module handle */
1595 DWORD fdwReason, /* reason called */
1596 LPVOID lpvReserved) /* reserved */
0a753a76 1597{
68dc0745 1598 switch (fdwReason) {
1599 /* The DLL is attaching to a process due to process
1600 * initialization or a call to LoadLibrary.
1601 */
1602 case DLL_PROCESS_ATTACH:
1603/* #define DEFAULT_BINMODE */
0a753a76 1604#ifdef DEFAULT_BINMODE
3e3baf6d 1605 setmode( fileno( stdin ), O_BINARY );
1606 setmode( fileno( stdout ), O_BINARY );
1607 setmode( fileno( stderr ), O_BINARY );
1608 _fmode = O_BINARY;
0a753a76 1609#endif
0cb96387 1610 g_TlsAllocIndex = TlsAlloc();
1611 DisableThreadLibraryCalls(hModule);
2d7a9237 1612 w32_perldll_handle = hModule;
68dc0745 1613 break;
0a753a76 1614
68dc0745 1615 /* The DLL is detaching from a process due to
1616 * process termination or call to FreeLibrary.
1617 */
1618 case DLL_PROCESS_DETACH:
0cb96387 1619 TlsFree(g_TlsAllocIndex);
68dc0745 1620 break;
0a753a76 1621
68dc0745 1622 /* The attached process creates a new thread. */
1623 case DLL_THREAD_ATTACH:
1624 break;
0a753a76 1625
68dc0745 1626 /* The thread of the attached process terminates. */
1627 case DLL_THREAD_DETACH:
1628 break;
0a753a76 1629
68dc0745 1630 default:
1631 break;
1632 }
1633 return TRUE;
0a753a76 1634}
8b10511d 1635