win32/splittree.pl Win32 port
win32/win32.c Win32 port
win32/win32.h Win32 port
-win32/win32io.c Win32 port
-win32/win32io.h Win32 port
win32/win32iop.h Win32 port
win32/win32sck.c Win32 port
win32/win32thread.h Win32 port mapping to threads
WINIOMAYBE =
!ELSE
LIBC = libcmt.lib
-WINIOMAYBE = win32io.obj
+WINIOMAYBE =
!ENDIF
!IF "$(CFG)" == "Debug"
WIN32_C = perllib.c \
win32.c \
- win32io.c \
win32sck.c \
win32thread.c
WIN32_OBJ = win32.obj \
- win32io.obj \
win32sck.obj \
win32thread.obj
PERL95_OBJ = perl95.obj \
win32mt.obj \
- win32iomt.obj \
win32sckmt.obj
DLL_OBJ = perllib.obj $(DYNALOADER).obj
del perl.exe
copy splittree.pl ..
$(MINIPERL) -I..\lib ..\splittree.pl "../LIB" "../LIB/auto"
-# attrib -r ..\t\*.*
-# copy test ..\t
perl95.c : runperl.c
copy runperl.c perl95.c
perl95.obj : perl95.c
$(CC) $(CFLAGS) -MT -UPERLDLL -c perl95.c
-win32iomt.obj : win32io.c
- $(CC) $(CFLAGS) -MT -c $(OBJOUT_FLAG)win32iomt.obj win32io.c
-
win32sckmt.obj : win32sck.c
$(CC) $(CFLAGS) -MT -c $(OBJOUT_FLAG)win32sckmt.obj win32sck.c
win32_free
win32_open_osfhandle
win32_get_osfhandle
-win32stdio
Perl_win32_init
RunPerl
-SetIOSubSystem
-GetIOSubSystem
WINIOMAYBE =
.ELSE
LIBC = libcmt.lib
-WINIOMAYBE = win32io.obj
+WINIOMAYBE =
.ENDIF
.IF "$(CFG)" == "Debug"
WIN32_C = perllib.c \
win32.c \
- win32io.c \
win32sck.c \
win32thread.c
WIN32_OBJ = win32.obj \
- win32io.obj \
win32sck.obj \
win32thread.obj
PERL95_OBJ = perl95.obj \
win32mt.obj \
- win32iomt.obj \
win32sckmt.obj
DLL_OBJ = perllib.obj $(DYNALOADER).obj
.ENDIF
copy splittree.pl ..
$(MINIPERL) -I..\lib ..\splittree.pl "../LIB" "../LIB/auto"
-# attrib -r ..\t\*.*
-# copy test ..\t
.IF "$(CCTYPE)" != "BORLAND"
perl95.obj : perl95.c
$(CC) $(CFLAGS) -MT -UPERLDLL -c perl95.c
-win32iomt.obj : win32io.c
- $(CC) $(CFLAGS) -MT -c $(OBJOUT_FLAG)win32iomt.obj win32io.c
-
win32sckmt.obj : win32sck.c
$(CC) $(CFLAGS) -MT -c $(OBJOUT_FLAG)win32sckmt.obj win32sck.c
{
int exitstatus;
PerlInterpreter *my_perl;
- void *pOldIOSubsystem;
-
- pOldIOSubsystem = SetIOSubSystem(iosubsystem);
PERL_SYS_INIT(&argc,&argv);
PERL_SYS_TERM();
- SetIOSubSystem(pOldIOSubsystem);
-
return (exitstatus);
}
-#include <stdio.h>
-#include <win32io.h>
+/* Say NO to CPP! Hallelujah! */
-#ifndef _DLL
-extern WIN32_IOSUBSYSTEM win32stdio;
-#endif
-
-extern int RunPerl(int argc, char **argv, char **env, void *iosubsystem);
+__declspec(dllimport) int RunPerl(int argc, char **argv, char **env, void *ios);
int
main(int argc, char **argv, char **env)
{
-#ifdef _DLL
- return (RunPerl(argc, argv, env, NULL));
-#else
- return (RunPerl(argc, argv, env, &win32stdio));
-#endif
+ return RunPerl(argc, argv, env, (void*)0);
}
static DWORD IdOS(void);
-extern WIN32_IOSUBSYSTEM win32stdio;
-static PWIN32_IOSUBSYSTEM pIOSubSystem = &win32stdio;
-
BOOL ProbeEnv = FALSE;
DWORD Win32System = (DWORD)-1;
char szShellPath[MAX_PATH+1];
return (IdOS() == VER_PLATFORM_WIN32_NT);
}
-DllExport PWIN32_IOSUBSYSTEM
-SetIOSubSystem(void *p)
-{
- PWIN32_IOSUBSYSTEM old = pIOSubSystem;
- if (p) {
- PWIN32_IOSUBSYSTEM pio = (PWIN32_IOSUBSYSTEM)p;
- if (pio->signature_begin == 12345678L
- && pio->signature_end == 87654321L) {
- pIOSubSystem = pio;
- }
- }
- else {
- pIOSubSystem = &win32stdio;
- }
- return old;
-}
-
-DllExport PWIN32_IOSUBSYSTEM
-GetIOSubSystem(void)
-{
- return pIOSubSystem;
-}
-
char *
win32PerlLibPath(void)
{
};
}
}
- res = pIOSubSystem->pfnstat(p,buffer);
+ res = stat(p,buffer);
#ifdef __BORLANDC__
if (res == 0) {
if (S_ISDIR(buffer->st_mode))
#undef times
int
-mytimes(struct tms *timebuf)
+my_times(struct tms *timebuf)
{
FILETIME user;
FILETIME kernel;
#undef alarm
unsigned int
-myalarm(unsigned int sec)
+my_alarm(unsigned int sec)
{
/*
* the 'obvious' implentation is SetTimer() with a callback
return 0;
}
+#if defined(_DLL) || !defined(_MSC_VER)
+/* It may or may not be fixed (ok on NT), but DLL runtime
+ does not export the functions used in the workround
+*/
+#define WIN95_OSFHANDLE_FIXED
+#endif
+
+#if defined(_WIN32) && !defined(WIN95_OSFHANDLE_FIXED) && defined(_M_IX86)
+
+EXTERN_C int __cdecl _alloc_osfhnd(void);
+EXTERN_C int __cdecl _set_osfhnd(int fh, long value);
+EXTERN_C void __cdecl _lock_fhandle(int);
+EXTERN_C void __cdecl _unlock_fhandle(int);
+EXTERN_C void __cdecl _unlock(int);
+
+#if (_MSC_VER >= 1000)
+typedef struct {
+ long osfhnd; /* underlying OS file HANDLE */
+ char osfile; /* attributes of file (e.g., open in text mode?) */
+ char pipech; /* one char buffer for handles opened on pipes */
+#if defined (_MT) && !defined (DLL_FOR_WIN32S)
+ int lockinitflag;
+ CRITICAL_SECTION lock;
+#endif /* defined (_MT) && !defined (DLL_FOR_WIN32S) */
+} ioinfo;
+
+EXTERN_C ioinfo * __pioinfo[];
+
+#define IOINFO_L2E 5
+#define IOINFO_ARRAY_ELTS (1 << IOINFO_L2E)
+#define _pioinfo(i) (__pioinfo[i >> IOINFO_L2E] + (i & (IOINFO_ARRAY_ELTS - 1)))
+#define _osfile(i) (_pioinfo(i)->osfile)
+
+#else /* (_MSC_VER >= 1000) */
+extern char _osfile[];
+#endif /* (_MSC_VER >= 1000) */
+
+#define FOPEN 0x01 /* file handle open */
+#define FAPPEND 0x20 /* file handle opened O_APPEND */
+#define FDEV 0x40 /* file handle refers to device */
+#define FTEXT 0x80 /* file handle is in text mode */
+
+#define _STREAM_LOCKS 26 /* Table of stream locks */
+#define _LAST_STREAM_LOCK (_STREAM_LOCKS+_NSTREAM_-1) /* Last stream lock */
+#define _FH_LOCKS (_LAST_STREAM_LOCK+1) /* Table of fh locks */
+
+/***
+*int my_open_osfhandle(long osfhandle, int flags) - open C Runtime file handle
+*
+*Purpose:
+* This function allocates a free C Runtime file handle and associates
+* it with the Win32 HANDLE specified by the first parameter. This is a
+* temperary fix for WIN95's brain damage GetFileType() error on socket
+* we just bypass that call for socket
+*
+*Entry:
+* long osfhandle - Win32 HANDLE to associate with C Runtime file handle.
+* int flags - flags to associate with C Runtime file handle.
+*
+*Exit:
+* returns index of entry in fh, if successful
+* return -1, if no free entry is found
+*
+*Exceptions:
+*
+*******************************************************************************/
+
+static int
+my_open_osfhandle(long osfhandle, int flags)
+{
+ int fh;
+ char fileflags; /* _osfile flags */
+
+ /* copy relevant flags from second parameter */
+ fileflags = FDEV;
+
+ if(flags & O_APPEND)
+ fileflags |= FAPPEND;
+
+ if(flags & O_TEXT)
+ fileflags |= FTEXT;
+
+ /* attempt to allocate a C Runtime file handle */
+ if((fh = _alloc_osfhnd()) == -1) {
+ errno = EMFILE; /* too many open files */
+ _doserrno = 0L; /* not an OS error */
+ return -1; /* return error to caller */
+ }
+
+ /* the file is open. now, set the info in _osfhnd array */
+ _set_osfhnd(fh, osfhandle);
+
+ fileflags |= FOPEN; /* mark as open */
+
+#if (_MSC_VER >= 1000)
+ _osfile(fh) = fileflags; /* set osfile entry */
+ _unlock_fhandle(fh);
+#else
+ _osfile[fh] = fileflags; /* set osfile entry */
+ _unlock(fh+_FH_LOCKS); /* unlock handle */
+#endif
+
+ return fh; /* return handle */
+}
+
+#define _open_osfhandle my_open_osfhandle
+#endif /* _M_IX86 */
+
+/* simulate flock by locking a range on the file */
+
+#define LK_ERR(f,i) ((f) ? (i = 0) : (errno = GetLastError()))
+#define LK_LEN 0xffff0000
+
+int
+my_flock(int fd, int oper)
+{
+ OVERLAPPED o;
+ int i = -1;
+ HANDLE fh;
+
+ fh = (HANDLE)_get_osfhandle(fd);
+ memset(&o, 0, sizeof(o));
+
+ switch(oper) {
+ case LOCK_SH: /* shared lock */
+ LK_ERR(LockFileEx(fh, 0, 0, LK_LEN, 0, &o),i);
+ break;
+ case LOCK_EX: /* exclusive lock */
+ LK_ERR(LockFileEx(fh, LOCKFILE_EXCLUSIVE_LOCK, 0, LK_LEN, 0, &o),i);
+ break;
+ case LOCK_SH|LOCK_NB: /* non-blocking shared lock */
+ LK_ERR(LockFileEx(fh, LOCKFILE_FAIL_IMMEDIATELY, 0, LK_LEN, 0, &o),i);
+ break;
+ case LOCK_EX|LOCK_NB: /* non-blocking exclusive lock */
+ LK_ERR(LockFileEx(fh,
+ LOCKFILE_EXCLUSIVE_LOCK|LOCKFILE_FAIL_IMMEDIATELY,
+ 0, LK_LEN, 0, &o),i);
+ break;
+ case LOCK_UN: /* unlock lock */
+ LK_ERR(UnlockFileEx(fh, 0, LK_LEN, 0, &o),i);
+ break;
+ default: /* unknown */
+ errno = EINVAL;
+ break;
+ }
+ return i;
+}
+
+#undef LK_ERR
+#undef LK_LEN
+
/*
* redirected io subsystem for all XS modules
*
DllExport int *
win32_errno(void)
{
- return (pIOSubSystem->pfnerrno());
+ return (&errno);
}
DllExport char ***
win32_environ(void)
{
- return (pIOSubSystem->pfnenviron());
+ return (&(_environ));
}
/* the rest are the remapped stdio routines */
DllExport FILE *
win32_stderr(void)
{
- return (pIOSubSystem->pfnstderr());
+ return (stderr);
}
DllExport FILE *
win32_stdin(void)
{
- return (pIOSubSystem->pfnstdin());
+ return (stdin);
}
DllExport FILE *
win32_stdout()
{
- return (pIOSubSystem->pfnstdout());
+ return (stdout);
}
DllExport int
win32_ferror(FILE *fp)
{
- return (pIOSubSystem->pfnferror(fp));
+ return (ferror(fp));
}
DllExport int
win32_feof(FILE *fp)
{
- return (pIOSubSystem->pfnfeof(fp));
+ return (feof(fp));
}
/*
return strerror_buffer;
}
- return pIOSubSystem->pfnstrerror(e);
+ return strerror(e);
}
DllExport int
va_list marker;
va_start(marker, format); /* Initialize variable arguments. */
- return (pIOSubSystem->pfnvfprintf(fp, format, marker));
+ return (vfprintf(fp, format, marker));
}
DllExport int
va_list marker;
va_start(marker, format); /* Initialize variable arguments. */
- return (pIOSubSystem->pfnvprintf(format, marker));
+ return (vprintf(format, marker));
}
DllExport int
win32_vfprintf(FILE *fp, const char *format, va_list args)
{
- return (pIOSubSystem->pfnvfprintf(fp, format, args));
+ return (vfprintf(fp, format, args));
}
DllExport int
win32_vprintf(const char *format, va_list args)
{
- return (pIOSubSystem->pfnvprintf(format, args));
+ return (vprintf(format, args));
}
DllExport size_t
win32_fread(void *buf, size_t size, size_t count, FILE *fp)
{
- return pIOSubSystem->pfnfread(buf, size, count, fp);
+ return fread(buf, size, count, fp);
}
DllExport size_t
win32_fwrite(const void *buf, size_t size, size_t count, FILE *fp)
{
- return pIOSubSystem->pfnfwrite(buf, size, count, fp);
+ return fwrite(buf, size, count, fp);
}
DllExport FILE *
win32_fopen(const char *filename, const char *mode)
{
if (stricmp(filename, "/dev/null")==0)
- return pIOSubSystem->pfnfopen("NUL", mode);
- return pIOSubSystem->pfnfopen(filename, mode);
+ return fopen("NUL", mode);
+ return fopen(filename, mode);
}
DllExport FILE *
win32_fdopen( int handle, const char *mode)
{
- return pIOSubSystem->pfnfdopen(handle, (char *) mode);
+ return fdopen(handle, (char *) mode);
}
DllExport FILE *
win32_freopen( const char *path, const char *mode, FILE *stream)
{
if (stricmp(path, "/dev/null")==0)
- return pIOSubSystem->pfnfreopen("NUL", mode, stream);
- return pIOSubSystem->pfnfreopen(path, mode, stream);
+ return freopen("NUL", mode, stream);
+ return freopen(path, mode, stream);
}
DllExport int
win32_fclose(FILE *pf)
{
- return pIOSubSystem->pfnfclose(pf);
+ return my_fclose(pf);
}
DllExport int
win32_fputs(const char *s,FILE *pf)
{
- return pIOSubSystem->pfnfputs(s, pf);
+ return fputs(s, pf);
}
DllExport int
win32_fputc(int c,FILE *pf)
{
- return pIOSubSystem->pfnfputc(c,pf);
+ return fputc(c,pf);
}
DllExport int
win32_ungetc(int c,FILE *pf)
{
- return pIOSubSystem->pfnungetc(c,pf);
+ return ungetc(c,pf);
}
DllExport int
win32_getc(FILE *pf)
{
- return pIOSubSystem->pfngetc(pf);
+ return getc(pf);
}
DllExport int
win32_fileno(FILE *pf)
{
- return pIOSubSystem->pfnfileno(pf);
+ return fileno(pf);
}
DllExport void
win32_clearerr(FILE *pf)
{
- pIOSubSystem->pfnclearerr(pf);
+ clearerr(pf);
return;
}
DllExport int
win32_fflush(FILE *pf)
{
- return pIOSubSystem->pfnfflush(pf);
+ return fflush(pf);
}
DllExport long
win32_ftell(FILE *pf)
{
- return pIOSubSystem->pfnftell(pf);
+ return ftell(pf);
}
DllExport int
win32_fseek(FILE *pf,long offset,int origin)
{
- return pIOSubSystem->pfnfseek(pf, offset, origin);
+ return fseek(pf, offset, origin);
}
DllExport int
win32_fgetpos(FILE *pf,fpos_t *p)
{
- return pIOSubSystem->pfnfgetpos(pf, p);
+ return fgetpos(pf, p);
}
DllExport int
win32_fsetpos(FILE *pf,const fpos_t *p)
{
- return pIOSubSystem->pfnfsetpos(pf, p);
+ return fsetpos(pf, p);
}
DllExport void
win32_rewind(FILE *pf)
{
- pIOSubSystem->pfnrewind(pf);
+ rewind(pf);
return;
}
DllExport FILE*
win32_tmpfile(void)
{
- return pIOSubSystem->pfntmpfile();
+ return tmpfile();
}
DllExport void
win32_abort(void)
{
- pIOSubSystem->pfnabort();
+ abort();
return;
}
DllExport int
win32_fstat(int fd,struct stat *bufptr)
{
- return pIOSubSystem->pfnfstat(fd,bufptr);
+ return fstat(fd,bufptr);
}
DllExport int
win32_pipe(int *pfd, unsigned int size, int mode)
{
- return pIOSubSystem->pfnpipe(pfd, size, mode);
+ return _pipe(pfd, size, mode);
}
DllExport FILE*
win32_popen(const char *command, const char *mode)
{
- return pIOSubSystem->pfnpopen(command, mode);
+ return _popen(command, mode);
}
DllExport int
win32_pclose(FILE *pf)
{
- return pIOSubSystem->pfnpclose(pf);
+ return _pclose(pf);
}
DllExport int
win32_setmode(int fd, int mode)
{
- return pIOSubSystem->pfnsetmode(fd, mode);
+ return setmode(fd, mode);
}
DllExport long
win32_lseek(int fd, long offset, int origin)
{
- return pIOSubSystem->pfnlseek(fd, offset, origin);
+ return lseek(fd, offset, origin);
}
DllExport long
win32_tell(int fd)
{
- return pIOSubSystem->pfntell(fd);
+ return tell(fd);
}
DllExport int
va_end(ap);
if (stricmp(path, "/dev/null")==0)
- return pIOSubSystem->pfnopen("NUL", flag, pmode);
- return pIOSubSystem->pfnopen(path,flag,pmode);
+ return open("NUL", flag, pmode);
+ return open(path,flag,pmode);
}
DllExport int
win32_close(int fd)
{
- return pIOSubSystem->pfnclose(fd);
+ return close(fd);
}
DllExport int
win32_eof(int fd)
{
- return pIOSubSystem->pfneof(fd);
+ return eof(fd);
}
DllExport int
win32_dup(int fd)
{
- return pIOSubSystem->pfndup(fd);
+ return dup(fd);
}
DllExport int
win32_dup2(int fd1,int fd2)
{
- return pIOSubSystem->pfndup2(fd1,fd2);
+ return dup2(fd1,fd2);
}
DllExport int
win32_read(int fd, void *buf, unsigned int cnt)
{
- return pIOSubSystem->pfnread(fd, buf, cnt);
+ return read(fd, buf, cnt);
}
DllExport int
win32_write(int fd, const void *buf, unsigned int cnt)
{
- return pIOSubSystem->pfnwrite(fd, buf, cnt);
+ return write(fd, buf, cnt);
}
DllExport int
win32_mkdir(const char *dir, int mode)
{
- return pIOSubSystem->pfnmkdir(dir); /* just ignore mode */
+ return mkdir(dir); /* just ignore mode */
}
DllExport int
win32_rmdir(const char *dir)
{
- return pIOSubSystem->pfnrmdir(dir);
+ return rmdir(dir);
}
DllExport int
win32_chdir(const char *dir)
{
- return pIOSubSystem->pfnchdir(dir);
+ return chdir(dir);
}
DllExport int
win32_spawnvp(int mode, const char *cmdname, const char *const *argv)
{
- return pIOSubSystem->pfnspawnvp(mode, cmdname, (char * const *) argv);
+ return spawnvp(mode, cmdname, (char * const *) argv);
}
DllExport int
win32_execvp(const char *cmdname, const char *const *argv)
{
- return pIOSubSystem->pfnexecvp(cmdname, (char *const *)argv);
+ return execvp(cmdname, (char *const *)argv);
}
DllExport void
win32_perror(const char *str)
{
- pIOSubSystem->pfnperror(str);
+ perror(str);
}
DllExport void
win32_setbuf(FILE *pf, char *buf)
{
- pIOSubSystem->pfnsetbuf(pf, buf);
+ setbuf(pf, buf);
}
DllExport int
win32_setvbuf(FILE *pf, char *buf, int type, size_t size)
{
- return pIOSubSystem->pfnsetvbuf(pf, buf, type, size);
+ return setvbuf(pf, buf, type, size);
}
DllExport int
win32_flushall(void)
{
- return pIOSubSystem->pfnflushall();
+ return flushall();
}
DllExport int
win32_fcloseall(void)
{
- return pIOSubSystem->pfnfcloseall();
+ return fcloseall();
}
DllExport char*
win32_fgets(char *s, int n, FILE *pf)
{
- return pIOSubSystem->pfnfgets(s, n, pf);
+ return fgets(s, n, pf);
}
DllExport char*
win32_gets(char *s)
{
- return pIOSubSystem->pfngets(s);
+ return gets(s);
}
DllExport int
win32_fgetc(FILE *pf)
{
- return pIOSubSystem->pfnfgetc(pf);
+ return fgetc(pf);
}
DllExport int
win32_putc(int c, FILE *pf)
{
- return pIOSubSystem->pfnputc(c,pf);
+ return putc(c,pf);
}
DllExport int
win32_puts(const char *s)
{
- return pIOSubSystem->pfnputs(s);
+ return puts(s);
}
DllExport int
win32_getchar(void)
{
- return pIOSubSystem->pfngetchar();
+ return getchar();
}
DllExport int
win32_putchar(int c)
{
- return pIOSubSystem->pfnputchar(c);
+ return putchar(c);
}
DllExport void*
win32_malloc(size_t size)
{
- return pIOSubSystem->pfnmalloc(size);
+ return malloc(size);
}
DllExport void*
win32_calloc(size_t numitems, size_t size)
{
- return pIOSubSystem->pfncalloc(numitems,size);
+ return calloc(numitems,size);
}
DllExport void*
win32_realloc(void *block, size_t size)
{
- return pIOSubSystem->pfnrealloc(block,size);
+ return realloc(block,size);
}
DllExport void
win32_free(void *block)
{
- pIOSubSystem->pfnfree(block);
+ free(block);
}
int
win32_open_osfhandle(long handle, int flags)
{
- return pIOSubSystem->pfn_open_osfhandle(handle, flags);
+ return _open_osfhandle(handle, flags);
}
long
win32_get_osfhandle(int fd)
{
- return pIOSubSystem->pfn_get_osfhandle(fd);
+ return _get_osfhandle(fd);
}
/*
croak("flock() unimplemented on this platform");
return -1;
}
- return pIOSubSystem->pfnflock(fd, oper);
+ return my_flock(fd, oper);
}
static
#include <process.h>
#include <stdio.h>
#include <direct.h>
+#include <stdlib.h>
+#ifndef EXT
+#include "EXTERN.h"
+#endif
+
+#ifndef START_EXTERN_C
+#ifdef __cplusplus
+# define START_EXTERN_C extern "C" {
+# define END_EXTERN_C }
+# define EXTERN_C extern "C"
+#else
+# define START_EXTERN_C
+# define END_EXTERN_C
+# define EXTERN_C
+#endif
+#endif
+
+#define STANDARD_C 1
+#define DOSISH 1 /* no escaping our roots */
+#define OP_BINARY O_BINARY /* mistake in in pp_sys.c? */
+#define USE_SOCKETS_AS_HANDLES /* we wanna pretend sockets are FDs */
+/*#define USE_WIN32_RTL_ENV */ /* see note below */
/* For UNIX compatibility. */
#endif
-#ifdef __cplusplus
-extern "C" {
-#endif
-
+START_EXTERN_C
extern uid_t getuid(void);
extern gid_t getgid(void);
extern uid_t geteuid(void);
extern gid_t getegid(void);
extern int setuid(uid_t uid);
extern int setgid(gid_t gid);
-
extern int kill(int pid, int sig);
-
-#ifdef __cplusplus
-}
-#endif
-
+END_EXTERN_C
extern char *staticlinkmodules[];
+START_EXTERN_C
+
/* if USE_WIN32_RTL_ENV is not defined, Perl uses direct Win32 calls
* to read the environment, bypassing the runtime's (usually broken)
* facilities for accessing the same. See note in util.c/my_setenv().
*/
-/*#define USE_WIN32_RTL_ENV */
#ifndef USE_WIN32_RTL_ENV
-#include <stdlib.h>
-#ifndef EXT
-#include "EXTERN.h"
-#endif
+EXT char *win32_getenv(const char *name);
#undef getenv
#define getenv win32_getenv
-EXT char *win32_getenv(const char *name);
-#endif
-
-#ifdef __cplusplus
-extern "C" {
#endif
-
EXT void Perl_win32_init(int *argcp, char ***argvp);
-#define USE_SOCKETS_AS_HANDLES
#ifndef USE_SOCKETS_AS_HANDLES
-
-extern FILE *myfdopen(int, char *);
-
+extern FILE *my_fdopen(int, char *);
#undef fdopen
-#define fdopen myfdopen
+#define fdopen my_fdopen
#endif /* USE_SOCKETS_AS_HANDLES */
-#define STANDARD_C 1 /* Perl5 likes standard C. */
-#define DOSISH 1 /* Take advantage of DOSish code in Perl5. */
+#undef fclose
+#define fclose my_fclose
-#define OP_BINARY O_BINARY /* Mistake in in pp_sys.c. */
-
-#undef pipe
-#define pipe(fd) win32_pipe((fd), 512, O_BINARY) /* the pipe call is a bit different */
+#undef pipe /* win32_pipe() itself calls _pipe() */
+#define pipe(fd) win32_pipe((fd), 512, O_BINARY)
#undef pause
#define pause() sleep((32767L << 16) + 32767)
-
#undef times
-#define times mytimes
+#define times my_times
#undef alarm
-#define alarm myalarm
+#define alarm my_alarm
struct tms {
long tms_utime;
long tms_cstime;
};
-unsigned int sleep(unsigned int);
-char *win32PerlLibPath(void);
-char *win32SiteLibPath(void);
-int mytimes(struct tms *timebuf);
-unsigned int myalarm(unsigned int sec);
-int do_aspawn(void* really, void ** mark, void ** arglast);
-int do_spawn(char *cmd);
-char do_exec(char *cmd);
-void init_os_extras(void);
-
-#ifdef __cplusplus
-}
-#endif
+extern unsigned int sleep(unsigned int);
+extern char *win32PerlLibPath(void);
+extern char *win32SiteLibPath(void);
+extern int my_times(struct tms *timebuf);
+extern unsigned int my_alarm(unsigned int sec);
+extern int my_flock(int fd, int oper);
+extern int do_aspawn(void* really, void ** mark, void ** arglast);
+extern int do_spawn(char *cmd);
+extern char do_exec(char *cmd);
+extern void init_os_extras(void);
+extern int my_fclose(FILE *);
+extern int IsWin95(void);
+extern int IsWinNT(void);
+
+END_EXTERN_C
typedef char * caddr_t; /* In malloc.c (core address). */
#pragma warning(disable: 4018 4035 4101 4102 4244 4245 4761)
#endif
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-int IsWin95(void);
-int IsWinNT(void);
-
-#ifdef __cplusplus
-}
-#endif
-
-
#ifndef VER_PLATFORM_WIN32_WINDOWS /* VC-2.0 headers dont have this */
#define VER_PLATFORM_WIN32_WINDOWS 1
#endif
-#define WIN32_LEAN_AND_MEAN
-#include <stdio.h>
-extern int my_fclose(FILE *pf);
-#include "EXTERN.h"
-#define WIN32IO_IS_STDIO
-#include <windows.h>
-#include <stdlib.h>
-#include <io.h>
-#include <sys/stat.h>
-#include <sys/socket.h>
-#include <fcntl.h>
-#include <assert.h>
-#include <errno.h>
-#include <process.h>
-#include <direct.h>
-
-#include "win32iop.h"
-
-/*
- * The following is just a basic wrapping of the stdio
- *
- * redirected io subsystem for all XS modules
- */
-
-static int *
-dummy_errno(void)
-{
- return (&(errno));
-}
-
-static char ***
-dummy_environ(void)
-{
- return (&(_environ));
-}
-
-/* the rest are the remapped stdio routines */
-static FILE *
-dummy_stderr(void)
-{
- return stderr;
-}
-
-static FILE *
-dummy_stdin(void)
-{
- return stdin;
-}
-
-static FILE *
-dummy_stdout(void)
-{
- return stdout;
-}
-
-static int
-dummy_globalmode(int mode)
-{
- int o = _fmode;
- _fmode = mode;
-
- return o;
-}
-
-#if defined(_DLL) || !defined(_MSC_VER)
-/* It may or may not be fixed (ok on NT), but DLL runtime
- does not export the functions used in the workround
-*/
-#define WIN95_OSFHANDLE_FIXED
-#endif
-
-#if defined(_WIN32) && !defined(WIN95_OSFHANDLE_FIXED) && defined(_M_IX86)
-
-EXTERN_C int __cdecl _alloc_osfhnd(void);
-EXTERN_C int __cdecl _set_osfhnd(int fh, long value);
-EXTERN_C void __cdecl _lock_fhandle(int);
-EXTERN_C void __cdecl _unlock_fhandle(int);
-EXTERN_C void __cdecl _unlock(int);
-
-#if (_MSC_VER >= 1000)
-typedef struct {
- long osfhnd; /* underlying OS file HANDLE */
- char osfile; /* attributes of file (e.g., open in text mode?) */
- char pipech; /* one char buffer for handles opened on pipes */
-#if defined (_MT) && !defined (DLL_FOR_WIN32S)
- int lockinitflag;
- CRITICAL_SECTION lock;
-#endif /* defined (_MT) && !defined (DLL_FOR_WIN32S) */
-} ioinfo;
-
-EXTERN_C ioinfo * __pioinfo[];
-
-#define IOINFO_L2E 5
-#define IOINFO_ARRAY_ELTS (1 << IOINFO_L2E)
-#define _pioinfo(i) (__pioinfo[i >> IOINFO_L2E] + (i & (IOINFO_ARRAY_ELTS - 1)))
-#define _osfile(i) (_pioinfo(i)->osfile)
-
-#else /* (_MSC_VER >= 1000) */
-extern char _osfile[];
-#endif /* (_MSC_VER >= 1000) */
-
-#define FOPEN 0x01 /* file handle open */
-#define FAPPEND 0x20 /* file handle opened O_APPEND */
-#define FDEV 0x40 /* file handle refers to device */
-#define FTEXT 0x80 /* file handle is in text mode */
-
-#define _STREAM_LOCKS 26 /* Table of stream locks */
-#define _LAST_STREAM_LOCK (_STREAM_LOCKS+_NSTREAM_-1) /* Last stream lock */
-#define _FH_LOCKS (_LAST_STREAM_LOCK+1) /* Table of fh locks */
-
-/***
-*int my_open_osfhandle(long osfhandle, int flags) - open C Runtime file handle
-*
-*Purpose:
-* This function allocates a free C Runtime file handle and associates
-* it with the Win32 HANDLE specified by the first parameter. This is a
-* temperary fix for WIN95's brain damage GetFileType() error on socket
-* we just bypass that call for socket
-*
-*Entry:
-* long osfhandle - Win32 HANDLE to associate with C Runtime file handle.
-* int flags - flags to associate with C Runtime file handle.
-*
-*Exit:
-* returns index of entry in fh, if successful
-* return -1, if no free entry is found
-*
-*Exceptions:
-*
-*******************************************************************************/
-
-static int
-my_open_osfhandle(long osfhandle, int flags)
-{
- int fh;
- char fileflags; /* _osfile flags */
-
- /* copy relevant flags from second parameter */
- fileflags = FDEV;
-
- if(flags & O_APPEND)
- fileflags |= FAPPEND;
-
- if(flags & O_TEXT)
- fileflags |= FTEXT;
-
- /* attempt to allocate a C Runtime file handle */
- if((fh = _alloc_osfhnd()) == -1) {
- errno = EMFILE; /* too many open files */
- _doserrno = 0L; /* not an OS error */
- return -1; /* return error to caller */
- }
-
- /* the file is open. now, set the info in _osfhnd array */
- _set_osfhnd(fh, osfhandle);
-
- fileflags |= FOPEN; /* mark as open */
-
-#if (_MSC_VER >= 1000)
- _osfile(fh) = fileflags; /* set osfile entry */
- _unlock_fhandle(fh);
-#else
- _osfile[fh] = fileflags; /* set osfile entry */
- _unlock(fh+_FH_LOCKS); /* unlock handle */
-#endif
-
- return fh; /* return handle */
-}
-
-#define _open_osfhandle my_open_osfhandle
-#endif /* _M_IX86 */
-
-/* simulate flock by locking a range on the file */
-
-#define LK_ERR(f,i) ((f) ? (i = 0) : (errno = GetLastError()))
-#define LK_LEN 0xffff0000
-
-int
-my_flock(int fd, int oper)
-{
- OVERLAPPED o;
- int i = -1;
- HANDLE fh;
-
- fh = (HANDLE)_get_osfhandle(fd);
- memset(&o, 0, sizeof(o));
-
- switch(oper) {
- case LOCK_SH: /* shared lock */
- LK_ERR(LockFileEx(fh, 0, 0, LK_LEN, 0, &o),i);
- break;
- case LOCK_EX: /* exclusive lock */
- LK_ERR(LockFileEx(fh, LOCKFILE_EXCLUSIVE_LOCK, 0, LK_LEN, 0, &o),i);
- break;
- case LOCK_SH|LOCK_NB: /* non-blocking shared lock */
- LK_ERR(LockFileEx(fh, LOCKFILE_FAIL_IMMEDIATELY, 0, LK_LEN, 0, &o),i);
- break;
- case LOCK_EX|LOCK_NB: /* non-blocking exclusive lock */
- LK_ERR(LockFileEx(fh,
- LOCKFILE_EXCLUSIVE_LOCK|LOCKFILE_FAIL_IMMEDIATELY,
- 0, LK_LEN, 0, &o),i);
- break;
- case LOCK_UN: /* unlock lock */
- LK_ERR(UnlockFileEx(fh, 0, LK_LEN, 0, &o),i);
- break;
- default: /* unknown */
- errno = EINVAL;
- break;
- }
- return i;
-}
-
-#undef LK_ERR
-#undef LK_LEN
-
-
-#ifdef PERLDLL
-__declspec(dllexport)
-#endif
-WIN32_IOSUBSYSTEM win32stdio = {
- 12345678L, /* begin of structure; */
- dummy_errno, /* (*pfunc_errno)(void); */
- dummy_environ, /* (*pfunc_environ)(void); */
- dummy_stdin, /* (*pfunc_stdin)(void); */
- dummy_stdout, /* (*pfunc_stdout)(void); */
- dummy_stderr, /* (*pfunc_stderr)(void); */
- ferror, /* (*pfunc_ferror)(FILE *fp); */
- feof, /* (*pfunc_feof)(FILE *fp); */
- strerror, /* (*strerror)(int e); */
- vfprintf, /* (*pfunc_vfprintf)(FILE *pf, const char *format, va_list arg); */
- vprintf, /* (*pfunc_vprintf)(const char *format, va_list arg); */
- fread, /* (*pfunc_fread)(void *buf, size_t size, size_t count, FILE *pf); */
- fwrite, /* (*pfunc_fwrite)(void *buf, size_t size, size_t count, FILE *pf); */
- fopen, /* (*pfunc_fopen)(const char *path, const char *mode); */
- fdopen, /* (*pfunc_fdopen)(int fh, const char *mode); */
- freopen, /* (*pfunc_freopen)(const char *path, const char *mode, FILE *pf); */
- my_fclose, /* (*pfunc_fclose)(FILE *pf); */
- fputs, /* (*pfunc_fputs)(const char *s,FILE *pf); */
- fputc, /* (*pfunc_fputc)(int c,FILE *pf); */
- ungetc, /* (*pfunc_ungetc)(int c,FILE *pf); */
- getc, /* (*pfunc_getc)(FILE *pf); */
- fileno, /* (*pfunc_fileno)(FILE *pf); */
- clearerr, /* (*pfunc_clearerr)(FILE *pf); */
- fflush, /* (*pfunc_fflush)(FILE *pf); */
- ftell, /* (*pfunc_ftell)(FILE *pf); */
- fseek, /* (*pfunc_fseek)(FILE *pf,long offset,int origin); */
- fgetpos, /* (*pfunc_fgetpos)(FILE *pf,fpos_t *p); */
- fsetpos, /* (*pfunc_fsetpos)(FILE *pf,fpos_t *p); */
- rewind, /* (*pfunc_rewind)(FILE *pf); */
- tmpfile, /* (*pfunc_tmpfile)(void); */
- abort, /* (*pfunc_abort)(void); */
- fstat, /* (*pfunc_fstat)(int fd,struct stat *bufptr); */
- stat, /* (*pfunc_stat)(const char *name,struct stat *bufptr); */
- _pipe, /* (*pfunc_pipe)( int *phandles, unsigned int psize, int textmode ); */
- _popen, /* (*pfunc_popen)( const char *command, const char *mode ); */
- _pclose, /* (*pfunc_pclose)( FILE *pf); */
- setmode, /* (*pfunc_setmode)( int fd, int mode); */
- lseek, /* (*pfunc_lseek)( int fd, long offset, int origin); */
- tell, /* (*pfunc_tell)( int fd); */
- dup, /* (*pfunc_dup)( int fd); */
- dup2, /* (*pfunc_dup2)(int h1, int h2); */
- open, /* (*pfunc_open)(const char *path, int oflag,...); */
- close, /* (*pfunc_close)(int fd); */
- eof, /* (*pfunc_eof)(int fd); */
- read, /* (*pfunc_read)(int fd, void *buf, unsigned int cnt); */
- write, /* (*pfunc_write)(int fd, const void *buf, unsigned int cnt); */
- dummy_globalmode, /* (*pfunc_globalmode)(int mode) */
- _open_osfhandle,
- _get_osfhandle,
- spawnvp,
- mkdir,
- rmdir,
- chdir,
- my_flock, /* (*pfunc_flock)(int fd, int oper) */
- execvp,
- perror,
- setbuf,
- setvbuf,
- flushall,
- fcloseall,
- fgets,
- gets,
- fgetc,
- putc,
- puts,
- getchar,
- putchar,
- fscanf,
- scanf,
- malloc,
- calloc,
- realloc,
- free,
- 87654321L, /* end of structure */
-};
-
-
-
-
-#ifndef WIN32IO_H
-#define WIN32IO_H
-
-#ifdef __BORLANDC__
-#include <stdarg.h>
-#define MSconst
-#else
-#define MSconst const
-#endif
-
-typedef struct {
-int signature_begin;
-int * (*pfnerrno)(void);
-char ***(*pfnenviron)(void);
-FILE* (*pfnstdin)(void);
-FILE* (*pfnstdout)(void);
-FILE* (*pfnstderr)(void);
-int (*pfnferror)(FILE *fp);
-int (*pfnfeof)(FILE *fp);
-char* (*pfnstrerror)(int e);
-int (*pfnvfprintf)(FILE *pf, const char *format, va_list arg);
-int (*pfnvprintf)(const char *format, va_list arg);
-size_t (*pfnfread)(void *buf, size_t size, size_t count, FILE *pf);
-size_t (*pfnfwrite)(const void *buf, size_t size, size_t count, FILE *pf);
-FILE* (*pfnfopen)(const char *path, const char *mode);
-FILE* (*pfnfdopen)(int fh, MSconst char *mode);
-FILE* (*pfnfreopen)(const char *path, const char *mode, FILE *pf);
-int (*pfnfclose)(FILE *pf);
-int (*pfnfputs)(const char *s,FILE *pf);
-int (*pfnfputc)(int c,FILE *pf);
-int (*pfnungetc)(int c,FILE *pf);
-int (*pfngetc)(FILE *pf);
-int (*pfnfileno)(FILE *pf);
-void (*pfnclearerr)(FILE *pf);
-int (*pfnfflush)(FILE *pf);
-long (*pfnftell)(FILE *pf);
-int (*pfnfseek)(FILE *pf,long offset,int origin);
-int (*pfnfgetpos)(FILE *pf,fpos_t *p);
-int (*pfnfsetpos)(FILE *pf,const fpos_t *p);
-void (*pfnrewind)(FILE *pf);
-FILE* (*pfntmpfile)(void);
-void (*pfnabort)(void);
-int (*pfnfstat)(int fd,struct stat *bufptr);
-int (*pfnstat)(const char *name,struct stat *bufptr);
-int (*pfnpipe)( int *phandles, unsigned int psize, int textmode );
-FILE* (*pfnpopen)( const char *command, const char *mode );
-int (*pfnpclose)( FILE *pf);
-int (*pfnsetmode)( int fd, int mode);
-long (*pfnlseek)( int fd, long offset, int origin);
-long (*pfntell)( int fd);
-int (*pfndup)( int fd);
-int (*pfndup2)(int h1, int h2);
-int (*pfnopen)(const char *path, int oflag,...);
-int (*pfnclose)(int fd);
-int (*pfneof)(int fd);
-int (*pfnread)(int fd, void *buf, unsigned int cnt);
-int (*pfnwrite)(int fd, const void *buf, unsigned int cnt);
-int (*pfnopenmode)(int mode);
-int (*pfn_open_osfhandle)(long handle, int flags);
-long (*pfn_get_osfhandle)(int fd);
-int (*pfnspawnvp)(int mode, const char *cmdname, MSconst char * const *argv);
-int (*pfnmkdir)(const char *path);
-int (*pfnrmdir)(const char *path);
-int (*pfnchdir)(const char *path);
-int (*pfnflock)(int fd, int oper);
-int (*pfnexecvp)(const char *cmdname, MSconst char *const *argv);
-void (*pfnperror)(const char *str);
-void (*pfnsetbuf)(FILE *pf, char *buf);
-int (*pfnsetvbuf)(FILE *pf, char *buf, int type, size_t size);
-int (*pfnflushall)(void);
-int (*pfnfcloseall)(void);
-char* (*pfnfgets)(char *s, int n, FILE *pf);
-char* (*pfngets)(char *s);
-int (*pfnfgetc)(FILE *pf);
-int (*pfnputc)(int c, FILE *pf);
-int (*pfnputs)(const char *s);
-int (*pfngetchar)(void);
-int (*pfnputchar)(int c);
-int (*pfnfscanf)(FILE *pf, const char *format, ...);
-int (*pfnscanf)(const char *format, ...);
-void* (*pfnmalloc)(size_t size);
-void* (*pfncalloc)(size_t numitems, size_t size);
-void* (*pfnrealloc)(void *block, size_t size);
-void (*pfnfree)(void *block);
-int signature_end;
-} WIN32_IOSUBSYSTEM;
-
-typedef WIN32_IOSUBSYSTEM *PWIN32_IOSUBSYSTEM;
-
-#endif /* WIN32IO_H */
#define LOCK_NB 4
#define LOCK_UN 8
-#include <win32io.h> /* pull in the io sub system structure */
-
/*
* Make this as close to original stdio as possible.
*/
EXT long win32_get_osfhandle(int fd);
-EXT PWIN32_IOSUBSYSTEM SetIOSubSystem(void *piosubsystem);
-EXT PWIN32_IOSUBSYSTEM GetIOSubSystem(void);
-
END_EXTERN_C
/*
#undef stdout
#undef ferror
#undef feof
+#undef fclose
#ifdef __BORLANDC__
#undef ungetc
#define puts win32_puts
#define getchar win32_getchar
#define putchar win32_putchar
-#define fscanf (GetIOSubSystem()->pfnfscanf)
-#define scanf (GetIOSubSystem()->pfnscanf)
#define malloc win32_malloc
#define calloc win32_calloc
#define realloc win32_realloc
* License or the Artistic License, as specified in the README file.
*/
-#include <windows.h>
+#define WIN32IO_IS_STDIO
#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
#include "EXTERN.h"
#include "perl.h"
#include <sys/socket.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <assert.h>
+#include <io.h>
#undef htonl
#undef htons
croak("setservent not implemented!\n");
}
-#define WIN32IO_IS_STDIO
-#include <io.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-#include "win32iop.h"
-#ifdef __cplusplus
-}
-#endif
-
static struct servent*
win32_savecopyservent(struct servent*d, struct servent*s, const char *proto)
{