tclWinPort.h
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:13k
源码类别:

通讯编程

开发平台:

Visual C++

  1. /*
  2.  * tclWinPort.h --
  3.  *
  4.  * This header file handles porting issues that occur because of
  5.  * differences between Windows and Unix. It should be the only
  6.  * file that contains #ifdefs to handle different flavors of OS.
  7.  *
  8.  * Copyright (c) 1994-1997 Sun Microsystems, Inc.
  9.  *
  10.  * See the file "license.terms" for information on usage and redistribution
  11.  * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  12.  *
  13.  * RCS: @(#) $Id: tclWinPort.h,v 1.36.2.2 2005/11/04 18:33:35 patthoyts Exp $
  14.  */
  15. #ifndef _TCLWINPORT
  16. #define _TCLWINPORT
  17. #ifndef _TCLINT
  18. #   include "tclInt.h"
  19. #endif
  20. #ifdef CHECK_UNICODE_CALLS
  21. #   define _UNICODE
  22. #   define UNICODE
  23. #   define __TCHAR_DEFINED
  24.     typedef float *_TCHAR;
  25. #   define _TCHAR_DEFINED
  26.     typedef float *TCHAR;
  27. #endif /* CHECK_UNICODE_CALLS */
  28. /*
  29.  *---------------------------------------------------------------------------
  30.  * The following sets of #includes and #ifdefs are required to get Tcl to
  31.  * compile under the windows compilers.
  32.  *---------------------------------------------------------------------------
  33.  */
  34. #include <stdio.h>
  35. #include <stdlib.h>
  36. #include <errno.h>
  37. #include <fcntl.h>
  38. #include <float.h>
  39. #include <io.h>
  40. #include <malloc.h>
  41. #include <process.h>
  42. #include <signal.h>
  43. #include <string.h>
  44. /*
  45.  * Need to block out these includes for building extensions with MetroWerks
  46.  * compiler for Win32.
  47.  */
  48. #ifndef __MWERKS__
  49. #include <sys/stat.h>
  50. #include <sys/timeb.h>
  51. #   ifdef __BORLANDC__
  52. # include <utime.h>
  53. #   else
  54. # include <sys/utime.h>
  55. #   endif /* __BORLANDC__ */
  56. #endif /* __MWERKS__ */
  57. #include <time.h>
  58. #define WIN32_LEAN_AND_MEAN
  59. #include <windows.h>
  60. #undef WIN32_LEAN_AND_MEAN
  61. /*
  62.  * Ask for the winsock function typedefs, also.
  63.  */
  64. #define INCL_WINSOCK_API_TYPEDEFS   1
  65. #include <winsock2.h>
  66. #ifdef BUILD_tcl
  67. #   undef TCL_STORAGE_CLASS
  68. #   define TCL_STORAGE_CLASS DLLEXPORT
  69. #endif /* BUILD_tcl */
  70. /*
  71.  * Define EINPROGRESS in terms of WSAEINPROGRESS.
  72.  */
  73. #ifndef EINPROGRESS
  74. #   define EINPROGRESS WSAEINPROGRESS
  75. #endif
  76. /*
  77.  * If ENOTSUP is not defined, define it to a value that will never occur.
  78.  */
  79. #ifndef ENOTSUP
  80. #   define ENOTSUP -1030507
  81. #endif
  82. /*
  83.  * The following defines redefine the Windows Socket errors as
  84.  * BSD errors so Tcl_PosixError can do the right thing.
  85.  */
  86. #ifndef EWOULDBLOCK
  87. #   define EWOULDBLOCK EAGAIN
  88. #endif
  89. #ifndef EALREADY
  90. #   define EALREADY 149 /* operation already in progress */
  91. #endif
  92. #ifndef ENOTSOCK
  93. #   define ENOTSOCK 95 /* Socket operation on non-socket */
  94. #endif
  95. #ifndef EDESTADDRREQ
  96. #   define EDESTADDRREQ 96 /* Destination address required */
  97. #endif
  98. #ifndef EMSGSIZE
  99. #   define EMSGSIZE 97 /* Message too long */
  100. #endif
  101. #ifndef EPROTOTYPE
  102. #   define EPROTOTYPE 98 /* Protocol wrong type for socket */
  103. #endif
  104. #ifndef ENOPROTOOPT
  105. #   define ENOPROTOOPT 99 /* Protocol not available */
  106. #endif
  107. #ifndef EPROTONOSUPPORT
  108. #   define EPROTONOSUPPORT 120 /* Protocol not supported */
  109. #endif
  110. #ifndef ESOCKTNOSUPPORT
  111. #   define ESOCKTNOSUPPORT 121 /* Socket type not supported */
  112. #endif
  113. #ifndef EOPNOTSUPP
  114. #   define EOPNOTSUPP 122 /* Operation not supported on socket */
  115. #endif
  116. #ifndef EPFNOSUPPORT
  117. #   define EPFNOSUPPORT 123 /* Protocol family not supported */
  118. #endif
  119. #ifndef EAFNOSUPPORT
  120. #   define EAFNOSUPPORT 124 /* Address family not supported */
  121. #endif
  122. #ifndef EADDRINUSE
  123. #   define EADDRINUSE 125 /* Address already in use */
  124. #endif
  125. #ifndef EADDRNOTAVAIL
  126. #   define EADDRNOTAVAIL 126 /* Can't assign requested address */
  127. #endif
  128. #ifndef ENETDOWN
  129. #   define ENETDOWN 127 /* Network is down */
  130. #endif
  131. #ifndef ENETUNREACH
  132. #   define ENETUNREACH 128 /* Network is unreachable */
  133. #endif
  134. #ifndef ENETRESET
  135. #   define ENETRESET 129 /* Network dropped connection on reset */
  136. #endif
  137. #ifndef ECONNABORTED
  138. #   define ECONNABORTED 130 /* Software caused connection abort */
  139. #endif
  140. #ifndef ECONNRESET
  141. #   define ECONNRESET 131 /* Connection reset by peer */
  142. #endif
  143. #ifndef ENOBUFS
  144. #   define ENOBUFS 132 /* No buffer space available */
  145. #endif
  146. #ifndef EISCONN
  147. #   define EISCONN 133 /* Socket is already connected */
  148. #endif
  149. #ifndef ENOTCONN
  150. #   define ENOTCONN 134 /* Socket is not connected */
  151. #endif
  152. #ifndef ESHUTDOWN
  153. #   define ESHUTDOWN 143 /* Can't send after socket shutdown */
  154. #endif
  155. #ifndef ETOOMANYREFS
  156. #   define ETOOMANYREFS 144 /* Too many references: can't splice */
  157. #endif
  158. #ifndef ETIMEDOUT
  159. #   define ETIMEDOUT 145 /* Connection timed out */
  160. #endif
  161. #ifndef ECONNREFUSED
  162. #   define ECONNREFUSED 146 /* Connection refused */
  163. #endif
  164. #ifndef ELOOP
  165. #   define ELOOP 90 /* Symbolic link loop */
  166. #endif
  167. #ifndef EHOSTDOWN
  168. #   define EHOSTDOWN 147 /* Host is down */
  169. #endif
  170. #ifndef EHOSTUNREACH
  171. #   define EHOSTUNREACH 148 /* No route to host */
  172. #endif
  173. #ifndef ENOTEMPTY
  174. #   define ENOTEMPTY  93 /* directory not empty */
  175. #endif
  176. #ifndef EUSERS
  177. #   define EUSERS 94 /* Too many users (for UFS) */
  178. #endif
  179. #ifndef EDQUOT
  180. #   define EDQUOT 69 /* Disc quota exceeded */
  181. #endif
  182. #ifndef ESTALE
  183. #   define ESTALE 151 /* Stale NFS file handle */
  184. #endif
  185. #ifndef EREMOTE
  186. #   define EREMOTE 66 /* The object is remote */
  187. #endif
  188. /*
  189.  * It is very hard to determine how Windows reacts to attempting to
  190.  * set a file pointer outside the input datatype's representable
  191.  * region.  So we fake the error code ourselves.
  192.  */
  193. #ifndef EOVERFLOW
  194. #   ifdef EFBIG
  195. #      define EOVERFLOW EFBIG /* The object couldn't fit in the datatype */
  196. #   else /* !EFBIG */
  197. #      define EOVERFLOW EINVAL /* Better than nothing! */
  198. #   endif /* EFBIG */
  199. #endif /* !EOVERFLOW */
  200. /*
  201.  * Supply definitions for macros to query wait status, if not already
  202.  * defined in header files above.
  203.  */
  204. #if TCL_UNION_WAIT
  205. #   define WAIT_STATUS_TYPE union wait
  206. #else
  207. #   define WAIT_STATUS_TYPE int
  208. #endif /* TCL_UNION_WAIT */
  209. #ifndef WIFEXITED
  210. #   define WIFEXITED(stat)  (((*((int *) &(stat))) & 0xC0000000) == 0)
  211. #endif
  212. #ifndef WEXITSTATUS
  213. #   define WEXITSTATUS(stat) (*((int *) &(stat)))
  214. #endif
  215. #ifndef WIFSIGNALED
  216. #   define WIFSIGNALED(stat) ((*((int *) &(stat))) & 0xC0000000)
  217. #endif
  218. #ifndef WTERMSIG
  219. #   define WTERMSIG(stat)    ((*((int *) &(stat))) & 0x7f)
  220. #endif
  221. #ifndef WIFSTOPPED
  222. #   define WIFSTOPPED(stat)  0
  223. #endif
  224. #ifndef WSTOPSIG
  225. #   define WSTOPSIG(stat)    (((*((int *) &(stat))) >> 8) & 0xff)
  226. #endif
  227. /*
  228.  * Define constants for waitpid() system call if they aren't defined
  229.  * by a system header file.
  230.  */
  231. #ifndef WNOHANG
  232. #   define WNOHANG 1
  233. #endif
  234. #ifndef WUNTRACED
  235. #   define WUNTRACED 2
  236. #endif
  237. /*
  238.  * Define access mode constants if they aren't already defined.
  239.  */
  240. #ifndef F_OK
  241. #    define F_OK 00
  242. #endif
  243. #ifndef X_OK
  244. #    define X_OK 01
  245. #endif
  246. #ifndef W_OK
  247. #    define W_OK 02
  248. #endif
  249. #ifndef R_OK
  250. #    define R_OK 04
  251. #endif
  252. /*
  253.  * Define macros to query file type bits, if they're not already
  254.  * defined.
  255.  */
  256. #ifndef S_IFLNK
  257. #define S_IFLNK        0120000  /* Symbolic Link */
  258. #endif
  259. #ifndef S_ISREG
  260. #   ifdef S_IFREG
  261. #       define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
  262. #   else
  263. #       define S_ISREG(m) 0
  264. #   endif
  265. #endif /* !S_ISREG */
  266. #ifndef S_ISDIR
  267. #   ifdef S_IFDIR
  268. #       define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
  269. #   else
  270. #       define S_ISDIR(m) 0
  271. #   endif
  272. #endif /* !S_ISDIR */
  273. #ifndef S_ISCHR
  274. #   ifdef S_IFCHR
  275. #       define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR)
  276. #   else
  277. #       define S_ISCHR(m) 0
  278. #   endif
  279. #endif /* !S_ISCHR */
  280. #ifndef S_ISBLK
  281. #   ifdef S_IFBLK
  282. #       define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK)
  283. #   else
  284. #       define S_ISBLK(m) 0
  285. #   endif
  286. #endif /* !S_ISBLK */
  287. #ifndef S_ISFIFO
  288. #   ifdef S_IFIFO
  289. #       define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO)
  290. #   else
  291. #       define S_ISFIFO(m) 0
  292. #   endif
  293. #endif /* !S_ISFIFO */
  294. #ifndef S_ISLNK
  295. #   ifdef S_IFLNK
  296. #       define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK)
  297. #   else
  298. #       define S_ISLNK(m) 0
  299. #   endif
  300. #endif /* !S_ISLNK */
  301. /*
  302.  * Define MAXPATHLEN in terms of MAXPATH if available
  303.  */
  304. #ifndef MAXPATH
  305. #define MAXPATH MAX_PATH
  306. #endif /* MAXPATH */
  307. #ifndef MAXPATHLEN
  308. #define MAXPATHLEN MAXPATH
  309. #endif /* MAXPATHLEN */
  310. /*
  311.  * Define pid_t and uid_t if they're not already defined.
  312.  */
  313. #if ! TCL_PID_T
  314. #   define pid_t int
  315. #endif /* !TCL_PID_T */
  316. #if ! TCL_UID_T
  317. #   define uid_t int
  318. #endif /* !TCL_UID_T */
  319. /*
  320.  * Visual C++ has some odd names for common functions, so we need to
  321.  * define a few macros to handle them.  Also, it defines EDEADLOCK and
  322.  * EDEADLK as the same value, which confuses Tcl_ErrnoId().
  323.  */
  324. #if defined(_MSC_VER) || defined(__MINGW32__)
  325. #    define environ _environ
  326. #    define hypot _hypot
  327. #    define exception _exception
  328. #    undef EDEADLOCK
  329. #    if defined(__MINGW32__) && !defined(__MSVCRT__)
  330. # define timezone _timezone
  331. #    endif
  332. #endif /* _MSC_VER || __MINGW32__ */
  333. /*
  334.  * Borland's timezone and environ functions.
  335.  */
  336. #ifdef  __BORLANDC__
  337. #   define timezone _timezone
  338. #   define environ  _environ
  339. #endif /* __BORLANDC__ */
  340. #ifdef __CYGWIN__
  341. /* On Cygwin, the environment is imported from the Cygwin DLL. */
  342.      DLLIMPORT extern char **__cygwin_environ;
  343. #    define environ __cygwin_environ
  344. #    define putenv TclCygwinPutenv
  345. #    define timezone _timezone
  346. #endif /* __CYGWIN__ */
  347. /*
  348.  * There is no platform-specific panic routine for Windows in the Tcl internals.
  349.  */
  350. #define TclpPanic ((Tcl_PanicProc *) NULL)
  351. /*
  352.  *---------------------------------------------------------------------------
  353.  * The following macros and declarations represent the interface between 
  354.  * generic and windows-specific parts of Tcl.  Some of the macros may 
  355.  * override functions declared in tclInt.h.
  356.  *---------------------------------------------------------------------------
  357.  */
  358. /*
  359.  * The default platform eol translation on Windows is TCL_TRANSLATE_CRLF:
  360.  */
  361. #define TCL_PLATFORM_TRANSLATION TCL_TRANSLATE_CRLF
  362. /*
  363.  * Declare dynamic loading extension macro.
  364.  */
  365. #define TCL_SHLIB_EXT ".dll"
  366. /*
  367.  * The following define ensures that we use the native putenv
  368.  * implementation to modify the environment array.  This keeps
  369.  * the C level environment in synch with the system level environment.
  370.  */
  371. #define USE_PUTENV 1
  372. #define USE_PUTENV_FOR_UNSET 1
  373. /*
  374.  * Msvcrt's putenv() copies the string rather than takes ownership of it.
  375.  */
  376. #if defined(_MSC_VER) || defined(__MINGW32__)
  377. #   define HAVE_PUTENV_THAT_COPIES 1
  378. #endif
  379. /*
  380.  * The following defines wrap the system memory allocation routines for
  381.  * use by tclAlloc.c.
  382.  */
  383. #ifdef __CYGWIN__
  384. #   define TclpSysAlloc(size, isBin) malloc((size))
  385. #   define TclpSysFree(ptr) free((ptr))
  386. #   define TclpSysRealloc(ptr, size) realloc((ptr), (size))
  387. #else
  388. #   define TclpSysAlloc(size, isBin) ((void*)HeapAlloc(GetProcessHeap(), 
  389.     (DWORD)0, (DWORD)size))
  390. #   define TclpSysFree(ptr) (HeapFree(GetProcessHeap(), 
  391.     (DWORD)0, (HGLOBAL)ptr))
  392. #   define TclpSysRealloc(ptr, size) ((void*)HeapReAlloc(GetProcessHeap(), 
  393.     (DWORD)0, (LPVOID)ptr, (DWORD)size))
  394. #endif
  395. /*
  396.  * The following defines map from standard socket names to our internal
  397.  * wrappers that redirect through the winSock function table (see the
  398.  * file tclWinSock.c).
  399.  */
  400. #define getservbyname TclWinGetServByName
  401. #define getsockopt TclWinGetSockOpt
  402. #define ntohs TclWinNToHS
  403. #define setsockopt TclWinSetSockOpt
  404. /* This type is not defined in the Windows headers */
  405. #define socklen_t       int
  406. /*
  407.  * The following macros have trivial definitions, allowing generic code to 
  408.  * address platform-specific issues.
  409.  */
  410. #define TclpReleaseFile(file) ckfree((char *) file)
  411. /*
  412.  * The following macros and declarations wrap the C runtime library 
  413.  * functions.
  414.  */
  415. #define TclpExit exit
  416. /*
  417.  * Declarations for Windows-only functions.
  418.  */
  419. EXTERN HANDLE     TclWinSerialReopen _ANSI_ARGS_(( HANDLE handle,
  420. CONST TCHAR *name, DWORD access));
  421. EXTERN Tcl_Channel  TclWinOpenSerialChannel _ANSI_ARGS_((HANDLE handle,
  422.                         char *channelName, int permissions));
  423.  
  424. EXTERN Tcl_Channel  TclWinOpenConsoleChannel _ANSI_ARGS_((HANDLE handle,
  425.                         char *channelName, int permissions));
  426. EXTERN Tcl_Channel  TclWinOpenFileChannel _ANSI_ARGS_((HANDLE handle,
  427.                         char *channelName, int permissions, int appendMode));
  428. EXTERN TclFile TclWinMakeFile _ANSI_ARGS_((HANDLE handle));
  429. /*
  430.  * Platform specific mutex definition used by memory allocators.
  431.  * These mutexes are statically allocated and explicitly initialized.
  432.  * Most modules do not use this, but instead use Tcl_Mutex types and
  433.  * Tcl_MutexLock and Tcl_MutexUnlock that are self-initializing.
  434.  */
  435. #ifdef TCL_THREADS
  436. typedef CRITICAL_SECTION TclpMutex;
  437. EXTERN void TclpMutexInit _ANSI_ARGS_((TclpMutex *mPtr));
  438. EXTERN void TclpMutexLock _ANSI_ARGS_((TclpMutex *mPtr));
  439. EXTERN void TclpMutexUnlock _ANSI_ARGS_((TclpMutex *mPtr));
  440. #else /* !TCL_THREADS */
  441. typedef int TclpMutex;
  442. #define TclpMutexInit(a)
  443. #define TclpMutexLock(a)
  444. #define TclpMutexUnlock(a)
  445. #endif /* TCL_THREADS */
  446. #ifdef TCL_WIDE_INT_TYPE
  447. EXTERN Tcl_WideInt strtoll _ANSI_ARGS_((CONST char *string,
  448.      char **endPtr, int base));
  449. EXTERN Tcl_WideUInt strtoull _ANSI_ARGS_((CONST char *string,
  450.       char **endPtr, int base));
  451. #endif /* TCL_WIDE_INT_TYPE */
  452. #ifndef INVALID_SET_FILE_POINTER
  453. #define INVALID_SET_FILE_POINTER 0xFFFFFFFF
  454. #endif /* INVALID_SET_FILE_POINTER */
  455. #include "tclPlatDecls.h"
  456. #include "tclIntPlatDecls.h"
  457. #undef TCL_STORAGE_CLASS
  458. #define TCL_STORAGE_CLASS DLLIMPORT
  459. #endif /* _TCLWINPORT */