From f3986ebb5fa156b34b51584d78a10d0d906dbcd6 Mon Sep 17 00:00:00 2001 From: Gurusamy Sarathy Date: Wed, 12 Nov 1997 22:26:39 +0000 Subject: [PATCH] More cleanups of win32/win32*.[ch] files. win32/win32iop.h now contains the all the declarations and macros for the win32io layer. New std-ish functions are exported now. All win32-specific exported functions begin with "win32_" consistently. win32 version of init_os_extras() is now exported, so embedders can get the in-core xsubs. p4raw-id: //depot/win32/perl@244 --- dosish.h | 7 +--- win32/makedef.pl | 4 ++ win32/win32.c | 65 ++++++++++------------------- win32/win32.h | 124 ++++++++++++++++++++++--------------------------------- win32/win32iop.h | 37 +++++++++++++++-- win32/win32sck.c | 3 +- 6 files changed, 112 insertions(+), 128 deletions(-) diff --git a/dosish.h b/dosish.h index 1b251ef..19eb5e8 100644 --- a/dosish.h +++ b/dosish.h @@ -94,12 +94,9 @@ void Perl_DJGPP_init(); #ifndef WIN32 # define Stat(fname,bufptr) stat((fname),(bufptr)) #else -# define Stat(fname,bufptr) win32_stat((fname),(bufptr)) -# define my_getenv(var) getenv(var) /* - * the following are standard library calls (stdio in particular) - * that is being redirected to the perl DLL. This is needed for - * Dynaloading any modules that called stdio functions + * This provides a layer of functions and macros to ensure extensions will + * get to use the same RTL functions as the core. */ # include #endif /* WIN32 */ diff --git a/win32/makedef.pl b/win32/makedef.pl index fd2a99c..abc89d8 100644 --- a/win32/makedef.pl +++ b/win32/makedef.pl @@ -395,7 +395,11 @@ win32_malloc win32_calloc win32_realloc win32_free +win32_sleep +win32_times +win32_alarm win32_open_osfhandle win32_get_osfhandle Perl_win32_init +Perl_init_os_extras RunPerl diff --git a/win32/win32.c b/win32/win32.c index a73d9e6..4551679 100644 --- a/win32/win32.c +++ b/win32/win32.c @@ -575,26 +575,13 @@ ioctl(int i, unsigned int u, char *data) } #endif -unsigned int -sleep(unsigned int t) +DllExport unsigned int +win32_sleep(unsigned int t) { Sleep(t*1000); return 0; } - -#undef rename - -int -myrename(char *OldFileName, char *newname) -{ - if(_access(newname, 0) != -1) { /* file exists */ - _unlink(newname); - } - return rename(OldFileName, newname); -} - - DllExport int win32_stat(const char *path, struct stat *buffer) { @@ -670,9 +657,8 @@ FileTimeToClock(PFILETIME ft) return (long) qw; } -#undef times -int -my_times(struct tms *timebuf) +DllExport int +win32_times(struct tms *timebuf) { FILETIME user; FILETIME kernel; @@ -705,9 +691,8 @@ static VOID CALLBACK TimerProc(HWND win, UINT msg, UINT id, DWORD time) sighandler(14); } -#undef alarm -unsigned int -my_alarm(unsigned int sec) +DllExport unsigned int +win32_alarm(unsigned int sec) { /* * the 'obvious' implentation is SetTimer() with a callback @@ -735,14 +720,7 @@ my_alarm(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) +#ifdef USE_FIXED_OSFHANDLE EXTERN_C int __cdecl _alloc_osfhnd(void); EXTERN_C int __cdecl _set_osfhnd(int fh, long value); @@ -841,20 +819,24 @@ my_open_osfhandle(long osfhandle, int flags) } #define _open_osfhandle my_open_osfhandle -#endif /* _M_IX86 */ +#endif /* USE_FIXED_OSFHANDLE */ /* 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) +DllExport int +win32_flock(int fd, int oper) { OVERLAPPED o; int i = -1; HANDLE fh; + if (!IsWinNT()) { + croak("flock() unimplemented on this platform"); + return -1; + } fh = (HANDLE)_get_osfhandle(fd); memset(&o, 0, sizeof(o)); @@ -1014,6 +996,11 @@ win32_fopen(const char *filename, const char *mode) return fopen(filename, mode); } +#ifndef USE_SOCKETS_AS_HANDLES +#undef fdopen +#define fdopen my_fdopen +#endif + DllExport FILE * win32_fdopen( int handle, const char *mode) { @@ -1031,7 +1018,7 @@ win32_freopen( const char *path, const char *mode, FILE *stream) DllExport int win32_fclose(FILE *pf) { - return my_fclose(pf); + return my_fclose(pf); /* defined in win32sck.c */ } DllExport int @@ -1356,16 +1343,6 @@ win32_get_osfhandle(int fd) * Extras. */ -DllExport int -win32_flock(int fd, int oper) -{ - if (!IsWinNT()) { - croak("flock() unimplemented on this platform"); - return -1; - } - return my_flock(fd, oper); -} - static XS(w32_GetCwd) { @@ -1617,7 +1594,7 @@ XS(w32_GetShortPathName) } void -init_os_extras() +Perl_init_os_extras() { char *file = __FILE__; dXSUB_SYS; diff --git a/win32/win32.h b/win32/win32.h index 365fe5e..18bf8a2 100644 --- a/win32/win32.h +++ b/win32/win32.h @@ -42,12 +42,31 @@ #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 */ +#define DllExport __declspec(dllexport) +#define DllImport __declspec(dllimport) -/* For UNIX compatibility. */ +/* Define USE_SOCKETS_AS_HANDLES to enable emulation of windows sockets as + * real filehandles. XXX Should always be defined (the other version is untested) */ +#define USE_SOCKETS_AS_HANDLES + +/* 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 */ -#ifdef __BORLANDC__ +/* Define USE_FIXED_OSFHANDLE to fix VC's _open_osfhandle() on W95. + * Can only enable it if not using the DLL CRT (it doesn't expose internals) */ +#if defined(_MSC_VER) && !defined(_DLL) && defined(_M_IX86) +#define USE_FIXED_OSFHANDLE +#endif + +#ifndef VER_PLATFORM_WIN32_WINDOWS /* VC-2.0 headers dont have this */ +#define VER_PLATFORM_WIN32_WINDOWS 1 +#endif + +/* Compiler-specific stuff. */ + +#ifdef __BORLANDC__ /* Microsoft Visual C++ */ #define _access access #define _chdir chdir @@ -69,12 +88,22 @@ #else +#ifdef _MSC_VER /* Microsoft Visual C++ */ + typedef long uid_t; typedef long gid_t; +#pragma warning(disable: 4018 4035 4101 4102 4244 4245 4761) + +#endif /* _MSC_VER */ + +/* compatibility stuff for other compilers goes here */ #endif START_EXTERN_C + +/* For UNIX compatibility. */ + extern uid_t getuid(void); extern gid_t getgid(void); extern uid_t geteuid(void); @@ -82,91 +111,38 @@ extern gid_t getegid(void); extern int setuid(uid_t uid); extern int setgid(gid_t gid); extern int kill(int pid, int sig); -END_EXTERN_C -extern char *staticlinkmodules[]; +#undef Stat +#define Stat win32_stat -START_EXTERN_C +#undef init_os_extras +#define init_os_extras Perl_init_os_extras -/* 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(). - */ +EXT void Perl_win32_init(int *argcp, char ***argvp); +EXT void Perl_init_os_extras(void); -#ifndef USE_WIN32_RTL_ENV -EXT char *win32_getenv(const char *name); -#undef getenv -#define getenv win32_getenv +#ifndef USE_SOCKETS_AS_HANDLES +extern FILE * my_fdopen(int, char *); #endif +extern int my_fclose(FILE *); +extern int do_aspawn(void* really, void ** mark, void ** arglast); +extern int do_spawn(char *cmd); +extern char do_exec(char *cmd); +extern char * win32PerlLibPath(void); +extern char * win32SiteLibPath(void); +extern int IsWin95(void); +extern int IsWinNT(void); -EXT void Perl_win32_init(int *argcp, char ***argvp); - -#ifndef USE_SOCKETS_AS_HANDLES -extern FILE *my_fdopen(int, char *); -#undef fdopen -#define fdopen my_fdopen -#endif /* USE_SOCKETS_AS_HANDLES */ - -#undef fclose -#define fclose my_fclose - -#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 my_times - -#undef alarm -#define alarm my_alarm - -struct tms { - long tms_utime; - long tms_stime; - long tms_cutime; - long tms_cstime; -}; - -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); +extern char * staticlinkmodules[]; END_EXTERN_C typedef char * caddr_t; /* In malloc.c (core address). */ /* - * Extension Library, only good for VC - */ - -#define DllExport __declspec(dllexport) -#define DllImport __declspec(dllimport) - -/* * handle socket stuff, assuming socket is always available */ - #include #include -#ifdef _MSC_VER -#pragma warning(disable: 4018 4035 4101 4102 4244 4245 4761) -#endif - -#ifndef VER_PLATFORM_WIN32_WINDOWS /* VC-2.0 headers dont have this */ -#define VER_PLATFORM_WIN32_WINDOWS 1 -#endif - #endif /* _INC_WIN32_PERL5 */ diff --git a/win32/win32iop.h b/win32/win32iop.h index 992eec7..a60194d 100644 --- a/win32/win32iop.h +++ b/win32/win32iop.h @@ -30,6 +30,13 @@ */ START_EXTERN_C +struct tms { + long tms_utime; + long tms_stime; + long tms_cutime; + long tms_cstime; +}; + EXT int * win32_errno(void); EXT char *** win32_environ(void); EXT FILE* win32_stdin(void); @@ -102,12 +109,18 @@ EXT void* win32_calloc(size_t numitems, size_t size); EXT void* win32_realloc(void *block, size_t size); EXT void win32_free(void *block); -/* - * these two are win32 specific but still io related - */ EXT int win32_open_osfhandle(long handle, int flags); EXT long win32_get_osfhandle(int fd); +#ifndef USE_WIN32_RTL_ENV +EXT char* win32_getenv(const char *name); +#endif + +EXT unsigned int win32_sleep(unsigned int); +EXT int win32_times(struct tms *timebuf); +EXT unsigned int win32_alarm(unsigned int sec); +EXT int win32_flock(int fd, int oper); +EXT int win32_stat(const char *path, struct stat *buf); END_EXTERN_C @@ -123,6 +136,11 @@ END_EXTERN_C #undef ferror #undef feof #undef fclose +#undef pipe +#undef pause +#undef sleep +#undef times +#undef alarm #ifdef __BORLANDC__ #undef ungetc @@ -205,6 +223,17 @@ END_EXTERN_C #define calloc win32_calloc #define realloc win32_realloc #define free win32_free -#endif /* WIN32IO_IS_STDIO */ +#define pipe(fd) win32_pipe((fd), 512, O_BINARY) +#define pause() win32_sleep((32767L << 16) + 32767) +#define sleep win32_sleep +#define times win32_times +#define alarm win32_alarm + +#ifndef USE_WIN32_RTL_ENV +#undef getenv +#define getenv win32_getenv +#endif + +#endif /* WIN32IO_IS_STDIO */ #endif /* WIN32IOP_H */ diff --git a/win32/win32sck.c b/win32/win32sck.c index 9de7a14..b4f40f0 100644 --- a/win32/win32sck.c +++ b/win32/win32sck.c @@ -132,8 +132,9 @@ start_sockets(void) #ifndef USE_SOCKETS_AS_HANDLES +#undef fdopen FILE * -myfdopen(int fd, char *mode) +my_fdopen(int fd, char *mode) { FILE *fp; char sockbuf[256]; -- 2.7.4