Less potentially test-harness-confusing output.
[p5sagit/p5-mst-13.2.git] / NetWare / nwperlsys.c
CommitLineData
2986a63f 1/*
2 * Copyright © 2001 Novell, Inc. All Rights Reserved.
3 *
4 * You may distribute under the terms of either the GNU General Public
5 * License or the Artistic License, as specified in the README file.
6 *
7 */
8
9/*
10 * FILENAME : nwperlsys.c
11 * DESCRIPTION : Contains the platform specific functions calls
12 *
13 * Author : SGP
14 * Date Created : June 12th 2001.
15 * Date Modified:
16 */
17
18#include "EXTERN.h"
19#include "perl.h"
20
21
22#ifdef PERL_OBJECT
23#define NO_XSLOCKS
24#endif
25
26//CHKSGP
27//Including this is giving premature end-of-file error during compilation
28//#include "XSUB.h"
29
30#ifdef PERL_IMPLICIT_SYS
31
32#include "nw5iop.h"
33#include <fcntl.h>
34
35
36#include "win32ish.h"
37
38START_EXTERN_C
39extern int do_spawn2(char *cmd, int exectype);
40extern int do_aspawn(void *vreally, void **vmark, void **vsp);
41extern void Perl_init_os_extras(void);
42extern BOOL fnInsertHashListAddrs(void *addrs, BOOL dontTouchHashList);
43extern BOOL fnGetHashListAddrs(void *addrs, BOOL *dontTouchHashList);
44END_EXTERN_C
45
46//Includes iperlsys.h and function definitions
47#include "nwperlsys.h"
48
49/* IPerlStdio - Stdio functions - Begin ================================================*/
50
51FILE*
52PerlStdIOStdin(struct IPerlStdIO* piPerl)
53{
54 return nw_stdin();
55}
56
57FILE*
58PerlStdIOStdout(struct IPerlStdIO* piPerl)
59{
60 return nw_stdout();
61}
62
63FILE*
64PerlStdIOStderr(struct IPerlStdIO* piPerl)
65{
66 return nw_stderr();
67}
68
69FILE*
70PerlStdIOOpen(struct IPerlStdIO* piPerl, const char *path, const char *mode)
71{
72 return nw_fopen(path, mode);
73}
74
75int
76PerlStdIOClose(struct IPerlStdIO* piPerl, FILE* pf)
77{
78 return nw_fclose(pf);
79}
80
81int
82PerlStdIOEof(struct IPerlStdIO* piPerl, FILE* pf)
83{
84 return nw_feof(pf);
85}
86
87int
88PerlStdIOError(struct IPerlStdIO* piPerl, FILE* pf)
89{
90 return nw_ferror(pf);
91}
92
93void
94PerlStdIOClearerr(struct IPerlStdIO* piPerl, FILE* pf)
95{
96 nw_clearerr(pf);
97}
98
99int
100PerlStdIOGetc(struct IPerlStdIO* piPerl, FILE* pf)
101{
102 return nw_getc(pf);
103}
104
105char*
106PerlStdIOGetBase(struct IPerlStdIO* piPerl, FILE* pf)
107{
108#ifdef FILE_base
109 FILE *f = pf;
110 return FILE_base(f);
111#else
112 return Nullch;
113#endif
114}
115
116int
117PerlStdIOGetBufsiz(struct IPerlStdIO* piPerl, FILE* pf)
118{
119#ifdef FILE_bufsiz
120 FILE *f = pf;
121 return FILE_bufsiz(f);
122#else
123 return (-1);
124#endif
125}
126
127int
128PerlStdIOGetCnt(struct IPerlStdIO* piPerl, FILE* pf)
129{
130#ifdef USE_STDIO_PTR
131 FILE *f = pf;
132 return FILE_cnt(f);
133#else
134 return (-1);
135#endif
136}
137
138char*
139PerlStdIOGetPtr(struct IPerlStdIO* piPerl, FILE* pf)
140{
141#ifdef USE_STDIO_PTR
142 FILE *f = pf;
143 return FILE_ptr(f);
144#else
145 return Nullch;
146#endif
147}
148
149char*
150PerlStdIOGets(struct IPerlStdIO* piPerl, FILE* pf, char* s, int n)
151{
152 return nw_fgets(s, n, pf);
153}
154
155int
156PerlStdIOPutc(struct IPerlStdIO* piPerl, FILE* pf, int c)
157{
158 return nw_fputc(c, pf);
159}
160
161int
162PerlStdIOPuts(struct IPerlStdIO* piPerl, FILE* pf, const char *s)
163{
164 return nw_fputs(s, pf);
165}
166
167int
168PerlStdIOFlush(struct IPerlStdIO* piPerl, FILE* pf)
169{
170 return nw_fflush(pf);
171}
172
173int
174PerlStdIOUngetc(struct IPerlStdIO* piPerl, int c, FILE* pf)
175{
176 return nw_ungetc(c, pf);
177}
178
179int
180PerlStdIOFileno(struct IPerlStdIO* piPerl, FILE* pf)
181{
182 return nw_fileno(pf);
183}
184
185FILE*
186PerlStdIOFdopen(struct IPerlStdIO* piPerl, int fd, const char *mode)
187{
188 return nw_fdopen(fd, mode);
189}
190
191FILE*
192PerlStdIOReopen(struct IPerlStdIO* piPerl, const char*path, const char*mode, FILE* pf)
193{
194 return nw_freopen(path, mode, pf);
195}
196
197SSize_t
198PerlStdIORead(struct IPerlStdIO* piPerl, void *buffer, Size_t size, Size_t count, FILE* pf)
199{
200 return nw_fread(buffer, size, count, pf);
201}
202
203SSize_t
204PerlStdIOWrite(struct IPerlStdIO* piPerl, const void *buffer, Size_t size, Size_t count, FILE* pf)
205{
206 return nw_fwrite(buffer, size, count, pf);
207}
208
209void
210PerlStdIOSetBuf(struct IPerlStdIO* piPerl, FILE* pf, char* buffer)
211{
212 nw_setbuf(pf, buffer);
213}
214
215int
216PerlStdIOSetVBuf(struct IPerlStdIO* piPerl, FILE* pf, char* buffer, int type, Size_t size)
217{
218 return nw_setvbuf(pf, buffer, type, size);
219}
220
221void
222PerlStdIOSetCnt(struct IPerlStdIO* piPerl, FILE* pf, int n)
223{
224#ifdef STDIO_CNT_LVALUE
225 FILE *f = pf;
226 FILE_cnt(f) = n;
227#endif
228}
229
230void
231PerlStdIOSetPtr(struct IPerlStdIO* piPerl, FILE* pf, char * ptr)
232{
233#ifdef STDIO_PTR_LVALUE
234 FILE *f = pf;
235 FILE_ptr(f) = ptr;
236#endif
237}
238
239void
240PerlStdIOSetlinebuf(struct IPerlStdIO* piPerl, FILE* pf)
241{
242 nw_setvbuf(pf, NULL, _IOLBF, 0);
243}
244
245int
246PerlStdIOPrintf(struct IPerlStdIO* piPerl, FILE* pf, const char *format,...)
247{
248 va_list(arglist);
249 va_start(arglist, format);
250 return nw_vfprintf(pf, format, arglist);
251}
252
253int
254PerlStdIOVprintf(struct IPerlStdIO* piPerl, FILE* pf, const char *format, va_list arglist)
255{
256 return nw_vfprintf(pf, format, arglist);
257}
258
259long
260PerlStdIOTell(struct IPerlStdIO* piPerl, FILE* pf)
261{
262 return nw_ftell(pf);
263}
264
265int
266PerlStdIOSeek(struct IPerlStdIO* piPerl, FILE* pf, off_t offset, int origin)
267{
268 return nw_fseek(pf, offset, origin);
269}
270
271void
272PerlStdIORewind(struct IPerlStdIO* piPerl, FILE* pf)
273{
274 nw_rewind(pf);
275}
276
277FILE*
278PerlStdIOTmpfile(struct IPerlStdIO* piPerl)
279{
280 return nw_tmpfile();
281}
282
283int
284PerlStdIOGetpos(struct IPerlStdIO* piPerl, FILE* pf, Fpos_t *p)
285{
286 return nw_fgetpos(pf, p);
287}
288
289int
290PerlStdIOSetpos(struct IPerlStdIO* piPerl, FILE* pf, const Fpos_t *p)
291{
292 return nw_fsetpos(pf, p);
293}
294
295void
296PerlStdIOInit(struct IPerlStdIO* piPerl)
297{
298}
299
300void
301PerlStdIOInitOSExtras(struct IPerlStdIO* piPerl)
302{
303 Perl_init_os_extras();
304}
305
306
307int
308PerlStdIOOpenOSfhandle(struct IPerlStdIO* piPerl, long osfhandle, int flags)
309{
310 return nw_open_osfhandle(osfhandle, flags);
311}
312
313int
314PerlStdIOGetOSfhandle(struct IPerlStdIO* piPerl, int filenum)
315{
316 return nw_get_osfhandle(filenum);
317}
318
319FILE*
320PerlStdIOFdupopen(struct IPerlStdIO* piPerl, FILE* pf)
321{
322 FILE* pfdup=NULL;
323 fpos_t pos=0;
324 char mode[3]={'\0'};
325 int fileno = nw_dup(nw_fileno(pf));
326
327 /* open the file in the same mode */
328 if(((FILE*)pf)->_flag & _IOREAD) {
329 mode[0] = 'r';
330 mode[1] = 0;
331 }
332 else if(((FILE*)pf)->_flag & _IOWRT) {
333 mode[0] = 'a';
334 mode[1] = 0;
335 }
336 else if(((FILE*)pf)->_flag & _IORW) {
337 mode[0] = 'r';
338 mode[1] = '+';
339 mode[2] = 0;
340 }
341
342 /* it appears that the binmode is attached to the
343 * file descriptor so binmode files will be handled
344 * correctly
345 */
346 pfdup = nw_fdopen(fileno, mode);
347
348 /* move the file pointer to the same position */
349 if (!fgetpos(pf, &pos)) {
350 fsetpos(pfdup, &pos);
351 }
352 return pfdup;
353}
354
355/* IPerlStdio - Stdio functions - End ================================================*/
356
357/* IPerlDir - Directory Manipulation functions - Begin ===================================*/
358
359int
360PerlDirMakedir(struct IPerlDir* piPerl, const char *dirname, int mode)
361{
362 return mkdir(dirname);
363}
364
365int
366PerlDirChdir(struct IPerlDir* piPerl, const char *dirname)
367{
368 return nw_chdir(dirname);
369}
370
371int
372PerlDirRmdir(struct IPerlDir* piPerl, const char *dirname)
373{
374 return nw_rmdir(dirname);
375}
376
377int
378PerlDirClose(struct IPerlDir* piPerl, DIR *dirp)
379{
380 return nw_closedir(dirp);
381}
382
383DIR*
384PerlDirOpen(struct IPerlDir* piPerl, char *filename)
385{
386 return nw_opendir(filename);
387}
388
389struct direct *
390PerlDirRead(struct IPerlDir* piPerl, DIR *dirp)
391{
392 return nw_readdir(dirp);
393}
394
395void
396PerlDirRewind(struct IPerlDir* piPerl, DIR *dirp)
397{
398 nw_rewinddir(dirp);
399}
400
401void
402PerlDirSeek(struct IPerlDir* piPerl, DIR *dirp, long loc)
403{
404 nw_seekdir(dirp, loc);
405}
406
407long
408PerlDirTell(struct IPerlDir* piPerl, DIR *dirp)
409{
410 return nw_telldir(dirp);
411}
412
413/* IPerlDir - Directory Manipulation functions - End ===================================*/
414
415/* IPerlEnv - Environment related functions - Begin ======================================*/
416
417char*
418PerlEnvGetenv(struct IPerlEnv* piPerl, const char *varname)
419{
420 return(getenv(varname));
421};
422
423int
424PerlEnvPutenv(struct IPerlEnv* piPerl, const char *envstring)
425{
426 return(putenv(envstring));
427};
428
429char*
430PerlEnvGetenv_len(struct IPerlEnv* piPerl, const char* varname, unsigned long* len)
431{
432 *len = 0;
433 char *e = getenv(varname);
434 if (e)
435 *len = strlen(e);
436 return e;
437}
438
439int
440PerlEnvUname(struct IPerlEnv* piPerl, struct utsname *name)
441{
442 return nw_uname(name);
443}
444
445void
446PerlEnvClearenv(struct IPerlEnv* piPerl)
447{
448
449}
450
451/* IPerlEnv - Environment related functions - End ======================================*/
452
453/* IPerlLIO - Low-level IO functions - Begin =============================================*/
454
455int
456PerlLIOAccess(struct IPerlLIO* piPerl, const char *path, int mode)
457{
458 return nw_access(path, mode);
459}
460
461int
462PerlLIOChmod(struct IPerlLIO* piPerl, const char *filename, int pmode)
463{
464 return nw_chmod(filename, pmode);
465}
466
467int
468PerlLIOChown(struct IPerlLIO* piPerl, const char *filename, uid_t owner, gid_t group)
469{
470 dTHXo;
471 Perl_croak(aTHX_ "chown not implemented!\n");
472 return 0;
473}
474
475int
476PerlLIOChsize(struct IPerlLIO* piPerl, int handle, long size)
477{
478 return (nw_chsize(handle,size));
479}
480
481int
482PerlLIOClose(struct IPerlLIO* piPerl, int handle)
483{
484 return nw_close(handle);
485}
486
487int
488PerlLIODup(struct IPerlLIO* piPerl, int handle)
489{
490 return nw_dup(handle);
491}
492
493int
494PerlLIODup2(struct IPerlLIO* piPerl, int handle1, int handle2)
495{
496 return nw_dup2(handle1, handle2);
497}
498
499int
500PerlLIOFlock(struct IPerlLIO* piPerl, int fd, int oper)
501{
502 //On NetWare simulate flock by locking a range on the file
503 return nw_flock(fd, oper);
504}
505
506int
507PerlLIOFileStat(struct IPerlLIO* piPerl, int handle, struct stat *buffer)
508{
509 return fstat(handle, buffer);
510}
511
512int
513PerlLIOIOCtl(struct IPerlLIO* piPerl, int i, unsigned int u, char *data)
514{
515 return 0;
516}
517
518int
519PerlLIOIsatty(struct IPerlLIO* piPerl, int fd)
520{
521 return nw_isatty(fd);
522}
523
524int
525PerlLIOLink(struct IPerlLIO* piPerl, const char*oldname, const char *newname)
526{
527 return nw_link(oldname, newname);
528}
529
530long
531PerlLIOLseek(struct IPerlLIO* piPerl, int handle, long offset, int origin)
532{
533 return nw_lseek(handle, offset, origin);
534}
535
536int
537PerlLIOLstat(struct IPerlLIO* piPerl, const char *path, struct stat *buffer)
538{
539 return nw_stat(path, buffer);
540}
541
542char*
543PerlLIOMktemp(struct IPerlLIO* piPerl, char *Template)
544{
545 return(nw_mktemp(Template));
546}
547
548int
549PerlLIOOpen(struct IPerlLIO* piPerl, const char *filename, int oflag)
550{
551 return nw_open(filename, oflag);
552}
553
554int
555PerlLIOOpen3(struct IPerlLIO* piPerl, const char *filename, int oflag, int pmode)
556{
557 return nw_open(filename, oflag, pmode);
558}
559
560int
561PerlLIORead(struct IPerlLIO* piPerl, int handle, void *buffer, unsigned int count)
562{
563 return nw_read(handle, buffer, count);
564}
565
566int
567PerlLIORename(struct IPerlLIO* piPerl, const char *OldFileName, const char *newname)
568{
569 return nw_rename(OldFileName, newname);
570}
571
572int
573PerlLIOSetmode(struct IPerlLIO* piPerl, FILE *fp, int mode)
574{
575 return nw_setmode(fp, mode);
576}
577
578int
579PerlLIONameStat(struct IPerlLIO* piPerl, const char *path, struct stat *buffer)
580{
581 return nw_stat(path, buffer);
582}
583
584char*
585PerlLIOTmpnam(struct IPerlLIO* piPerl, char *string)
586{
587 return tmpnam(string);
588}
589
590int
591PerlLIOUmask(struct IPerlLIO* piPerl, int pmode)
592{
593 return umask(pmode);
594}
595
596int
597PerlLIOUnlink(struct IPerlLIO* piPerl, const char *filename)
598{
599 return nw_unlink(filename);
600}
601
602int
603PerlLIOUtime(struct IPerlLIO* piPerl, char *filename, struct utimbuf *times)
604{
605 return nw_utime(filename, times);
606}
607
608int
609PerlLIOWrite(struct IPerlLIO* piPerl, int handle, const void *buffer, unsigned int count)
610{
611 return nw_write(handle, buffer, count);
612}
613
614/* IPerlLIO - Low-level IO functions - End =============================================*/
615
616/* IPerlMem - Memory management functions - Begin ========================================*/
617
618void*
619PerlMemMalloc(struct IPerlMem* piPerl, size_t size)
620{
621 void *ptr = NULL;
622 ptr = malloc(size);
623 if (ptr) {
624 void **listptr;
625 BOOL m_dontTouchHashLists;
626 if(fnGetHashListAddrs(&listptr,&m_dontTouchHashLists)) {
627 if (listptr) {
628 WCValHashTable<void*>* m_allocList= (WCValHashTable<void*>*)listptr;
629 (WCValHashTable<void*>*)m_allocList->insert(ptr);
630 }
631 }
632 }
633 return(ptr);
634}
635
636void*
637PerlMemRealloc(struct IPerlMem* piPerl, void* ptr, size_t size)
638{
639 void *newptr = NULL;
640 WCValHashTable<void*>* m_allocList;
641
642 newptr = realloc(ptr, size);
643
644 if (ptr)
645 {
646 void **listptr;
647 BOOL m_dontTouchHashLists;
648 if(fnGetHashListAddrs(&listptr,&m_dontTouchHashLists)) {
649 m_allocList= (WCValHashTable<void*>*)listptr;
650 (WCValHashTable<void*>*)m_allocList->remove(ptr);
651 }
652 }
653 if (newptr)
654 {
655 if (m_allocList)
656 (WCValHashTable<void*>*)m_allocList->insert(newptr);
657 }
658
659 return(newptr);
660}
661
662void
663PerlMemFree(struct IPerlMem* piPerl, void* ptr)
664{
665 BOOL m_dontTouchHashLists;
666 WCValHashTable<void*>* m_allocList;
667
668 void **listptr;
669 if(fnGetHashListAddrs(&listptr,&m_dontTouchHashLists)) {
670 m_allocList= (WCValHashTable<void*>*)listptr;
671 // Final clean up, free all the nodes from the hash list
672 if (m_dontTouchHashLists)
673 {
674 if(ptr)
675 {
676 free(ptr);
677 ptr = NULL;
678 }
679 }
680 else
681 {
682 if(ptr && m_allocList)
683 {
684 if ((WCValHashTable<void*>*)m_allocList->remove(ptr))
685 {
686 free(ptr);
687 ptr = NULL;
688 }
689 else
690 {
691 // If it comes here, that means that the memory pointer is not contained in the hash list.
692 // But no need to free now, since if is deleted here, it will result in an abend!!
693 // If the memory is still there, it will be cleaned during final cleanup anyway.
694 }
695 }
696 }
697 }
698 return;
699}
700
701void*
702PerlMemCalloc(struct IPerlMem* piPerl, size_t num, size_t size)
703{
704 void *ptr = NULL;
705
706 ptr = calloc(num, size);
707 if (ptr) {
708 void **listptr;
709 BOOL m_dontTouchHashLists;
710 if(fnGetHashListAddrs(&listptr,&m_dontTouchHashLists)) {
711 if (listptr) {
712 WCValHashTable<void*>* m_allocList= (WCValHashTable<void*>*)listptr;
713 (WCValHashTable<void*>*)m_allocList->insert(ptr);
714 }
715 }
716 }
717 return(ptr);
718}
719
720/* IPerlMem - Memory management functions - End ========================================*/
721
722/* IPerlProc - Process control functions - Begin =========================================*/
723
724#define EXECF_EXEC 1
725#define EXECF_SPAWN 2
726
727void
728PerlProcAbort(struct IPerlProc* piPerl)
729{
730 nw_abort();
731}
732
733char *
734PerlProcCrypt(struct IPerlProc* piPerl, const char* clear, const char* salt)
735{
736 return nw_crypt(clear, salt);
737}
738
739void
740PerlProcExit(struct IPerlProc* piPerl, int status)
741{
742// exit(status);
743 dTHX;
744 dJMPENV;
745 JMPENV_JUMP(2);
746}
747
748void
749PerlProc_Exit(struct IPerlProc* piPerl, int status)
750{
751// _exit(status);
752 dTHX;
753 dJMPENV;
754 JMPENV_JUMP(2);
755}
756
757int
758PerlProcExecl(struct IPerlProc* piPerl, const char *cmdname, const char *arg0, const char *arg1, const char *arg2, const char *arg3)
759{
760 dTHXo;
761 Perl_croak(aTHX_ "execl not implemented!\n");
762 return 0;
763}
764
765int
766PerlProcExecv(struct IPerlProc* piPerl, const char *cmdname, const char *const *argv)
767{
768 return nw_execvp((char *)cmdname, (char **)argv);
769}
770
771int
772PerlProcExecvp(struct IPerlProc* piPerl, const char *cmdname, const char *const *argv)
773{
774 return nw_execvp((char *)cmdname, (char **)argv);
775}
776
777uid_t
778PerlProcGetuid(struct IPerlProc* piPerl)
779{
780 return 0;
781}
782
783uid_t
784PerlProcGeteuid(struct IPerlProc* piPerl)
785{
786 return 0;
787}
788
789gid_t
790PerlProcGetgid(struct IPerlProc* piPerl)
791{
792 return 0;
793}
794
795gid_t
796PerlProcGetegid(struct IPerlProc* piPerl)
797{
798 return 0;
799}
800
801char *
802PerlProcGetlogin(struct IPerlProc* piPerl)
803{
804 return NULL;
805}
806
807int
808PerlProcKill(struct IPerlProc* piPerl, int pid, int sig)
809{
810 return nw_kill(pid, sig);
811}
812
813int
814PerlProcKillpg(struct IPerlProc* piPerl, int pid, int sig)
815{
816 dTHXo;
817 Perl_croak(aTHX_ "killpg not implemented!\n");
818 return 0;
819}
820
821int
822PerlProcPauseProc(struct IPerlProc* piPerl)
823{
824 return nw_sleep((32767L << 16) + 32767);
825}
826
827PerlIO*
828PerlProcPopen(struct IPerlProc* piPerl, const char *command, const char *mode)
829{
830 dTHXo;
831 PERL_FLUSHALL_FOR_CHILD;
832
833 return (PerlIO*)nw_Popen((char *)command, (char *)mode, (int *)errno);
834}
835
836int
837PerlProcPclose(struct IPerlProc* piPerl, PerlIO *stream)
838{
839 return nw_Pclose((FILE*)stream, (int *)errno);
840}
841
842int
843PerlProcPipe(struct IPerlProc* piPerl, int *phandles)
844{
845 return nw_Pipe((int *)phandles, (int *)errno);
846}
847
848int
849PerlProcSetuid(struct IPerlProc* piPerl, uid_t u)
850{
851 return 0;
852}
853
854int
855PerlProcSetgid(struct IPerlProc* piPerl, gid_t g)
856{
857 return 0;
858}
859
860int
861PerlProcSleep(struct IPerlProc* piPerl, unsigned int s)
862{
863 return nw_sleep(s);
864}
865
866int
867PerlProcTimes(struct IPerlProc* piPerl, struct tms *timebuf)
868{
869 return nw_times(timebuf);
870}
871
872int
873PerlProcWait(struct IPerlProc* piPerl, int *status)
874{
875 return nw_wait(status);
876}
877
878int
879PerlProcWaitpid(struct IPerlProc* piPerl, int pid, int *status, int flags)
880{
881 return nw_waitpid(pid, status, flags);
882}
883
884Sighandler_t
885PerlProcSignal(struct IPerlProc* piPerl, int sig, Sighandler_t subcode)
886{
887 return 0;
888}
889
890int
891PerlProcFork(struct IPerlProc* piPerl)
892{
893 return 0;
894}
895
896int
897PerlProcGetpid(struct IPerlProc* piPerl)
898{
899 return nw_getpid();
900}
901
902/*BOOL
903PerlProcDoCmd(struct IPerlProc* piPerl, char *cmd)
904{
905 do_spawn2(cmd, EXECF_EXEC);
906 return FALSE;
907}*/
908
909int
910PerlProcSpawn(struct IPerlProc* piPerl, char* cmds)
911{
912 return do_spawn2(cmds, EXECF_SPAWN);
913}
914
915int
916PerlProcSpawnvp(struct IPerlProc* piPerl, int mode, const char *cmdname, const char *const *argv)
917{
918 return nw_spawnvp(mode, (char *)cmdname, (char **)argv);
919}
920
921int
922PerlProcASpawn(struct IPerlProc* piPerl, void *vreally, void **vmark, void **vsp)
923{
924 return do_aspawn(vreally, vmark, vsp);
925}
926
927/* IPerlProc - Process control functions - End =========================================*/
928
929/* IPerlSock - Socket functions - Begin ==================================================*/
930
931u_long
932PerlSockHtonl(struct IPerlSock* piPerl, u_long hostlong)
933{
934 return(nw_htonl(hostlong));
935}
936
937u_short
938PerlSockHtons(struct IPerlSock* piPerl, u_short hostshort)
939{
940 return(nw_htons(hostshort));
941}
942
943u_long
944PerlSockNtohl(struct IPerlSock* piPerl, u_long netlong)
945{
946 return nw_ntohl(netlong);
947}
948
949u_short
950PerlSockNtohs(struct IPerlSock* piPerl, u_short netshort)
951{
952 return nw_ntohs(netshort);
953}
954
955SOCKET PerlSockAccept(struct IPerlSock* piPerl, SOCKET s, struct sockaddr* addr, int* addrlen)
956{
957 return nw_accept(s, addr, addrlen);
958}
959
960int
961PerlSockBind(struct IPerlSock* piPerl, SOCKET s, const struct sockaddr* name, int namelen)
962{
963 return nw_bind(s, name, namelen);
964}
965
966int
967PerlSockConnect(struct IPerlSock* piPerl, SOCKET s, const struct sockaddr* name, int namelen)
968{
969 return nw_connect(s, name, namelen);
970}
971
972void
973PerlSockEndhostent(struct IPerlSock* piPerl)
974{
975 nw_endhostent();
976}
977
978void
979PerlSockEndnetent(struct IPerlSock* piPerl)
980{
981 nw_endnetent();
982}
983
984void
985PerlSockEndprotoent(struct IPerlSock* piPerl)
986{
987 nw_endprotoent();
988}
989
990void
991PerlSockEndservent(struct IPerlSock* piPerl)
992{
993 nw_endservent();
994}
995
996struct hostent*
997PerlSockGethostbyaddr(struct IPerlSock* piPerl, const char* addr, int len, int type)
998{
999 return(nw_gethostbyaddr(addr,len,type));
1000}
1001
1002struct hostent*
1003PerlSockGethostbyname(struct IPerlSock* piPerl, const char* name)
1004{
1005 return nw_gethostbyname(name);
1006}
1007
1008struct hostent*
1009PerlSockGethostent(struct IPerlSock* piPerl)
1010{
1011 return(nw_gethostent());
1012}
1013
1014int
1015PerlSockGethostname(struct IPerlSock* piPerl, char* name, int namelen)
1016{
1017 return nw_gethostname(name,namelen);
1018}
1019
1020struct netent *
1021PerlSockGetnetbyaddr(struct IPerlSock* piPerl, long net, int type)
1022{
1023 return nw_getnetbyaddr(net, type);
1024}
1025
1026struct netent *
1027PerlSockGetnetbyname(struct IPerlSock* piPerl, const char *name)
1028{
1029 return nw_getnetbyname((char*)name);
1030}
1031
1032struct netent *
1033PerlSockGetnetent(struct IPerlSock* piPerl)
1034{
1035 return nw_getnetent();
1036}
1037
1038int PerlSockGetpeername(struct IPerlSock* piPerl, SOCKET s, struct sockaddr* name, int* namelen)
1039{
1040 return nw_getpeername(s, name, namelen);
1041}
1042
1043struct protoent*
1044PerlSockGetprotobyname(struct IPerlSock* piPerl, const char* name)
1045{
1046 return nw_getprotobyname(name);
1047}
1048
1049struct protoent*
1050PerlSockGetprotobynumber(struct IPerlSock* piPerl, int number)
1051{
1052 return nw_getprotobynumber(number);
1053}
1054
1055struct protoent*
1056PerlSockGetprotoent(struct IPerlSock* piPerl)
1057{
1058 return nw_getprotoent();
1059}
1060
1061struct servent*
1062PerlSockGetservbyname(struct IPerlSock* piPerl, const char* name, const char* proto)
1063{
1064 return nw_getservbyname((char*)name, (char*)proto);
1065}
1066
1067struct servent*
1068PerlSockGetservbyport(struct IPerlSock* piPerl, int port, const char* proto)
1069{
1070 return nw_getservbyport(port, proto);
1071}
1072
1073struct servent*
1074PerlSockGetservent(struct IPerlSock* piPerl)
1075{
1076 return nw_getservent();
1077}
1078
1079int
1080PerlSockGetsockname(struct IPerlSock* piPerl, SOCKET s, struct sockaddr* name, int* namelen)
1081{
1082 return nw_getsockname(s, name, namelen);
1083}
1084
1085int
1086PerlSockGetsockopt(struct IPerlSock* piPerl, SOCKET s, int level, int optname, char* optval, int* optlen)
1087{
1088 return nw_getsockopt(s, level, optname, optval, optlen);
1089}
1090
1091unsigned long
1092PerlSockInetAddr(struct IPerlSock* piPerl, const char* cp)
1093{
1094 return(nw_inet_addr(cp));
1095}
1096
1097char*
1098PerlSockInetNtoa(struct IPerlSock* piPerl, struct in_addr in)
1099{
1100 return NULL;
1101}
1102
1103int
1104PerlSockListen(struct IPerlSock* piPerl, SOCKET s, int backlog)
1105{
1106 return (nw_listen(s, backlog));
1107}
1108
1109int
1110PerlSockRecv(struct IPerlSock* piPerl, SOCKET s, char* buffer, int len, int flags)
1111{
1112 return (nw_recv(s, buffer, len, flags));
1113}
1114
1115int
1116PerlSockRecvfrom(struct IPerlSock* piPerl, SOCKET s, char* buffer, int len, int flags, struct sockaddr* from, int* fromlen)
1117{
1118 return nw_recvfrom(s, buffer, len, flags, from, fromlen);
1119}
1120
1121int
1122PerlSockSelect(struct IPerlSock* piPerl, int nfds, char* readfds, char* writefds, char* exceptfds, const struct timeval* timeout)
1123{
1124 return nw_select(nfds, (fd_set*) readfds, (fd_set*) writefds, (fd_set*) exceptfds, timeout);
1125}
1126
1127int
1128PerlSockSend(struct IPerlSock* piPerl, SOCKET s, const char* buffer, int len, int flags)
1129{
1130 return (nw_send(s, buffer, len, flags));
1131}
1132
1133int
1134PerlSockSendto(struct IPerlSock* piPerl, SOCKET s, const char* buffer, int len, int flags, const struct sockaddr* to, int tolen)
1135{
1136 return(nw_sendto(s, buffer, len, flags, to, tolen));
1137}
1138
1139void
1140PerlSockSethostent(struct IPerlSock* piPerl, int stayopen)
1141{
1142 nw_sethostent(stayopen);
1143}
1144
1145void
1146PerlSockSetnetent(struct IPerlSock* piPerl, int stayopen)
1147{
1148 nw_setnetent(stayopen);
1149}
1150
1151void
1152PerlSockSetprotoent(struct IPerlSock* piPerl, int stayopen)
1153{
1154 nw_setprotoent(stayopen);
1155}
1156
1157void
1158PerlSockSetservent(struct IPerlSock* piPerl, int stayopen)
1159{
1160 nw_setservent(stayopen);
1161}
1162
1163int
1164PerlSockSetsockopt(struct IPerlSock* piPerl, SOCKET s, int level, int optname, const char* optval, int optlen)
1165{
1166 dTHXo;
1167 Perl_croak(aTHX_ "setsockopt not implemented!\n");
1168 return 0;
1169}
1170
1171int
1172PerlSockShutdown(struct IPerlSock* piPerl, SOCKET s, int how)
1173{
1174 return nw_shutdown(s, how);
1175}
1176
1177SOCKET
1178PerlSockSocket(struct IPerlSock* piPerl, int af, int type, int protocol)
1179{
1180 return nw_socket(af, type, protocol);
1181}
1182
1183int
1184PerlSockSocketpair(struct IPerlSock* piPerl, int domain, int type, int protocol, int* fds)
1185{
1186 dTHXo;
1187 Perl_croak(aTHX_ "socketpair not implemented!\n");
1188 return 0;
1189}
1190
1191int
1192PerlSockIoctlsocket(struct IPerlSock* piPerl, SOCKET s, long cmd, u_long *argp)
1193{
1194 dTHXo;
1195 Perl_croak(aTHX_ "ioctlsocket not implemented!\n");
1196 return 0;
1197}
1198
1199/* IPerlSock - Socket functions - End ==================================================*/
1200
1201/*============================================================================================
1202
1203 Function : fnFreeMemEntry
1204
1205 Description : Called for each outstanding memory allocation at the end of a script run.
1206 Frees the outstanding allocations
1207
1208 Parameters : ptr (IN).
1209 context (IN)
1210
1211 Returns : Nothing.
1212
1213==============================================================================================*/
1214
1215void fnFreeMemEntry(void* ptr, void* context)
1216{
1217 if(ptr)
1218 {
1219 PerlMemFree(NULL, ptr);
1220 }
1221}
1222/*============================================================================================
1223
1224 Function : fnAllocListHash
1225
1226 Description : Hashing function for hash table of memory allocations.
1227
1228 Parameters : invalue (IN).
1229
1230 Returns : unsigned.
1231
1232==============================================================================================*/
1233
1234unsigned fnAllocListHash(void* const& invalue)
1235{
1236 return (((unsigned) invalue & 0x0000ff00) >> 8);
1237}
1238
1239/*============================================================================================
1240
1241 Function : perl_alloc
1242
1243 Description : creates a Perl interpreter variable and initializes
1244
1245 Parameters : none
1246
1247 Returns : Pointer to Perl interpreter
1248
1249==============================================================================================*/
1250
1251EXTERN_C PerlInterpreter*
1252perl_alloc(void)
1253{
1254 PerlInterpreter* my_perl = NULL;
1255
1256 WCValHashTable<void*>* m_allocList;
1257 m_allocList = new WCValHashTable<void*> (fnAllocListHash, 256);
1258 fnInsertHashListAddrs(m_allocList, FALSE);
1259
1260 my_perl = perl_alloc_using(&perlMem,
1261 NULL,
1262 NULL,
1263 &perlEnv,
1264 &perlStdIO,
1265 &perlLIO,
1266 &perlDir,
1267 &perlSock,
1268 &perlProc);
1269 if (my_perl) {
1270#ifdef PERL_OBJECT
1271 CPerlObj* pPerl = (CPerlObj*)my_perl;
1272#endif
1273 //w32_internal_host = m_allocList;
1274 }
1275 return my_perl;
1276}
1277
1278/*============================================================================================
1279
1280 Function : nw5_delete_internal_host
1281
1282 Description : Deletes the alloc_list pointer
1283
1284 Parameters : alloc_list pointer
1285
1286 Returns : none
1287
1288==============================================================================================*/
1289
1290EXTERN_C void
1291nw5_delete_internal_host(void *h)
1292{
1293 WCValHashTable<void*>* m_allocList;
1294 void **listptr;
1295 BOOL m_dontTouchHashLists;
1296 if (fnGetHashListAddrs(&listptr,&m_dontTouchHashLists)) {
1297 m_allocList = (WCValHashTable<void*>*)listptr;
1298 fnInsertHashListAddrs(m_allocList, TRUE);
1299 if (m_allocList)
1300 {
1301 m_allocList->forAll(fnFreeMemEntry, NULL);
1302 fnInsertHashListAddrs(NULL, FALSE);
1303 delete m_allocList;
1304 }
1305 }
1306}
1307
1308#endif /* PERL_IMPLICIT_SYS */