mswindows.h
Go to the documentation of this file.
1/*
2 * Copyright (C) 1996-2023 The Squid Software Foundation and contributors
3 *
4 * Squid software is distributed under GPLv2+ license and includes
5 * contributions from numerous individuals and organizations.
6 * Please see the COPYING and CONTRIBUTORS files for details.
7 */
8
9/*
10 * AUTHOR: Andrey Shorin <tolsty@tushino.com>
11 * AUTHOR: Guido Serassio <serassio@squid-cache.org>
12 */
13
14#ifndef SQUID_OS_MSWINDOWS_H
15#define SQUID_OS_MSWINDOWS_H
16
17#if _SQUID_WINDOWS_
18
19/****************************************************************************
20 *--------------------------------------------------------------------------*
21 * DO *NOT* MAKE ANY CHANGES below here unless you know what you're doing...*
22 *--------------------------------------------------------------------------*
23 ****************************************************************************/
24
25/* we target Windows XP and later - some API are missing otherwise */
26#if _SQUID_MINGW_
27#if WINVER < 0x0501
28#undef WINVER
29#define WINVER 0x0501
30#undef _WIN32_WINNT
31#define _WIN32_WINNT WINVER
32#endif
33#endif /* _SQUID_MINGW_ */
34
35#include "compat/initgroups.h"
36
37#if HAVE_DIRECT_H
38#include <direct.h>
39#endif
40#if HAVE_FCNTL_H
41#include <fcntl.h>
42#endif /* HAVE_FCNTL_H */
43#if HAVE_STRING_H
44#include <string.h>
45#endif /* HAVE_FCNTL_H */
46#if HAVE_SYS_STAT_H
47#include <sys/stat.h>
48#endif /* HAVE_SYS_STAT_H */
49
50#define ACL WindowsACL
51#if defined(_MSC_VER) /* Microsoft C Compiler ONLY */
52#if _MSC_VER == 1400
53#define _CRT_SECURE_NO_DEPRECATE
54#pragma warning( disable : 4290 )
55#pragma warning( disable : 4996 )
56#endif
57#endif
58
59/* Some MinGW version defines min() and max() as macros
60 causing the fail of the build process. The following
61 #define will disable that definition
62 */
63#if defined(__GNUC__) && !NOMINMAX
64#define NOMINMAX
65#endif
66
68#if !defined(IPV6_V6ONLY)
69#define IPV6_V6ONLY 27
70#endif
71
72#if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS == 64
73# define __USE_FILE_OFFSET64 1
74#endif
75
76#if defined(_MSC_VER) /* Microsoft C Compiler ONLY */
77
78#if defined(__USE_FILE_OFFSET64)
79typedef uint64_t ino_t;
80#else
81typedef unsigned long ino_t;
82#endif
83
84#define INT64_MAX _I64_MAX
85#define INT64_MIN _I64_MIN
86
87#include "default_config_file.h"
88/* Some tricks for MS Compilers */
89#define __STDC__ 1
90#define THREADLOCAL __declspec(thread)
91
92#elif defined(__GNUC__) /* gcc environment */
93
94#define THREADLOCAL __attribute__((section(".tls")))
95
96#endif /* _MSC_VER */
97
98/* ONLY Microsoft C Compiler needs these: */
99#if defined(_MSC_VER)
100#define alloca _alloca
101#define fileno _fileno
102#define fstat _fstati64
103#define lseek _lseeki64
104#define memccpy _memccpy
105#define mktemp _mktemp
106#define snprintf _snprintf
107#define stat _stati64
108#define strcasecmp _stricmp
109#define strlwr _strlwr
110#define strncasecmp _strnicmp
111#define tempnam _tempnam
112#define vsnprintf _vsnprintf
113#endif
114
115/* Microsoft C Compiler and CygWin need these. MinGW does not */
116#if defined(_MSC_VER) || _SQUID_CYGWIN_
117SQUIDCEXTERN int WIN32_ftruncate(int fd, off_t size);
118#define ftruncate WIN32_ftruncate
119SQUIDCEXTERN int WIN32_truncate(const char *pathname, off_t length);
120#define truncate WIN32_truncate
121#define chdir _chdir
122#endif
123
124/* All three compiler systems need these: */
125#define dup _dup
126#define dup2 _dup2
127#define fdopen _fdopen
128#define getcwd _getcwd
129#define getpid _getpid
130#define mkdir(p,F) mkdir((p))
131#define pclose _pclose
132#define popen _popen
133#define putenv _putenv
134#define setmode _setmode
135#define sleep(t) Sleep((t)*1000)
136#define umask _umask
137#define unlink _unlink
138
139#ifndef O_RDONLY
140#define O_RDONLY _O_RDONLY
141#endif
142#ifndef O_WRONLY
143#define O_WRONLY _O_WRONLY
144#endif
145#ifndef O_RDWR
146#define O_RDWR _O_RDWR
147#endif
148#ifndef O_APPEND
149#define O_APPEND _O_APPEND
150#endif
151#ifndef O_CREAT
152#define O_CREAT _O_CREAT
153#endif
154#ifndef O_TRUNC
155#define O_TRUNC _O_TRUNC
156#endif
157#ifndef O_EXCL
158#define O_EXCL _O_EXCL
159#endif
160#ifndef O_TEXT
161#define O_TEXT _O_TEXT
162#endif
163#ifndef O_BINARY
164#define O_BINARY _O_BINARY
165#endif
166#ifndef O_RAW
167#define O_RAW _O_BINARY
168#endif
169#ifndef O_TEMPORARY
170#define O_TEMPORARY _O_TEMPORARY
171#endif
172#ifndef O_NOINHERIT
173#define O_NOINHERIT _O_NOINHERIT
174#endif
175#ifndef O_SEQUENTIAL
176#define O_SEQUENTIAL _O_SEQUENTIAL
177#endif
178#ifndef O_RANDOM
179#define O_RANDOM _O_RANDOM
180#endif
181#ifndef O_NDELAY
182#define O_NDELAY 0
183#endif
184
185#ifndef S_IFMT
186#define S_IFMT _S_IFMT
187#endif
188#ifndef S_IFDIR
189#define S_IFDIR _S_IFDIR
190#endif
191#ifndef S_IFCHR
192#define S_IFCHR _S_IFCHR
193#endif
194#ifndef S_IFREG
195#define S_IFREG _S_IFREG
196#endif
197#ifndef S_IREAD
198#define S_IREAD _S_IREAD
199#endif
200#ifndef S_IWRITE
201#define S_IWRITE _S_IWRITE
202#endif
203#ifndef S_IEXEC
204#define S_IEXEC _S_IEXEC
205#endif
206#ifndef S_IRWXO
207#define S_IRWXO 007
208#endif
209
210/* There are no group protection bits like these in Windows.
211 * The values are used by umask() to remove permissions so
212 * mapping to user permission bits will break file accesses.
213 * Map group permissions to harmless zero instead.
214 */
215#ifndef S_IXGRP
216#define S_IXGRP 0
217#endif
218#ifndef S_IWGRP
219#define S_IWGRP 0
220#endif
221#ifndef S_IWOTH
222#define S_IWOTH 0
223#endif
224#ifndef S_IXOTH
225#define S_IXOTH 0
226#endif
227
228#if defined(_MSC_VER)
229#define S_ISDIR(m) (((m) & _S_IFDIR) == _S_IFDIR)
230#endif
231
232#define SIGHUP 1 /* hangup */
233#define SIGKILL 9 /* kill (cannot be caught or ignored) */
234#define SIGBUS 10 /* bus error */
235#define SIGPIPE 13 /* write on a pipe with no one to read it */
236#define SIGCHLD 20 /* to parent on child stop or exit */
237#define SIGUSR1 30 /* user defined signal 1 */
238#define SIGUSR2 31 /* user defined signal 2 */
239
240#if _SQUID_MINGW_
241typedef unsigned char boolean;
242typedef unsigned char u_char;
243typedef unsigned int u_int;
244#endif
245
246#if defined(_MSC_VER)
247typedef int uid_t;
248typedef int gid_t;
249#endif
250
251struct passwd {
252 char *pw_name; /* user name */
253 char *pw_passwd; /* user password */
254 uid_t pw_uid; /* user id */
255 gid_t pw_gid; /* group id */
256 char *pw_gecos; /* real name */
257 char *pw_dir; /* home directory */
258 char *pw_shell; /* shell program */
259};
260
261struct group {
262 char *gr_name; /* group name */
263 char *gr_passwd; /* group password */
264 gid_t gr_gid; /* group id */
265 char **gr_mem; /* group members */
266};
267
268#if !HAVE_GETTIMEOFDAY
269struct timezone {
270 int tz_minuteswest; /* minutes west of Greenwich */
271 int tz_dsttime; /* type of dst correction */
272};
273#endif
274
275#define CHANGE_FD_SETSIZE 1
276#if CHANGE_FD_SETSIZE && SQUID_MAXFD > DEFAULT_FD_SETSIZE
277#define FD_SETSIZE SQUID_MAXFD
278#endif
279
280#include <process.h>
281#include <errno.h>
282#if HAVE_WINSOCK2_H
283#include <winsock2.h>
284#elif HAVE_WINSOCK_H
285#include <winsock.h>
286#endif
287
288#if !_SQUID_CYGWIN_
289#undef IN_ADDR
290#include <ws2tcpip.h>
291#endif
292
293#if (EAI_NODATA == EAI_NONAME)
294#undef EAI_NODATA
295#define EAI_NODATA WSANO_DATA
296#endif
297
298#if defined(_MSC_VER)
299/* Hack to suppress compiler warnings on FD_SET() & FD_CLR() */
300#pragma warning (push)
301#pragma warning (disable:4142)
302#endif
303
304/* prevent inclusion of wingdi.h */
305#define NOGDI
306#include <ws2spi.h>
307
308#if defined(_MSC_VER)
309#pragma warning (pop)
310#endif
311
312#include <io.h>
313
314typedef char * caddr_t;
315
316#ifndef _PATH_DEVNULL
317#define _PATH_DEVNULL "NUL"
318#endif
319
320#undef FD_CLOSE
321#undef FD_OPEN
322#undef FD_READ
323#undef FD_WRITE
324
325#ifndef EISCONN
326#define EISCONN WSAEISCONN
327#endif
328#ifndef EINPROGRESS
329#define EINPROGRESS WSAEINPROGRESS
330#endif
331#ifndef EWOULDBLOCK
332#define EWOULDBLOCK WSAEWOULDBLOCK
333#endif
334#ifndef EALREADY
335#define EALREADY WSAEALREADY
336#endif
337#ifndef ETIMEDOUT
338#define ETIMEDOUT WSAETIMEDOUT
339#endif
340#ifndef ECONNREFUSED
341#define ECONNREFUSED WSAECONNREFUSED
342#endif
343#ifndef ECONNRESET
344#define ECONNRESET WSAECONNRESET
345#endif
346#ifndef ENOTCONN
347#define ENOTCONN WSAENOTCONN
348#endif
349#ifndef ERESTART
350#define ERESTART WSATRY_AGAIN
351#endif
352#ifndef EAFNOSUPPORT
353#define EAFNOSUPPORT WSAEAFNOSUPPORT
354#endif
355#ifndef ENETUNREACH
356#define ENETUNREACH WSAENETUNREACH
357#endif
358#ifndef ENOTSUP
359#define ENOTSUP WSAEOPNOTSUPP
360#endif
361#ifndef ECONNABORTED
362#define ECONNABORTED WSAECONNABORTED
363#endif
364
365#undef h_errno
366#define h_errno errno /* we'll set it ourselves */
367
368#undef FD_CLR
369#define FD_CLR(fd, set) do { \
370 u_int __i; \
371 SOCKET __sock = _get_osfhandle(fd); \
372 for (__i = 0; __i < ((fd_set FAR *)(set))->fd_count ; __i++) { \
373 if (((fd_set FAR *)(set))->fd_array[__i] == __sock) { \
374 while (__i < ((fd_set FAR *)(set))->fd_count-1) { \
375 ((fd_set FAR *)(set))->fd_array[__i] = \
376 ((fd_set FAR *)(set))->fd_array[__i+1]; \
377 __i++; \
378 } \
379 ((fd_set FAR *)(set))->fd_count--; \
380 break; \
381 } \
382 } \
383} while(0)
384
385#undef FD_SET
386#define FD_SET(fd, set) do { \
387 u_int __i; \
388 SOCKET __sock = _get_osfhandle(fd); \
389 for (__i = 0; __i < ((fd_set FAR *)(set))->fd_count; __i++) { \
390 if (((fd_set FAR *)(set))->fd_array[__i] == (__sock)) { \
391 break; \
392 } \
393 } \
394 if (__i == ((fd_set FAR *)(set))->fd_count) { \
395 if (((fd_set FAR *)(set))->fd_count < FD_SETSIZE) { \
396 ((fd_set FAR *)(set))->fd_array[__i] = (__sock); \
397 ((fd_set FAR *)(set))->fd_count++; \
398 } \
399 } \
400} while(0)
401
402#undef FD_ISSET
403#define FD_ISSET(fd, set) Win32__WSAFDIsSet(fd, (fd_set FAR *)(set))
404
405/* internal to Microsoft CRTLIB */
406typedef struct {
407 long osfhnd; /* underlying OS file HANDLE */
408 char osfile; /* attributes of file (e.g., open in text mode?) */
409 char pipech; /* one char buffer for handles opened on pipes */
410#ifdef _MT
411 int lockinitflag;
412 CRITICAL_SECTION lock;
413#endif /* _MT */
414} ioinfo;
415#define IOINFO_L2E 5
416#define IOINFO_ARRAY_ELTS (1 << IOINFO_L2E)
417#define _pioinfo(i) ( __pioinfo[(i) >> IOINFO_L2E] + ((i) & (IOINFO_ARRAY_ELTS - 1)) )
418#define _osfile(i) ( _pioinfo(i)->osfile )
419#define _osfhnd(i) ( _pioinfo(i)->osfhnd )
420#if !defined(FOPEN)
421#define FOPEN 0x01 /* file handle open */
422#endif
423
424#if defined(_MSC_VER)
425SQUIDCEXTERN _CRTIMP ioinfo * __pioinfo[];
426SQUIDCEXTERN int __cdecl _free_osfhnd(int);
427#endif
428
429#if _SQUID_MINGW_
430__MINGW_IMPORT ioinfo * __pioinfo[];
431SQUIDCEXTERN int _free_osfhnd(int);
432#endif
433
434SQUIDCEXTERN THREADLOCAL int ws32_result;
435
436#if defined(__cplusplus)
437
438inline int
439close(int fd)
440{
441 char l_so_type[sizeof(int)];
442 int l_so_type_siz = sizeof(l_so_type);
443 SOCKET sock = _get_osfhandle(fd);
444
445 if (::getsockopt(sock, SOL_SOCKET, SO_TYPE, l_so_type, &l_so_type_siz) == 0) {
446 int result = 0;
447 if (closesocket(sock) == SOCKET_ERROR) {
448 errno = WSAGetLastError();
449 result = 1;
450 }
451 _free_osfhnd(fd);
452 _osfile(fd) = 0;
453 return result;
454 } else
455 return _close(fd);
456}
457
458#if defined(_MSC_VER) /* Microsoft C Compiler ONLY */
459
460#ifndef _S_IREAD
461#define _S_IREAD 0x0100
462#endif
463
464#ifndef _S_IWRITE
465#define _S_IWRITE 0x0080
466#endif
467
468inline int
469open(const char *filename, int oflag, int pmode = 0)
470{
471 return _open(filename, oflag, pmode & (_S_IREAD | _S_IWRITE));
472}
473#endif
474
475inline int
476read(int fd, void * buf, size_t siz)
477{
478 char l_so_type[sizeof(int)];
479 int l_so_type_siz = sizeof(l_so_type);
480 SOCKET sock = _get_osfhandle(fd);
481
482 if (::getsockopt(sock, SOL_SOCKET, SO_TYPE, l_so_type, &l_so_type_siz) == 0)
483 return ::recv(sock, (char FAR *) buf, (int)siz, 0);
484 else
485 return _read(fd, buf, (unsigned int)siz);
486}
487
488inline int
489write(int fd, const void * buf, size_t siz)
490{
491 char l_so_type[sizeof(int)];
492 int l_so_type_siz = sizeof(l_so_type);
493 SOCKET sock = _get_osfhandle(fd);
494
495 if (::getsockopt(sock, SOL_SOCKET, SO_TYPE, l_so_type, &l_so_type_siz) == 0)
496 return ::send(sock, (char FAR *) buf, siz, 0);
497 else
498 return _write(fd, buf, siz);
499}
500
501// stdlib <functional> definitions are required before std API redefinitions.
502#include <functional>
503
505namespace Squid
506{
509/*
510 * Each of these functions is defined in the Squid namespace so as not to
511 * clash with the winsock.h and winsock2.h definitions.
512 * It is then paired with a #define to cause these wrappers to be used by
513 * the main code instead of those system definitions.
514 *
515 * We do this wrapper in order to:
516 * - cast the parameter types in only one place, and
517 * - record errors in POSIX errno variable, and
518 * - map the FD value used by Squid to the socket handes used by Windows.
519 */
520
521inline int
522accept(int s, struct sockaddr * a, socklen_t * l)
523{
524 SOCKET result;
525 if ((result = ::accept(_get_osfhandle(s), a, l)) == INVALID_SOCKET) {
526 if (WSAEMFILE == (errno = WSAGetLastError()))
527 errno = EMFILE;
528 return -1;
529 } else
530 return _open_osfhandle(result, 0);
531}
532#define accept(s,a,l) Squid::accept(s,a,reinterpret_cast<socklen_t*>(l))
533
534inline int
535bind(int s, const struct sockaddr * n, socklen_t l)
536{
537 if (::bind(_get_osfhandle(s),n,l) == SOCKET_ERROR) {
538 errno = WSAGetLastError();
539 return -1;
540 } else
541 return 0;
542}
543#define bind(s,n,l) Squid::bind(s,n,l)
544
545inline int
546connect(int s, const struct sockaddr * n, socklen_t l)
547{
548 if (::connect(_get_osfhandle(s),n,l) == SOCKET_ERROR) {
549 if (WSAEMFILE == (errno = WSAGetLastError()))
550 errno = EMFILE;
551 return -1;
552 } else
553 return 0;
554}
555#define connect(s,n,l) Squid::connect(s,n,l)
556
557inline struct hostent *
558gethostbyname(const char *n) {
559 HOSTENT FAR * result;
560 if ((result = ::gethostbyname(n)) == NULL)
561 errno = WSAGetLastError();
562 return result;
563}
564#define gethostbyname(n) Squid::gethostbyname(n)
565
566inline SERVENT FAR *
567getservbyname(const char * n, const char * p)
568{
569 SERVENT FAR * result;
570 if ((result = ::getservbyname(n, p)) == NULL)
571 errno = WSAGetLastError();
572 return result;
573}
574#define getservbyname(n,p) Squid::getservbyname(n,p)
575
576inline HOSTENT FAR *
577gethostbyaddr(const void * a, size_t l, int t)
578{
579 HOSTENT FAR * result;
580 if ((result = ::gethostbyaddr((const char*)a, l, t)) == NULL)
581 errno = WSAGetLastError();
582 return result;
583}
584#define gethostbyaddr(a,l,t) Squid::gethostbyaddr(a,l,t)
585
586inline int
587getsockname(int s, struct sockaddr * n, socklen_t * l)
588{
589 int i=*l;
590 if (::getsockname(_get_osfhandle(s), n, &i) == SOCKET_ERROR) {
591 errno = WSAGetLastError();
592 return -1;
593 } else
594 return 0;
595}
596#define getsockname(s,a,l) Squid::getsockname(s,a,reinterpret_cast<socklen_t*>(l))
597
598inline int
599gethostname(char * n, size_t l)
600{
601 if ((::gethostname(n, l)) == SOCKET_ERROR) {
602 errno = WSAGetLastError();
603 return -1;
604 } else
605 return 0;
606}
607#define gethostname(n,l) Squid::gethostname(n,l)
608
609inline int
610getsockopt(int s, int l, int o, void * v, socklen_t * n)
611{
612 Sleep(1);
613 if ((::getsockopt(_get_osfhandle(s), l, o,(char *) v, n)) == SOCKET_ERROR) {
614 errno = WSAGetLastError();
615 return -1;
616 } else
617 return 0;
618}
619#define getsockopt(s,l,o,v,n) Squid::getsockopt(s,l,o,v,n)
620
621#if HAVE_DECL_INETNTOPA || HAVE_DECL_INET_NTOP
622inline char *
623inet_ntop(int af, const void *src, char *dst, size_t size)
624{
625#if HAVE_DECL_INETNTOPA
626 return (char*)InetNtopA(af, const_cast<void*>(src), dst, size);
627#else // HAVE_DECL_INET_NTOP
628 return ::inet_ntop(af, src, dst, size);
629#endif
630}
631#define inet_ntop(a,s,d,l) Squid::inet_ntop(a,s,d,l)
632#endif // let compat/inet_ntop.h deal with it
633
634#if HAVE_DECL_INETPTONA || HAVE_DECL_INET_PTON
635inline char *
636inet_pton(int af, const void *src, char *dst)
637{
638#if HAVE_DECL_INETPTONA
639 return (char*)InetPtonA(af, const_cast<void*>(src), dst);
640#else // HAVE_DECL_INET_PTON
641 return ::inet_pton(af, src, dst);
642#endif
643}
644#define inet_pton(a,s,d) Squid::inet_pton(a,s,d)
645#endif // let compat/inet_pton.h deal with it
646
647/* Simple ioctl() emulation */
648inline int
649ioctl(int s, int c, void * a)
650{
651 if ((::ioctlsocket(_get_osfhandle(s), c, (u_long FAR *)a)) == SOCKET_ERROR) {
652 errno = WSAGetLastError();
653 return -1;
654 } else
655 return 0;
656}
657#define ioctl(s,c,a) Squid::ioctl(s,c,a)
658
659inline int
660ioctlsocket(int s, long c, u_long FAR * a)
661{
662 if ((::ioctlsocket(_get_osfhandle(s), c, a)) == SOCKET_ERROR) {
663 errno = WSAGetLastError();
664 return -1;
665 } else
666 return 0;
667}
668#define ioctlsocket(s,c,a) Squid::ioctlsocket(s,c,a)
669
670inline int
671listen(int s, int b)
672{
673 if (::listen(_get_osfhandle(s), b) == SOCKET_ERROR) {
674 if (WSAEMFILE == (errno = WSAGetLastError()))
675 errno = EMFILE;
676 return -1;
677 } else
678 return 0;
679}
680#define listen(s,b) Squid::listen(s,b)
681
682inline ssize_t
683recv(int s, void * b, size_t l, int f)
684{
685 ssize_t result;
686 if ((result = ::recv(_get_osfhandle(s), (char *)b, l, f)) == SOCKET_ERROR) {
687 errno = WSAGetLastError();
688 return -1;
689 } else
690 return result;
691}
692#define recv(s,b,l,f) Squid::recv(s,b,l,f)
693
694inline ssize_t
695recvfrom(int s, void * b, size_t l, int f, struct sockaddr * fr, socklen_t * fl)
696{
697 ssize_t result;
698 int ifl=*fl;
699 if ((result = ::recvfrom(_get_osfhandle(s), (char *)b, l, f, fr, &ifl)) == SOCKET_ERROR) {
700 errno = WSAGetLastError();
701 return -1;
702 } else
703 return result;
704}
705#define recvfrom(s,b,l,f,r,n) Squid::recvfrom(s,b,l,f,r,reinterpret_cast<socklen_t*>(n))
706
707inline int
708select(int n, fd_set * r, fd_set * w, fd_set * e, struct timeval * t)
709{
710 int result;
711 if ((result = ::select(n,r,w,e,t)) == SOCKET_ERROR) {
712 errno = WSAGetLastError();
713 return -1;
714 } else
715 return result;
716}
717#define select(n,r,w,e,t) Squid::select(n,r,w,e,t)
718
719inline ssize_t
720send(int s, const char * b, size_t l, int f)
721{
722 ssize_t result;
723 if ((result = ::send(_get_osfhandle(s), b, l, f)) == SOCKET_ERROR) {
724 errno = WSAGetLastError();
725 return -1;
726 } else
727 return result;
728}
729#define send(s,b,l,f) Squid::send(s,reinterpret_cast<const char*>(b),l,f)
730
731inline ssize_t
732sendto(int s, const void * b, size_t l, int f, const struct sockaddr * t, socklen_t tl)
733{
734 ssize_t result;
735 if ((result = ::sendto(_get_osfhandle(s), (char *)b, l, f, t, tl)) == SOCKET_ERROR) {
736 errno = WSAGetLastError();
737 return -1;
738 } else
739 return result;
740}
741#define sendto(a,b,l,f,t,n) Squid::sendto(a,b,l,f,t,n)
742
743inline int
744setsockopt(SOCKET s, int l, int o, const void * v, socklen_t n)
745{
746 SOCKET socket;
747
748 socket = ((s == INVALID_SOCKET) ? s : (SOCKET)_get_osfhandle((int)s));
749
750 if (::setsockopt(socket, l, o, (const char *)v, n) == SOCKET_ERROR) {
751 errno = WSAGetLastError();
752 return -1;
753 } else
754 return 0;
755}
756#define setsockopt(s,l,o,v,n) Squid::setsockopt(s,l,o,v,n)
757
758inline int
759shutdown(int s, int h)
760{
761 if (::shutdown(_get_osfhandle(s),h) == SOCKET_ERROR) {
762 errno = WSAGetLastError();
763 return -1;
764 } else
765 return 0;
766}
767#define shutdown(s,h) Squid::shutdown(s,h)
768
769inline int
770socket(int f, int t, int p)
771{
772 SOCKET result;
773 if ((result = ::socket(f, t, p)) == INVALID_SOCKET) {
774 if (WSAEMFILE == (errno = WSAGetLastError()))
775 errno = EMFILE;
776 return -1;
777 } else
778 return _open_osfhandle(result, 0);
779}
780#define socket(f,t,p) Squid::socket(f,t,p)
781
782inline int
783pipe(int pipefd[2])
784{
785 return _pipe(pipefd,4096,_O_BINARY);
786}
787#define pipe(a) Squid::pipe(a)
788
789inline int
790WSAAsyncSelect(int s, HWND h, unsigned int w, long e)
791{
792 if (::WSAAsyncSelect(_get_osfhandle(s), h, w, e) == SOCKET_ERROR) {
793 errno = WSAGetLastError();
794 return -1;
795 } else
796 return 0;
797}
798#define WSAAsyncSelect(s,h,w,e) Squid::WSAAsyncSelect(s,h,w,e)
799
800#undef WSADuplicateSocket
801inline int
802WSADuplicateSocket(int s, DWORD n, LPWSAPROTOCOL_INFO l)
803{
804#ifdef UNICODE
805 if (::WSADuplicateSocketW(_get_osfhandle(s), n, l) == SOCKET_ERROR) {
806#else
807 if (::WSADuplicateSocketA(_get_osfhandle(s), n, l) == SOCKET_ERROR) {
808#endif
809 errno = WSAGetLastError();
810 return -1;
811 } else
812 return 0;
813}
814#define WSADuplicateSocket(s,n,l) Squid::WSADuplicateSocket(s,n,l)
815
816#undef WSASocket
817inline int
818WSASocket(int a, int t, int p, LPWSAPROTOCOL_INFO i, GROUP g, DWORD f)
819{
820 SOCKET result;
821#ifdef UNICODE
822 if ((result = ::WSASocketW(a, t, p, i, g, f)) == INVALID_SOCKET) {
823#else
824 if ((result = ::WSASocketA(a, t, p, i, g, f)) == INVALID_SOCKET) {
825#endif
826 if (WSAEMFILE == (errno = WSAGetLastError()))
827 errno = EMFILE;
828 return -1;
829 } else
830 return _open_osfhandle(result, 0);
831}
832#define WSASocket(a,t,p,i,g,f) Squid::WSASocket(a,t,p,i,g,f)
833
834} /* namespace Squid */
835
836#else /* #ifdef __cplusplus */
837#define connect(s,n,l) \
838 (SOCKET_ERROR == connect(_get_osfhandle(s),n,l) ? \
839 (WSAEMFILE == (errno = WSAGetLastError()) ? errno = EMFILE : -1, -1) : 0)
840#define gethostbyname(n) \
841 (NULL == ((HOSTENT FAR*)(ws32_result = (int)gethostbyname(n))) ? \
842 (errno = WSAGetLastError()), (HOSTENT FAR*)NULL : (HOSTENT FAR*)ws32_result)
843#define gethostname(n,l) \
844 (SOCKET_ERROR == gethostname(n,l) ? \
845 (errno = WSAGetLastError()), -1 : 0)
846#define recv(s,b,l,f) \
847 (SOCKET_ERROR == (ws32_result = recv(_get_osfhandle(s),b,l,f)) ? \
848 (errno = WSAGetLastError()), -1 : ws32_result)
849#define sendto(s,b,l,f,t,tl) \
850 (SOCKET_ERROR == (ws32_result = sendto(_get_osfhandle(s),b,l,f,t,tl)) ? \
851 (errno = WSAGetLastError()), -1 : ws32_result)
852#define select(n,r,w,e,t) \
853 (SOCKET_ERROR == (ws32_result = select(n,r,w,e,t)) ? \
854 (errno = WSAGetLastError()), -1 : ws32_result)
855#define socket(f,t,p) \
856 (INVALID_SOCKET == ((SOCKET)(ws32_result = (int)socket(f,t,p))) ? \
857 ((WSAEMFILE == (errno = WSAGetLastError()) ? errno = EMFILE : -1), -1) : \
858 (SOCKET)_open_osfhandle(ws32_result,0))
859#define write _write /* Needed in util.c */
860#define open _open /* Needed in win32lib.c */
861#endif /* #ifdef __cplusplus */
862
863/* provide missing definitions from resoruce.h */
864/* NP: sys/resource.h and sys/time.h are apparently order-dependant. */
865#if HAVE_SYS_TIME_H
866#include <sys/time.h>
867#endif
868#if HAVE_SYS_RESOURCE_H
869#include <sys/resource.h>
870#else
871#define RUSAGE_SELF 0 /* calling process */
872#define RUSAGE_CHILDREN -1 /* terminated child processes */
873
874struct rusage {
875 struct timeval ru_utime; /* user time used */
876 struct timeval ru_stime; /* system time used */
877 long ru_maxrss; /* integral max resident set size */
878 long ru_ixrss; /* integral shared text memory size */
879 long ru_idrss; /* integral unshared data size */
880 long ru_isrss; /* integral unshared stack size */
881 long ru_minflt; /* page reclaims */
882 long ru_majflt; /* page faults */
883 long ru_nswap; /* swaps */
884 long ru_inblock; /* block input operations */
885 long ru_oublock; /* block output operations */
886 long ru_msgsnd; /* messages sent */
887 long ru_msgrcv; /* messages received */
888 long ru_nsignals; /* signals received */
889 long ru_nvcsw; /* voluntary context switches */
890 long ru_nivcsw; /* involuntary context switches */
891};
892#endif /* HAVE_SYS_RESOURCE_H */
893
894#undef ACL
895
896SQUIDCEXTERN int chroot(const char *dirname);
897SQUIDCEXTERN int kill(pid_t, int);
898SQUIDCEXTERN struct passwd * getpwnam(char *unused);
899SQUIDCEXTERN struct group * getgrnam(char *unused);
900
901static inline uid_t
902geteuid(void)
903{
904 return 100;
905}
906static inline int
907seteuid (uid_t euid)
908{
909 return 0;
910}
911static inline uid_t
912getuid(void)
913{
914 return 100;
915}
916static inline int
917setuid (uid_t uid)
918{
919 return 0;
920}
921static inline gid_t
922getegid(void)
923{
924 return 100;
925}
926static inline int
927setegid (gid_t egid)
928{
929 return 0;
930}
931static inline int
932getgid(void)
933{
934 return 100;
935}
936static inline int
937setgid (gid_t gid)
938{
939 return 0;
940}
941
942/* for some reason autoconf misdetects getpagesize.. */
943#if HAVE_GETPAGESIZE && _SQUID_MINGW_
944#undef HAVE_GETPAGESIZE
945#endif
946
947#if !HAVE_GETPAGESIZE
948/* And now we define a compatibility layer */
949size_t getpagesize();
950#define HAVE_GETPAGESIZE 2
951#endif
952
953SQUIDCEXTERN void WIN32_ExceptionHandlerInit(void);
954SQUIDCEXTERN int Win32__WSAFDIsSet(int fd, fd_set* set);
956
957/* gcc doesn't recognize the Windows native 64 bit formatting tags causing
958 * the compile fail, so we must disable the check on native Windows.
959 */
960#if __GNUC__
961#define PRINTF_FORMAT_ARG1
962#define PRINTF_FORMAT_ARG2
963#define PRINTF_FORMAT_ARG3
964#endif
965
966/* XXX: the logic around this is a bit warped:
967 * we #define ACL unconditionally at the top of this file,
968 * then #undef ACL unconditionally hafway down,
969 * then here re-define ACL to the same value as at the top,
970 * then include windows.h and #undef ACL again.
971 */
972#ifndef ACL
973#define ACL WindowsACL
974#define _MSWIN_ACL_WAS_NOT_DEFINED 1
975#endif
976#include <windows.h>
977#if _MSWIN_ACL_WAS_NOT_DEFINED
978#undef ACL
979#undef _MSWIN_ACL_WAS_NOT_DEFINED
980#endif
981
982#if !HAVE_SYSLOG
983/* syslog compatibility layer derives from git */
984#define LOG_PID 0x01
985#define LOG_EMERG 0
986#define LOG_ALERT 1
987#define LOG_CRIT 2
988#define LOG_ERR 3
989#define LOG_WARNING 4
990#define LOG_NOTICE 5
991#define LOG_INFO 6
992#define LOG_DEBUG 7
993#define LOG_DAEMON (3<<3)
994
995void openlog(const char *ident, int logopt, int facility);
996void syslog(int priority, const char *fmt, ...);
997#endif
998
999#if _SQUID_MINGW_
1000/* MinGW missing bits from sys/wait.h */
1001/* A status looks like:
1002 * <2 bytes info> <2 bytes code>
1003 *
1004 * <code> == 0, child has exited, info is the exit value
1005 * <code> == 1..7e, child has exited, info is the signal number.
1006 * <code> == 7f, child has stopped, info was the signal number.
1007 * <code> == 80, there was a core dump.
1008 */
1009#define WIFEXITED(w) (((w) & 0xff) == 0)
1010#define WIFSIGNALED(w) (((w) & 0x7f) > 0 && (((w) & 0x7f) < 0x7f))
1011#define WIFSTOPPED(w) (((w) & 0xff) == 0x7f)
1012#define WEXITSTATUS(w) (((w) >> 8) & 0xff)
1013#define WTERMSIG(w) ((w) & 0x7f)
1014#define WSTOPSIG WEXITSTATUS
1015#endif
1016
1017/* prototypes */
1018void WIN32_maperror(unsigned long WIN32_oserrno);
1019
1020#endif /* _SQUID_WINDOWS_ */
1021#endif /* SQUID_OS_MSWINDOWS_H */
1022
int size
Definition: ModDevPoll.cc:75
DWORD WIN32_IpAddrChangeMonitorInit()
Definition: WinSvc.cc:441
#define inet_ntop
Definition: inet_ntop.h:25
#define inet_pton
Definition: inet_pton.h:28
struct hostent * gethostbyaddr()
struct servent * getservbyname()
struct hostent * gethostbyname()
#define SQUIDCEXTERN
Definition: squid.h:21
int unsigned int
Definition: stub_fd.cc:19
#define NULL
Definition: types.h:160
int socklen_t
Definition: types.h:152

 

Introduction

Documentation

Support

Miscellaneous

Web Site Translations

Mirrors