summaryrefslogtreecommitdiffstats
path: root/win/tclWinPort.h
diff options
context:
space:
mode:
Diffstat (limited to 'win/tclWinPort.h')
-rw-r--r--win/tclWinPort.h464
1 files changed, 290 insertions, 174 deletions
diff --git a/win/tclWinPort.h b/win/tclWinPort.h
index aba6807..652cd06 100644
--- a/win/tclWinPort.h
+++ b/win/tclWinPort.h
@@ -9,28 +9,70 @@
*
* See the file "license.terms" for information on usage and redistribution
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
- *
- * RCS: @(#) $Id: tclWinPort.h,v 1.9 1999/04/22 20:28:02 redman Exp $
*/
#ifndef _TCLWINPORT
#define _TCLWINPORT
-#ifndef _TCLINT
-# include "tclInt.h"
+#if !defined(_WIN64) && defined(BUILD_tcl)
+/* See [Bug 3354324]: file mtime sets wrong time */
+# define _USE_32BIT_TIME_T
#endif
-#ifdef CHECK_UNICODE_CALLS
+/*
+ * We must specify the lower version we intend to support.
+ *
+ * WINVER = 0x0500 means Windows 2000 and above
+ */
-#define _UNICODE
-#define UNICODE
+#ifndef WINVER
+# define WINVER 0x0501
+#endif
+#ifndef _WIN32_WINNT
+# define _WIN32_WINNT 0x0501
+#endif
-#define __TCHAR_DEFINED
-typedef float *_TCHAR;
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#undef WIN32_LEAN_AND_MEAN
-#define _TCHAR_DEFINED
-typedef float *TCHAR;
+/* Compatibility to older visual studio / windows platform SDK */
+#if !defined(MAXULONG_PTR)
+typedef DWORD DWORD_PTR;
+typedef DWORD_PTR * PDWORD_PTR;
+#endif
+/*
+ * Ask for the winsock function typedefs, also.
+ */
+#define INCL_WINSOCK_API_TYPEDEFS 1
+#include <winsock2.h>
+#include <ws2tcpip.h>
+#ifdef HAVE_WSPIAPI_H
+# include <wspiapi.h>
+#endif
+
+#ifdef CHECK_UNICODE_CALLS
+# define _UNICODE
+# define UNICODE
+# define __TCHAR_DEFINED
+ typedef float *_TCHAR;
+# define _TCHAR_DEFINED
+ typedef float *TCHAR;
+#endif /* CHECK_UNICODE_CALLS */
+
+/*
+ * Pull in the typedef of TCHAR for windows.
+ */
+#include <tchar.h>
+#ifndef _TCHAR_DEFINED
+ /* Borland seems to forget to set this. */
+ typedef _TCHAR TCHAR;
+# define _TCHAR_DEFINED
+#endif
+#if defined(_MSC_VER) && defined(__STDC__)
+ /* VS2005 SP1 misses this. See [Bug #3110161] */
+ typedef _TCHAR TCHAR;
#endif
/*
@@ -40,155 +82,209 @@ typedef float *TCHAR;
*---------------------------------------------------------------------------
*/
-#include <stdio.h>
-#include <stdlib.h>
-
-#include <direct.h>
+#include <time.h>
+#include <wchar.h>
+#include <io.h>
#include <errno.h>
#include <fcntl.h>
#include <float.h>
-#include <io.h>
#include <malloc.h>
#include <process.h>
#include <signal.h>
-#include <string.h>
-#include <sys/stat.h>
-#include <sys/timeb.h>
-#include <tchar.h>
-#include <time.h>
-#include <winsock2.h>
+#include <limits.h>
-#define WIN32_LEAN_AND_MEAN
-#include <windows.h>
-#undef WIN32_LEAN_AND_MEAN
-
-#ifdef BUILD_tcl
-# undef TCL_STORAGE_CLASS
-# define TCL_STORAGE_CLASS DLLEXPORT
-#endif
-
-/*
- * Define EINPROGRESS in terms of WSAEINPROGRESS.
- */
-
-#ifndef EINPROGRESS
-#define EINPROGRESS WSAEINPROGRESS
+#ifndef __GNUC__
+# define strncasecmp _strnicmp
+# define strcasecmp _stricmp
#endif
/*
- * If ENOTSUP is not defined, define it to a value that will never occur.
+ * Need to block out these includes for building extensions with MetroWerks
+ * compiler for Win32.
*/
-#ifndef ENOTSUP
-#define ENOTSUP -1030507
-#endif
+#ifndef __MWERKS__
+#include <sys/stat.h>
+#include <sys/timeb.h>
+# ifdef __BORLANDC__
+# include <utime.h>
+# else
+# include <sys/utime.h>
+# endif /* __BORLANDC__ */
+#endif /* __MWERKS__ */
/*
* The following defines redefine the Windows Socket errors as
* BSD errors so Tcl_PosixError can do the right thing.
*/
-#ifndef EWOULDBLOCK
-#define EWOULDBLOCK EAGAIN
+#ifndef ENOTEMPTY
+# define ENOTEMPTY 41 /* Directory not empty */
+#endif
+#ifndef EREMOTE
+# define EREMOTE 66 /* The object is remote */
+#endif
+#ifndef EPFNOSUPPORT
+# define EPFNOSUPPORT 96 /* Protocol family not supported */
+#endif
+#ifndef EADDRINUSE
+# define EADDRINUSE 100 /* Address already in use */
+#endif
+#ifndef EADDRNOTAVAIL
+# define EADDRNOTAVAIL 101 /* Can't assign requested address */
+#endif
+#ifndef EAFNOSUPPORT
+# define EAFNOSUPPORT 102 /* Address family not supported */
#endif
#ifndef EALREADY
-#define EALREADY 149 /* operation already in progress */
+# define EALREADY 103 /* Operation already in progress */
#endif
-#ifndef ENOTSOCK
-#define ENOTSOCK 95 /* Socket operation on non-socket */
+#ifndef EBADMSG
+# define EBADMSG 104 /* Not a data message */
#endif
-#ifndef EDESTADDRREQ
-#define EDESTADDRREQ 96 /* Destination address required */
+#ifndef ECANCELED
+# define ECANCELED 105 /* Canceled */
#endif
-#ifndef EMSGSIZE
-#define EMSGSIZE 97 /* Message too long */
+#ifndef ECONNABORTED
+# define ECONNABORTED 106 /* Software caused connection abort */
#endif
-#ifndef EPROTOTYPE
-#define EPROTOTYPE 98 /* Protocol wrong type for socket */
+#ifndef ECONNREFUSED
+# define ECONNREFUSED 107 /* Connection refused */
#endif
-#ifndef ENOPROTOOPT
-#define ENOPROTOOPT 99 /* Protocol not available */
+#ifndef ECONNRESET
+# define ECONNRESET 108 /* Connection reset by peer */
#endif
-#ifndef EPROTONOSUPPORT
-#define EPROTONOSUPPORT 120 /* Protocol not supported */
+#ifndef EDESTADDRREQ
+# define EDESTADDRREQ 109 /* Destination address required */
#endif
-#ifndef ESOCKTNOSUPPORT
-#define ESOCKTNOSUPPORT 121 /* Socket type not supported */
+#ifndef EHOSTUNREACH
+# define EHOSTUNREACH 110 /* No route to host */
#endif
-#ifndef EOPNOTSUPP
-#define EOPNOTSUPP 122 /* Operation not supported on socket */
+#ifndef EIDRM
+# define EIDRM 111 /* Identifier removed */
#endif
-#ifndef EPFNOSUPPORT
-#define EPFNOSUPPORT 123 /* Protocol family not supported */
+#ifndef EINPROGRESS
+# define EINPROGRESS 112 /* Operation now in progress */
#endif
-#ifndef EAFNOSUPPORT
-#define EAFNOSUPPORT 124 /* Address family not supported */
+#ifndef EISCONN
+# define EISCONN 113 /* Socket is already connected */
#endif
-#ifndef EADDRINUSE
-#define EADDRINUSE 125 /* Address already in use */
+#ifndef ELOOP
+# define ELOOP 114 /* Symbolic link loop */
#endif
-#ifndef EADDRNOTAVAIL
-#define EADDRNOTAVAIL 126 /* Can't assign requested address */
+#ifndef EMSGSIZE
+# define EMSGSIZE 115 /* Message too long */
#endif
#ifndef ENETDOWN
-#define ENETDOWN 127 /* Network is down */
+# define ENETDOWN 116 /* Network is down */
+#endif
+#ifndef ENETRESET
+# define ENETRESET 117 /* Network dropped connection on reset */
#endif
#ifndef ENETUNREACH
-#define ENETUNREACH 128 /* Network is unreachable */
+# define ENETUNREACH 118 /* Network is unreachable */
#endif
-#ifndef ENETRESET
-#define ENETRESET 129 /* Network dropped connection on reset */
+#ifndef ENOBUFS
+# define ENOBUFS 119 /* No buffer space available */
#endif
-#ifndef ECONNABORTED
-#define ECONNABORTED 130 /* Software caused connection abort */
+#ifndef ENODATA
+# define ENODATA 120 /* No data available */
#endif
-#ifndef ECONNRESET
-#define ECONNRESET 131 /* Connection reset by peer */
+#ifndef ENOLINK
+# define ENOLINK 121 /* Link has be severed */
#endif
-#ifndef ENOBUFS
-#define ENOBUFS 132 /* No buffer space available */
+#ifndef ENOMSG
+# define ENOMSG 122 /* No message of desired type */
#endif
-#ifndef EISCONN
-#define EISCONN 133 /* Socket is already connected */
+#ifndef ENOPROTOOPT
+# define ENOPROTOOPT 123 /* Protocol not available */
+#endif
+#ifndef ENOSR
+# define ENOSR 124 /* Out of stream resources */
+#endif
+#ifndef ENOSTR
+# define ENOSTR 125 /* Not a stream device */
#endif
#ifndef ENOTCONN
-#define ENOTCONN 134 /* Socket is not connected */
+# define ENOTCONN 126 /* Socket is not connected */
#endif
-#ifndef ESHUTDOWN
-#define ESHUTDOWN 143 /* Can't send after socket shutdown */
+#ifndef ENOTRECOVERABLE
+# define ENOTRECOVERABLE 127 /* Not recoverable */
#endif
-#ifndef ETOOMANYREFS
-#define ETOOMANYREFS 144 /* Too many references: can't splice */
+#ifndef ENOTSOCK
+# define ENOTSOCK 128 /* Socket operation on non-socket */
+#endif
+#ifndef ENOTSUP
+# define ENOTSUP 129 /* Operation not supported */
+#endif
+#ifndef EOPNOTSUPP
+# define EOPNOTSUPP 130 /* Operation not supported on socket */
+#endif
+#ifndef EOTHER
+# define EOTHER 131 /* Other error */
+#endif
+#ifndef EOVERFLOW
+# define EOVERFLOW 132 /* File too big */
+#endif
+#ifndef EOWNERDEAD
+# define EOWNERDEAD 133 /* Owner dead */
+#endif
+#ifndef EPROTO
+# define EPROTO 134 /* Protocol error */
+#endif
+#ifndef EPROTONOSUPPORT
+# define EPROTONOSUPPORT 135 /* Protocol not supported */
+#endif
+#ifndef EPROTOTYPE
+# define EPROTOTYPE 136 /* Protocol wrong type for socket */
+#endif
+#ifndef ETIME
+# define ETIME 137 /* Timer expired */
#endif
#ifndef ETIMEDOUT
-#define ETIMEDOUT 145 /* Connection timed out */
+# define ETIMEDOUT 138 /* Connection timed out */
#endif
-#ifndef ECONNREFUSED
-#define ECONNREFUSED 146 /* Connection refused */
+#ifndef ETXTBSY
+# define ETXTBSY 139 /* Text file or pseudo-device busy */
#endif
-#ifndef ELOOP
-#define ELOOP 90 /* Symbolic link loop */
+#ifndef EWOULDBLOCK
+# define EWOULDBLOCK 140 /* Operation would block */
#endif
-#ifndef EHOSTDOWN
-#define EHOSTDOWN 147 /* Host is down */
+
+
+/* Visual Studio doesn't have these, so just choose some high numbers */
+#ifndef ESOCKTNOSUPPORT
+# define ESOCKTNOSUPPORT 240 /* Socket type not supported */
#endif
-#ifndef EHOSTUNREACH
-#define EHOSTUNREACH 148 /* No route to host */
+#ifndef ESHUTDOWN
+# define ESHUTDOWN 241 /* Can't send after socket shutdown */
#endif
-#ifndef ENOTEMPTY
-#define ENOTEMPTY 93 /* directory not empty */
+#ifndef ETOOMANYREFS
+# define ETOOMANYREFS 242 /* Too many references: can't splice */
+#endif
+#ifndef EHOSTDOWN
+# define EHOSTDOWN 243 /* Host is down */
#endif
#ifndef EUSERS
-#define EUSERS 94 /* Too many users (for UFS) */
+# define EUSERS 244 /* Too many users (for UFS) */
#endif
#ifndef EDQUOT
-#define EDQUOT 49 /* Disc quota exceeded */
+# define EDQUOT 245 /* Disc quota exceeded */
#endif
#ifndef ESTALE
-#define ESTALE 151 /* Stale NFS file handle */
+# define ESTALE 246 /* Stale NFS file handle */
#endif
-#ifndef EREMOTE
-#define EREMOTE 66 /* The object is remote */
+
+/*
+ * Signals not known to the standard ANSI signal.h. These are used
+ * by Tcl_WaitPid() and generic/tclPosixStr.c
+ */
+
+#ifndef SIGTRAP
+# define SIGTRAP 5
+#endif
+#ifndef SIGBUS
+# define SIGBUS 10
#endif
/*
@@ -200,18 +296,18 @@ typedef float *TCHAR;
# define WAIT_STATUS_TYPE union wait
#else
# define WAIT_STATUS_TYPE int
-#endif
+#endif /* TCL_UNION_WAIT */
#ifndef WIFEXITED
-# define WIFEXITED(stat) (((*((int *) &(stat))) & 0xff) == 0)
+# define WIFEXITED(stat) (((*((int *) &(stat))) & 0xC0000000) == 0)
#endif
#ifndef WEXITSTATUS
-# define WEXITSTATUS(stat) (((*((int *) &(stat))) >> 8) & 0xff)
+# define WEXITSTATUS(stat) (*((int *) &(stat)))
#endif
#ifndef WIFSIGNALED
-# define WIFSIGNALED(stat) (((*((int *) &(stat)))) && ((*((int *) &(stat))) == ((*((int *) &(stat))) & 0x00ff)))
+# define WIFSIGNALED(stat) ((*((int *) &(stat))) & 0xC0000000)
#endif
#ifndef WTERMSIG
@@ -219,7 +315,7 @@ typedef float *TCHAR;
#endif
#ifndef WIFSTOPPED
-# define WIFSTOPPED(stat) (((*((int *) &(stat))) & 0xff) == 0177)
+# define WIFSTOPPED(stat) 0
#endif
#ifndef WSTOPSIG
@@ -260,52 +356,64 @@ typedef float *TCHAR;
* defined.
*/
+#ifndef S_IFLNK
+# define S_IFLNK 0120000 /* Symbolic Link */
+#endif
+
#ifndef S_ISREG
# ifdef S_IFREG
# define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
# else
# define S_ISREG(m) 0
# endif
-# endif
+#endif /* !S_ISREG */
#ifndef S_ISDIR
# ifdef S_IFDIR
# define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
# else
# define S_ISDIR(m) 0
# endif
-# endif
+#endif /* !S_ISDIR */
#ifndef S_ISCHR
# ifdef S_IFCHR
# define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR)
# else
# define S_ISCHR(m) 0
# endif
-# endif
+#endif /* !S_ISCHR */
#ifndef S_ISBLK
# ifdef S_IFBLK
# define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK)
# else
# define S_ISBLK(m) 0
# endif
-# endif
+#endif /* !S_ISBLK */
#ifndef S_ISFIFO
# ifdef S_IFIFO
# define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO)
# else
# define S_ISFIFO(m) 0
# endif
-# endif
+#endif /* !S_ISFIFO */
+#ifndef S_ISLNK
+# ifdef S_IFLNK
+# define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK)
+# else
+# define S_ISLNK(m) 0
+# endif
+#endif /* !S_ISLNK */
+
/*
* Define MAXPATHLEN in terms of MAXPATH if available
*/
#ifndef MAXPATH
-#define MAXPATH MAX_PATH
+# define MAXPATH MAX_PATH
#endif /* MAXPATH */
#ifndef MAXPATHLEN
-#define MAXPATHLEN MAXPATH
+# define MAXPATHLEN MAXPATH
#endif /* MAXPATHLEN */
/*
@@ -314,10 +422,10 @@ typedef float *TCHAR;
#if ! TCL_PID_T
# define pid_t int
-#endif
+#endif /* !TCL_PID_T */
#if ! TCL_UID_T
# define uid_t int
-#endif
+#endif /* !TCL_UID_T */
/*
* Visual C++ has some odd names for common functions, so we need to
@@ -325,17 +433,49 @@ typedef float *TCHAR;
* EDEADLK as the same value, which confuses Tcl_ErrnoId().
*/
-#ifdef _MSC_VER
-# define environ _environ
-# define hypot _hypot
-# define exception _exception
-# undef EDEADLOCK
-#endif /* _MSC_VER */
+#if defined(_MSC_VER) || defined(__MINGW32__)
+# define environ _environ
+# if defined(_MSC_VER) && (_MSC_VER < 1600)
+# define hypot _hypot
+# endif
+# define exception _exception
+# undef EDEADLOCK
+# if defined(__MINGW32__) && !defined(__MSVCRT__)
+# define timezone _timezone
+# endif
+#endif /* _MSC_VER || __MINGW32__ */
+
+/*
+ * Borland's timezone and environ functions.
+ */
+
+#ifdef __BORLANDC__
+# define timezone _timezone
+# define environ _environ
+#endif /* __BORLANDC__ */
+
+#ifdef __WATCOMC__
+# if !defined(__CHAR_SIGNED__)
+# error "You must use the -j switch to ensure char is signed."
+# endif
+#endif
+
+
+/*
+ * MSVC 8.0 started to mark many standard C library functions depreciated
+ * including the *printf family and others. Tell it to shut up.
+ * (_MSC_VER is 1200 for VC6, 1300 or 1310 for vc7.net, 1400 for 8.0)
+ */
+#if defined(_MSC_VER) && (_MSC_VER >= 1400)
+# pragma warning(disable:4244)
+# pragma warning(disable:4267)
+# pragma warning(disable:4996)
+#endif
/*
*---------------------------------------------------------------------------
- * The following macros and declarations represent the interface between
- * generic and windows-specific parts of Tcl. Some of the macros may
+ * The following macros and declarations represent the interface between
+ * generic and windows-specific parts of Tcl. Some of the macros may
* override functions declared in tclInt.h.
*---------------------------------------------------------------------------
*/
@@ -358,7 +498,23 @@ typedef float *TCHAR;
* the C level environment in synch with the system level environment.
*/
-#define USE_PUTENV 1
+#define USE_PUTENV 1
+#define USE_PUTENV_FOR_UNSET 1
+
+/*
+ * Msvcrt's putenv() copies the string rather than takes ownership of it.
+ */
+
+#if defined(_MSC_VER) || defined(__MINGW32__)
+# define HAVE_PUTENV_THAT_COPIES 1
+#endif
+
+/*
+ * Older version of Mingw are known to lack a MWMO_ALERTABLE define.
+ */
+#if !defined(MWMO_ALERTABLE)
+# define MWMO_ALERTABLE 2
+#endif
/*
* The following defines wrap the system memory allocation routines for
@@ -372,70 +528,30 @@ typedef float *TCHAR;
#define TclpSysRealloc(ptr, size) ((void*)HeapReAlloc(GetProcessHeap(), \
(DWORD)0, (LPVOID)ptr, (DWORD)size))
-/*
- * The following defines map from standard socket names to our internal
- * wrappers that redirect through the winSock function table (see the
- * file tclWinSock.c).
- */
+/* This type is not defined in the Windows headers */
+#define socklen_t int
-#define getservbyname TclWinGetServByName
-#define getsockopt TclWinGetSockOpt
-#define ntohs TclWinNToHS
-#define setsockopt TclWinSetSockOpt
/*
- * The following macros have trivial definitions, allowing generic code to
+ * The following macros have trivial definitions, allowing generic code to
* address platform-specific issues.
*/
#define TclpReleaseFile(file) ckfree((char *) file)
/*
- * The following macros and declarations wrap the C runtime library
+ * The following macros and declarations wrap the C runtime library
* functions.
*/
#define TclpExit exit
-#define TclpLstat TclpStat
-/*
- * Declarations for Windows-only functions.
- */
+#ifndef INVALID_SET_FILE_POINTER
+#define INVALID_SET_FILE_POINTER 0xFFFFFFFF
+#endif /* INVALID_SET_FILE_POINTER */
-EXTERN Tcl_Channel TclWinOpenSerialChannel _ANSI_ARGS_((HANDLE handle,
- char *channelName, int permissions));
-
-EXTERN Tcl_Channel TclWinOpenConsoleChannel _ANSI_ARGS_((HANDLE handle,
- char *channelName, int permissions));
-
-EXTERN Tcl_Channel TclWinOpenFileChannel _ANSI_ARGS_((HANDLE handle,
- char *channelName, int permissions, int appendMode));
-
-EXTERN TclFile TclWinMakeFile _ANSI_ARGS_((HANDLE handle));
-
-/*
- * Platform specific mutex definition used by memory allocators.
- * These mutexes are statically allocated and explicitly initialized.
- * Most modules do not use this, but instead use Tcl_Mutex types and
- * Tcl_MutexLock and Tcl_MutexUnlock that are self-initializing.
- */
-
-#ifdef TCL_THREADS
-typedef CRITICAL_SECTION TclpMutex;
-EXTERN void TclpMutexInit _ANSI_ARGS_((TclpMutex *mPtr));
-EXTERN void TclpMutexLock _ANSI_ARGS_((TclpMutex *mPtr));
-EXTERN void TclpMutexUnlock _ANSI_ARGS_((TclpMutex *mPtr));
-#else
-typedef int TclpMutex;
-#define TclpMutexInit(a)
-#define TclpMutexLock(a)
-#define TclpMutexUnlock(a)
-#endif /* TCL_THREADS */
-
-#include "tclPlatDecls.h"
-#include "tclIntPlatDecls.h"
-
-# undef TCL_STORAGE_CLASS
-# define TCL_STORAGE_CLASS DLLIMPORT
+#ifndef LABEL_SECURITY_INFORMATION
+# define LABEL_SECURITY_INFORMATION (0x00000010L)
+#endif
#endif /* _TCLWINPORT */