I've tried today to compile wget statically linked against openssl and
dynamically linked against msvcrt.dll (which required using headers and
libs from the Windows Driver Development Kit, I used 6001.18002), so that
I didn't have to distribute the runtime.
It didn't compile cleanly. In case anywone is interested, I attach the
changes I had to make. It works in XP SP3 (but will also probably work in
SP1 and SP2) and vista. IPv6 works in both operating systems.
The diffs are against 1.11.4.
--
Gustavo Lopes
--- mswindows.c Mon Jan 19 04:14:16 1970
+++ mswindows.c Mon Jan 19 04:14:16 1970
@@ -694,11 +694,11 @@
/* An inet_ntop implementation that uses WSAAddressToString.
Prototype complies with POSIX 1003.1-2004. This is only used under
IPv6 because Wget prints IPv4 addresses using inet_ntoa. */
-
+//vista has this function, but it's incompatible
const char *
-inet_ntop (int af, const void *src, char *dst, socklen_t cnt)
+inet_ntop_custom (int af, const void *src, char *dst, socklen_t cnt)
{
- /* struct sockaddr can't accomodate struct sockaddr_in6. */
+ //struct sockaddr can't accomodate struct sockaddr_in6.
union {
struct sockaddr_in6 sin6;
struct sockaddr_in sin;
@@ -723,7 +723,8 @@
abort ();
}
- if (WSAAddressToString ((struct sockaddr *) &sa, srcsize, NULL, dst,
&dstlen) != 0)
+ //changed from WSAAddressToString because wget is not handling unicode
strings
+ if (WSAAddressToStringA ((struct sockaddr *) &sa, srcsize, NULL, dst,
&dstlen) != 0)
{
errno = WSAGetLastError();
return NULL;
--- mswindows.h Mon Jan 19 04:14:16 1970
+++ mswindows.h Mon Jan 19 04:14:16 1970
@@ -70,12 +70,23 @@
# define S_ISLNK(a) 0
#endif
+#define utime _utime
+#define utimbuf _utimbuf
+//inet_ntop was introduced in vista, do not use it
+#define inet_ntop inet_ntop_custom
+//don't know why this is needed
+#define getpid GetCurrentProcessId
+
/* We have strcasecmp and strncasecmp, just under different names. */
#ifndef HAVE_STRCASECMP
# define strcasecmp stricmp
+//avoid redefinition of stricmp
+# define HAVE_STRCASECMP
#endif
#ifndef HAVE_STRNCASECMP
# define strncasecmp strnicmp
+//avoid redefinition of strnicmp
+# define HAVE_STRNCASECMP
#endif
/* The same for snprintf() and vsnprintf(). */
@@ -162,8 +173,8 @@
right thing with Winsock errors. */
#ifndef INHIBIT_WRAP
# define strerror windows_strerror
-#endif
const char *windows_strerror (int);
+#endif
/* Declarations of various socket errors: */
--- config-compiler.h Mon Jan 19 04:14:16 1970
+++ config-compiler.h Mon Jan 19 04:14:16 1970
@@ -107,6 +107,8 @@
#define OS_TYPE "Windows-MSVC"
+#undef socklen_t /* avoid clash with <ws2tcpip.h> */
+
#define LL(n) n##I64
#define stat_alias _stati64
--- Makefile.src Mon Jan 19 04:14:16 1970
+++ Makefile.src Mon Jan 19 04:14:16 1970
@@ -41,15 +41,15 @@
LD = link
RM = -del
-DEFS = /DWINDOWS /D_CONSOLE /DHAVE_CONFIG_H $(SSLDEFS)
-LIBS = kernel32.lib advapi32.lib wsock32.lib user32.lib gdi32.lib $(SSLLIBS)
+DEFS = /DWINDOWS /DENABLE_IPV6 /D_CONSOLE /DHAVE_CONFIG_H $(SSLDEFS)
+LIBS = kernel32.lib advapi32.lib wsock32.lib user32.lib gdi32.lib ws2_32.lib
$(SSLLIBS) msvcrt_winxp.obj msvcrt.lib
!ifdef DEBUG
CFLAGS = /nologo /MTd /Od /Zi /I. $(DEFS)
LDFLAGS = /debug
!else
-CFLAGS = /nologo /MT /O2 /I. $(DEFS)
-LDFLAGS = /opt:ref #/opt:nowin98
+CFLAGS = /MD /nologo /O2 /Ox /I. -IC:\WinDDK\6001.18002\inc\api
/IC:\WinDDK\6001.18002\inc\crt -IC:\Users\Cataphract\Desktop\openssl\include
$(DEFS)
+LDFLAGS = /subsystem:console /opt:ref /nodefaultlib:libcmt
/nodefaultlib:libcmtd /nodefaultlib:msvcrt /nodefaultlib:msvcrt90
/LIBPATH:C:\WinDDK\6001.18002\lib\crt\i386
/LIBPATH:C:\WinDDK\6001.18002\lib\wxp\i386
/LIBPATH:C:\Users\Cataphract\Desktop\openssl\lib /PDB:wget.pdb
!endif