diff options
-rw-r--r-- | MANIFEST | 2 | ||||
-rw-r--r-- | win32/Makefile | 10 | ||||
-rw-r--r-- | win32/makedef.pl | 3 | ||||
-rw-r--r-- | win32/makefile.mk | 10 | ||||
-rw-r--r-- | win32/perllib.c | 5 | ||||
-rw-r--r-- | win32/runperl.c | 15 | ||||
-rw-r--r-- | win32/win32.c | 329 | ||||
-rw-r--r-- | win32/win32.h | 110 | ||||
-rw-r--r-- | win32/win32io.c | 299 | ||||
-rw-r--r-- | win32/win32io.h | 90 | ||||
-rw-r--r-- | win32/win32iop.h | 8 | ||||
-rw-r--r-- | win32/win32sck.c | 15 |
12 files changed, 286 insertions, 610 deletions
@@ -880,8 +880,6 @@ win32/runperl.c Win32 port 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 diff --git a/win32/Makefile b/win32/Makefile index ba02106df4..5d241300c0 100644 --- a/win32/Makefile +++ b/win32/Makefile @@ -60,7 +60,7 @@ LIBC = msvcrt.lib WINIOMAYBE = !ELSE LIBC = libcmt.lib -WINIOMAYBE = win32io.obj +WINIOMAYBE = !ENDIF !IF "$(CFG)" == "Debug" @@ -197,18 +197,15 @@ CORE_OBJ= ..\av.obj \ 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 @@ -363,8 +360,6 @@ $(PERLEXE): $(PERLDLL) $(CONFIGPM) perlmain.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 @@ -372,9 +367,6 @@ perl95.c : runperl.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 diff --git a/win32/makedef.pl b/win32/makedef.pl index 31686d26b8..fd2a99cbc1 100644 --- a/win32/makedef.pl +++ b/win32/makedef.pl @@ -397,8 +397,5 @@ win32_realloc win32_free win32_open_osfhandle win32_get_osfhandle -win32stdio Perl_win32_init RunPerl -SetIOSubSystem -GetIOSubSystem diff --git a/win32/makefile.mk b/win32/makefile.mk index e7c385756b..35baed5c5d 100644 --- a/win32/makefile.mk +++ b/win32/makefile.mk @@ -105,7 +105,7 @@ LIBC = msvcrt.lib WINIOMAYBE = .ELSE LIBC = libcmt.lib -WINIOMAYBE = win32io.obj +WINIOMAYBE = .ENDIF .IF "$(CFG)" == "Debug" @@ -265,18 +265,15 @@ CORE_OBJ= ..\av.obj \ 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 @@ -460,8 +457,6 @@ $(PERLEXE): $(PERLDLL) $(CONFIGPM) perlmain.obj .ENDIF copy splittree.pl .. $(MINIPERL) -I..\lib ..\splittree.pl "../LIB" "../LIB/auto" -# attrib -r ..\t\*.* -# copy test ..\t .IF "$(CCTYPE)" != "BORLAND" @@ -471,9 +466,6 @@ perl95.c : runperl.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 diff --git a/win32/perllib.c b/win32/perllib.c index 56cba541b9..848360698b 100644 --- a/win32/perllib.c +++ b/win32/perllib.c @@ -14,9 +14,6 @@ RunPerl(int argc, char **argv, char **env, void *iosubsystem) { int exitstatus; PerlInterpreter *my_perl; - void *pOldIOSubsystem; - - pOldIOSubsystem = SetIOSubSystem(iosubsystem); PERL_SYS_INIT(&argc,&argv); @@ -37,8 +34,6 @@ RunPerl(int argc, char **argv, char **env, void *iosubsystem) PERL_SYS_TERM(); - SetIOSubSystem(pOldIOSubsystem); - return (exitstatus); } diff --git a/win32/runperl.c b/win32/runperl.c index 07e2bd6f83..6f84c601ea 100644 --- a/win32/runperl.c +++ b/win32/runperl.c @@ -1,18 +1,9 @@ -#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); } diff --git a/win32/win32.c b/win32/win32.c index 6d04d4a28d..a73d9e65b6 100644 --- a/win32/win32.c +++ b/win32/win32.c @@ -36,9 +36,6 @@ 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]; @@ -57,29 +54,6 @@ IsWinNT(void) { 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) { @@ -640,7 +614,7 @@ win32_stat(const char *path, struct stat *buffer) }; } } - res = pIOSubSystem->pfnstat(p,buffer); + res = stat(p,buffer); #ifdef __BORLANDC__ if (res == 0) { if (S_ISDIR(buffer->st_mode)) @@ -698,7 +672,7 @@ FileTimeToClock(PFILETIME ft) #undef times int -mytimes(struct tms *timebuf) +my_times(struct tms *timebuf) { FILETIME user; FILETIME kernel; @@ -733,7 +707,7 @@ static VOID CALLBACK TimerProc(HWND win, UINT msg, UINT id, DWORD time) #undef alarm unsigned int -myalarm(unsigned int sec) +my_alarm(unsigned int sec) { /* * the 'obvious' implentation is SetTimer() with a callback @@ -761,6 +735,157 @@ myalarm(unsigned int sec) 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 * @@ -769,45 +894,45 @@ myalarm(unsigned int sec) 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)); } /* @@ -836,7 +961,7 @@ win32_strerror(int e) return strerror_buffer; } - return pIOSubSystem->pfnstrerror(e); + return strerror(e); } DllExport int @@ -845,7 +970,7 @@ win32_fprintf(FILE *fp, const char *format, ...) va_list marker; va_start(marker, format); /* Initialize variable arguments. */ - return (pIOSubSystem->pfnvfprintf(fp, format, marker)); + return (vfprintf(fp, format, marker)); } DllExport int @@ -854,188 +979,188 @@ win32_printf(const char *format, ...) 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 @@ -1049,182 +1174,182 @@ win32_open(const char *path, int flag, ...) 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); } /* @@ -1238,7 +1363,7 @@ win32_flock(int fd, int oper) croak("flock() unimplemented on this platform"); return -1; } - return pIOSubSystem->pfnflock(fd, oper); + return my_flock(fd, oper); } static diff --git a/win32/win32.h b/win32/win32.h index 525ef0f6cc..365fe5e220 100644 --- a/win32/win32.h +++ b/win32/win32.h @@ -22,6 +22,28 @@ #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. */ @@ -52,75 +74,53 @@ typedef long gid_t; #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; @@ -129,19 +129,21 @@ struct tms { 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). */ @@ -163,18 +165,6 @@ 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 diff --git a/win32/win32io.c b/win32/win32io.c index b4aacf1101..8b13789179 100644 --- a/win32/win32io.c +++ b/win32/win32io.c @@ -1,300 +1 @@ -#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 */ -}; - - - - diff --git a/win32/win32io.h b/win32/win32io.h index 0e849cf783..8b13789179 100644 --- a/win32/win32io.h +++ b/win32/win32io.h @@ -1,91 +1 @@ -#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 */ diff --git a/win32/win32iop.h b/win32/win32iop.h index fd97d66e6c..992eec7458 100644 --- a/win32/win32iop.h +++ b/win32/win32iop.h @@ -21,8 +21,6 @@ #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. */ @@ -111,9 +109,6 @@ EXT int win32_open_osfhandle(long handle, int flags); EXT long win32_get_osfhandle(int fd); -EXT PWIN32_IOSUBSYSTEM SetIOSubSystem(void *piosubsystem); -EXT PWIN32_IOSUBSYSTEM GetIOSubSystem(void); - END_EXTERN_C /* @@ -127,6 +122,7 @@ END_EXTERN_C #undef stdout #undef ferror #undef feof +#undef fclose #ifdef __BORLANDC__ #undef ungetc @@ -205,8 +201,6 @@ END_EXTERN_C #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 diff --git a/win32/win32sck.c b/win32/win32sck.c index a0fad00386..9de7a149ad 100644 --- a/win32/win32sck.c +++ b/win32/win32sck.c @@ -8,14 +8,16 @@ * 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 @@ -602,17 +604,6 @@ win32_setservent(int stayopen) 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) { |