/*
- * $Id: squid_mswin.h,v 1.3 2006/12/24 14:19:28 serassio Exp $
+ * $Id$
*
* AUTHOR: Andrey Shorin <tolsty@tushino.com>
* AUTHOR: Guido Serassio <serassio@squid-cache.org>
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
- *
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
*
*/
+#ifndef _INC_SQUID_MSWIN_H
+#define _INC_SQUID_MSWIN_H
+
+#include "config.h"
+
+#ifdef _SQUID_WIN32_
#define ACL WindowsACL
#if defined(_MSC_VER) /* Microsoft C Compiler ONLY */
#if defined(_MSC_VER) /* Microsoft C Compiler ONLY */
+typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
typedef unsigned int uint32_t;
typedef unsigned __int64 uint64_t;
#define INT64_MAX _I64_MAX
#define INT64_MIN _I64_MIN
-#define PRId64 "I64d"
#include "default_config_file.h"
/* Some tricks for MS Compilers */
#define __STDC__ 1
-#pragma include_alias(<dirent.h>, <direct.h>)
#define THREADLOCAL __declspec(thread)
#elif defined(__GNUC__) /* gcc environment */
};
struct statfs {
- long f_type; /* type of filesystem (see below) */
- long f_bsize; /* optimal transfer block size */
- long f_blocks; /* total data blocks in file system */
- long f_bfree; /* free blocks in fs */
- long f_bavail; /* free blocks avail to non-superuser */
- long f_files; /* total file nodes in file system */
- long f_ffree; /* free file nodes in fs */
- long f_fsid; /* file system id */
- long f_namelen; /* maximum length of filenames */
- long f_spare[6]; /* spare for later */
+ long f_type; /* type of filesystem (see below) */
+ long f_bsize; /* optimal transfer block size */
+ long f_blocks; /* total data blocks in file system */
+ long f_bfree; /* free blocks in fs */
+ long f_bavail; /* free blocks avail to non-superuser */
+ long f_files; /* total file nodes in file system */
+ long f_ffree; /* free file nodes in fs */
+ long f_fsid; /* file system id */
+ long f_namelen; /* maximum length of filenames */
+ long f_spare[6]; /* spare for later */
};
#ifndef HAVE_GETTIMEOFDAY
-struct timezone
- {
+struct timezone {
int tz_minuteswest; /* minutes west of Greenwich */
int tz_dsttime; /* type of dst correction */
- };
+};
#endif
#define CHANGE_FD_SETSIZE 1
#include <process.h>
#include <errno.h>
#if defined(_MSC_VER) /* Microsoft C Compiler ONLY */
+#include <winsock2.h>
+#endif
+#include <ws2tcpip.h>
+#if (EAI_NODATA == EAI_NONAME)
+#undef EAI_NODATA
+#define EAI_NODATA WSANO_DATA
+#endif
+#if defined(_MSC_VER) /* Microsoft C Compiler ONLY */
/* Hack to suppress compiler warnings on FD_SET() & FD_CLR() */
#pragma warning (push)
#pragma warning (disable:4142)
#include <ws2spi.h>
#if defined(_MSC_VER) /* Microsoft C Compiler ONLY */
#pragma warning (pop)
-#include "readdir.h"
-#else
+#endif
#include <io.h>
#include <stdlib.h>
-#include <sys/types.h>
-#endif
typedef char * caddr_t;
#undef FD_READ
#undef FD_WRITE
#define EISCONN WSAEISCONN
-#define EINPROGRESS WSAEINPROGRESS
+#define EINPROGRESS WSAEINPROGRESS
#define EWOULDBLOCK WSAEWOULDBLOCK
#define EALREADY WSAEALREADY
#define ETIMEDOUT WSAETIMEDOUT
#define ECONNRESET WSAECONNRESET
#define ENOTCONN WSAENOTCONN
#define ERESTART WSATRY_AGAIN
+#define EAFNOSUPPORT WSAEAFNOSUPPORT
#undef h_errno
#define h_errno errno /* we'll set it ourselves */
#undef FD_CLR
#define FD_CLR(fd, set) do { \
u_int __i; \
- SOCKET __sock = fd_table[fd].win32.handle; \
+ SOCKET __sock = _get_osfhandle(fd); \
for (__i = 0; __i < ((fd_set FAR *)(set))->fd_count ; __i++) { \
if (((fd_set FAR *)(set))->fd_array[__i] == __sock) { \
while (__i < ((fd_set FAR *)(set))->fd_count-1) { \
#undef FD_SET
#define FD_SET(fd, set) do { \
u_int __i; \
- SOCKET __sock = fd_table[fd].win32.handle; \
+ SOCKET __sock = _get_osfhandle(fd); \
for (__i = 0; __i < ((fd_set FAR *)(set))->fd_count; __i++) { \
if (((fd_set FAR *)(set))->fd_array[__i] == (__sock)) { \
break; \
/* internal to Microsoft CRTLIB */
typedef struct {
- long osfhnd; /* underlying OS file HANDLE */
- char osfile; /* attributes of file (e.g., open in text mode?) */
- char pipech; /* one char buffer for handles opened on pipes */
+ long osfhnd; /* underlying OS file HANDLE */
+ char osfile; /* attributes of file (e.g., open in text mode?) */
+ char pipech; /* one char buffer for handles opened on pipes */
#ifdef _MT
- int lockinitflag;
- CRITICAL_SECTION lock;
+ int lockinitflag;
+ CRITICAL_SECTION lock;
#endif /* _MT */
- } ioinfo;
+} ioinfo;
#define IOINFO_L2E 5
#define IOINFO_ARRAY_ELTS (1 << IOINFO_L2E)
#define _pioinfo(i) ( __pioinfo[(i) >> IOINFO_L2E] + ((i) & (IOINFO_ARRAY_ELTS - 1)) )
int l_so_type_siz = sizeof(l_so_type);
SOCKET sock = _get_osfhandle(fd);
- if (::getsockopt(sock, SOL_SOCKET, SO_TYPE, l_so_type, &l_so_type_siz) == 0){
+ if (::getsockopt(sock, SOL_SOCKET, SO_TYPE, l_so_type, &l_so_type_siz) == 0) {
int result = 0;
- if (closesocket(sock) == SOCKET_ERROR) {
- errno = WSAGetLastError();
- result = 1;
- }
- _free_osfhnd(fd);
- _osfile(fd) = 0;
- return result;
- }
- else
- return _close(fd);
+ if (closesocket(sock) == SOCKET_ERROR) {
+ errno = WSAGetLastError();
+ result = 1;
+ }
+ _free_osfhnd(fd);
+ _osfile(fd) = 0;
+ return result;
+ } else
+ return _close(fd);
}
#if defined(_MSC_VER) /* Microsoft C Compiler ONLY */
SOCKET sock = _get_osfhandle(fd);
if (::getsockopt(sock, SOL_SOCKET, SO_TYPE, l_so_type, &l_so_type_siz) == 0)
- return ::recv(sock, (char FAR *) buf, (int)siz, 0);
+ return ::recv(sock, (char FAR *) buf, (int)siz, 0);
else
- return _read(fd, buf, (unsigned int)siz);
+ return _read(fd, buf, (unsigned int)siz);
}
inline
SOCKET sock = _get_osfhandle(fd);
if (::getsockopt(sock, SOL_SOCKET, SO_TYPE, l_so_type, &l_so_type_siz) == 0)
- return ::send(sock, (char FAR *) buf, siz, 0);
+ return ::send(sock, (char FAR *) buf, siz, 0);
else
- return _write(fd, buf, siz);
+ return _write(fd, buf, siz);
}
-inline
+inline
char *index(const char *s, int c)
{
return (char *)strchr(s,c);
}
-namespace Squid {
+/** \cond AUTODOCS-IGNORE */
+namespace Squid
+{
+/** \endcond */
inline
-int accept(int s, struct sockaddr * a, int * l)
+int accept(int s, struct sockaddr * a, size_t * l)
{
SOCKET result;
- if ((result = ::accept(_get_osfhandle(s), a, l)) == INVALID_SOCKET) {
- if (WSAEMFILE == (errno = WSAGetLastError()))
- errno = EMFILE;
- return -1;
- }
- else
- return _open_osfhandle(result, 0);
+ if ((result = ::accept(_get_osfhandle(s), a, (int *)l)) == INVALID_SOCKET) {
+ if (WSAEMFILE == (errno = WSAGetLastError()))
+ errno = EMFILE;
+ return -1;
+ } else
+ return _open_osfhandle(result, 0);
}
inline
int bind(int s, struct sockaddr * n, int l)
{
if (::bind(_get_osfhandle(s),n,l) == SOCKET_ERROR) {
- errno = WSAGetLastError();
- return -1;
- }
- else
- return 0;
+ errno = WSAGetLastError();
+ return -1;
+ } else
+ return 0;
}
inline
int connect(int s, const struct sockaddr * n, int l)
{
if (::connect(_get_osfhandle(s),n,l) == SOCKET_ERROR) {
- if (WSAEMFILE == (errno = WSAGetLastError()))
- errno = EMFILE;
- return -1;
- }
- else
- return 0;
+ if (WSAEMFILE == (errno = WSAGetLastError()))
+ errno = EMFILE;
+ return -1;
+ } else
+ return 0;
}
-inline
-struct hostent * gethostbyname (const char *n)
-{
- HOSTENT FAR * result;
+inline
+struct hostent * gethostbyname (const char *n) {
+ HOSTENT FAR * result;
if ((result = ::gethostbyname(n)) == NULL)
- errno = WSAGetLastError();
+ errno = WSAGetLastError();
return result;
}
#define gethostbyname(n) Squid::gethostbyname(n)
{
SERVENT FAR * result;
if ((result = ::getservbyname(n, p)) == NULL)
- errno = WSAGetLastError();
+ errno = WSAGetLastError();
return result;
}
#define getservbyname(n,p) Squid::getservbyname(n,p)
{
HOSTENT FAR * result;
if ((result = ::gethostbyaddr(a, l, t)) == NULL)
- errno = WSAGetLastError();
+ errno = WSAGetLastError();
return result;
}
#define gethostbyaddr(a,l,t) Squid::gethostbyaddr(a,l,t)
inline
-int getsockname(int s, struct sockaddr * n, int * l)
+int getsockname(int s, struct sockaddr * n, size_t * l)
{
- if ((::getsockname(_get_osfhandle(s), n, l)) == SOCKET_ERROR) {
- errno = WSAGetLastError();
- return -1;
- }
- else
- return 0;
+ if ((::getsockname(_get_osfhandle(s), n, (int *)l)) == SOCKET_ERROR) {
+ errno = WSAGetLastError();
+ return -1;
+ } else
+ return 0;
}
inline
int gethostname(char * n, size_t l)
{
if ((::gethostname(n, l)) == SOCKET_ERROR) {
- errno = WSAGetLastError();
- return -1;
- }
- else
- return 0;
+ errno = WSAGetLastError();
+ return -1;
+ } else
+ return 0;
}
#define gethostname(n,l) Squid::gethostname(n,l)
{
Sleep(1);
if ((::getsockopt(_get_osfhandle(s), l, o,(char *) v, n)) == SOCKET_ERROR) {
- errno = WSAGetLastError();
- return -1;
- }
- else
- return 0;
+ errno = WSAGetLastError();
+ return -1;
+ } else
+ return 0;
}
/* Simple ioctl() emulation */
int ioctl(int s, int c, void * a)
{
if ((::ioctlsocket(_get_osfhandle(s), c, (u_long FAR *)a)) == SOCKET_ERROR) {
- errno = WSAGetLastError();
- return -1;
- }
- else
- return 0;
+ errno = WSAGetLastError();
+ return -1;
+ } else
+ return 0;
}
inline
int ioctlsocket(int s, long c, u_long FAR * a)
{
if ((::ioctlsocket(_get_osfhandle(s), c, a)) == SOCKET_ERROR) {
- errno = WSAGetLastError();
- return -1;
- }
- else
- return 0;
+ errno = WSAGetLastError();
+ return -1;
+ } else
+ return 0;
}
inline
int listen(int s, int b)
{
if (::listen(_get_osfhandle(s), b) == SOCKET_ERROR) {
- if (WSAEMFILE == (errno = WSAGetLastError()))
- errno = EMFILE;
- return -1;
- }
- else
- return 0;
+ if (WSAEMFILE == (errno = WSAGetLastError()))
+ errno = EMFILE;
+ return -1;
+ } else
+ return 0;
}
#define listen(s,b) Squid::listen(s,b)
{
int result;
if ((result = ::recv(_get_osfhandle(s), (char *)b, l, f)) == SOCKET_ERROR) {
- errno = WSAGetLastError();
+ errno = WSAGetLastError();
return -1;
- }
- else
+ } else
return result;
}
inline
-int recvfrom(int s, void * b, size_t l, int f, struct sockaddr * fr, int * fl)
+int recvfrom(int s, void * b, size_t l, int f, struct sockaddr * fr, size_t * fl)
{
int result;
- if ((result = ::recvfrom(_get_osfhandle(s), (char *)b, l, f, fr, fl)) == SOCKET_ERROR) {
- errno = WSAGetLastError();
- return -1;
- }
- else
+ if ((result = ::recvfrom(_get_osfhandle(s), (char *)b, l, f, fr, (int *)fl)) == SOCKET_ERROR) {
+ errno = WSAGetLastError();
+ return -1;
+ } else
return result;
}
{
int result;
if ((result = ::select(n,r,w,e,t)) == SOCKET_ERROR) {
- errno = WSAGetLastError();
- return -1;
- }
- else
+ errno = WSAGetLastError();
+ return -1;
+ } else
return result;
}
#define select(n,r,w,e,t) Squid::select(n,r,w,e,t)
{
int result;
if ((result = ::send(_get_osfhandle(s), (char *)b, l, f)) == SOCKET_ERROR) {
- errno = WSAGetLastError();
- return -1;
- }
- else
+ errno = WSAGetLastError();
+ return -1;
+ } else
return result;
}
{
int result;
if ((result = ::sendto(_get_osfhandle(s), (char *)b, l, f, t, tl)) == SOCKET_ERROR) {
- errno = WSAGetLastError();
- return -1;
- }
- else
+ errno = WSAGetLastError();
+ return -1;
+ } else
return result;
}
if (::setsockopt(socket, l, o, v, n) == SOCKET_ERROR) {
errno = WSAGetLastError();
return -1;
- }
- else
+ } else
return 0;
}
#define setsockopt(s,l,o,v,n) Squid::setsockopt(s,l,o,v,n)
int shutdown(int s, int h)
{
if (::shutdown(_get_osfhandle(s),h) == SOCKET_ERROR) {
- errno = WSAGetLastError();
- return -1;
- }
- else
- return 0;
+ errno = WSAGetLastError();
+ return -1;
+ } else
+ return 0;
}
inline
{
SOCKET result;
if ((result = ::socket(f, t, p)) == INVALID_SOCKET) {
- if (WSAEMFILE == (errno = WSAGetLastError()))
- errno = EMFILE;
- return -1;
- }
- else
- return _open_osfhandle(result, 0);
+ if (WSAEMFILE == (errno = WSAGetLastError()))
+ errno = EMFILE;
+ return -1;
+ } else
+ return _open_osfhandle(result, 0);
}
#define socket(f,t,p) Squid::socket(f,t,p)
int WSAAsyncSelect(int s, HWND h, unsigned int w, long e)
{
if (::WSAAsyncSelect(_get_osfhandle(s), h, w, e) == SOCKET_ERROR) {
- errno = WSAGetLastError();
- return -1;
- }
- else
+ errno = WSAGetLastError();
+ return -1;
+ } else
return 0;
}
#else
if (::WSADuplicateSocketA(_get_osfhandle(s), n, l) == SOCKET_ERROR) {
#endif
- errno = WSAGetLastError();
- return -1;
- }
- else
+ errno = WSAGetLastError();
+ return -1;
+ } else
return 0;
}
#undef WSASocket
inline
-int WSASocket(int a, int t, int p, LPWSAPROTOCOL_INFO i, GROUP g, DWORD f)
-{
+int WSASocket(int a, int t, int p, LPWSAPROTOCOL_INFO i, GROUP g, DWORD f) {
SOCKET result;
#ifdef UNICODE
if ((result = ::WSASocketW(a, t, p, i, g, f)) == INVALID_SOCKET) {
#else
if ((result = ::WSASocketA(a, t, p, i, g, f)) == INVALID_SOCKET) {
#endif
- if (WSAEMFILE == (errno = WSAGetLastError()))
- errno = EMFILE;
- return -1;
- }
- else
- return _open_osfhandle(result, 0);
+ if (WSAEMFILE == (errno = WSAGetLastError()))
+ errno = EMFILE;
+ return -1;
+ } else
+ return _open_osfhandle(result, 0);
}
} /* namespace Squid */
#define RUSAGE_CHILDREN -1 /* terminated child processes */
struct rusage {
- struct timeval ru_utime; /* user time used */
- struct timeval ru_stime; /* system time used */
- long ru_maxrss; /* integral max resident set size */
- long ru_ixrss; /* integral shared text memory size */
- long ru_idrss; /* integral unshared data size */
- long ru_isrss; /* integral unshared stack size */
- long ru_minflt; /* page reclaims */
- long ru_majflt; /* page faults */
- long ru_nswap; /* swaps */
- long ru_inblock; /* block input operations */
- long ru_oublock; /* block output operations */
- long ru_msgsnd; /* messages sent */
- long ru_msgrcv; /* messages received */
- long ru_nsignals; /* signals received */
- long ru_nvcsw; /* voluntary context switches */
- long ru_nivcsw; /* involuntary context switches */
+ struct timeval ru_utime; /* user time used */
+ struct timeval ru_stime; /* system time used */
+ long ru_maxrss; /* integral max resident set size */
+ long ru_ixrss; /* integral shared text memory size */
+ long ru_idrss; /* integral unshared data size */
+ long ru_isrss; /* integral unshared stack size */
+ long ru_minflt; /* page reclaims */
+ long ru_majflt; /* page faults */
+ long ru_nswap; /* swaps */
+ long ru_inblock; /* block input operations */
+ long ru_oublock; /* block output operations */
+ long ru_msgsnd; /* messages sent */
+ long ru_msgrcv; /* messages received */
+ long ru_nsignals; /* signals received */
+ long ru_nvcsw; /* voluntary context switches */
+ long ru_nivcsw; /* involuntary context switches */
};
#undef ACL
-SQUIDCEXTERN int chroot (const char *);
-SQUIDCEXTERN int ftruncate(int, off_t);
-#ifndef HAVE_GETTIMEOFDAY
-SQUIDCEXTERN int gettimeofday(struct timeval * ,void *);
-#endif
-SQUIDCEXTERN int kill(pid_t, int);
-SQUIDCEXTERN int statfs(const char *, struct statfs *);
-SQUIDCEXTERN int truncate(const char *, off_t);
-SQUIDCEXTERN const char * wsastrerror(int);
-SQUIDCEXTERN struct passwd *getpwnam(char *);
-SQUIDCEXTERN struct group *getgrnam(char *);
-SQUIDCEXTERN uid_t geteuid(void);
-SQUIDCEXTERN uid_t getuid(void);
-SQUIDCEXTERN int setuid(uid_t);
-SQUIDCEXTERN int seteuid(uid_t);
-SQUIDCEXTERN gid_t getgid(void);
-SQUIDCEXTERN gid_t getegid(void);
-SQUIDCEXTERN int setgid(gid_t);
-SQUIDCEXTERN int setegid(gid_t);
-SQUIDCEXTERN const char *WIN32_strerror(int);
-SQUIDCEXTERN void WIN32_maperror(unsigned long);
+
+#endif /* _SQUID_WIN32_ */
+
+#endif /* _INC_SQUID_MSWIN_H */