]> sjero.net Git - wget/blobdiff - src/mswindows.h
[svn] Merge of fix for bugs 20341 and 20410.
[wget] / src / mswindows.h
index 177f39f9aac6f076b419e3674c9f6f91dbc16322..e298e066ff91bc4e7e2aa94480fc91ce1463edd3 100644 (file)
@@ -1,12 +1,11 @@
 /* Declarations for windows
 /* Declarations for windows
-   Copyright (C) 1995, 1997, 1997, 1998, 2004
-   Free Software Foundation, Inc.
+   Copyright (C) 1996-2006 Free Software Foundation, Inc.
 
 This file is part of GNU Wget.
 
 GNU Wget is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 
 This file is part of GNU Wget.
 
 GNU Wget is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
+the Free Software Foundation; either version 3 of the License, or
 (at your option) any later version.
 
 GNU Wget is distributed in the hope that it will be useful,
 (at your option) any later version.
 
 GNU Wget is distributed in the hope that it will be useful,
@@ -15,8 +14,7 @@ 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
 GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
-along with Wget; if not, write to the Free Software
-Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+along with Wget.  If not, see <http://www.gnu.org/licenses/>.
 
 In addition, as a special exception, the Free Software Foundation
 gives permission to link the code of its release of Wget with the
 
 In addition, as a special exception, the Free Software Foundation
 gives permission to link the code of its release of Wget with the
@@ -32,20 +30,20 @@ so, delete this exception statement from your version.  */
 #define MSWINDOWS_H
 
 #ifndef WGET_H
 #define MSWINDOWS_H
 
 #ifndef WGET_H
-#error Include mswindows.h inside or after "wget.h"
+# error This file should not be included directly.
 #endif
 
 /* Prevent inclusion of <winsock*.h> in <windows.h>.  */
 #ifndef WIN32_LEAN_AND_MEAN
 #endif
 
 /* Prevent inclusion of <winsock*.h> in <windows.h>.  */
 #ifndef WIN32_LEAN_AND_MEAN
-#define WIN32_LEAN_AND_MEAN
+# define WIN32_LEAN_AND_MEAN
 #endif
 
 #include <windows.h>
 
 #endif
 
 #include <windows.h>
 
-/* Use the correct winsock header; <ws2tcpip.h> includes <winsock2.h>
-   only on MingW.  We cannot use <winsock.h> for IPv6.  Using
-   getaddrinfo() requires <ws2tcpip.h>.  */
-#if defined(ENABLE_IPV6) || defined(HAVE_GETADDRINFO)
+/* We need winsock2.h for IPv6 and ws2tcpip.h for getaddrinfo, so
+  include both in ENABLE_IPV6 case.  (ws2tcpip.h includes winsock2.h
+  only on MinGW.) */
+#ifdef ENABLE_IPV6
 # include <winsock2.h>
 # include <ws2tcpip.h>
 #else
 # include <winsock2.h>
 # include <ws2tcpip.h>
 #else
@@ -56,14 +54,12 @@ so, delete this exception statement from your version.  */
 # define EAI_SYSTEM -1   /* value doesn't matter */
 #endif
 
 # define EAI_SYSTEM -1   /* value doesn't matter */
 #endif
 
-/* Must include <sys/stat.h> because of 'stat' define below.  */
-#include <sys/stat.h>
-
-/* Missing in several .c files.  Include here.  */
+/* Declares file access functions, such as open, creat, access, and
+   chmod.  Unix declares these in unistd.h and fcntl.h.  */
 #include <io.h>
 
 #include <io.h>
 
-/* Apparently needed to get alloca().  */
-#include <malloc.h>
+/* Declares getpid(). */
+#include <process.h>
 
 #ifndef S_ISDIR
 # define S_ISDIR(m) (((m) & (_S_IFMT)) == (_S_IFDIR))
 
 #ifndef S_ISDIR
 # define S_ISDIR(m) (((m) & (_S_IFMT)) == (_S_IFDIR))
@@ -72,9 +68,13 @@ so, delete this exception statement from your version.  */
 # define S_ISLNK(a) 0
 #endif
 
 # define S_ISLNK(a) 0
 #endif
 
-/* We have strcasecmp and strncasecmp, just under a different name.  */
-#define strcasecmp stricmp
-#define strncasecmp strnicmp
+/* We have strcasecmp and strncasecmp, just under different names.  */
+#ifndef HAVE_STRCASECMP
+# define strcasecmp stricmp
+#endif
+#ifndef HAVE_STRNCASECMP
+# define strncasecmp strnicmp
+#endif
 
 /* The same for snprintf() and vsnprintf().  */
 #define snprintf _snprintf
 
 /* The same for snprintf() and vsnprintf().  */
 #define snprintf _snprintf
@@ -84,70 +84,55 @@ so, delete this exception statement from your version.  */
 typedef __int64 wgint;
 #define SIZEOF_WGINT 8
 
 typedef __int64 wgint;
 #define SIZEOF_WGINT 8
 
-#ifdef __GNUC__
-#define WGINT_MAX 9223372036854775807LL
+/* str_to_wgint is a function with the semantics of strtol[l], but
+   which works on wgint.  */
+#if defined HAVE_STRTOLL
+# define str_to_wgint strtoll
+#elif defined HAVE__STRTOI64
+# define str_to_wgint _strtoi64
 #else
 #else
-#define WGINT_MAX 9223372036854775807I64
+# define str_to_wgint strtoll
+# define NEED_STRTOLL
+# define strtoll_type __int64
 #endif
 
 #endif
 
-/* str_to_wgint is a function with the semantics of strtol, but which
-   works on wgint.  Since wgint is unconditionally 64-bit on Windows,
-   we #define it to str_to_int64, which either calls _strtoi64 or
-   implements the conversion manually.  */
-#define str_to_wgint str_to_int64
-__int64 str_to_int64 (const char *, char **, int);
-
 /* Windows has no symlink, therefore no lstat.  Without symlinks lstat
    is equivalent to stat anyway.  */
 #define lstat stat
 
 /* Windows has no symlink, therefore no lstat.  Without symlinks lstat
    is equivalent to stat anyway.  */
 #define lstat stat
 
-/* Transparently support statting large files, like POSIX's LFS API
-   does.  All Windows compilers we support use _stati64 (but have
-   different names for 2nd argument type, see below), so we use
-   that.  */
-#define stat(fname, buf) _stati64 (fname, buf)
-
-/* On Windows the 64-bit stat requires an explicitly different type
-   for the 2nd argument, so we define a struct_stat macro that expands
-   to the appropriate type on Windows, and to the regular struct stat
-   on Unix.
-
-   Note that Borland C 5.5 has 64-bit stat (_stati64), but not a
-   64-bit fstat!  Because of that we also need a struct_fstat that
-   points to struct_stat on Unix and on Windows, except under Borland,
-   where it points to the 32-bit struct stat.  */
-
-#ifndef __BORLANDC__
-# define fstat(fd, buf) _fstati64 (fd, buf)
-# define struct_stat  struct _stati64
-# define struct_fstat struct _stati64
-#else  /* __BORLANDC__ */
-# define struct_stat  struct stati64
-# define struct_fstat struct stat
-#endif /* __BORLANDC__ */
-
-#define PATH_SEPARATOR '\\'
-
-#ifdef HAVE_ISATTY
-#ifdef _MSC_VER
-# define isatty _isatty
+/* Define LFS aliases for stat and fstat. */
+#ifdef stat_alias
+# define stat(f, b) stat_alias (f, b)
 #endif
 #endif
+#ifdef fstat_alias
+# define fstat(f, b) fstat_alias (f, b)
 #endif
 
 #endif
 
-/* #### Do we need this?  */
+#define PATH_SEPARATOR '\\'
+
+/* Win32 doesn't support the MODE argument to mkdir.  */
 #include <direct.h>
 #include <direct.h>
+#define mkdir(a, b) (mkdir) (a)
+
+/* Additional declarations needed for IPv6: */
+#ifdef ENABLE_IPV6
+const char *inet_ntop (int, const void *, char *, socklen_t);
+#endif
 
 
-/* Windows compilers accept only one arg to mkdir.  */
-#define mkdir(a, b) _mkdir(a)
+#ifdef NEED_GAI_STRERROR
+# undef gai_strerror
+# define gai_strerror windows_strerror
+#endif
 
 #ifndef INHIBIT_WRAP
 
 
 #ifndef INHIBIT_WRAP
 
-/* Winsock functions don't set errno, so we provide wrappers
-   that do. */
+/* Winsock functions don't set errno, so we provide wrappers that do. */
 
 #define socket wrapped_socket
 #define bind wrapped_bind
 #define connect wrapped_connect
 
 #define socket wrapped_socket
 #define bind wrapped_bind
 #define connect wrapped_connect
+#define listen wrapped_listen
+#define accept wrapped_accept
 #define recv wrapped_recv
 #define send wrapped_send
 #define select wrapped_select
 #define recv wrapped_recv
 #define send wrapped_send
 #define select wrapped_select
@@ -161,6 +146,8 @@ __int64 str_to_int64 (const char *, char **, int);
 int wrapped_socket (int, int, int);
 int wrapped_bind (int, struct sockaddr *, int);
 int wrapped_connect (int, const struct sockaddr *, int);
 int wrapped_socket (int, int, int);
 int wrapped_bind (int, struct sockaddr *, int);
 int wrapped_connect (int, const struct sockaddr *, int);
+int wrapped_listen (int s, int backlog);
+int wrapped_accept (int s, struct sockaddr *a, int *alen);
 int wrapped_recv (int, void *, int, int);
 int wrapped_send (int, const void *, int, int);
 int wrapped_select (int, fd_set *, fd_set *, fd_set *, const struct timeval *);
 int wrapped_recv (int, void *, int, int);
 int wrapped_send (int, const void *, int, int);
 int wrapped_select (int, fd_set *, fd_set *, fd_set *, const struct timeval *);
@@ -176,13 +163,6 @@ int wrapped_closesocket (int);
 #endif
 const char *windows_strerror (int);
 
 #endif
 const char *windows_strerror (int);
 
-/* MingW 3.7 (or older) prototypes gai_strerror(), but is missing
-   from all import libraries. */
-#if defined(__MINGW32__) && defined(ENABLE_IPV6)
-# undef gai_strerror
-# define gai_strerror windows_strerror
-#endif
-
 /* Declarations of various socket errors:  */
 
 #define EWOULDBLOCK             WSAEWOULDBLOCK
 /* Declarations of various socket errors:  */
 
 #define EWOULDBLOCK             WSAEWOULDBLOCK
@@ -229,11 +209,4 @@ void ws_percenttitle (double);
 char *ws_mypath (void);
 void windows_main (int *, char **, char **);
 
 char *ws_mypath (void);
 void windows_main (int *, char **, char **);
 
-/* Things needed for IPv6; missing in <ws2tcpip.h>.  */
-#ifdef ENABLE_IPV6
-# ifndef HAVE_INET_NTOP
-extern const char *inet_ntop (int af, const void *src, char *dst, size_t size);
-# endif
-#endif /* ENABLE_IPV6 */
-
 #endif /* MSWINDOWS_H */
 #endif /* MSWINDOWS_H */