14#ifndef SQUID_COMPAT_OS_MSWINDOWS_H
15#define SQUID_COMPAT_OS_MSWINDOWS_H
43#define _CRT_SECURE_NO_DEPRECATE
44#pragma warning( disable : 4290 )
45#pragma warning( disable : 4996 )
49#if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS == 64
50# define __USE_FILE_OFFSET64 1
55#if defined(__USE_FILE_OFFSET64)
56typedef uint64_t ino_t;
58typedef unsigned long ino_t;
61#define INT64_MAX _I64_MAX
62#define INT64_MIN _I64_MIN
64#include "default_config_file.h"
67#define THREADLOCAL __declspec(thread)
69#elif defined(__GNUC__)
71#define THREADLOCAL __attribute__((section(".tls")))
79#define fstat _fstati64
80#define lseek _lseeki64
81#define memccpy _memccpy
83#define snprintf _snprintf
85#define strcasecmp _stricmp
87#define strncasecmp _strnicmp
88#define tempnam _tempnam
89#define vsnprintf _vsnprintf
93#if defined(_MSC_VER) || _SQUID_CYGWIN_
95#define ftruncate WIN32_ftruncate
96SQUIDCEXTERN int WIN32_truncate(
const char *pathname, off_t length);
97#define truncate WIN32_truncate
104#define fdopen _fdopen
105#define getcwd _getcwd
106#define getpid _getpid
107#define mkdir(p,F) mkdir((p))
108#define pclose _pclose
112setenv(
const char *
const name,
const char *
const value,
const int overwrite)
114 if (!overwrite && getenv(name))
122 return (_putenv_s(name, value) == 0 ? 0 : -1);
125#define setmode _setmode
126#define sleep(t) Sleep((t)*1000)
128#define unlink _unlink
131#define O_RDONLY _O_RDONLY
134#define O_WRONLY _O_WRONLY
137#define O_RDWR _O_RDWR
140#define O_APPEND _O_APPEND
143#define O_CREAT _O_CREAT
146#define O_TRUNC _O_TRUNC
149#define O_EXCL _O_EXCL
152#define O_TEXT _O_TEXT
155#define O_BINARY _O_BINARY
158#define O_RAW _O_BINARY
161#define O_TEMPORARY _O_TEMPORARY
164#define O_NOINHERIT _O_NOINHERIT
167#define O_SEQUENTIAL _O_SEQUENTIAL
170#define O_RANDOM _O_RANDOM
177#define S_IFMT _S_IFMT
180#define S_IFDIR _S_IFDIR
183#define S_IFCHR _S_IFCHR
186#define S_IFREG _S_IFREG
189#define S_IREAD _S_IREAD
192#define S_IWRITE _S_IWRITE
195#define S_IEXEC _S_IEXEC
220#define S_ISDIR(m) (((m) & _S_IFDIR) == _S_IFDIR)
253#if !HAVE_GETTIMEOFDAY
260#define CHANGE_FD_SETSIZE 1
261#if CHANGE_FD_SETSIZE && SQUID_MAXFD > DEFAULT_FD_SETSIZE
262#define FD_SETSIZE SQUID_MAXFD
276#if (EAI_NODATA == EAI_NONAME)
278#define EAI_NODATA WSANO_DATA
283#pragma warning (push)
284#pragma warning (disable:4142)
298#define EISCONN WSAEISCONN
301#define EINPROGRESS WSAEINPROGRESS
304#define EWOULDBLOCK WSAEWOULDBLOCK
307#define EALREADY WSAEALREADY
310#define ETIMEDOUT WSAETIMEDOUT
313#define ECONNREFUSED WSAECONNREFUSED
316#define ECONNRESET WSAECONNRESET
319#define ENOTCONN WSAENOTCONN
322#define ERESTART WSATRY_AGAIN
325#define EAFNOSUPPORT WSAEAFNOSUPPORT
328#define ENETUNREACH WSAENETUNREACH
331#define ENOTSUP WSAEOPNOTSUPP
334#define ECONNABORTED WSAECONNABORTED
341#define FD_CLR(fd, set) do { \
343 SOCKET __sock = _get_osfhandle(fd); \
344 for (__i = 0; __i < ((fd_set FAR *)(set))->fd_count ; __i++) { \
345 if (((fd_set FAR *)(set))->fd_array[__i] == __sock) { \
346 while (__i < ((fd_set FAR *)(set))->fd_count-1) { \
347 ((fd_set FAR *)(set))->fd_array[__i] = \
348 ((fd_set FAR *)(set))->fd_array[__i+1]; \
351 ((fd_set FAR *)(set))->fd_count--; \
358#define FD_SET(fd, set) do { \
360 SOCKET __sock = _get_osfhandle(fd); \
361 for (__i = 0; __i < ((fd_set FAR *)(set))->fd_count; __i++) { \
362 if (((fd_set FAR *)(set))->fd_array[__i] == (__sock)) { \
366 if (__i == ((fd_set FAR *)(set))->fd_count) { \
367 if (((fd_set FAR *)(set))->fd_count < FD_SETSIZE) { \
368 ((fd_set FAR *)(set))->fd_array[__i] = (__sock); \
369 ((fd_set FAR *)(set))->fd_count++; \
375#define FD_ISSET(fd, set) Win32__WSAFDIsSet(fd, (fd_set FAR *)(set))
384 CRITICAL_SECTION lock;
388#define IOINFO_ARRAY_ELTS (1 << IOINFO_L2E)
389#define _pioinfo(i) ( __pioinfo[(i) >> IOINFO_L2E] + ((i) & (IOINFO_ARRAY_ELTS - 1)) )
390#define _osfile(i) ( _pioinfo(i)->osfile )
391#define _osfhnd(i) ( _pioinfo(i)->osfhnd )
403#if defined(__cplusplus)
430ioctl(
int s,
int c,
void * a)
432 if ((::ioctlsocket(_get_osfhandle(s), c, (u_long FAR *)a)) == SOCKET_ERROR) {
433 errno = WSAGetLastError();
438#define ioctl(s,c,a) Squid::ioctl(s,c,a)
441ioctlsocket(
int s,
long c, u_long FAR * a)
443 if ((::ioctlsocket(_get_osfhandle(s), c, a)) == SOCKET_ERROR) {
444 errno = WSAGetLastError();
449#define ioctlsocket(s,c,a) Squid::ioctlsocket(s,c,a)
452shutdown(
int s,
int h)
454 if (::shutdown(_get_osfhandle(s),h) == SOCKET_ERROR) {
455 errno = WSAGetLastError();
460#define shutdown(s,h) Squid::shutdown(s,h)
462#undef WSADuplicateSocket
464WSADuplicateSocket(
int s, DWORD n, LPWSAPROTOCOL_INFO l)
467 if (::WSADuplicateSocketW(_get_osfhandle(s), n, l) == SOCKET_ERROR) {
469 if (::WSADuplicateSocketA(_get_osfhandle(s), n, l) == SOCKET_ERROR) {
471 errno = WSAGetLastError();
476#define WSADuplicateSocket(s,n,l) Squid::WSADuplicateSocket(s,n,l)
480WSASocket(
int a,
int t,
int p, LPWSAPROTOCOL_INFO i, GROUP g, DWORD f)
484 if ((result = ::WSASocketW(a, t, p, i, g, f)) == INVALID_SOCKET) {
486 if ((result = ::WSASocketA(a, t, p, i, g, f)) == INVALID_SOCKET) {
488 if (WSAEMFILE == (errno = WSAGetLastError()))
492 return _open_osfhandle(result, 0);
494#define WSASocket(a,t,p,i,g,f) Squid::WSASocket(a,t,p,i,g,f)
508#if HAVE_SYS_RESOURCE_H
509#include <sys/resource.h>
512#define RUSAGE_CHILDREN -1
515 struct timeval ru_utime;
516 struct timeval ru_stime;
585#define HAVE_GETPAGESIZE 2
599#define ACL WindowsACL
600#define _MSWIN_ACL_WAS_NOT_DEFINED 1
603#if _MSWIN_ACL_WAS_NOT_DEFINED
605#undef _MSWIN_ACL_WAS_NOT_DEFINED
619#define LOG_DAEMON (3<<3)
621void openlog(
const char *ident,
int logopt,
int facility);
622void syslog(
int priority,
const char *fmt, ...);
DWORD WIN32_IpAddrChangeMonitorInit()