summaryrefslogtreecommitdiff
path: root/gnu
diff options
context:
space:
mode:
authorTodd C. Miller <millert@cvs.openbsd.org>1997-11-30 08:06:47 +0000
committerTodd C. Miller <millert@cvs.openbsd.org>1997-11-30 08:06:47 +0000
commit0512af39306262113602b12265059e76c91427ff (patch)
tree2fb13f9b188aaf0f9a0e746b2d7a67fa54c8d356 /gnu
parentebf0e4c599bca88436539559ca7c08c69ed197bf (diff)
stock perl 5.8.0 from CPAN
Diffstat (limited to 'gnu')
-rw-r--r--gnu/usr.bin/perl/win32/win32io.c327
1 files changed, 327 insertions, 0 deletions
diff --git a/gnu/usr.bin/perl/win32/win32io.c b/gnu/usr.bin/perl/win32/win32io.c
new file mode 100644
index 00000000000..eeb684620bb
--- /dev/null
+++ b/gnu/usr.bin/perl/win32/win32io.c
@@ -0,0 +1,327 @@
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define WIN32_LEAN_AND_MEAN
+#define WIN32IO_IS_STDIO
+#define EXT
+#include <windows.h>
+#include <stdio.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(__BORLANDC__)
+/* 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 __cplusplus
+#define EXT_C_FUNC extern "C"
+# else
+#define EXT_C_FUNC extern
+# endif
+
+EXT_C_FUNC int __cdecl _alloc_osfhnd(void);
+EXT_C_FUNC int __cdecl _set_osfhnd(int fh, long value);
+EXT_C_FUNC void __cdecl _lock_fhandle(int);
+EXT_C_FUNC void __cdecl _unlock_fhandle(int);
+EXT_C_FUNC 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;
+
+EXT_C_FUNC 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 _patch_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:
+*
+*******************************************************************************/
+
+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 */
+}
+#else
+
+int __cdecl
+my_open_osfhandle(long osfhandle, int flags)
+{
+ return _open_osfhandle(osfhandle, flags);
+}
+#endif /* _M_IX86 */
+
+long
+my_get_osfhandle( int filehandle )
+{
+ return _get_osfhandle(filehandle);
+}
+
+#ifdef __BORLANDC__
+#define _chdir chdir
+#endif
+
+/* 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)my_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
+
+EXT int my_fclose(FILE *pf);
+
+#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) */
+ my_open_osfhandle,
+ my_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 */
+};
+
+
+#ifdef __cplusplus
+}
+#endif
+