2
* $Id: squid_mswin.h,v 1.2 2006/09/09 15:29:59 serassio Exp $
4
* AUTHOR: Andrey Shorin <tolsty@tushino.com>
5
* AUTHOR: Guido Serassio <serassio@squid-cache.org>
7
* SQUID Web Proxy Cache http://www.squid-cache.org/
8
* ----------------------------------------------------------
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.
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.
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.
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.
35
#define ACL WindowsACL
36
#if defined(_MSC_VER) /* Microsoft C Compiler ONLY */
38
#define _CRT_SECURE_NO_DEPRECATE
39
#pragma warning( disable : 4290 )
40
#pragma warning( disable : 4996 )
44
#if defined _FILE_OFFSET_BITS && _FILE_OFFSET_BITS == 64
45
# define __USE_FILE_OFFSET64 1
48
#if defined(_MSC_VER) /* Microsoft C Compiler ONLY */
50
typedef unsigned short uint16_t;
51
typedef unsigned int uint32_t;
52
typedef unsigned __int64 uint64_t;
56
#if defined __USE_FILE_OFFSET64
57
typedef int64_t off_t;
58
typedef uint64_t ino_t;
62
typedef unsigned long ino_t;
66
#define INT64_MAX _I64_MAX
67
#define INT64_MIN _I64_MIN
70
#include "default_config_file.h"
71
/* Some tricks for MS Compilers */
73
#pragma include_alias(<dirent.h>, <direct.h>)
74
#define THREADLOCAL __declspec(thread)
76
#elif defined(__GNUC__) /* gcc environment */
78
#define THREADLOCAL __attribute__((section(".tls")))
82
#if defined(_MSC_VER) /* Microsoft C Compiler ONLY */
83
#define alloca _alloca
88
#define fdopen _fdopen
89
#if defined(_MSC_VER) /* Microsoft C Compiler ONLY */
90
#define fileno _fileno
91
#define fstat _fstati64
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
103
#define pclose _pclose
104
#define pipe WIN32_pipe
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
118
#define truncate WIN32_truncate
120
#define unlink _unlink
121
#if defined(_MSC_VER) /* Microsoft C Compiler ONLY */
122
#define vsnprintf _vsnprintf
125
#define O_RDONLY _O_RDONLY
126
#define O_WRONLY _O_WRONLY
127
#define O_RDWR _O_RDWR
128
#define O_APPEND _O_APPEND
130
#define O_CREAT _O_CREAT
131
#define O_TRUNC _O_TRUNC
132
#define O_EXCL _O_EXCL
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
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
152
#if defined(_MSC_VER) /* Microsoft C Compiler ONLY */
153
#define S_ISDIR(m) (((m) & _S_IFDIR) == _S_IFDIR)
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 */
164
typedef unsigned short int ushort;
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 */
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 */
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 */
200
int tz_minuteswest; /* minutes west of Greenwich */
201
int tz_dsttime; /* type of dst correction */
204
#define CHANGE_FD_SETSIZE 1
205
#if CHANGE_FD_SETSIZE && SQUID_MAXFD > DEFAULT_FD_SETSIZE
206
#define FD_SETSIZE SQUID_MAXFD
212
#if defined(_MSC_VER) /* Microsoft C Compiler ONLY */
213
/* Hack to suppress compiler warnings on FD_SET() & FD_CLR() */
214
#pragma warning (push)
215
#pragma warning (disable:4142)
217
/* prevent inclusion of wingdi.h */
220
#if defined(_MSC_VER) /* Microsoft C Compiler ONLY */
221
#pragma warning (pop)
226
#include <sys/types.h>
229
typedef char * caddr_t;
235
#define EISCONN WSAEISCONN
236
#define EINPROGRESS WSAEINPROGRESS
237
#define EWOULDBLOCK WSAEWOULDBLOCK
238
#define EALREADY WSAEALREADY
239
#define ETIMEDOUT WSAETIMEDOUT
240
#define ECONNREFUSED WSAECONNREFUSED
241
#define ECONNRESET WSAECONNRESET
242
#define ENOTCONN WSAENOTCONN
243
#define ERESTART WSATRY_AGAIN
246
#define h_errno errno /* we'll set it ourselves */
249
#define FD_CLR(fd, set) do { \
251
SOCKET __sock = fd_table[fd].win32.handle; \
252
for (__i = 0; __i < ((fd_set FAR *)(set))->fd_count ; __i++) { \
253
if (((fd_set FAR *)(set))->fd_array[__i] == __sock) { \
254
while (__i < ((fd_set FAR *)(set))->fd_count-1) { \
255
((fd_set FAR *)(set))->fd_array[__i] = \
256
((fd_set FAR *)(set))->fd_array[__i+1]; \
259
((fd_set FAR *)(set))->fd_count--; \
266
#define FD_SET(fd, set) do { \
268
SOCKET __sock = fd_table[fd].win32.handle; \
269
for (__i = 0; __i < ((fd_set FAR *)(set))->fd_count; __i++) { \
270
if (((fd_set FAR *)(set))->fd_array[__i] == (__sock)) { \
274
if (__i == ((fd_set FAR *)(set))->fd_count) { \
275
if (((fd_set FAR *)(set))->fd_count < FD_SETSIZE) { \
276
((fd_set FAR *)(set))->fd_array[__i] = (__sock); \
277
((fd_set FAR *)(set))->fd_count++; \
283
#define FD_ISSET(fd, set) Win32__WSAFDIsSet(fd, (fd_set FAR *)(set))
285
/* internal to Microsoft CRTLIB */
287
long osfhnd; /* underlying OS file HANDLE */
288
char osfile; /* attributes of file (e.g., open in text mode?) */
289
char pipech; /* one char buffer for handles opened on pipes */
292
CRITICAL_SECTION lock;
296
#define IOINFO_ARRAY_ELTS (1 << IOINFO_L2E)
297
#define _pioinfo(i) ( __pioinfo[(i) >> IOINFO_L2E] + ((i) & (IOINFO_ARRAY_ELTS - 1)) )
298
#define _osfile(i) ( _pioinfo(i)->osfile )
299
#define _osfhnd(i) ( _pioinfo(i)->osfhnd )
300
#define FOPEN 0x01 /* file handle open */
302
#if defined(_MSC_VER) /* Microsoft C Compiler ONLY */
304
SQUIDCEXTERN _CRTIMP ioinfo * __pioinfo[];
305
SQUIDCEXTERN int __cdecl _free_osfhnd(int);
307
#elif defined(__MINGW32__) /* MinGW environment */
309
__MINGW_IMPORT ioinfo * __pioinfo[];
310
SQUIDCEXTERN int _free_osfhnd(int);
314
SQUIDCEXTERN THREADLOCAL int ws32_result;
316
#define strerror(e) WIN32_strerror(e)
323
char l_so_type[sizeof(int)];
324
int l_so_type_siz = sizeof(l_so_type);
325
SOCKET sock = _get_osfhandle(fd);
327
if (::getsockopt(sock, SOL_SOCKET, SO_TYPE, l_so_type, &l_so_type_siz) == 0){
329
if (closesocket(sock) == SOCKET_ERROR) {
330
errno = WSAGetLastError();
341
#if defined(_MSC_VER) /* Microsoft C Compiler ONLY */
344
#define _S_IREAD 0x0100
348
#define _S_IWRITE 0x0080
352
int open(const char *filename, int oflag, int pmode = 0)
354
return _open(filename, oflag, pmode & (_S_IREAD | _S_IWRITE));
359
int read(int fd, void * buf, size_t siz)
361
char l_so_type[sizeof(int)];
362
int l_so_type_siz = sizeof(l_so_type);
363
SOCKET sock = _get_osfhandle(fd);
365
if (::getsockopt(sock, SOL_SOCKET, SO_TYPE, l_so_type, &l_so_type_siz) == 0)
366
return ::recv(sock, (char FAR *) buf, (int)siz, 0);
368
return _read(fd, buf, (unsigned int)siz);
372
int write(int fd, const void * buf, size_t siz)
374
char l_so_type[sizeof(int)];
375
int l_so_type_siz = sizeof(l_so_type);
376
SOCKET sock = _get_osfhandle(fd);
378
if (::getsockopt(sock, SOL_SOCKET, SO_TYPE, l_so_type, &l_so_type_siz) == 0)
379
return ::send(sock, (char FAR *) buf, siz, 0);
381
return _write(fd, buf, siz);
385
char *index(const char *s, int c)
387
return (char *)strchr(s,c);
393
int accept(int s, struct sockaddr * a, int * l)
396
if ((result = ::accept(_get_osfhandle(s), a, l)) == INVALID_SOCKET) {
397
if (WSAEMFILE == (errno = WSAGetLastError()))
402
return _open_osfhandle(result, 0);
406
int bind(int s, struct sockaddr * n, int l)
408
if (::bind(_get_osfhandle(s),n,l) == SOCKET_ERROR) {
409
errno = WSAGetLastError();
417
int connect(int s, const struct sockaddr * n, int l)
419
if (::connect(_get_osfhandle(s),n,l) == SOCKET_ERROR) {
420
if (WSAEMFILE == (errno = WSAGetLastError()))
429
struct hostent * gethostbyname (const char *n)
431
HOSTENT FAR * result;
432
if ((result = ::gethostbyname(n)) == NULL)
433
errno = WSAGetLastError();
436
#define gethostbyname(n) Squid::gethostbyname(n)
439
SERVENT FAR* getservbyname (const char * n, const char * p)
441
SERVENT FAR * result;
442
if ((result = ::getservbyname(n, p)) == NULL)
443
errno = WSAGetLastError();
446
#define getservbyname(n,p) Squid::getservbyname(n,p)
449
HOSTENT FAR * gethostbyaddr(const char * a, int l, int t)
451
HOSTENT FAR * result;
452
if ((result = ::gethostbyaddr(a, l, t)) == NULL)
453
errno = WSAGetLastError();
456
#define gethostbyaddr(a,l,t) Squid::gethostbyaddr(a,l,t)
459
int getsockname(int s, struct sockaddr * n, int * l)
461
if ((::getsockname(_get_osfhandle(s), n, l)) == SOCKET_ERROR) {
462
errno = WSAGetLastError();
470
int gethostname(char * n, size_t l)
472
if ((::gethostname(n, l)) == SOCKET_ERROR) {
473
errno = WSAGetLastError();
479
#define gethostname(n,l) Squid::gethostname(n,l)
482
int getsockopt(int s, int l, int o, void * v, int * n)
485
if ((::getsockopt(_get_osfhandle(s), l, o,(char *) v, n)) == SOCKET_ERROR) {
486
errno = WSAGetLastError();
493
/* Simple ioctl() emulation */
495
int ioctl(int s, int c, void * a)
497
if ((::ioctlsocket(_get_osfhandle(s), c, (u_long FAR *)a)) == SOCKET_ERROR) {
498
errno = WSAGetLastError();
506
int ioctlsocket(int s, long c, u_long FAR * a)
508
if ((::ioctlsocket(_get_osfhandle(s), c, a)) == SOCKET_ERROR) {
509
errno = WSAGetLastError();
517
int listen(int s, int b)
519
if (::listen(_get_osfhandle(s), b) == SOCKET_ERROR) {
520
if (WSAEMFILE == (errno = WSAGetLastError()))
527
#define listen(s,b) Squid::listen(s,b)
530
int recv(int s, void * b, size_t l, int f)
533
if ((result = ::recv(_get_osfhandle(s), (char *)b, l, f)) == SOCKET_ERROR) {
534
errno = WSAGetLastError();
542
int recvfrom(int s, void * b, size_t l, int f, struct sockaddr * fr, int * fl)
545
if ((result = ::recvfrom(_get_osfhandle(s), (char *)b, l, f, fr, fl)) == SOCKET_ERROR) {
546
errno = WSAGetLastError();
554
int select(int n, fd_set * r, fd_set * w, fd_set * e, struct timeval * t)
557
if ((result = ::select(n,r,w,e,t)) == SOCKET_ERROR) {
558
errno = WSAGetLastError();
564
#define select(n,r,w,e,t) Squid::select(n,r,w,e,t)
567
int send(int s, const void * b, size_t l, int f)
570
if ((result = ::send(_get_osfhandle(s), (char *)b, l, f)) == SOCKET_ERROR) {
571
errno = WSAGetLastError();
579
int sendto(int s, const void * b, size_t l, int f, const struct sockaddr * t, int tl)
582
if ((result = ::sendto(_get_osfhandle(s), (char *)b, l, f, t, tl)) == SOCKET_ERROR) {
583
errno = WSAGetLastError();
591
int setsockopt(SOCKET s, int l, int o, const char * v, int n)
595
socket = ((s == INVALID_SOCKET) ? s : (SOCKET)_get_osfhandle((int)s));
597
if (::setsockopt(socket, l, o, v, n) == SOCKET_ERROR) {
598
errno = WSAGetLastError();
604
#define setsockopt(s,l,o,v,n) Squid::setsockopt(s,l,o,v,n)
607
int shutdown(int s, int h)
609
if (::shutdown(_get_osfhandle(s),h) == SOCKET_ERROR) {
610
errno = WSAGetLastError();
618
int socket(int f, int t, int p)
621
if ((result = ::socket(f, t, p)) == INVALID_SOCKET) {
622
if (WSAEMFILE == (errno = WSAGetLastError()))
627
return _open_osfhandle(result, 0);
629
#define socket(f,t,p) Squid::socket(f,t,p)
632
int WSAAsyncSelect(int s, HWND h, unsigned int w, long e)
634
if (::WSAAsyncSelect(_get_osfhandle(s), h, w, e) == SOCKET_ERROR) {
635
errno = WSAGetLastError();
642
#undef WSADuplicateSocket
644
int WSADuplicateSocket(int s, DWORD n, LPWSAPROTOCOL_INFO l)
647
if (::WSADuplicateSocketW(_get_osfhandle(s), n, l) == SOCKET_ERROR) {
649
if (::WSADuplicateSocketA(_get_osfhandle(s), n, l) == SOCKET_ERROR) {
651
errno = WSAGetLastError();
660
int WSASocket(int a, int t, int p, LPWSAPROTOCOL_INFO i, GROUP g, DWORD f)
664
if ((result = ::WSASocketW(a, t, p, i, g, f)) == INVALID_SOCKET) {
666
if ((result = ::WSASocketA(a, t, p, i, g, f)) == INVALID_SOCKET) {
668
if (WSAEMFILE == (errno = WSAGetLastError()))
673
return _open_osfhandle(result, 0);
676
} /* namespace Squid */
678
#else /* #ifdef __cplusplus */
679
#define connect(s,n,l) \
680
(SOCKET_ERROR == connect(_get_osfhandle(s),n,l) ? \
681
(WSAEMFILE == (errno = WSAGetLastError()) ? errno = EMFILE : -1, -1) : 0)
682
#define gethostbyname(n) \
683
(NULL == ((HOSTENT FAR*)(ws32_result = (int)gethostbyname(n))) ? \
684
(errno = WSAGetLastError()), (HOSTENT FAR*)NULL : (HOSTENT FAR*)ws32_result)
685
#define gethostname(n,l) \
686
(SOCKET_ERROR == gethostname(n,l) ? \
687
(errno = WSAGetLastError()), -1 : 0)
688
#define recv(s,b,l,f) \
689
(SOCKET_ERROR == (ws32_result = recv(_get_osfhandle(s),b,l,f)) ? \
690
(errno = WSAGetLastError()), -1 : ws32_result)
691
#define sendto(s,b,l,f,t,tl) \
692
(SOCKET_ERROR == (ws32_result = sendto(_get_osfhandle(s),b,l,f,t,tl)) ? \
693
(errno = WSAGetLastError()), -1 : ws32_result)
694
#define select(n,r,w,e,t) \
695
(SOCKET_ERROR == (ws32_result = select(n,r,w,e,t)) ? \
696
(errno = WSAGetLastError()), -1 : ws32_result)
697
#define socket(f,t,p) \
698
(INVALID_SOCKET == ((SOCKET)(ws32_result = (int)socket(f,t,p))) ? \
699
((WSAEMFILE == (errno = WSAGetLastError()) ? errno = EMFILE : -1), -1) : \
700
(SOCKET)_open_osfhandle(ws32_result,0))
701
#define write _write /* Needed in util.c */
702
#define open _open /* Needed in win32lib.c */
703
#endif /* #ifdef __cplusplus */
705
#define RUSAGE_SELF 0 /* calling process */
706
#define RUSAGE_CHILDREN -1 /* terminated child processes */
709
struct timeval ru_utime; /* user time used */
710
struct timeval ru_stime; /* system time used */
711
long ru_maxrss; /* integral max resident set size */
712
long ru_ixrss; /* integral shared text memory size */
713
long ru_idrss; /* integral unshared data size */
714
long ru_isrss; /* integral unshared stack size */
715
long ru_minflt; /* page reclaims */
716
long ru_majflt; /* page faults */
717
long ru_nswap; /* swaps */
718
long ru_inblock; /* block input operations */
719
long ru_oublock; /* block output operations */
720
long ru_msgsnd; /* messages sent */
721
long ru_msgrcv; /* messages received */
722
long ru_nsignals; /* signals received */
723
long ru_nvcsw; /* voluntary context switches */
724
long ru_nivcsw; /* involuntary context switches */
729
SQUIDCEXTERN int chroot (const char *);
730
SQUIDCEXTERN int ftruncate(int, off_t);
731
SQUIDCEXTERN int gettimeofday(struct timeval * ,void *);
732
SQUIDCEXTERN int kill(pid_t, int);
733
SQUIDCEXTERN int statfs(const char *, struct statfs *);
734
SQUIDCEXTERN int truncate(const char *, off_t);
735
SQUIDCEXTERN const char * wsastrerror(int);
736
SQUIDCEXTERN struct passwd *getpwnam(char *);
737
SQUIDCEXTERN struct group *getgrnam(char *);
738
SQUIDCEXTERN uid_t geteuid(void);
739
SQUIDCEXTERN uid_t getuid(void);
740
SQUIDCEXTERN int setuid(uid_t);
741
SQUIDCEXTERN int seteuid(uid_t);
742
SQUIDCEXTERN gid_t getgid(void);
743
SQUIDCEXTERN gid_t getegid(void);
744
SQUIDCEXTERN int setgid(gid_t);
745
SQUIDCEXTERN int setegid(gid_t);
746
SQUIDCEXTERN const char *WIN32_strerror(int);
747
SQUIDCEXTERN void WIN32_maperror(unsigned long);