]> git.ipfire.org Git - thirdparty/squid.git/blob - include/squid_mswin.h
Windows port: workaround for Visual Studio odd EAI_NODATA definition.
[thirdparty/squid.git] / include / squid_mswin.h
1 /*
2 * $Id: squid_mswin.h,v 1.9 2008/01/22 20:12:57 serassio Exp $
3 *
4 * AUTHOR: Andrey Shorin <tolsty@tushino.com>
5 * AUTHOR: Guido Serassio <serassio@squid-cache.org>
6 *
7 * SQUID Web Proxy Cache http://www.squid-cache.org/
8 * ----------------------------------------------------------
9 *
10 * Squid is the result of efforts by numerous individuals from
11 * the Internet community; see the CONTRIBUTORS file for full
12 * details. Many organizations have provided support for Squid's
13 * development; see the SPONSORS file for full details. Squid is
14 * Copyrighted (C) 2001 by the Regents of the University of
15 * California; see the COPYRIGHT file for full details. Squid
16 * incorporates software developed and/or copyrighted by other
17 * sources; see the CREDITS file for full details.
18 *
19 * This program is free software; you can redistribute it and/or modify
20 * it under the terms of the GNU General Public License as published by
21 * the Free Software Foundation; either version 2 of the License, or
22 * (at your option) any later version.
23 *
24 * This program is distributed in the hope that it will be useful,
25 * but WITHOUT ANY WARRANTY; without even the implied warranty of
26 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
27 * GNU General Public License for more details.
28 *
29 * You should have received a copy of the GNU General Public License
30 * along with this program; if not, write to the Free Software
31 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
32 *
33 */
34
35 #define ACL WindowsACL
36 #if defined(_MSC_VER) /* Microsoft C Compiler ONLY */
37 #if _MSC_VER == 1400
38 #define _CRT_SECURE_NO_DEPRECATE
39 #pragma warning( disable : 4290 )
40 #pragma warning( disable : 4996 )
41 #endif
42 #endif
43
44 #if defined _FILE_OFFSET_BITS && _FILE_OFFSET_BITS == 64
45 # define __USE_FILE_OFFSET64 1
46 #endif
47
48 #if defined(_MSC_VER) /* Microsoft C Compiler ONLY */
49
50 typedef unsigned char uint8_t;
51 typedef unsigned short uint16_t;
52 typedef unsigned int uint32_t;
53 typedef unsigned __int64 uint64_t;
54
55 typedef long pid_t;
56
57 #if defined __USE_FILE_OFFSET64
58 typedef int64_t off_t;
59 typedef uint64_t ino_t;
60
61 #else
62 typedef long off_t;
63 typedef unsigned long ino_t;
64
65 #endif
66
67 #define INT64_MAX _I64_MAX
68 #define INT64_MIN _I64_MIN
69
70 #include "default_config_file.h"
71 /* Some tricks for MS Compilers */
72 #define __STDC__ 1
73 #pragma include_alias(<dirent.h>, <direct.h>)
74 #define THREADLOCAL __declspec(thread)
75
76 #elif defined(__GNUC__) /* gcc environment */
77
78 #define THREADLOCAL __attribute__((section(".tls")))
79
80 #endif
81
82 #if defined(_MSC_VER) /* Microsoft C Compiler ONLY */
83 #define alloca _alloca
84 #endif
85 #define chdir _chdir
86 #define dup _dup
87 #define dup2 _dup2
88 #define fdopen _fdopen
89 #if defined(_MSC_VER) /* Microsoft C Compiler ONLY */
90 #define fileno _fileno
91 #define fstat _fstati64
92 #endif
93 #define ftruncate WIN32_ftruncate
94 #define getcwd _getcwd
95 #define getpid _getpid
96 #define getrusage WIN32_getrusage
97 #if defined(_MSC_VER) /* Microsoft C Compiler ONLY */
98 #define lseek _lseeki64
99 #define memccpy _memccpy
100 #define mkdir(p) _mkdir(p)
101 #define mktemp _mktemp
102 #endif
103 #define pclose _pclose
104 #define pipe WIN32_pipe
105 #define popen _popen
106 #define putenv _putenv
107 #define setmode _setmode
108 #define sleep(t) Sleep((t)*1000)
109 #if defined(_MSC_VER) /* Microsoft C Compiler ONLY */
110 #define snprintf _snprintf
111 #define stat _stati64
112 #define strcasecmp _stricmp
113 #define strdup _strdup
114 #define strlwr _strlwr
115 #define strncasecmp _strnicmp
116 #define tempnam _tempnam
117 #endif
118 #define truncate WIN32_truncate
119 #define umask _umask
120 #define unlink _unlink
121 #if defined(_MSC_VER) /* Microsoft C Compiler ONLY */
122 #define vsnprintf _vsnprintf
123 #endif
124
125 #define O_RDONLY _O_RDONLY
126 #define O_WRONLY _O_WRONLY
127 #define O_RDWR _O_RDWR
128 #define O_APPEND _O_APPEND
129
130 #define O_CREAT _O_CREAT
131 #define O_TRUNC _O_TRUNC
132 #define O_EXCL _O_EXCL
133
134 #define O_TEXT _O_TEXT
135 #define O_BINARY _O_BINARY
136 #define O_RAW _O_BINARY
137 #define O_TEMPORARY _O_TEMPORARY
138 #define O_NOINHERIT _O_NOINHERIT
139 #define O_SEQUENTIAL _O_SEQUENTIAL
140 #define O_RANDOM _O_RANDOM
141 #define O_NDELAY 0
142
143 #define S_IFMT _S_IFMT
144 #define S_IFDIR _S_IFDIR
145 #define S_IFCHR _S_IFCHR
146 #define S_IFREG _S_IFREG
147 #define S_IREAD _S_IREAD
148 #define S_IWRITE _S_IWRITE
149 #define S_IEXEC _S_IEXEC
150
151 #define S_IRWXO 007
152 #if defined(_MSC_VER) /* Microsoft C Compiler ONLY */
153 #define S_ISDIR(m) (((m) & _S_IFDIR) == _S_IFDIR)
154 #endif
155
156 #define SIGHUP 1 /* hangup */
157 #define SIGKILL 9 /* kill (cannot be caught or ignored) */
158 #define SIGBUS 10 /* bus error */
159 #define SIGPIPE 13 /* write on a pipe with no one to read it */
160 #define SIGCHLD 20 /* to parent on child stop or exit */
161 #define SIGUSR1 30 /* user defined signal 1 */
162 #define SIGUSR2 31 /* user defined signal 2 */
163
164 typedef unsigned short int ushort;
165 typedef int uid_t;
166 typedef int gid_t;
167
168 struct passwd {
169 char *pw_name; /* user name */
170 char *pw_passwd; /* user password */
171 uid_t pw_uid; /* user id */
172 gid_t pw_gid; /* group id */
173 char *pw_gecos; /* real name */
174 char *pw_dir; /* home directory */
175 char *pw_shell; /* shell program */
176 };
177
178 struct group {
179 char *gr_name; /* group name */
180 char *gr_passwd; /* group password */
181 gid_t gr_gid; /* group id */
182 char **gr_mem; /* group members */
183 };
184
185 struct statfs {
186 long f_type; /* type of filesystem (see below) */
187 long f_bsize; /* optimal transfer block size */
188 long f_blocks; /* total data blocks in file system */
189 long f_bfree; /* free blocks in fs */
190 long f_bavail; /* free blocks avail to non-superuser */
191 long f_files; /* total file nodes in file system */
192 long f_ffree; /* free file nodes in fs */
193 long f_fsid; /* file system id */
194 long f_namelen; /* maximum length of filenames */
195 long f_spare[6]; /* spare for later */
196 };
197
198 #ifndef HAVE_GETTIMEOFDAY
199 struct timezone
200 {
201 int tz_minuteswest; /* minutes west of Greenwich */
202 int tz_dsttime; /* type of dst correction */
203 };
204 #endif
205
206 #define CHANGE_FD_SETSIZE 1
207 #if CHANGE_FD_SETSIZE && SQUID_MAXFD > DEFAULT_FD_SETSIZE
208 #define FD_SETSIZE SQUID_MAXFD
209 #endif
210
211 #include <stddef.h>
212 #include <process.h>
213 #include <errno.h>
214 #if defined(_MSC_VER) /* Microsoft C Compiler ONLY */
215 #include <winsock2.h>
216 #endif
217 #include <ws2tcpip.h>
218 #if (EAI_NODATA == EAI_NONAME)
219 #undef EAI_NODATA
220 #define EAI_NODATA WSANO_DATA
221 #endif
222 #if defined(_MSC_VER) /* Microsoft C Compiler ONLY */
223 /* Hack to suppress compiler warnings on FD_SET() & FD_CLR() */
224 #pragma warning (push)
225 #pragma warning (disable:4142)
226 #endif
227 /* prevent inclusion of wingdi.h */
228 #define NOGDI
229 #include <ws2spi.h>
230 #if defined(_MSC_VER) /* Microsoft C Compiler ONLY */
231 #pragma warning (pop)
232 #include "readdir.h"
233 #else
234 #include <io.h>
235 #include <stdlib.h>
236 #include <sys/types.h>
237 #endif
238
239 typedef char * caddr_t;
240
241 #undef FD_CLOSE
242 #undef FD_OPEN
243 #undef FD_READ
244 #undef FD_WRITE
245 #define EISCONN WSAEISCONN
246 #define EINPROGRESS WSAEINPROGRESS
247 #define EWOULDBLOCK WSAEWOULDBLOCK
248 #define EALREADY WSAEALREADY
249 #define ETIMEDOUT WSAETIMEDOUT
250 #define ECONNREFUSED WSAECONNREFUSED
251 #define ECONNRESET WSAECONNRESET
252 #define ENOTCONN WSAENOTCONN
253 #define ERESTART WSATRY_AGAIN
254 #define EAFNOSUPPORT WSAEAFNOSUPPORT
255
256 #undef h_errno
257 #define h_errno errno /* we'll set it ourselves */
258
259 #undef FD_CLR
260 #define FD_CLR(fd, set) do { \
261 u_int __i; \
262 SOCKET __sock = fd_table[fd].win32.handle; \
263 for (__i = 0; __i < ((fd_set FAR *)(set))->fd_count ; __i++) { \
264 if (((fd_set FAR *)(set))->fd_array[__i] == __sock) { \
265 while (__i < ((fd_set FAR *)(set))->fd_count-1) { \
266 ((fd_set FAR *)(set))->fd_array[__i] = \
267 ((fd_set FAR *)(set))->fd_array[__i+1]; \
268 __i++; \
269 } \
270 ((fd_set FAR *)(set))->fd_count--; \
271 break; \
272 } \
273 } \
274 } while(0)
275
276 #undef FD_SET
277 #define FD_SET(fd, set) do { \
278 u_int __i; \
279 SOCKET __sock = fd_table[fd].win32.handle; \
280 for (__i = 0; __i < ((fd_set FAR *)(set))->fd_count; __i++) { \
281 if (((fd_set FAR *)(set))->fd_array[__i] == (__sock)) { \
282 break; \
283 } \
284 } \
285 if (__i == ((fd_set FAR *)(set))->fd_count) { \
286 if (((fd_set FAR *)(set))->fd_count < FD_SETSIZE) { \
287 ((fd_set FAR *)(set))->fd_array[__i] = (__sock); \
288 ((fd_set FAR *)(set))->fd_count++; \
289 } \
290 } \
291 } while(0)
292
293 #undef FD_ISSET
294 #define FD_ISSET(fd, set) Win32__WSAFDIsSet(fd, (fd_set FAR *)(set))
295
296 /* internal to Microsoft CRTLIB */
297 typedef struct {
298 long osfhnd; /* underlying OS file HANDLE */
299 char osfile; /* attributes of file (e.g., open in text mode?) */
300 char pipech; /* one char buffer for handles opened on pipes */
301 #ifdef _MT
302 int lockinitflag;
303 CRITICAL_SECTION lock;
304 #endif /* _MT */
305 } ioinfo;
306 #define IOINFO_L2E 5
307 #define IOINFO_ARRAY_ELTS (1 << IOINFO_L2E)
308 #define _pioinfo(i) ( __pioinfo[(i) >> IOINFO_L2E] + ((i) & (IOINFO_ARRAY_ELTS - 1)) )
309 #define _osfile(i) ( _pioinfo(i)->osfile )
310 #define _osfhnd(i) ( _pioinfo(i)->osfhnd )
311 #define FOPEN 0x01 /* file handle open */
312
313 #if defined(_MSC_VER) /* Microsoft C Compiler ONLY */
314
315 SQUIDCEXTERN _CRTIMP ioinfo * __pioinfo[];
316 SQUIDCEXTERN int __cdecl _free_osfhnd(int);
317
318 #elif defined(__MINGW32__) /* MinGW environment */
319
320 __MINGW_IMPORT ioinfo * __pioinfo[];
321 SQUIDCEXTERN int _free_osfhnd(int);
322
323 #endif
324
325 SQUIDCEXTERN THREADLOCAL int ws32_result;
326
327 #define strerror(e) WIN32_strerror(e)
328
329 #ifdef __cplusplus
330
331 inline
332 int close(int fd)
333 {
334 char l_so_type[sizeof(int)];
335 int l_so_type_siz = sizeof(l_so_type);
336 SOCKET sock = _get_osfhandle(fd);
337
338 if (::getsockopt(sock, SOL_SOCKET, SO_TYPE, l_so_type, &l_so_type_siz) == 0){
339 int result = 0;
340 if (closesocket(sock) == SOCKET_ERROR) {
341 errno = WSAGetLastError();
342 result = 1;
343 }
344 _free_osfhnd(fd);
345 _osfile(fd) = 0;
346 return result;
347 }
348 else
349 return _close(fd);
350 }
351
352 #if defined(_MSC_VER) /* Microsoft C Compiler ONLY */
353
354 #ifndef _S_IREAD
355 #define _S_IREAD 0x0100
356 #endif
357
358 #ifndef _S_IWRITE
359 #define _S_IWRITE 0x0080
360 #endif
361
362 inline
363 int open(const char *filename, int oflag, int pmode = 0)
364 {
365 return _open(filename, oflag, pmode & (_S_IREAD | _S_IWRITE));
366 }
367 #endif
368
369 inline
370 int read(int fd, void * buf, size_t siz)
371 {
372 char l_so_type[sizeof(int)];
373 int l_so_type_siz = sizeof(l_so_type);
374 SOCKET sock = _get_osfhandle(fd);
375
376 if (::getsockopt(sock, SOL_SOCKET, SO_TYPE, l_so_type, &l_so_type_siz) == 0)
377 return ::recv(sock, (char FAR *) buf, (int)siz, 0);
378 else
379 return _read(fd, buf, (unsigned int)siz);
380 }
381
382 inline
383 int write(int fd, const void * buf, size_t siz)
384 {
385 char l_so_type[sizeof(int)];
386 int l_so_type_siz = sizeof(l_so_type);
387 SOCKET sock = _get_osfhandle(fd);
388
389 if (::getsockopt(sock, SOL_SOCKET, SO_TYPE, l_so_type, &l_so_type_siz) == 0)
390 return ::send(sock, (char FAR *) buf, siz, 0);
391 else
392 return _write(fd, buf, siz);
393 }
394
395 inline
396 char *index(const char *s, int c)
397 {
398 return (char *)strchr(s,c);
399 }
400
401 namespace Squid {
402
403 inline
404 int accept(int s, struct sockaddr * a, size_t * l)
405 {
406 SOCKET result;
407 if ((result = ::accept(_get_osfhandle(s), a, (int *)l)) == INVALID_SOCKET) {
408 if (WSAEMFILE == (errno = WSAGetLastError()))
409 errno = EMFILE;
410 return -1;
411 }
412 else
413 return _open_osfhandle(result, 0);
414 }
415
416 inline
417 int bind(int s, struct sockaddr * n, int l)
418 {
419 if (::bind(_get_osfhandle(s),n,l) == SOCKET_ERROR) {
420 errno = WSAGetLastError();
421 return -1;
422 }
423 else
424 return 0;
425 }
426
427 inline
428 int connect(int s, const struct sockaddr * n, int l)
429 {
430 if (::connect(_get_osfhandle(s),n,l) == SOCKET_ERROR) {
431 if (WSAEMFILE == (errno = WSAGetLastError()))
432 errno = EMFILE;
433 return -1;
434 }
435 else
436 return 0;
437 }
438
439 inline
440 struct hostent * gethostbyname (const char *n)
441 {
442 HOSTENT FAR * result;
443 if ((result = ::gethostbyname(n)) == NULL)
444 errno = WSAGetLastError();
445 return result;
446 }
447 #define gethostbyname(n) Squid::gethostbyname(n)
448
449 inline
450 SERVENT FAR* getservbyname (const char * n, const char * p)
451 {
452 SERVENT FAR * result;
453 if ((result = ::getservbyname(n, p)) == NULL)
454 errno = WSAGetLastError();
455 return result;
456 }
457 #define getservbyname(n,p) Squid::getservbyname(n,p)
458
459 inline
460 HOSTENT FAR * gethostbyaddr(const char * a, int l, int t)
461 {
462 HOSTENT FAR * result;
463 if ((result = ::gethostbyaddr(a, l, t)) == NULL)
464 errno = WSAGetLastError();
465 return result;
466 }
467 #define gethostbyaddr(a,l,t) Squid::gethostbyaddr(a,l,t)
468
469 inline
470 int getsockname(int s, struct sockaddr * n, size_t * l)
471 {
472 if ((::getsockname(_get_osfhandle(s), n, (int *)l)) == SOCKET_ERROR) {
473 errno = WSAGetLastError();
474 return -1;
475 }
476 else
477 return 0;
478 }
479
480 inline
481 int gethostname(char * n, size_t l)
482 {
483 if ((::gethostname(n, l)) == SOCKET_ERROR) {
484 errno = WSAGetLastError();
485 return -1;
486 }
487 else
488 return 0;
489 }
490 #define gethostname(n,l) Squid::gethostname(n,l)
491
492 inline
493 int getsockopt(int s, int l, int o, void * v, int * n)
494 {
495 Sleep(1);
496 if ((::getsockopt(_get_osfhandle(s), l, o,(char *) v, n)) == SOCKET_ERROR) {
497 errno = WSAGetLastError();
498 return -1;
499 }
500 else
501 return 0;
502 }
503
504 /* Simple ioctl() emulation */
505 inline
506 int ioctl(int s, int c, void * a)
507 {
508 if ((::ioctlsocket(_get_osfhandle(s), c, (u_long FAR *)a)) == SOCKET_ERROR) {
509 errno = WSAGetLastError();
510 return -1;
511 }
512 else
513 return 0;
514 }
515
516 inline
517 int ioctlsocket(int s, long c, u_long FAR * a)
518 {
519 if ((::ioctlsocket(_get_osfhandle(s), c, a)) == SOCKET_ERROR) {
520 errno = WSAGetLastError();
521 return -1;
522 }
523 else
524 return 0;
525 }
526
527 inline
528 int listen(int s, int b)
529 {
530 if (::listen(_get_osfhandle(s), b) == SOCKET_ERROR) {
531 if (WSAEMFILE == (errno = WSAGetLastError()))
532 errno = EMFILE;
533 return -1;
534 }
535 else
536 return 0;
537 }
538 #define listen(s,b) Squid::listen(s,b)
539
540 inline
541 int recv(int s, void * b, size_t l, int f)
542 {
543 int result;
544 if ((result = ::recv(_get_osfhandle(s), (char *)b, l, f)) == SOCKET_ERROR) {
545 errno = WSAGetLastError();
546 return -1;
547 }
548 else
549 return result;
550 }
551
552 inline
553 int recvfrom(int s, void * b, size_t l, int f, struct sockaddr * fr, size_t * fl)
554 {
555 int result;
556 if ((result = ::recvfrom(_get_osfhandle(s), (char *)b, l, f, fr, (int *)fl)) == SOCKET_ERROR) {
557 errno = WSAGetLastError();
558 return -1;
559 }
560 else
561 return result;
562 }
563
564 inline
565 int select(int n, fd_set * r, fd_set * w, fd_set * e, struct timeval * t)
566 {
567 int result;
568 if ((result = ::select(n,r,w,e,t)) == SOCKET_ERROR) {
569 errno = WSAGetLastError();
570 return -1;
571 }
572 else
573 return result;
574 }
575 #define select(n,r,w,e,t) Squid::select(n,r,w,e,t)
576
577 inline
578 int send(int s, const void * b, size_t l, int f)
579 {
580 int result;
581 if ((result = ::send(_get_osfhandle(s), (char *)b, l, f)) == SOCKET_ERROR) {
582 errno = WSAGetLastError();
583 return -1;
584 }
585 else
586 return result;
587 }
588
589 inline
590 int sendto(int s, const void * b, size_t l, int f, const struct sockaddr * t, int tl)
591 {
592 int result;
593 if ((result = ::sendto(_get_osfhandle(s), (char *)b, l, f, t, tl)) == SOCKET_ERROR) {
594 errno = WSAGetLastError();
595 return -1;
596 }
597 else
598 return result;
599 }
600
601 inline
602 int setsockopt(SOCKET s, int l, int o, const char * v, int n)
603 {
604 SOCKET socket;
605
606 socket = ((s == INVALID_SOCKET) ? s : (SOCKET)_get_osfhandle((int)s));
607
608 if (::setsockopt(socket, l, o, v, n) == SOCKET_ERROR) {
609 errno = WSAGetLastError();
610 return -1;
611 }
612 else
613 return 0;
614 }
615 #define setsockopt(s,l,o,v,n) Squid::setsockopt(s,l,o,v,n)
616
617 inline
618 int shutdown(int s, int h)
619 {
620 if (::shutdown(_get_osfhandle(s),h) == SOCKET_ERROR) {
621 errno = WSAGetLastError();
622 return -1;
623 }
624 else
625 return 0;
626 }
627
628 inline
629 int socket(int f, int t, int p)
630 {
631 SOCKET result;
632 if ((result = ::socket(f, t, p)) == INVALID_SOCKET) {
633 if (WSAEMFILE == (errno = WSAGetLastError()))
634 errno = EMFILE;
635 return -1;
636 }
637 else
638 return _open_osfhandle(result, 0);
639 }
640 #define socket(f,t,p) Squid::socket(f,t,p)
641
642 inline
643 int WSAAsyncSelect(int s, HWND h, unsigned int w, long e)
644 {
645 if (::WSAAsyncSelect(_get_osfhandle(s), h, w, e) == SOCKET_ERROR) {
646 errno = WSAGetLastError();
647 return -1;
648 }
649 else
650 return 0;
651 }
652
653 #undef WSADuplicateSocket
654 inline
655 int WSADuplicateSocket(int s, DWORD n, LPWSAPROTOCOL_INFO l)
656 {
657 #ifdef UNICODE
658 if (::WSADuplicateSocketW(_get_osfhandle(s), n, l) == SOCKET_ERROR) {
659 #else
660 if (::WSADuplicateSocketA(_get_osfhandle(s), n, l) == SOCKET_ERROR) {
661 #endif
662 errno = WSAGetLastError();
663 return -1;
664 }
665 else
666 return 0;
667 }
668
669 #undef WSASocket
670 inline
671 int WSASocket(int a, int t, int p, LPWSAPROTOCOL_INFO i, GROUP g, DWORD f)
672 {
673 SOCKET result;
674 #ifdef UNICODE
675 if ((result = ::WSASocketW(a, t, p, i, g, f)) == INVALID_SOCKET) {
676 #else
677 if ((result = ::WSASocketA(a, t, p, i, g, f)) == INVALID_SOCKET) {
678 #endif
679 if (WSAEMFILE == (errno = WSAGetLastError()))
680 errno = EMFILE;
681 return -1;
682 }
683 else
684 return _open_osfhandle(result, 0);
685 }
686
687 } /* namespace Squid */
688
689 #else /* #ifdef __cplusplus */
690 #define connect(s,n,l) \
691 (SOCKET_ERROR == connect(_get_osfhandle(s),n,l) ? \
692 (WSAEMFILE == (errno = WSAGetLastError()) ? errno = EMFILE : -1, -1) : 0)
693 #define gethostbyname(n) \
694 (NULL == ((HOSTENT FAR*)(ws32_result = (int)gethostbyname(n))) ? \
695 (errno = WSAGetLastError()), (HOSTENT FAR*)NULL : (HOSTENT FAR*)ws32_result)
696 #define gethostname(n,l) \
697 (SOCKET_ERROR == gethostname(n,l) ? \
698 (errno = WSAGetLastError()), -1 : 0)
699 #define recv(s,b,l,f) \
700 (SOCKET_ERROR == (ws32_result = recv(_get_osfhandle(s),b,l,f)) ? \
701 (errno = WSAGetLastError()), -1 : ws32_result)
702 #define sendto(s,b,l,f,t,tl) \
703 (SOCKET_ERROR == (ws32_result = sendto(_get_osfhandle(s),b,l,f,t,tl)) ? \
704 (errno = WSAGetLastError()), -1 : ws32_result)
705 #define select(n,r,w,e,t) \
706 (SOCKET_ERROR == (ws32_result = select(n,r,w,e,t)) ? \
707 (errno = WSAGetLastError()), -1 : ws32_result)
708 #define socket(f,t,p) \
709 (INVALID_SOCKET == ((SOCKET)(ws32_result = (int)socket(f,t,p))) ? \
710 ((WSAEMFILE == (errno = WSAGetLastError()) ? errno = EMFILE : -1), -1) : \
711 (SOCKET)_open_osfhandle(ws32_result,0))
712 #define write _write /* Needed in util.c */
713 #define open _open /* Needed in win32lib.c */
714 #endif /* #ifdef __cplusplus */
715
716 #define RUSAGE_SELF 0 /* calling process */
717 #define RUSAGE_CHILDREN -1 /* terminated child processes */
718
719 struct rusage {
720 struct timeval ru_utime; /* user time used */
721 struct timeval ru_stime; /* system time used */
722 long ru_maxrss; /* integral max resident set size */
723 long ru_ixrss; /* integral shared text memory size */
724 long ru_idrss; /* integral unshared data size */
725 long ru_isrss; /* integral unshared stack size */
726 long ru_minflt; /* page reclaims */
727 long ru_majflt; /* page faults */
728 long ru_nswap; /* swaps */
729 long ru_inblock; /* block input operations */
730 long ru_oublock; /* block output operations */
731 long ru_msgsnd; /* messages sent */
732 long ru_msgrcv; /* messages received */
733 long ru_nsignals; /* signals received */
734 long ru_nvcsw; /* voluntary context switches */
735 long ru_nivcsw; /* involuntary context switches */
736 };
737
738 #undef ACL