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.50 2007/12/13 15:28:44 dgp Exp $ |
---|
14 | */ |
---|
15 | |
---|
16 | #ifndef _TCLWINPORT |
---|
17 | #define _TCLWINPORT |
---|
18 | |
---|
19 | #ifdef CHECK_UNICODE_CALLS |
---|
20 | # define _UNICODE |
---|
21 | # define UNICODE |
---|
22 | # define __TCHAR_DEFINED |
---|
23 | typedef float *_TCHAR; |
---|
24 | # define _TCHAR_DEFINED |
---|
25 | typedef float *TCHAR; |
---|
26 | #endif /* CHECK_UNICODE_CALLS */ |
---|
27 | |
---|
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 | |
---|
35 | #include <stdio.h> |
---|
36 | #include <stdlib.h> |
---|
37 | |
---|
38 | #include <errno.h> |
---|
39 | #include <fcntl.h> |
---|
40 | #include <float.h> |
---|
41 | #include <io.h> |
---|
42 | #include <malloc.h> |
---|
43 | #include <process.h> |
---|
44 | #include <signal.h> |
---|
45 | #include <string.h> |
---|
46 | |
---|
47 | /* |
---|
48 | * These string functions are not defined with the same names on Windows. |
---|
49 | */ |
---|
50 | |
---|
51 | #define strcasecmp stricmp |
---|
52 | #define strncasecmp strnicmp |
---|
53 | |
---|
54 | /* |
---|
55 | * Need to block out these includes for building extensions with MetroWerks |
---|
56 | * compiler for Win32. |
---|
57 | */ |
---|
58 | |
---|
59 | #ifndef __MWERKS__ |
---|
60 | #include <sys/stat.h> |
---|
61 | #include <sys/timeb.h> |
---|
62 | # ifdef __BORLANDC__ |
---|
63 | # include <utime.h> |
---|
64 | # else |
---|
65 | # include <sys/utime.h> |
---|
66 | # endif /* __BORLANDC__ */ |
---|
67 | #endif /* __MWERKS__ */ |
---|
68 | |
---|
69 | #include <time.h> |
---|
70 | |
---|
71 | #define WIN32_LEAN_AND_MEAN |
---|
72 | #include <windows.h> |
---|
73 | #undef WIN32_LEAN_AND_MEAN |
---|
74 | |
---|
75 | /* |
---|
76 | * Ask for the winsock function typedefs, also. |
---|
77 | */ |
---|
78 | #define INCL_WINSOCK_API_TYPEDEFS 1 |
---|
79 | #include <winsock2.h> |
---|
80 | |
---|
81 | /* |
---|
82 | * Define EINPROGRESS in terms of WSAEINPROGRESS. |
---|
83 | */ |
---|
84 | |
---|
85 | #ifndef EINPROGRESS |
---|
86 | # define EINPROGRESS WSAEINPROGRESS |
---|
87 | #endif |
---|
88 | |
---|
89 | /* |
---|
90 | * If ENOTSUP is not defined, define it to a value that will never occur. |
---|
91 | */ |
---|
92 | |
---|
93 | #ifndef ENOTSUP |
---|
94 | # define ENOTSUP -1030507 |
---|
95 | #endif |
---|
96 | |
---|
97 | /* |
---|
98 | * The following defines redefine the Windows Socket errors as |
---|
99 | * BSD errors so Tcl_PosixError can do the right thing. |
---|
100 | */ |
---|
101 | |
---|
102 | #ifndef EWOULDBLOCK |
---|
103 | # define EWOULDBLOCK EAGAIN |
---|
104 | #endif |
---|
105 | #ifndef EALREADY |
---|
106 | # define EALREADY 149 /* operation already in progress */ |
---|
107 | #endif |
---|
108 | #ifndef ENOTSOCK |
---|
109 | # define ENOTSOCK 95 /* Socket operation on non-socket */ |
---|
110 | #endif |
---|
111 | #ifndef EDESTADDRREQ |
---|
112 | # define EDESTADDRREQ 96 /* Destination address required */ |
---|
113 | #endif |
---|
114 | #ifndef EMSGSIZE |
---|
115 | # define EMSGSIZE 97 /* Message too long */ |
---|
116 | #endif |
---|
117 | #ifndef EPROTOTYPE |
---|
118 | # define EPROTOTYPE 98 /* Protocol wrong type for socket */ |
---|
119 | #endif |
---|
120 | #ifndef ENOPROTOOPT |
---|
121 | # define ENOPROTOOPT 99 /* Protocol not available */ |
---|
122 | #endif |
---|
123 | #ifndef EPROTONOSUPPORT |
---|
124 | # define EPROTONOSUPPORT 120 /* Protocol not supported */ |
---|
125 | #endif |
---|
126 | #ifndef ESOCKTNOSUPPORT |
---|
127 | # define ESOCKTNOSUPPORT 121 /* Socket type not supported */ |
---|
128 | #endif |
---|
129 | #ifndef EOPNOTSUPP |
---|
130 | # define EOPNOTSUPP 122 /* Operation not supported on socket */ |
---|
131 | #endif |
---|
132 | #ifndef EPFNOSUPPORT |
---|
133 | # define EPFNOSUPPORT 123 /* Protocol family not supported */ |
---|
134 | #endif |
---|
135 | #ifndef EAFNOSUPPORT |
---|
136 | # define EAFNOSUPPORT 124 /* Address family not supported */ |
---|
137 | #endif |
---|
138 | #ifndef EADDRINUSE |
---|
139 | # define EADDRINUSE 125 /* Address already in use */ |
---|
140 | #endif |
---|
141 | #ifndef EADDRNOTAVAIL |
---|
142 | # define EADDRNOTAVAIL 126 /* Can't assign requested address */ |
---|
143 | #endif |
---|
144 | #ifndef ENETDOWN |
---|
145 | # define ENETDOWN 127 /* Network is down */ |
---|
146 | #endif |
---|
147 | #ifndef ENETUNREACH |
---|
148 | # define ENETUNREACH 128 /* Network is unreachable */ |
---|
149 | #endif |
---|
150 | #ifndef ENETRESET |
---|
151 | # define ENETRESET 129 /* Network dropped connection on reset */ |
---|
152 | #endif |
---|
153 | #ifndef ECONNABORTED |
---|
154 | # define ECONNABORTED 130 /* Software caused connection abort */ |
---|
155 | #endif |
---|
156 | #ifndef ECONNRESET |
---|
157 | # define ECONNRESET 131 /* Connection reset by peer */ |
---|
158 | #endif |
---|
159 | #ifndef ENOBUFS |
---|
160 | # define ENOBUFS 132 /* No buffer space available */ |
---|
161 | #endif |
---|
162 | #ifndef EISCONN |
---|
163 | # define EISCONN 133 /* Socket is already connected */ |
---|
164 | #endif |
---|
165 | #ifndef ENOTCONN |
---|
166 | # define ENOTCONN 134 /* Socket is not connected */ |
---|
167 | #endif |
---|
168 | #ifndef ESHUTDOWN |
---|
169 | # define ESHUTDOWN 143 /* Can't send after socket shutdown */ |
---|
170 | #endif |
---|
171 | #ifndef ETOOMANYREFS |
---|
172 | # define ETOOMANYREFS 144 /* Too many references: can't splice */ |
---|
173 | #endif |
---|
174 | #ifndef ETIMEDOUT |
---|
175 | # define ETIMEDOUT 145 /* Connection timed out */ |
---|
176 | #endif |
---|
177 | #ifndef ECONNREFUSED |
---|
178 | # define ECONNREFUSED 146 /* Connection refused */ |
---|
179 | #endif |
---|
180 | #ifndef ELOOP |
---|
181 | # define ELOOP 90 /* Symbolic link loop */ |
---|
182 | #endif |
---|
183 | #ifndef EHOSTDOWN |
---|
184 | # define EHOSTDOWN 147 /* Host is down */ |
---|
185 | #endif |
---|
186 | #ifndef EHOSTUNREACH |
---|
187 | # define EHOSTUNREACH 148 /* No route to host */ |
---|
188 | #endif |
---|
189 | #ifndef ENOTEMPTY |
---|
190 | # define ENOTEMPTY 93 /* directory not empty */ |
---|
191 | #endif |
---|
192 | #ifndef EUSERS |
---|
193 | # define EUSERS 94 /* Too many users (for UFS) */ |
---|
194 | #endif |
---|
195 | #ifndef EDQUOT |
---|
196 | # define EDQUOT 69 /* Disc quota exceeded */ |
---|
197 | #endif |
---|
198 | #ifndef ESTALE |
---|
199 | # define ESTALE 151 /* Stale NFS file handle */ |
---|
200 | #endif |
---|
201 | #ifndef EREMOTE |
---|
202 | # define EREMOTE 66 /* The object is remote */ |
---|
203 | #endif |
---|
204 | |
---|
205 | /* |
---|
206 | * It is very hard to determine how Windows reacts to attempting to |
---|
207 | * set a file pointer outside the input datatype's representable |
---|
208 | * region. So we fake the error code ourselves. |
---|
209 | */ |
---|
210 | |
---|
211 | #ifndef EOVERFLOW |
---|
212 | # ifdef EFBIG |
---|
213 | # define EOVERFLOW EFBIG /* The object couldn't fit in the datatype */ |
---|
214 | # else /* !EFBIG */ |
---|
215 | # define EOVERFLOW EINVAL /* Better than nothing! */ |
---|
216 | # endif /* EFBIG */ |
---|
217 | #endif /* !EOVERFLOW */ |
---|
218 | |
---|
219 | /* |
---|
220 | * Signals not known to the standard ANSI signal.h. These are used |
---|
221 | * by Tcl_WaitPid() and generic/tclPosixStr.c |
---|
222 | */ |
---|
223 | |
---|
224 | #ifndef SIGTRAP |
---|
225 | # define SIGTRAP 5 |
---|
226 | #endif |
---|
227 | #ifndef SIGBUS |
---|
228 | # define SIGBUS 10 |
---|
229 | #endif |
---|
230 | |
---|
231 | /* |
---|
232 | * Supply definitions for macros to query wait status, if not already |
---|
233 | * defined in header files above. |
---|
234 | */ |
---|
235 | |
---|
236 | #if TCL_UNION_WAIT |
---|
237 | # define WAIT_STATUS_TYPE union wait |
---|
238 | #else |
---|
239 | # define WAIT_STATUS_TYPE int |
---|
240 | #endif /* TCL_UNION_WAIT */ |
---|
241 | |
---|
242 | #ifndef WIFEXITED |
---|
243 | # define WIFEXITED(stat) (((*((int *) &(stat))) & 0xC0000000) == 0) |
---|
244 | #endif |
---|
245 | |
---|
246 | #ifndef WEXITSTATUS |
---|
247 | # define WEXITSTATUS(stat) (*((int *) &(stat))) |
---|
248 | #endif |
---|
249 | |
---|
250 | #ifndef WIFSIGNALED |
---|
251 | # define WIFSIGNALED(stat) ((*((int *) &(stat))) & 0xC0000000) |
---|
252 | #endif |
---|
253 | |
---|
254 | #ifndef WTERMSIG |
---|
255 | # define WTERMSIG(stat) ((*((int *) &(stat))) & 0x7f) |
---|
256 | #endif |
---|
257 | |
---|
258 | #ifndef WIFSTOPPED |
---|
259 | # define WIFSTOPPED(stat) 0 |
---|
260 | #endif |
---|
261 | |
---|
262 | #ifndef WSTOPSIG |
---|
263 | # define WSTOPSIG(stat) (((*((int *) &(stat))) >> 8) & 0xff) |
---|
264 | #endif |
---|
265 | |
---|
266 | /* |
---|
267 | * Define constants for waitpid() system call if they aren't defined |
---|
268 | * by a system header file. |
---|
269 | */ |
---|
270 | |
---|
271 | #ifndef WNOHANG |
---|
272 | # define WNOHANG 1 |
---|
273 | #endif |
---|
274 | #ifndef WUNTRACED |
---|
275 | # define WUNTRACED 2 |
---|
276 | #endif |
---|
277 | |
---|
278 | /* |
---|
279 | * Define access mode constants if they aren't already defined. |
---|
280 | */ |
---|
281 | |
---|
282 | #ifndef F_OK |
---|
283 | # define F_OK 00 |
---|
284 | #endif |
---|
285 | #ifndef X_OK |
---|
286 | # define X_OK 01 |
---|
287 | #endif |
---|
288 | #ifndef W_OK |
---|
289 | # define W_OK 02 |
---|
290 | #endif |
---|
291 | #ifndef R_OK |
---|
292 | # define R_OK 04 |
---|
293 | #endif |
---|
294 | |
---|
295 | /* |
---|
296 | * Define macros to query file type bits, if they're not already |
---|
297 | * defined. |
---|
298 | */ |
---|
299 | |
---|
300 | #ifndef S_IFLNK |
---|
301 | #define S_IFLNK 0120000 /* Symbolic Link */ |
---|
302 | #endif |
---|
303 | |
---|
304 | #ifndef S_ISREG |
---|
305 | # ifdef S_IFREG |
---|
306 | # define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) |
---|
307 | # else |
---|
308 | # define S_ISREG(m) 0 |
---|
309 | # endif |
---|
310 | #endif /* !S_ISREG */ |
---|
311 | #ifndef S_ISDIR |
---|
312 | # ifdef S_IFDIR |
---|
313 | # define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) |
---|
314 | # else |
---|
315 | # define S_ISDIR(m) 0 |
---|
316 | # endif |
---|
317 | #endif /* !S_ISDIR */ |
---|
318 | #ifndef S_ISCHR |
---|
319 | # ifdef S_IFCHR |
---|
320 | # define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR) |
---|
321 | # else |
---|
322 | # define S_ISCHR(m) 0 |
---|
323 | # endif |
---|
324 | #endif /* !S_ISCHR */ |
---|
325 | #ifndef S_ISBLK |
---|
326 | # ifdef S_IFBLK |
---|
327 | # define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK) |
---|
328 | # else |
---|
329 | # define S_ISBLK(m) 0 |
---|
330 | # endif |
---|
331 | #endif /* !S_ISBLK */ |
---|
332 | #ifndef S_ISFIFO |
---|
333 | # ifdef S_IFIFO |
---|
334 | # define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO) |
---|
335 | # else |
---|
336 | # define S_ISFIFO(m) 0 |
---|
337 | # endif |
---|
338 | #endif /* !S_ISFIFO */ |
---|
339 | #ifndef S_ISLNK |
---|
340 | # ifdef S_IFLNK |
---|
341 | # define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK) |
---|
342 | # else |
---|
343 | # define S_ISLNK(m) 0 |
---|
344 | # endif |
---|
345 | #endif /* !S_ISLNK */ |
---|
346 | |
---|
347 | |
---|
348 | /* |
---|
349 | * Define MAXPATHLEN in terms of MAXPATH if available |
---|
350 | */ |
---|
351 | |
---|
352 | #ifndef MAXPATH |
---|
353 | #define MAXPATH MAX_PATH |
---|
354 | #endif /* MAXPATH */ |
---|
355 | |
---|
356 | #ifndef MAXPATHLEN |
---|
357 | #define MAXPATHLEN MAXPATH |
---|
358 | #endif /* MAXPATHLEN */ |
---|
359 | |
---|
360 | /* |
---|
361 | * Define pid_t and uid_t if they're not already defined. |
---|
362 | */ |
---|
363 | |
---|
364 | #if ! TCL_PID_T |
---|
365 | # define pid_t int |
---|
366 | #endif /* !TCL_PID_T */ |
---|
367 | #if ! TCL_UID_T |
---|
368 | # define uid_t int |
---|
369 | #endif /* !TCL_UID_T */ |
---|
370 | |
---|
371 | /* |
---|
372 | * Visual C++ has some odd names for common functions, so we need to |
---|
373 | * define a few macros to handle them. Also, it defines EDEADLOCK and |
---|
374 | * EDEADLK as the same value, which confuses Tcl_ErrnoId(). |
---|
375 | */ |
---|
376 | |
---|
377 | #if defined(_MSC_VER) || defined(__MINGW32__) |
---|
378 | # define environ _environ |
---|
379 | # define hypot _hypot |
---|
380 | # define exception _exception |
---|
381 | # undef EDEADLOCK |
---|
382 | # if defined(__MINGW32__) && !defined(__MSVCRT__) |
---|
383 | # define timezone _timezone |
---|
384 | # endif |
---|
385 | #endif /* _MSC_VER || __MINGW32__ */ |
---|
386 | |
---|
387 | /* |
---|
388 | * Borland's timezone and environ functions. |
---|
389 | */ |
---|
390 | |
---|
391 | #ifdef __BORLANDC__ |
---|
392 | # define timezone _timezone |
---|
393 | # define environ _environ |
---|
394 | #endif /* __BORLANDC__ */ |
---|
395 | |
---|
396 | #ifdef __CYGWIN__ |
---|
397 | /* On Cygwin, the environment is imported from the Cygwin DLL. */ |
---|
398 | DLLIMPORT extern char **__cygwin_environ; |
---|
399 | # define environ __cygwin_environ |
---|
400 | # define putenv TclCygwinPutenv |
---|
401 | # define timezone _timezone |
---|
402 | #endif /* __CYGWIN__ */ |
---|
403 | |
---|
404 | |
---|
405 | #ifdef __WATCOMC__ |
---|
406 | /* |
---|
407 | * OpenWatcom uses a wine derived winsock2.h that is missing the |
---|
408 | * LPFN_* typedefs. |
---|
409 | */ |
---|
410 | # define HAVE_NO_LPFN_DECLS |
---|
411 | # if !defined(__CHAR_SIGNED__) |
---|
412 | # error "You must use the -j switch to ensure char is signed." |
---|
413 | # endif |
---|
414 | #endif |
---|
415 | |
---|
416 | |
---|
417 | /* |
---|
418 | * MSVC 8.0 started to mark many standard C library functions depreciated |
---|
419 | * including the *printf family and others. Tell it to shut up. |
---|
420 | * (_MSC_VER is 1200 for VC6, 1300 or 1310 for vc7.net, 1400 for 8.0) |
---|
421 | */ |
---|
422 | #if _MSC_VER >= 1400 |
---|
423 | #pragma warning(disable:4996) |
---|
424 | #endif |
---|
425 | |
---|
426 | |
---|
427 | /* |
---|
428 | * There is no platform-specific panic routine for Windows in the Tcl internals. |
---|
429 | */ |
---|
430 | |
---|
431 | #define TclpPanic ((Tcl_PanicProc *) NULL) |
---|
432 | |
---|
433 | /* |
---|
434 | *--------------------------------------------------------------------------- |
---|
435 | * The following macros and declarations represent the interface between |
---|
436 | * generic and windows-specific parts of Tcl. Some of the macros may |
---|
437 | * override functions declared in tclInt.h. |
---|
438 | *--------------------------------------------------------------------------- |
---|
439 | */ |
---|
440 | |
---|
441 | /* |
---|
442 | * The default platform eol translation on Windows is TCL_TRANSLATE_CRLF: |
---|
443 | */ |
---|
444 | |
---|
445 | #define TCL_PLATFORM_TRANSLATION TCL_TRANSLATE_CRLF |
---|
446 | |
---|
447 | /* |
---|
448 | * Declare dynamic loading extension macro. |
---|
449 | */ |
---|
450 | |
---|
451 | #define TCL_SHLIB_EXT ".dll" |
---|
452 | |
---|
453 | /* |
---|
454 | * The following define ensures that we use the native putenv |
---|
455 | * implementation to modify the environment array. This keeps |
---|
456 | * the C level environment in synch with the system level environment. |
---|
457 | */ |
---|
458 | |
---|
459 | #define USE_PUTENV 1 |
---|
460 | #define USE_PUTENV_FOR_UNSET 1 |
---|
461 | |
---|
462 | /* |
---|
463 | * Msvcrt's putenv() copies the string rather than takes ownership of it. |
---|
464 | */ |
---|
465 | |
---|
466 | #if defined(_MSC_VER) || defined(__MINGW32__) |
---|
467 | # define HAVE_PUTENV_THAT_COPIES 1 |
---|
468 | #endif |
---|
469 | |
---|
470 | /* |
---|
471 | * Older version of Mingw are known to lack a MWMO_ALERTABLE define. |
---|
472 | */ |
---|
473 | #if defined(HAVE_NO_MWMO_ALERTABLE) |
---|
474 | # define MWMO_ALERTABLE 2 |
---|
475 | #endif |
---|
476 | |
---|
477 | /* |
---|
478 | * The following defines wrap the system memory allocation routines for |
---|
479 | * use by tclAlloc.c. |
---|
480 | */ |
---|
481 | |
---|
482 | #ifdef __CYGWIN__ |
---|
483 | # define TclpSysAlloc(size, isBin) malloc((size)) |
---|
484 | # define TclpSysFree(ptr) free((ptr)) |
---|
485 | # define TclpSysRealloc(ptr, size) realloc((ptr), (size)) |
---|
486 | #else |
---|
487 | # define TclpSysAlloc(size, isBin) ((void*)HeapAlloc(GetProcessHeap(), \ |
---|
488 | (DWORD)0, (DWORD)size)) |
---|
489 | # define TclpSysFree(ptr) (HeapFree(GetProcessHeap(), \ |
---|
490 | (DWORD)0, (HGLOBAL)ptr)) |
---|
491 | # define TclpSysRealloc(ptr, size) ((void*)HeapReAlloc(GetProcessHeap(), \ |
---|
492 | (DWORD)0, (LPVOID)ptr, (DWORD)size)) |
---|
493 | #endif |
---|
494 | |
---|
495 | /* |
---|
496 | * The following defines map from standard socket names to our internal |
---|
497 | * wrappers that redirect through the winSock function table (see the |
---|
498 | * file tclWinSock.c). |
---|
499 | */ |
---|
500 | |
---|
501 | #define getservbyname TclWinGetServByName |
---|
502 | #define getsockopt TclWinGetSockOpt |
---|
503 | #define ntohs TclWinNToHS |
---|
504 | #define setsockopt TclWinSetSockOpt |
---|
505 | /* This type is not defined in the Windows headers */ |
---|
506 | #define socklen_t int |
---|
507 | |
---|
508 | |
---|
509 | /* |
---|
510 | * The following macros have trivial definitions, allowing generic code to |
---|
511 | * address platform-specific issues. |
---|
512 | */ |
---|
513 | |
---|
514 | #define TclpReleaseFile(file) ckfree((char *) file) |
---|
515 | |
---|
516 | /* |
---|
517 | * The following macros and declarations wrap the C runtime library |
---|
518 | * functions. |
---|
519 | */ |
---|
520 | |
---|
521 | #define TclpExit exit |
---|
522 | |
---|
523 | #ifndef INVALID_SET_FILE_POINTER |
---|
524 | #define INVALID_SET_FILE_POINTER 0xFFFFFFFF |
---|
525 | #endif /* INVALID_SET_FILE_POINTER */ |
---|
526 | |
---|
527 | #endif /* _TCLWINPORT */ |
---|