~rsrchboy/+junk/ndn-perl

1 by Chris Weyl
perl v5.20.2, from upstream tag
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		:	nwperlhost.h
11
 * DESCRIPTION	:	This is modelled on the perlhost.h module of Win32 port.
12
 *                  This is the host that include all the functions for running Perl within a class.
13
 * Author		:	SGP, HYAK
14
 * Date			:	January 2001.
15
 *
16
 */
17
18
19
20
#ifndef ___NWPerlHost_H___
21
#define ___NWPerlHost_H___
22
23
24
#include "iperlsys.h"
25
#include "nwvmem.h"
26
27
#include "nw5sck.h"
28
#include "netware.h"
29
30
#define	LPBYTE	unsigned char *
31
32
#if !defined(PERL_OBJECT)
33
START_EXTERN_C
34
#endif	/* PERL_OBJECT */
35
36
extern int do_spawn2(char *cmd, int exectype);
37
extern int do_aspawn(void *vreally, void **vmark, void **vsp);
38
extern void Perl_init_os_extras(void);
39
40
#if !defined(PERL_OBJECT)
41
END_EXTERN_C
42
#endif	/* PERL_OBJECT */
43
44
#ifdef PERL_OBJECT
45
extern int g_do_aspawn(void *vreally, void **vmark, void **vsp);
46
#define do_aspawn g_do_aspawn
47
#endif	/* PERL_OBJECT */
48
49
class CPerlHost
50
{
51
public:
52
    CPerlHost(void);
53
    CPerlHost(struct IPerlMem** ppMem, struct IPerlMem** ppMemShared,
54
		 struct IPerlMem** ppMemParse, struct IPerlEnv** ppEnv,
55
		 struct IPerlStdIO** ppStdIO, struct IPerlLIO** ppLIO,
56
		 struct IPerlDir** ppDir, struct IPerlSock** ppSock,
57
		 struct IPerlProc** ppProc);
58
    CPerlHost(const CPerlHost& host);
59
    virtual ~CPerlHost(void);
60
61
    static CPerlHost* IPerlMem2Host(struct IPerlMem* piPerl);
62
    static CPerlHost* IPerlMemShared2Host(struct IPerlMem* piPerl);
63
    static CPerlHost* IPerlMemParse2Host(struct IPerlMem* piPerl);
64
    static CPerlHost* IPerlEnv2Host(struct IPerlEnv* piPerl);
65
    static CPerlHost* IPerlStdIO2Host(struct IPerlStdIO* piPerl);
66
    static CPerlHost* IPerlLIO2Host(struct IPerlLIO* piPerl);
67
    static CPerlHost* IPerlDir2Host(struct IPerlDir* piPerl);
68
    static CPerlHost* IPerlSock2Host(struct IPerlSock* piPerl);
69
    static CPerlHost* IPerlProc2Host(struct IPerlProc* piPerl);
70
71
/* IPerlMem */
72
    inline void* Malloc(size_t size) { return m_pVMem->Malloc(size); };
73
    inline void* Realloc(void* ptr, size_t size) { return m_pVMem->Realloc(ptr, size); };
74
    inline void Free(void* ptr) { m_pVMem->Free(ptr); };
75
	inline void* Calloc(size_t num, size_t size){ return m_pVMem->Calloc(num, size); };
76
77
/* IPerlMemShared */
78
    inline void* MallocShared(size_t size)
79
    {
80
	return m_pVMemShared->Malloc(size);
81
    };
82
    inline void* ReallocShared(void* ptr, size_t size) { return m_pVMemShared->Realloc(ptr, size); };
83
    inline void FreeShared(void* ptr) { m_pVMemShared->Free(ptr); };
84
    inline void* CallocShared(size_t num, size_t size)
85
    {
86
	size_t count = num*size;
87
	void* lpVoid = MallocShared(count);
88
89
	return lpVoid;
90
    };
91
92
/* IPerlMemParse */
93
    inline void* MallocParse(size_t size) { return m_pVMemParse->Malloc(size); };
94
    inline void* ReallocParse(void* ptr, size_t size) { return m_pVMemParse->Realloc(ptr, size); };
95
    inline void FreeParse(void* ptr) { m_pVMemParse->Free(ptr); };
96
    inline void* CallocParse(size_t num, size_t size)
97
    {
98
	size_t count = num*size;
99
	void* lpVoid = MallocParse(count);
100
101
	return lpVoid;
102
    };
103
104
/* IPerlEnv */
105
    char *Getenv(const char *varname);
106
    int Putenv(const char *envstring);
107
    inline char *Getenv(const char *varname, unsigned long *len)
108
    {
109
	*len = 0;
110
	char *e = Getenv(varname);
111
	if (e)
112
	    *len = strlen(e);
113
	return e;
114
    }
115
116
117
public:
118
119
/* IPerlDIR */
120
121
122
/* IPerllProc */
123
    void Abort(void);
124
    void Exit(int status);
125
    void _Exit(int status);
126
    int Execl(const char *cmdname, const char *arg0, const char *arg1, const char *arg2, const char *arg3);
127
    int Execv(const char *cmdname, const char *const *argv);
128
    int Execvp(const char *cmdname, const char *const *argv);
129
130
public:
131
132
    struct IPerlMem	    m_hostperlMem;
133
    struct IPerlMem	    m_hostperlMemShared;
134
    struct IPerlMem	    m_hostperlMemParse;
135
    struct IPerlEnv	    m_hostperlEnv;
136
    struct IPerlStdIO	    m_hostperlStdIO;
137
    struct IPerlLIO	    m_hostperlLIO;
138
    struct IPerlDir	    m_hostperlDir;
139
    struct IPerlSock	    m_hostperlSock;
140
    struct IPerlProc	    m_hostperlProc;
141
142
    struct IPerlMem*	    m_pHostperlMem;
143
    struct IPerlMem*	    m_pHostperlMemShared;
144
    struct IPerlMem*	    m_pHostperlMemParse;
145
    struct IPerlEnv*	    m_pHostperlEnv;
146
    struct IPerlStdIO*	    m_pHostperlStdIO;
147
    struct IPerlLIO*	    m_pHostperlLIO;
148
    struct IPerlDir*	    m_pHostperlDir;
149
    struct IPerlSock*	    m_pHostperlSock;
150
    struct IPerlProc*	    m_pHostperlProc;
151
152
protected:
153
154
    VMem*   m_pVMem;
155
    VMem*   m_pVMemShared;
156
    VMem*   m_pVMemParse;
157
};
158
159
160
#define STRUCT2PTR(x, y) (CPerlHost*)(((LPBYTE)x)-offsetof(CPerlHost, y))
161
162
inline CPerlHost* IPerlMem2Host(struct IPerlMem* piPerl)
163
{
164
    return STRUCT2PTR(piPerl, m_hostperlMem);
165
}
166
167
inline CPerlHost* IPerlMemShared2Host(struct IPerlMem* piPerl)
168
{
169
    return STRUCT2PTR(piPerl, m_hostperlMemShared);
170
}
171
172
inline CPerlHost* IPerlMemParse2Host(struct IPerlMem* piPerl)
173
{
174
    return STRUCT2PTR(piPerl, m_hostperlMemParse);
175
}
176
177
inline CPerlHost* IPerlEnv2Host(struct IPerlEnv* piPerl)
178
{
179
    return STRUCT2PTR(piPerl, m_hostperlEnv);
180
}
181
182
inline CPerlHost* IPerlStdIO2Host(struct IPerlStdIO* piPerl)
183
{
184
    return STRUCT2PTR(piPerl, m_hostperlStdIO);
185
}
186
187
inline CPerlHost* IPerlLIO2Host(struct IPerlLIO* piPerl)
188
{
189
    return STRUCT2PTR(piPerl, m_hostperlLIO);
190
}
191
192
inline CPerlHost* IPerlDir2Host(struct IPerlDir* piPerl)
193
{
194
    return STRUCT2PTR(piPerl, m_hostperlDir);
195
}
196
197
inline CPerlHost* IPerlSock2Host(struct IPerlSock* piPerl)
198
{
199
    return STRUCT2PTR(piPerl, m_hostperlSock);
200
}
201
202
inline CPerlHost* IPerlProc2Host(struct IPerlProc* piPerl)
203
{
204
    return STRUCT2PTR(piPerl, m_hostperlProc);
205
}
206
207
208
#undef IPERL2HOST
209
#define IPERL2HOST(x) IPerlMem2Host(x)
210
211
212
/* IPerlMem */
213
void*
214
PerlMemMalloc(struct IPerlMem* piPerl, size_t size)
215
{
216
    return IPERL2HOST(piPerl)->Malloc(size);
217
}
218
void*
219
PerlMemRealloc(struct IPerlMem* piPerl, void* ptr, size_t size)
220
{
221
    return IPERL2HOST(piPerl)->Realloc(ptr, size);
222
}
223
void
224
PerlMemFree(struct IPerlMem* piPerl, void* ptr)
225
{
226
    IPERL2HOST(piPerl)->Free(ptr);
227
}
228
void*
229
PerlMemCalloc(struct IPerlMem* piPerl, size_t num, size_t size)
230
{
231
    return IPERL2HOST(piPerl)->Calloc(num, size);
232
}
233
234
235
struct IPerlMem perlMem =
236
{
237
    PerlMemMalloc,
238
    PerlMemRealloc,
239
    PerlMemFree,
240
    PerlMemCalloc,
241
};
242
243
#undef IPERL2HOST
244
#define IPERL2HOST(x) IPerlMemShared2Host(x)
245
246
/* IPerlMemShared */
247
void*
248
PerlMemSharedMalloc(struct IPerlMem* piPerl, size_t size)
249
{
250
    return IPERL2HOST(piPerl)->MallocShared(size);
251
}
252
void*
253
PerlMemSharedRealloc(struct IPerlMem* piPerl, void* ptr, size_t size)
254
{
255
    return IPERL2HOST(piPerl)->ReallocShared(ptr, size);
256
}
257
void
258
PerlMemSharedFree(struct IPerlMem* piPerl, void* ptr)
259
{
260
    IPERL2HOST(piPerl)->FreeShared(ptr);
261
}
262
void*
263
PerlMemSharedCalloc(struct IPerlMem* piPerl, size_t num, size_t size)
264
{
265
    return IPERL2HOST(piPerl)->CallocShared(num, size);
266
}
267
268
269
struct IPerlMem perlMemShared =
270
{
271
    PerlMemSharedMalloc,
272
    PerlMemSharedRealloc,
273
    PerlMemSharedFree,
274
    PerlMemSharedCalloc,
275
};
276
277
#undef IPERL2HOST
278
#define IPERL2HOST(x) IPerlMemParse2Host(x)
279
280
/* IPerlMemParse */
281
void*
282
PerlMemParseMalloc(struct IPerlMem* piPerl, size_t size)
283
{
284
    return IPERL2HOST(piPerl)->MallocParse(size);
285
}
286
void*
287
PerlMemParseRealloc(struct IPerlMem* piPerl, void* ptr, size_t size)
288
{
289
    return IPERL2HOST(piPerl)->ReallocParse(ptr, size);
290
}
291
void
292
PerlMemParseFree(struct IPerlMem* piPerl, void* ptr)
293
{
294
    IPERL2HOST(piPerl)->FreeParse(ptr);
295
}
296
void*
297
PerlMemParseCalloc(struct IPerlMem* piPerl, size_t num, size_t size)
298
{
299
    return IPERL2HOST(piPerl)->CallocParse(num, size);
300
}
301
302
303
struct IPerlMem perlMemParse =
304
{
305
    PerlMemParseMalloc,
306
    PerlMemParseRealloc,
307
    PerlMemParseFree,
308
    PerlMemParseCalloc,
309
};
310
311
312
#undef IPERL2HOST
313
#define IPERL2HOST(x) IPerlEnv2Host(x)
314
315
/* IPerlEnv */
316
char*
317
PerlEnvGetenv(struct IPerlEnv* piPerl, const char *varname)
318
{
319
    return IPERL2HOST(piPerl)->Getenv(varname);
320
};
321
322
int
323
PerlEnvPutenv(struct IPerlEnv* piPerl, const char *envstring)
324
{
325
    return IPERL2HOST(piPerl)->Putenv(envstring);
326
};
327
328
char*
329
PerlEnvGetenv_len(struct IPerlEnv* piPerl, const char* varname, unsigned long* len)
330
{
331
    return IPERL2HOST(piPerl)->Getenv(varname, len);
332
}
333
334
int
335
PerlEnvUname(struct IPerlEnv* piPerl, struct utsname *name)
336
{
337
    return nw_uname(name);
338
}
339
340
void
341
PerlEnvClearenv(struct IPerlEnv* piPerl)
342
{
343
	// If removed, compilation fails while compiling CGI2Perl.
344
}
345
346
void*
347
PerlEnvGetChildenv(struct IPerlEnv* piPerl)
348
{
349
	// If removed, compilation fails while compiling CGI2Perl.
350
	return NULL;
351
}
352
353
void
354
PerlEnvFreeChildenv(struct IPerlEnv* piPerl, void* childEnv)
355
{
356
	// If removed, compilation fails while compiling CGI2Perl.
357
}
358
359
char*
360
PerlEnvGetChilddir(struct IPerlEnv* piPerl)
361
{
362
	// If removed, compilation fails while compiling CGI2Perl.
363
	return NULL;
364
}
365
366
void
367
PerlEnvFreeChilddir(struct IPerlEnv* piPerl, char* childDir)
368
{
369
	// If removed, compilation fails while compiling CGI2Perl.
370
}
371
372
struct IPerlEnv perlEnv = 
373
{
374
    PerlEnvGetenv,
375
    PerlEnvPutenv,
376
    PerlEnvGetenv_len,
377
    PerlEnvUname,
378
    PerlEnvClearenv,
379
    PerlEnvGetChildenv,
380
    PerlEnvFreeChildenv,
381
    PerlEnvGetChilddir,
382
    PerlEnvFreeChilddir,
383
};
384
385
#undef IPERL2HOST
386
#define IPERL2HOST(x) IPerlStdIO2Host(x)
387
388
/* PerlStdIO */
389
PerlIO*
390
PerlStdIOStdin(struct IPerlStdIO* piPerl)
391
{
392
    return (PerlIO*)nw_stdin();
393
}
394
395
PerlIO*
396
PerlStdIOStdout(struct IPerlStdIO* piPerl)
397
{
398
    return (PerlIO*)nw_stdout();
399
}
400
401
PerlIO*
402
PerlStdIOStderr(struct IPerlStdIO* piPerl)
403
{
404
    return (PerlIO*)nw_stderr();
405
}
406
407
PerlIO*
408
PerlStdIOOpen(struct IPerlStdIO* piPerl, const char *path, const char *mode)
409
{
410
    return (PerlIO*)nw_fopen(path, mode);
411
}
412
413
int
414
PerlStdIOClose(struct IPerlStdIO* piPerl, PerlIO* pf)
415
{
416
    return nw_fclose(((FILE*)pf));
417
}
418
419
int
420
PerlStdIOEof(struct IPerlStdIO* piPerl, PerlIO* pf)
421
{
422
    return nw_feof((FILE*)pf);
423
}
424
425
int
426
PerlStdIOError(struct IPerlStdIO* piPerl, PerlIO* pf)
427
{
428
    return nw_ferror((FILE*)pf);
429
}
430
431
void
432
PerlStdIOClearerr(struct IPerlStdIO* piPerl, PerlIO* pf)
433
{
434
    nw_clearerr((FILE*)pf);
435
}
436
437
int
438
PerlStdIOGetc(struct IPerlStdIO* piPerl, PerlIO* pf)
439
{
440
    return nw_getc((FILE*)pf);
441
}
442
443
STDCHAR*
444
PerlStdIOGetBase(struct IPerlStdIO* piPerl, PerlIO* pf)
445
{
446
#ifdef FILE_base
447
    FILE *f = (FILE*)pf;
448
    return FILE_base(f);
449
#else
450
    return NULL;
451
#endif
452
}
453
454
int
455
PerlStdIOGetBufsiz(struct IPerlStdIO* piPerl, PerlIO* pf)
456
{
457
#ifdef FILE_bufsiz
458
    FILE *f = (FILE*)pf;
459
    return FILE_bufsiz(f);
460
#else
461
    return (-1);
462
#endif
463
}
464
465
int
466
PerlStdIOGetCnt(struct IPerlStdIO* piPerl, PerlIO* pf)
467
{
468
#ifdef USE_STDIO_PTR
469
    FILE *f = (FILE*)pf;
470
    return FILE_cnt(f);
471
#else
472
    return (-1);
473
#endif
474
}
475
476
STDCHAR*
477
PerlStdIOGetPtr(struct IPerlStdIO* piPerl, PerlIO* pf)
478
{
479
#ifdef USE_STDIO_PTR
480
    FILE *f = (FILE*)pf;
481
    return FILE_ptr(f);
482
#else
483
    return NULL;
484
#endif
485
}
486
487
char*
488
PerlStdIOGets(struct IPerlStdIO* piPerl, PerlIO* pf, char* s, int n)
489
{
490
    return nw_fgets(s, n, (FILE*)pf);
491
}
492
493
int
494
PerlStdIOPutc(struct IPerlStdIO* piPerl, PerlIO* pf, int c)
495
{
496
    return nw_fputc(c, (FILE*)pf);
497
}
498
499
int
500
PerlStdIOPuts(struct IPerlStdIO* piPerl, PerlIO* pf, const char *s)
501
{
502
    return nw_fputs(s, (FILE*)pf);
503
}
504
505
int
506
PerlStdIOFlush(struct IPerlStdIO* piPerl, PerlIO* pf)
507
{
508
    return nw_fflush((FILE*)pf);
509
}
510
511
int
512
PerlStdIOUngetc(struct IPerlStdIO* piPerl, int c, PerlIO* pf)	//(J)
513
{
514
    return nw_ungetc(c, (FILE*)pf);
515
}
516
517
int
518
PerlStdIOFileno(struct IPerlStdIO* piPerl, PerlIO* pf)
519
{
520
    return nw_fileno((FILE*)pf);
521
}
522
523
PerlIO*
524
PerlStdIOFdopen(struct IPerlStdIO* piPerl, int fd, const char *mode)
525
{
526
    return (PerlIO*)nw_fdopen(fd, mode);
527
}
528
529
PerlIO*
530
PerlStdIOReopen(struct IPerlStdIO* piPerl, const char*path, const char*mode, PerlIO* pf)
531
{
532
    return (PerlIO*)nw_freopen(path, mode, (FILE*)pf);
533
}
534
535
SSize_t
536
PerlStdIORead(struct IPerlStdIO* piPerl, void *buffer, Size_t size, Size_t dummy, PerlIO* pf)
537
{
538
    return nw_fread(buffer, 1, size, (FILE*)pf);
539
}
540
541
SSize_t
542
PerlStdIOWrite(struct IPerlStdIO* piPerl, const void *buffer, Size_t size, Size_t dummy, PerlIO* pf)
543
//PerlStdIOWrite(struct IPerlStdIO* piPerl, PerlIO* pf, const void *buffer, Size_t size) 
544
{
545
    return nw_fwrite(buffer, 1, size, (FILE*)pf);
546
}
547
548
void
549
PerlStdIOSetBuf(struct IPerlStdIO* piPerl, PerlIO* pf, char* buffer)
550
{
551
    nw_setbuf((FILE*)pf, buffer);
552
}
553
554
int
555
PerlStdIOSetVBuf(struct IPerlStdIO* piPerl, PerlIO* pf, char* buffer, int type, Size_t size)
556
{
557
    return nw_setvbuf((FILE*)pf, buffer, type, size);
558
}
559
560
void
561
PerlStdIOSetCnt(struct IPerlStdIO* piPerl, PerlIO* pf, int n)
562
{
563
#ifdef STDIO_CNT_LVALUE
564
    FILE *f = (FILE*)pf;
565
    FILE_cnt(f) = n;
566
#endif
567
}
568
569
void
570
PerlStdIOSetPtrCnt(struct IPerlStdIO* piPerl, PerlIO* pf, STDCHAR * ptr, int n)
571
{
572
#ifdef STDIO_PTR_LVALUE
573
    FILE *f = (FILE*)pf;
574
    FILE_ptr(f) = ptr;
575
    FILE_cnt(f) = n;
576
#endif
577
}
578
579
void
580
PerlStdIOSetlinebuf(struct IPerlStdIO* piPerl, PerlIO* pf)
581
{
582
    nw_setvbuf((FILE*)pf, NULL, _IOLBF, 0);
583
}
584
585
int
586
PerlStdIOPrintf(struct IPerlStdIO* piPerl, PerlIO* pf, const char *format,...)
587
{
588
    va_list(arglist);
589
    va_start(arglist, format);
590
    return nw_vfprintf((FILE*)pf, format, arglist);
591
}
592
593
int
594
PerlStdIOVprintf(struct IPerlStdIO* piPerl, PerlIO* pf, const char *format, va_list arglist)
595
{
596
    return nw_vfprintf((FILE*)pf, format, arglist);
597
}
598
599
long
600
PerlStdIOTell(struct IPerlStdIO* piPerl, PerlIO* pf)
601
{
602
    return nw_ftell((FILE*)pf);
603
}
604
605
int
606
PerlStdIOSeek(struct IPerlStdIO* piPerl, PerlIO* pf, off_t offset, int origin)
607
{
608
    return nw_fseek((FILE*)pf, offset, origin);
609
}
610
611
void
612
PerlStdIORewind(struct IPerlStdIO* piPerl, PerlIO* pf)
613
{
614
    nw_rewind((FILE*)pf);
615
}
616
617
PerlIO*
618
PerlStdIOTmpfile(struct IPerlStdIO* piPerl)
619
{
620
    return (PerlIO*)nw_tmpfile();
621
}
622
623
int
624
PerlStdIOGetpos(struct IPerlStdIO* piPerl, PerlIO* pf, Fpos_t *p)
625
{
626
    return nw_fgetpos((FILE*)pf, p);
627
}
628
629
int
630
PerlStdIOSetpos(struct IPerlStdIO* piPerl, PerlIO* pf, const Fpos_t *p)
631
{
632
    return nw_fsetpos((FILE*)pf, p);
633
}
634
635
void
636
PerlStdIOInit(struct IPerlStdIO* piPerl)
637
{
638
	// If removed, compilation error occurs.
639
}
640
641
void
642
PerlStdIOInitOSExtras(struct IPerlStdIO* piPerl)
643
{
644
    Perl_init_os_extras();
645
}
646
647
648
int
649
PerlStdIOOpenOSfhandle(struct IPerlStdIO* piPerl, long osfhandle, int flags)
650
{
651
    return nw_open_osfhandle(osfhandle, flags);
652
}
653
654
int
655
PerlStdIOGetOSfhandle(struct IPerlStdIO* piPerl, int filenum)
656
{
657
    return nw_get_osfhandle(filenum);
658
}
659
660
PerlIO*
661
PerlStdIOFdupopen(struct IPerlStdIO* piPerl, PerlIO* pf)
662
{
663
    PerlIO* pfdup=NULL;
664
    fpos_t pos=0;
665
    char mode[3]={'\0'};
666
    int fileno = nw_dup(nw_fileno((FILE*)pf));
667
668
    /* open the file in the same mode */
669
    if(((FILE*)pf)->_flag & _IOREAD) {
670
	mode[0] = 'r';
671
	mode[1] = 0;
672
    }
673
    else if(((FILE*)pf)->_flag & _IOWRT) {
674
	mode[0] = 'a';
675
	mode[1] = 0;
676
    }
677
    else if(((FILE*)pf)->_flag & _IORW) {
678
	mode[0] = 'r';
679
	mode[1] = '+';
680
	mode[2] = 0;
681
    }
682
683
    /* it appears that the binmode is attached to the 
684
     * file descriptor so binmode files will be handled
685
     * correctly
686
     */
687
    pfdup = (PerlIO*)nw_fdopen(fileno, mode);
688
689
    /* move the file pointer to the same position */
690
    if (!fgetpos((FILE*)pf, &pos)) {
691
	fsetpos((FILE*)pfdup, &pos);
692
    }
693
    return pfdup;
694
}
695
696
struct IPerlStdIO perlStdIO = 
697
{
698
    PerlStdIOStdin,
699
    PerlStdIOStdout,
700
    PerlStdIOStderr,
701
    PerlStdIOOpen,
702
    PerlStdIOClose,
703
    PerlStdIOEof,
704
    PerlStdIOError,
705
    PerlStdIOClearerr,
706
    PerlStdIOGetc,
707
    PerlStdIOGetBase,
708
    PerlStdIOGetBufsiz,
709
    PerlStdIOGetCnt,
710
    PerlStdIOGetPtr,
711
    PerlStdIOGets,
712
    PerlStdIOPutc,
713
    PerlStdIOPuts,
714
    PerlStdIOFlush,
715
    PerlStdIOUngetc,
716
    PerlStdIOFileno,
717
    PerlStdIOFdopen,
718
    PerlStdIOReopen,
719
    PerlStdIORead,
720
    PerlStdIOWrite,
721
    PerlStdIOSetBuf,
722
    PerlStdIOSetVBuf,
723
    PerlStdIOSetCnt,
724
    PerlStdIOSetPtrCnt,
725
    PerlStdIOSetlinebuf,
726
    PerlStdIOPrintf,
727
    PerlStdIOVprintf,
728
    PerlStdIOTell,
729
    PerlStdIOSeek,
730
    PerlStdIORewind,
731
    PerlStdIOTmpfile,
732
    PerlStdIOGetpos,
733
    PerlStdIOSetpos,
734
    PerlStdIOInit,
735
    PerlStdIOInitOSExtras,
736
    PerlStdIOFdupopen,
737
};
738
739
740
#undef IPERL2HOST
741
#define IPERL2HOST(x) IPerlLIO2Host(x)
742
743
/* IPerlLIO */
744
int
745
PerlLIOAccess(struct IPerlLIO* piPerl, const char *path, int mode)
746
{
747
    return nw_access(path, mode);
748
}
749
750
int
751
PerlLIOChmod(struct IPerlLIO* piPerl, const char *filename, int pmode)
752
{
753
    return nw_chmod(filename, pmode);
754
}
755
756
int
757
PerlLIOChown(struct IPerlLIO* piPerl, const char *filename, uid_t owner, gid_t group)
758
{
759
	// If removed, compilation error occurs.
760
	return 0;
761
}
762
763
int
764
PerlLIOChsize(struct IPerlLIO* piPerl, int handle, long size)
765
{
766
	return (nw_chsize(handle,size));
767
}
768
769
int
770
PerlLIOClose(struct IPerlLIO* piPerl, int handle)
771
{
772
    return nw_close(handle);
773
}
774
775
int
776
PerlLIODup(struct IPerlLIO* piPerl, int handle)
777
{
778
    return nw_dup(handle);
779
}
780
781
int
782
PerlLIODup2(struct IPerlLIO* piPerl, int handle1, int handle2)
783
{
784
    return nw_dup2(handle1, handle2);
785
}
786
787
int
788
PerlLIOFlock(struct IPerlLIO* piPerl, int fd, int oper)
789
{
790
	//On NetWare simulate flock by locking a range on the file
791
    return nw_flock(fd, oper);
792
}
793
794
int
795
PerlLIOFileStat(struct IPerlLIO* piPerl, int handle, struct stat *buffer)
796
{
797
    return fstat(handle, buffer);
798
}
799
800
int
801
PerlLIOIOCtl(struct IPerlLIO* piPerl, int i, unsigned int u, char *data)
802
{
803
	// If removed, compilation error occurs.
804
	return 0;
805
}
806
807
int
808
PerlLIOIsatty(struct IPerlLIO* piPerl, int fd)
809
{
810
    return nw_isatty(fd);
811
}
812
813
int
814
PerlLIOLink(struct IPerlLIO* piPerl, const char*oldname, const char *newname)
815
{
816
    return nw_link(oldname, newname);
817
}
818
819
long
820
PerlLIOLseek(struct IPerlLIO* piPerl, int handle, long offset, int origin)
821
{
822
    return nw_lseek(handle, offset, origin);
823
}
824
825
int
826
PerlLIOLstat(struct IPerlLIO* piPerl, const char *path, struct stat *buffer)
827
{
828
    return nw_stat(path, buffer);
829
}
830
831
char*
832
PerlLIOMktemp(struct IPerlLIO* piPerl, char *Template)
833
{
834
	return(nw_mktemp(Template));
835
}
836
837
int
838
PerlLIOOpen(struct IPerlLIO* piPerl, const char *filename, int oflag)
839
{
840
    return nw_open(filename, oflag);
841
}
842
843
int
844
PerlLIOOpen3(struct IPerlLIO* piPerl, const char *filename, int oflag, int pmode)
845
{
846
    return nw_open(filename, oflag, pmode);
847
}
848
849
int
850
PerlLIORead(struct IPerlLIO* piPerl, int handle, void *buffer, unsigned int count)
851
{
852
    return nw_read(handle, buffer, count);
853
}
854
855
int
856
PerlLIORename(struct IPerlLIO* piPerl, const char *OldFileName, const char *newname)
857
{
858
    return nw_rename(OldFileName, newname);
859
}
860
861
int
862
PerlLIOSetmode(struct IPerlLIO* piPerl, FILE *fp, int mode)
863
{
864
    return nw_setmode(fp, mode);
865
}
866
867
int
868
PerlLIONameStat(struct IPerlLIO* piPerl, const char *path, struct stat *buffer)
869
{
870
    return nw_stat(path, buffer);
871
}
872
873
char*
874
PerlLIOTmpnam(struct IPerlLIO* piPerl, char *string)
875
{
876
    return tmpnam(string);
877
}
878
879
int
880
PerlLIOUmask(struct IPerlLIO* piPerl, int pmode)
881
{
882
    return umask(pmode);
883
}
884
885
int
886
PerlLIOUnlink(struct IPerlLIO* piPerl, const char *filename)
887
{
888
    return nw_unlink(filename);
889
}
890
891
int
892
PerlLIOUtime(struct IPerlLIO* piPerl, const char *filename, struct utimbuf *times)
893
{
894
    return nw_utime(filename, times);
895
}
896
897
int
898
PerlLIOWrite(struct IPerlLIO* piPerl, int handle, const void *buffer, unsigned int count)
899
{
900
    return nw_write(handle, buffer, count);
901
}
902
903
struct IPerlLIO perlLIO =
904
{
905
    PerlLIOAccess,
906
    PerlLIOChmod,
907
    PerlLIOChown,
908
    PerlLIOChsize,
909
    PerlLIOClose,
910
    PerlLIODup,
911
    PerlLIODup2,
912
    PerlLIOFlock,
913
    PerlLIOFileStat,
914
    PerlLIOIOCtl,
915
    PerlLIOIsatty,
916
    PerlLIOLink,
917
    PerlLIOLseek,
918
    PerlLIOLstat,
919
    PerlLIOMktemp,
920
    PerlLIOOpen,
921
    PerlLIOOpen3,
922
    PerlLIORead,
923
    PerlLIORename,
924
    PerlLIOSetmode,
925
    PerlLIONameStat,
926
    PerlLIOTmpnam,
927
    PerlLIOUmask,
928
    PerlLIOUnlink,
929
    PerlLIOUtime,
930
    PerlLIOWrite,
931
};
932
933
934
#undef IPERL2HOST
935
#define IPERL2HOST(x) IPerlDir2Host(x)
936
937
/* IPerlDIR */
938
int
939
PerlDirMakedir(struct IPerlDir* piPerl, const char *dirname, int mode)
940
{
941
	return mkdir(dirname);
942
}
943
944
int
945
PerlDirChdir(struct IPerlDir* piPerl, const char *dirname)
946
{
947
	return nw_chdir(dirname);
948
}
949
950
int
951
PerlDirRmdir(struct IPerlDir* piPerl, const char *dirname)
952
{
953
	return nw_rmdir(dirname);
954
}
955
956
int
957
PerlDirClose(struct IPerlDir* piPerl, DIR *dirp)
958
{
959
	return nw_closedir(dirp);
960
}
961
962
DIR*
963
PerlDirOpen(struct IPerlDir* piPerl, const char *filename)
964
{
965
	return nw_opendir(filename);
966
}
967
968
struct direct *
969
PerlDirRead(struct IPerlDir* piPerl, DIR *dirp)
970
{
971
	return nw_readdir(dirp);
972
}
973
974
void
975
PerlDirRewind(struct IPerlDir* piPerl, DIR *dirp)
976
{
977
    nw_rewinddir(dirp);
978
}
979
980
void
981
PerlDirSeek(struct IPerlDir* piPerl, DIR *dirp, long loc)
982
{
983
    nw_seekdir(dirp, loc);
984
}
985
986
long
987
PerlDirTell(struct IPerlDir* piPerl, DIR *dirp)
988
{
989
    return nw_telldir(dirp);
990
}
991
992
struct IPerlDir perlDir =
993
{
994
    PerlDirMakedir,
995
    PerlDirChdir,
996
    PerlDirRmdir,
997
    PerlDirClose,
998
    PerlDirOpen,
999
    PerlDirRead,
1000
    PerlDirRewind,
1001
    PerlDirSeek,
1002
    PerlDirTell,
1003
};
1004
1005
1006
/* IPerlSock */
1007
u_long
1008
PerlSockHtonl(struct IPerlSock* piPerl, u_long hostlong)
1009
{
1010
	return(nw_htonl(hostlong));
1011
}
1012
1013
u_short
1014
PerlSockHtons(struct IPerlSock* piPerl, u_short hostshort)
1015
{
1016
	return(nw_htons(hostshort));
1017
}
1018
1019
u_long
1020
PerlSockNtohl(struct IPerlSock* piPerl, u_long netlong)
1021
{
1022
	return nw_ntohl(netlong);
1023
}
1024
1025
u_short
1026
PerlSockNtohs(struct IPerlSock* piPerl, u_short netshort)
1027
{
1028
	return nw_ntohs(netshort);
1029
}
1030
1031
SOCKET PerlSockAccept(struct IPerlSock* piPerl, SOCKET s, struct sockaddr* addr, int* addrlen)
1032
{
1033
	return nw_accept(s, addr, addrlen);
1034
}
1035
1036
int
1037
PerlSockBind(struct IPerlSock* piPerl, SOCKET s, const struct sockaddr* name, int namelen)
1038
{
1039
	return nw_bind(s, name, namelen);
1040
}
1041
1042
int
1043
PerlSockConnect(struct IPerlSock* piPerl, SOCKET s, const struct sockaddr* name, int namelen)
1044
{
1045
	return nw_connect(s, name, namelen);
1046
}
1047
1048
void
1049
PerlSockEndhostent(struct IPerlSock* piPerl)
1050
{
1051
    nw_endhostent();
1052
}
1053
1054
void
1055
PerlSockEndnetent(struct IPerlSock* piPerl)
1056
{
1057
    nw_endnetent();
1058
}
1059
1060
void
1061
PerlSockEndprotoent(struct IPerlSock* piPerl)
1062
{
1063
    nw_endprotoent();
1064
}
1065
1066
void
1067
PerlSockEndservent(struct IPerlSock* piPerl)
1068
{
1069
    nw_endservent();
1070
}
1071
1072
struct hostent*
1073
PerlSockGethostbyaddr(struct IPerlSock* piPerl, const char* addr, int len, int type)
1074
{
1075
	return(nw_gethostbyaddr(addr,len,type));
1076
}
1077
1078
struct hostent*
1079
PerlSockGethostbyname(struct IPerlSock* piPerl, const char* name)
1080
{
1081
    return nw_gethostbyname(name);
1082
}
1083
1084
struct hostent*
1085
PerlSockGethostent(struct IPerlSock* piPerl)
1086
{
1087
	return(nw_gethostent());
1088
}
1089
1090
int
1091
PerlSockGethostname(struct IPerlSock* piPerl, char* name, int namelen)
1092
{
1093
	return nw_gethostname(name,namelen);
1094
}
1095
1096
struct netent *
1097
PerlSockGetnetbyaddr(struct IPerlSock* piPerl, long net, int type)
1098
{
1099
    return nw_getnetbyaddr(net, type);
1100
}
1101
1102
struct netent *
1103
PerlSockGetnetbyname(struct IPerlSock* piPerl, const char *name)
1104
{
1105
    return nw_getnetbyname((char*)name);
1106
}
1107
1108
struct netent *
1109
PerlSockGetnetent(struct IPerlSock* piPerl)
1110
{
1111
    return nw_getnetent();
1112
}
1113
1114
int PerlSockGetpeername(struct IPerlSock* piPerl, SOCKET s, struct sockaddr* name, int* namelen)
1115
{
1116
    return nw_getpeername(s, name, namelen);
1117
}
1118
1119
struct protoent*
1120
PerlSockGetprotobyname(struct IPerlSock* piPerl, const char* name)
1121
{
1122
    return nw_getprotobyname(name);
1123
}
1124
1125
struct protoent*
1126
PerlSockGetprotobynumber(struct IPerlSock* piPerl, int number)
1127
{
1128
    return nw_getprotobynumber(number);
1129
}
1130
1131
struct protoent*
1132
PerlSockGetprotoent(struct IPerlSock* piPerl)
1133
{
1134
    return nw_getprotoent();
1135
}
1136
1137
struct servent*
1138
PerlSockGetservbyname(struct IPerlSock* piPerl, const char* name, const char* proto)
1139
{
1140
    return nw_getservbyname((char*)name, (char*)proto);
1141
}
1142
1143
struct servent*
1144
PerlSockGetservbyport(struct IPerlSock* piPerl, int port, const char* proto)
1145
{
1146
	return nw_getservbyport(port, proto);
1147
}
1148
1149
struct servent*
1150
PerlSockGetservent(struct IPerlSock* piPerl)
1151
{
1152
	return nw_getservent();
1153
}
1154
1155
int
1156
PerlSockGetsockname(struct IPerlSock* piPerl, SOCKET s, struct sockaddr* name, int* namelen)
1157
{
1158
	return nw_getsockname(s, name, namelen);
1159
}
1160
1161
int
1162
PerlSockGetsockopt(struct IPerlSock* piPerl, SOCKET s, int level, int optname, char* optval, int* optlen)
1163
{
1164
	return nw_getsockopt(s, level, optname, optval, optlen);
1165
}
1166
1167
unsigned long
1168
PerlSockInetAddr(struct IPerlSock* piPerl, const char* cp)
1169
{
1170
	return(nw_inet_addr(cp));
1171
}
1172
1173
char*
1174
PerlSockInetNtoa(struct IPerlSock* piPerl, struct in_addr in)
1175
{
1176
    return nw_inet_ntoa(in);
1177
}
1178
1179
int
1180
PerlSockListen(struct IPerlSock* piPerl, SOCKET s, int backlog)
1181
{
1182
	return (nw_listen(s, backlog));
1183
}
1184
1185
int
1186
PerlSockRecv(struct IPerlSock* piPerl, SOCKET s, char* buffer, int len, int flags)
1187
{
1188
	return (nw_recv(s, buffer, len, flags));
1189
}
1190
1191
int
1192
PerlSockRecvfrom(struct IPerlSock* piPerl, SOCKET s, char* buffer, int len, int flags, struct sockaddr* from, int* fromlen)
1193
{
1194
	return nw_recvfrom(s, buffer, len, flags, from, fromlen);
1195
}
1196
1197
int
1198
PerlSockSelect(struct IPerlSock* piPerl, int nfds, char* readfds, char* writefds, char* exceptfds, const struct timeval* timeout)
1199
{
1200
	return nw_select(nfds, (fd_set*) readfds, (fd_set*) writefds, (fd_set*) exceptfds, timeout);
1201
}
1202
1203
int
1204
PerlSockSend(struct IPerlSock* piPerl, SOCKET s, const char* buffer, int len, int flags)
1205
{
1206
	return (nw_send(s, buffer, len, flags));
1207
}
1208
1209
int
1210
PerlSockSendto(struct IPerlSock* piPerl, SOCKET s, const char* buffer, int len, int flags, const struct sockaddr* to, int tolen)
1211
{
1212
	return(nw_sendto(s, buffer, len, flags, to, tolen));
1213
}
1214
1215
void
1216
PerlSockSethostent(struct IPerlSock* piPerl, int stayopen)
1217
{
1218
	nw_sethostent(stayopen);
1219
}
1220
1221
void
1222
PerlSockSetnetent(struct IPerlSock* piPerl, int stayopen)
1223
{
1224
	nw_setnetent(stayopen);
1225
}
1226
1227
void
1228
PerlSockSetprotoent(struct IPerlSock* piPerl, int stayopen)
1229
{
1230
	nw_setprotoent(stayopen);
1231
}
1232
1233
void
1234
PerlSockSetservent(struct IPerlSock* piPerl, int stayopen)
1235
{
1236
	nw_setservent(stayopen);
1237
}
1238
1239
int
1240
PerlSockSetsockopt(struct IPerlSock* piPerl, SOCKET s, int level, int optname, const char* optval, int optlen)
1241
{
1242
	return nw_setsockopt(s, level, optname, optval, optlen);
1243
}
1244
1245
int
1246
PerlSockShutdown(struct IPerlSock* piPerl, SOCKET s, int how)
1247
{
1248
	return nw_shutdown(s, how);
1249
}
1250
1251
SOCKET
1252
PerlSockSocket(struct IPerlSock* piPerl, int af, int type, int protocol)
1253
{
1254
	return nw_socket(af, type, protocol);
1255
}
1256
1257
int
1258
PerlSockSocketpair(struct IPerlSock* piPerl, int domain, int type, int protocol, int* fds)
1259
{
1260
    dTHX;	// (J) dTHXo
1261
    Perl_croak(aTHX_ "socketpair not implemented!\n");
1262
    return 0;
1263
}
1264
1265
int
1266
PerlSockIoctlsocket(struct IPerlSock* piPerl, SOCKET s, long cmd, u_long *argp)
1267
{
1268
	dTHX;	// (J) dTHXo
1269
    Perl_croak(aTHX_ "ioctlsocket not implemented!\n");
1270
	return 0;
1271
}
1272
1273
struct IPerlSock perlSock =
1274
{
1275
    PerlSockHtonl,
1276
    PerlSockHtons,
1277
    PerlSockNtohl,
1278
    PerlSockNtohs,
1279
    PerlSockAccept,
1280
    PerlSockBind,
1281
    PerlSockConnect,
1282
    PerlSockEndhostent,
1283
    PerlSockEndnetent,
1284
    PerlSockEndprotoent,
1285
    PerlSockEndservent,
1286
    PerlSockGethostname,
1287
    PerlSockGetpeername,
1288
    PerlSockGethostbyaddr,
1289
    PerlSockGethostbyname,
1290
    PerlSockGethostent,
1291
    PerlSockGetnetbyaddr,
1292
    PerlSockGetnetbyname,
1293
    PerlSockGetnetent,
1294
    PerlSockGetprotobyname,
1295
    PerlSockGetprotobynumber,
1296
    PerlSockGetprotoent,
1297
    PerlSockGetservbyname,
1298
    PerlSockGetservbyport,
1299
    PerlSockGetservent,
1300
    PerlSockGetsockname,
1301
    PerlSockGetsockopt,
1302
    PerlSockInetAddr,
1303
	PerlSockInetNtoa,
1304
	PerlSockListen,
1305
    PerlSockRecv,
1306
    PerlSockRecvfrom,
1307
    PerlSockSelect,
1308
    PerlSockSend,
1309
    PerlSockSendto,
1310
    PerlSockSethostent,
1311
    PerlSockSetnetent,
1312
    PerlSockSetprotoent,
1313
    PerlSockSetservent,
1314
    PerlSockSetsockopt,
1315
    PerlSockShutdown,
1316
	PerlSockSocket,
1317
    PerlSockSocketpair,
1318
	//Following commented by sgp bcos of comiplation error too many initializers (E279)
1319
//    PerlSockClosesocket,
1320
};
1321
1322
1323
/* IPerlProc */
1324
1325
#define EXECF_EXEC 1
1326
#define EXECF_SPAWN 2
1327
1328
void
1329
PerlProcAbort(struct IPerlProc* piPerl)
1330
{
1331
    nw_abort();
1332
}
1333
1334
char *
1335
PerlProcCrypt(struct IPerlProc* piPerl, const char* clear, const char* salt)
1336
{
1337
    return nw_crypt(clear, salt);
1338
}
1339
1340
void
1341
PerlProcExit(struct IPerlProc* piPerl, int status)
1342
{
1343
//    exit(status);
1344
	dTHX;
1345
	//dJMPENV;
1346
	JMPENV_JUMP(2);
1347
}
1348
1349
void
1350
PerlProc_Exit(struct IPerlProc* piPerl, int status)
1351
{
1352
//    _exit(status);
1353
	dTHX;
1354
	//dJMPENV;
1355
	JMPENV_JUMP(2);
1356
}
1357
1358
int
1359
PerlProcExecl(struct IPerlProc* piPerl, const char *cmdname, const char *arg0, const char *arg1, const char *arg2, const char *arg3)
1360
{
1361
	// If removed, compilation error occurs.
1362
	return 0;
1363
}
1364
1365
int
1366
PerlProcExecv(struct IPerlProc* piPerl, const char *cmdname, const char *const *argv)
1367
{
1368
    return nw_execvp((char *)cmdname, (char **)argv);
1369
}
1370
1371
int
1372
PerlProcExecvp(struct IPerlProc* piPerl, const char *cmdname, const char *const *argv)
1373
{
1374
    return nw_execvp((char *)cmdname, (char **)argv);
1375
}
1376
1377
uid_t
1378
PerlProcGetuid(struct IPerlProc* piPerl)
1379
{
1380
	// If removed, compilation error occurs.
1381
	return 0;
1382
}
1383
1384
uid_t
1385
PerlProcGeteuid(struct IPerlProc* piPerl)
1386
{
1387
	// If removed, compilation error occurs.
1388
	return 0;
1389
}
1390
1391
gid_t
1392
PerlProcGetgid(struct IPerlProc* piPerl)
1393
{
1394
	// If removed, compilation error occurs.
1395
	return 0;
1396
}
1397
1398
gid_t
1399
PerlProcGetegid(struct IPerlProc* piPerl)
1400
{
1401
	// If removed, compilation error occurs.
1402
	return 0;
1403
}
1404
1405
char *
1406
PerlProcGetlogin(struct IPerlProc* piPerl)
1407
{
1408
	// If removed, compilation error occurs.
1409
	return NULL;
1410
}
1411
1412
int
1413
PerlProcKill(struct IPerlProc* piPerl, int pid, int sig)
1414
{
1415
    return nw_kill(pid, sig);
1416
}
1417
1418
int
1419
PerlProcKillpg(struct IPerlProc* piPerl, int pid, int sig)
1420
{
1421
    dTHX;	// (J) dTHXo 
1422
    Perl_croak(aTHX_ "killpg not implemented!\n");
1423
    return 0;
1424
}
1425
1426
int
1427
PerlProcPauseProc(struct IPerlProc* piPerl)
1428
{
1429
    return nw_sleep((32767L << 16) + 32767);
1430
}
1431
1432
PerlIO*
1433
PerlProcPopen(struct IPerlProc* piPerl, const char *command, const char *mode)
1434
{
1435
    dTHX;	// (J) dTHXo 
1436
    PERL_FLUSHALL_FOR_CHILD;
1437
1438
	return (PerlIO*)nw_Popen((char *)command, (char *)mode, (int *)errno);
1439
}
1440
1441
int
1442
PerlProcPclose(struct IPerlProc* piPerl, PerlIO *stream)
1443
{
1444
    return nw_Pclose((FILE*)stream, (int *)errno);
1445
}
1446
1447
int
1448
PerlProcPipe(struct IPerlProc* piPerl, int *phandles)
1449
{
1450
    return nw_Pipe((int *)phandles, (int *)errno);
1451
}
1452
1453
int
1454
PerlProcSetuid(struct IPerlProc* piPerl, uid_t u)
1455
{
1456
	// If removed, compilation error occurs.
1457
	return 0;
1458
}
1459
1460
int
1461
PerlProcSetgid(struct IPerlProc* piPerl, gid_t g)
1462
{
1463
	// If removed, compilation error occurs.
1464
	return 0;
1465
}
1466
1467
int
1468
PerlProcSleep(struct IPerlProc* piPerl, unsigned int s)
1469
{
1470
    return nw_sleep(s);
1471
}
1472
1473
int
1474
PerlProcTimes(struct IPerlProc* piPerl, struct tms *timebuf)
1475
{
1476
    return nw_times(timebuf);
1477
}
1478
1479
int
1480
PerlProcWait(struct IPerlProc* piPerl, int *status)
1481
{
1482
    return nw_wait(status);
1483
}
1484
1485
int
1486
PerlProcWaitpid(struct IPerlProc* piPerl, int pid, int *status, int flags)
1487
{
1488
    return nw_waitpid(pid, status, flags);
1489
}
1490
1491
Sighandler_t
1492
PerlProcSignal(struct IPerlProc* piPerl, int sig, Sighandler_t subcode)
1493
{
1494
	// If removed, compilation error occurs.
1495
    return 0;
1496
}
1497
1498
int
1499
PerlProcFork(struct IPerlProc* piPerl)
1500
{
1501
	// If removed, compilation error occurs.
1502
	return 0;
1503
}
1504
1505
int
1506
PerlProcGetpid(struct IPerlProc* piPerl)
1507
{
1508
    return nw_getpid();
1509
}
1510
1511
BOOL
1512
PerlProcDoCmd(struct IPerlProc* piPerl, char *cmd)
1513
{
1514
    do_spawn2(cmd, EXECF_EXEC);
1515
    return FALSE;
1516
}
1517
1518
int
1519
PerlProcSpawn(struct IPerlProc* piPerl, char* cmds)
1520
{
1521
    return do_spawn2(cmds, EXECF_SPAWN);
1522
}
1523
1524
int
1525
PerlProcSpawnvp(struct IPerlProc* piPerl, int mode, const char *cmdname, const char *const *argv)
1526
{
1527
    return nw_spawnvp(mode, (char *)cmdname, (char **)argv);
1528
}
1529
1530
int
1531
PerlProcASpawn(struct IPerlProc* piPerl, void *vreally, void **vmark, void **vsp)
1532
{
1533
    return do_aspawn(vreally, vmark, vsp);
1534
}
1535
1536
struct IPerlProc perlProc =
1537
{
1538
    PerlProcAbort,
1539
    PerlProcCrypt,
1540
    PerlProcExit,
1541
    PerlProc_Exit,
1542
    PerlProcExecl,
1543
    PerlProcExecv,
1544
    PerlProcExecvp,
1545
    PerlProcGetuid,
1546
    PerlProcGeteuid,
1547
    PerlProcGetgid,
1548
    PerlProcGetegid,
1549
    PerlProcGetlogin,
1550
    PerlProcKill,
1551
    PerlProcKillpg,
1552
    PerlProcPauseProc,
1553
    PerlProcPopen,
1554
    PerlProcPclose,
1555
    PerlProcPipe,
1556
    PerlProcSetuid,
1557
    PerlProcSetgid,
1558
    PerlProcSleep,
1559
    PerlProcTimes,
1560
    PerlProcWait,
1561
    PerlProcWaitpid,
1562
    PerlProcSignal,
1563
    PerlProcFork,
1564
    PerlProcGetpid,
1565
/*    PerlProcDynaLoader,
1566
    PerlProcGetOSError,
1567
    PerlProcDoCmd,
1568
    PerlProcSpawn,
1569
    PerlProcSpawnvp,
1570
    PerlProcASpawn,*/
1571
};
1572
1573
1574
/*
1575
 * CPerlHost
1576
 */
1577
1578
CPerlHost::CPerlHost(void)
1579
{
1580
    m_pVMem = new VMem();
1581
    m_pVMemShared = new VMem();
1582
    m_pVMemParse =  new VMem();
1583
1584
	memcpy(&m_hostperlMem, &perlMem, sizeof(perlMem));
1585
	memcpy(&m_hostperlMemShared, &perlMemShared, sizeof(perlMemShared));
1586
    memcpy(&m_hostperlMemParse, &perlMemParse, sizeof(perlMemParse));
1587
    memcpy(&m_hostperlEnv, &perlEnv, sizeof(perlEnv));
1588
    memcpy(&m_hostperlStdIO, &perlStdIO, sizeof(perlStdIO));
1589
    memcpy(&m_hostperlLIO, &perlLIO, sizeof(perlLIO));
1590
    memcpy(&m_hostperlDir, &perlDir, sizeof(perlDir));
1591
    memcpy(&m_hostperlSock, &perlSock, sizeof(perlSock));
1592
    memcpy(&m_hostperlProc, &perlProc, sizeof(perlProc));
1593
1594
    m_pHostperlMem	    = &m_hostperlMem;
1595
    m_pHostperlMemShared    = &m_hostperlMemShared;
1596
    m_pHostperlMemParse	    = &m_hostperlMemParse;
1597
    m_pHostperlEnv	    = &m_hostperlEnv;
1598
    m_pHostperlStdIO	    = &m_hostperlStdIO;
1599
    m_pHostperlLIO	    = &m_hostperlLIO;
1600
    m_pHostperlDir	    = &m_hostperlDir;
1601
    m_pHostperlSock	    = &m_hostperlSock;
1602
    m_pHostperlProc	    = &m_hostperlProc;
1603
}
1604
1605
#define SETUPEXCHANGE(xptr, iptr, table) \
1606
    STMT_START {				\
1607
	if (xptr) {				\
1608
	    iptr = *xptr;			\
1609
	    *xptr = &table;			\
1610
	}					\
1611
	else {					\
1612
	    iptr = &table;			\
1613
	}					\
1614
    } STMT_END
1615
1616
CPerlHost::CPerlHost(struct IPerlMem** ppMem, struct IPerlMem** ppMemShared,
1617
		 struct IPerlMem** ppMemParse, struct IPerlEnv** ppEnv,
1618
		 struct IPerlStdIO** ppStdIO, struct IPerlLIO** ppLIO,
1619
		 struct IPerlDir** ppDir, struct IPerlSock** ppSock,
1620
		 struct IPerlProc** ppProc)
1621
{
1622
    m_pVMem = new VMem();
1623
    m_pVMemShared = new VMem();
1624
    m_pVMemParse =  new VMem();
1625
1626
	memcpy(&m_hostperlMem, &perlMem, sizeof(perlMem));
1627
    memcpy(&m_hostperlMemShared, &perlMemShared, sizeof(perlMemShared));
1628
    memcpy(&m_hostperlMemParse, &perlMemParse, sizeof(perlMemParse));
1629
    memcpy(&m_hostperlEnv, &perlEnv, sizeof(perlEnv));
1630
    memcpy(&m_hostperlStdIO, &perlStdIO, sizeof(perlStdIO));
1631
    memcpy(&m_hostperlLIO, &perlLIO, sizeof(perlLIO));
1632
    memcpy(&m_hostperlDir, &perlDir, sizeof(perlDir));
1633
    memcpy(&m_hostperlSock, &perlSock, sizeof(perlSock));
1634
    memcpy(&m_hostperlProc, &perlProc, sizeof(perlProc));
1635
1636
    SETUPEXCHANGE(ppMem,	m_pHostperlMem,		m_hostperlMem);
1637
    SETUPEXCHANGE(ppMemShared,	m_pHostperlMemShared,	m_hostperlMemShared);
1638
    SETUPEXCHANGE(ppMemParse,	m_pHostperlMemParse,	m_hostperlMemParse);
1639
    SETUPEXCHANGE(ppEnv,	m_pHostperlEnv,		m_hostperlEnv);
1640
    SETUPEXCHANGE(ppStdIO,	m_pHostperlStdIO,	m_hostperlStdIO);
1641
    SETUPEXCHANGE(ppLIO,	m_pHostperlLIO,		m_hostperlLIO);
1642
    SETUPEXCHANGE(ppDir,	m_pHostperlDir,		m_hostperlDir);
1643
    SETUPEXCHANGE(ppSock,	m_pHostperlSock,	m_hostperlSock);
1644
    SETUPEXCHANGE(ppProc,	m_pHostperlProc,	m_hostperlProc);
1645
}
1646
#undef SETUPEXCHANGE
1647
1648
CPerlHost::CPerlHost(const CPerlHost& host)
1649
{
1650
	memcpy(&m_hostperlMem, &perlMem, sizeof(perlMem));
1651
    memcpy(&m_hostperlMemShared, &perlMemShared, sizeof(perlMemShared));
1652
    memcpy(&m_hostperlMemParse, &perlMemParse, sizeof(perlMemParse));
1653
    memcpy(&m_hostperlEnv, &perlEnv, sizeof(perlEnv));
1654
    memcpy(&m_hostperlStdIO, &perlStdIO, sizeof(perlStdIO));
1655
    memcpy(&m_hostperlLIO, &perlLIO, sizeof(perlLIO));
1656
    memcpy(&m_hostperlDir, &perlDir, sizeof(perlDir));
1657
    memcpy(&m_hostperlSock, &perlSock, sizeof(perlSock));
1658
    memcpy(&m_hostperlProc, &perlProc, sizeof(perlProc));
1659
1660
    m_pHostperlMem	    = &m_hostperlMem;
1661
    m_pHostperlMemShared    = &m_hostperlMemShared;
1662
    m_pHostperlMemParse	    = &m_hostperlMemParse;
1663
    m_pHostperlEnv	    = &m_hostperlEnv;
1664
    m_pHostperlStdIO	    = &m_hostperlStdIO;
1665
    m_pHostperlLIO	    = &m_hostperlLIO;
1666
    m_pHostperlDir	    = &m_hostperlDir;
1667
    m_pHostperlSock	    = &m_hostperlSock;
1668
    m_pHostperlProc	    = &m_hostperlProc;
1669
1670
}
1671
1672
CPerlHost::~CPerlHost(void)
1673
{
1674
	if ( m_pVMemParse ) delete m_pVMemParse;
1675
	if ( m_pVMemShared ) delete m_pVMemShared;
1676
	if ( m_pVMem ) delete m_pVMem;
1677
}
1678
1679
char*
1680
CPerlHost::Getenv(const char *varname)
1681
{
1682
	// getenv is always present. In old CLIB, it is implemented
1683
	// to always return NULL. With java loaded on NW411, it will
1684
	// return values set by envset. Is correctly implemented by
1685
	// CLIB on MOAB.
1686
	//
1687
	return getenv(varname);
1688
}
1689
1690
int
1691
CPerlHost::Putenv(const char *envstring)
1692
{
1693
   	return(putenv(envstring));
1694
}
1695
1696
1697
#endif /* ___NWPerlHost_H___ */
1698
1699