diff --git a/CHANGES b/CHANGES index 195faa291..7112294f3 100644 --- a/CHANGES +++ b/CHANGES @@ -6,6 +6,9 @@ Changelog +Daniel (2 November 2004) +- Paul Nolan provided a patch to make libcurl build nicely on Windows CE. + Daniel (1 November 2004) - When cross-compiling, the configure script no longer attempts to use pkg-config on the build host in order to detect OpenSSL compiler options. diff --git a/include/curl/curl.h b/include/curl/curl.h index c631fc119..ca2c78eb3 100644 --- a/include/curl/curl.h +++ b/include/curl/curl.h @@ -52,10 +52,16 @@ extern "C" { * platforms. We also provide a CURL_FORMAT_OFF_T define to use in *printf * format strings when outputting a variable of type curl_off_t. */ + #if defined(_MSC_VER) || defined(__LCC__) /* MSVC */ +#ifdef _WIN32_WCE + typedef long curl_off_t; +#define CURL_FORMAT_OFF_T "%ld" +#else typedef signed __int64 curl_off_t; #define CURL_FORMAT_OFF_T "%I64d" +#endif #else /* _MSC_VER || __LCC__ */ #if (defined(__GNUC__) && defined(WIN32)) || defined(__WATCOMC__) /* gcc on windows or Watcom */ diff --git a/include/curl/multi.h b/include/curl/multi.h index da9df2e15..65b672d2c 100644 --- a/include/curl/multi.h +++ b/include/curl/multi.h @@ -51,7 +51,8 @@ #define WIN32 1 #endif -#if defined(WIN32) && !defined(__GNUC__) || defined(__MINGW32__) +#if defined(WIN32) && !defined(_WIN32_WCE) && !defined(__GNUC__) || \ + defined(__MINGW32__) #if !(defined(_WINSOCKAPI_) || defined(_WINSOCK_H)) /* The check above prevents the winsock2 inclusion if winsock.h already was included, since they can't co-exist without problems */ diff --git a/lib/Makefile.am b/lib/Makefile.am index d7f9f7d44..d5cca407f 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -24,14 +24,14 @@ AUTOMAKE_OPTIONS = foreign nostdinc DSP = curllib.dsp -EXTRA_DIST = Makefile.b32 Makefile.m32 \ +EXTRA_DIST = Makefile.b32 Makefile.m32 \ Makefile.vc6 Makefile.riscos libcurl.def $(DSP) curllib.dsw \ config-vms.h config-win32.h config-riscos.h config-mac.h config.h.in \ ca-bundle.crt README.encoding README.memoryleak README.ares \ README.curlx makefile.dj config.dj libcurl.framework.make \ libcurl.plist libcurl.rc config-amigaos.h amigaos.c amigaos.h \ - makefile.amiga Makefile.netware nwlib.c libcurl.imp \ - msvcproj.head msvcproj.foot + makefile.amiga Makefile.netware nwlib.c libcurl.imp \ + msvcproj.head msvcproj.foot config-win32ce.h CLEANFILES = $(DSP) diff --git a/lib/config-win32ce.h b/lib/config-win32ce.h new file mode 100644 index 000000000..e217d4c81 --- /dev/null +++ b/lib/config-win32ce.h @@ -0,0 +1,258 @@ +/* config.h. Generated automatically by configure. */ +/* config.h.in. Generated automatically from configure.in by autoheader. */ + +#ifndef __CONFIG_WIN32_H +#define __CONFIG_WIN32_H + +/* Define if on AIX 3. + System headers sometimes define this. + We just want to avoid a redefinition error message. */ +#ifndef _ALL_SOURCE +/* #undef _ALL_SOURCE */ +#endif + +/* Define to empty if the keyword does not work. */ +/* #undef const */ + +/* Define if you don't have vprintf but do have _doprnt. */ +/* #undef HAVE_DOPRNT */ + +/* Define if you have the vprintf function. */ +#define HAVE_VPRINTF 1 + +/* Define as the return type of signal handlers (int or void). */ +/*#define RETSIGTYPE void */ + +/* Define to `unsigned' if doesn't define. */ +/* #undef size_t */ + +/* Define this to 'int' if ssize_t is not an available typedefed type */ +#define ssize_t int + +/* Define this to 'int' if socklen_t is not an available typedefed type */ +#if !defined(ENABLE_IPV6) && ((_MSC_VER < 1300) || !defined(USE_SSLEAY)) +#define socklen_t int +#endif + +/* The size of a `curl_off_t', as computed by sizeof. */ +#ifdef SIZEOF_CURL_OFF_T +#undef SIZEOF_CURL_OFF_T +#endif + +/* Borland lacks _lseeki64(), so we don't support >2GB files */ +#define SIZEOF_CURL_OFF_T 4 + +/* Define if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Define if you can safely include both and . */ +/* #define TIME_WITH_SYS_TIME 1 */ + +/* Define cpu-machine-OS */ +#define OS "i386-pc-win32" + +/* The number of bytes in a long double. */ +#define SIZEOF_LONG_DOUBLE 16 + +/* The number of bytes in a long long. */ +/* #define SIZEOF_LONG_LONG 8 */ + +/* Define if you have the gethostbyaddr function. */ +#define HAVE_GETHOSTBYADDR 1 + +/* Define if you have the gethostname function. */ +#define HAVE_GETHOSTNAME 1 + +/* Define if you have the getpass function. */ +/*#define HAVE_GETPASS 1*/ + +/* Define if you have the getservbyname function. */ +#define HAVE_GETSERVBYNAME 1 + +/* Define if you have the gettimeofday function. */ +/* #define HAVE_GETTIMEOFDAY 1 */ + +/* Define if you have the inet_addr function. */ +#define HAVE_INET_ADDR 1 + +/* Define if you have the inet_ntoa function. */ +#define HAVE_INET_NTOA 1 + +/* Define if you have the perror function. */ +#define HAVE_PERROR 1 + +/* Define if you have the select function. */ +#define HAVE_SELECT 1 + +/* Define if you have the socket function. */ +#define HAVE_SOCKET 1 + +/* Define if you have the strcasecmp function. */ +/*#define HAVE_STRCASECMP 1*/ + +/* Define if you have the stricmp function. */ +//#define HAVE_STRICMP 1 + +/* Define if you have the strdup function. */ +//#define HAVE_STRDUP 1 + +/* Define if you have the strftime function. */ +//#define HAVE_STRFTIME 1 + +/* Define if you have the strstr function. */ +#define HAVE_STRSTR 1 + +/* Define if you have the strtoll function. */ +#ifdef MINGW32 +#define HAVE_STRTOLL 1 +#endif + +/* Define if you have the tcgetattr function. */ +/*#define HAVE_TCGETATTR 1*/ + +/* Define if you have the tcsetattr function. */ +/*#define HAVE_TCSETATTR 1*/ + +/* Define if you have the uname function. */ +/*#define HAVE_UNAME 1*/ + +/* Define if you have utime() */ +#define HAVE_UTIME 1 + +/* Define if you have the header file. */ +/*#define HAVE_ALLOCA_H 1*/ + +/* Define if you have the malloc.h file. */ +#define HAVE_MALLOC_H 1 + +/* Define if you have the header file. */ +/* #define HAVE_ARPA_INET_H 1 */ + +/* Define if you have the header file. */ +//#define HAVE_ASSERT_H 1 + +/* Define if you have the header file. */ +/* #undef HAVE_CRYPTO_H */ + +/* Define if you have the header file. */ +/*#define HAVE_DLFCN_H 1*/ + +/* Define if you have the header file. */ +/* #undef HAVE_ERR_H */ + +/* Define if you have the header file. */ +#define HAVE_FCNTL_H 1 + +/* Define if you have the header file. */ +/* #undef HAVE_GETOPT_H */ + +/* Define if you have the header file. */ +/* #define HAVE_NETDB_H 1 */ + +/* Define if you have the header file. */ +/*#define HAVE_NETINET_IN_H 1*/ + +/* Define if you have the header file. */ +/*#define HAVE_SGTTY_H 1*/ + +/* Define if you have the header file. */ +/* #undef HAVE_SSL_H */ + +/* Define if you have the header file. */ +/*#define HAVE_SYS_PARAM_H 1*/ + +/* Define if you have the header file. */ +/* #define HAVE_SYS_SELECT_H 1 */ + +/* Define if you have the header file. */ +/*#define HAVE_SYS_SOCKET_H 1*/ + +/* Define if you have the header file. */ +/* #define HAVE_SYS_SOCKIO_H 1 */ + +/* Define if you have the header file. */ +//#define HAVE_SYS_STAT_H 1 + +/* Define if you have the header file */ +#define HAVE_SYS_UTIME_H 1 + +/* Define if you have the header file. */ +//#define HAVE_SYS_TYPES_H 1 + +/* Define if you have the header file. */ +/* #define HAVE_TERMIO_H 1 */ + +/* Define if you have the header file. */ +/* #define HAVE_TERMIOS_H 1 */ + +/* Name of package */ +#define PACKAGE "curl" + +/* Define if you have the header file. */ +#define HAVE_IO_H 1 + +/* Define if you have the header file. */ +#define HAVE_TIME_H 1 + +/* Define if you have the header file. */ +#define HAVE_WINSOCK_H 1 + +/* Define if you have the header file. */ +//#define HAVE_WINSOCK2_H 1 + +/* Define if you have the header file. */ +//#define HAVE_WS2TCPIP_H 1 + +/* Define if you have the header file. */ +#define HAVE_STDLIB_H 1 + +/* Define if you have the closesocket function. */ +#define HAVE_CLOSESOCKET 1 + +/* Define if you have the setvbuf function. */ +#define HAVE_SETVBUF 1 + +/* Define if you have the RAND_screen function when using SSL */ +#define HAVE_RAND_SCREEN 1 + +/* Define if you have the `RAND_status' function. */ +#define HAVE_RAND_STATUS 1 + +/* Define this to if in_addr_t is not an available typedefed type */ +#define in_addr_t unsigned long + +/* use ioctlsocket() for non-blocking sockets */ +#define HAVE_IOCTLSOCKET + +/************************************************* + * This section is for compiler specific defines.* + *************************************************/ +/* Borland and MS don't have this */ +#if defined(MINGW32) || defined(__WATCOMC__) || defined(__LCC__) + +/* Define if you have the header file. */ +#define HAVE_UNISTD_H 1 + +#else + +#endif + +/* WinCE */ + +#define CURL_DISABLE_FILE + +#define CURL_DISABLE_TELNET +#define CURL_DISABLE_LDAP +#define WITHOUT_MM_LIB + +#include +#include + +extern int errno; + +#define ENOSPC 1 +#define ENOMEM 2 + +extern int stat(const char *path,struct stat *buffer ); + +#endif diff --git a/lib/connect.c b/lib/connect.c index 5d464acbd..c61301ad2 100644 --- a/lib/connect.c +++ b/lib/connect.c @@ -156,6 +156,7 @@ int Curl_nonblock(curl_socket_t sockfd, /* operate on this */ /* Windows? */ unsigned long flags; flags = nonblock; + return ioctlsocket(sockfd, FIONBIO, &flags); #define SETBLOCK 3 #endif @@ -406,13 +407,25 @@ static bool verifyconnect(curl_socket_t sockfd, int *error) * * Someone got to verify this on Win-NT 4.0, 2000." */ + +#ifdef _WIN32_WCE + Sleep(0); +#else SleepEx(0, FALSE); +#endif + #endif if( -1 == getsockopt(sockfd, SOL_SOCKET, SO_ERROR, (void *)&err, &errSize)) err = Curl_ourerrno(); +#ifdef _WIN32_WCE + /* Always returns this error, bug in CE? */ + if(WSAENOPROTOOPT==err) + err=0; +#endif + if ((0 == err) || (EISCONN == err)) /* we are connected, awesome! */ rc = TRUE; diff --git a/lib/dict.c b/lib/dict.c index 1b3f00452..f8e402bcf 100644 --- a/lib/dict.c +++ b/lib/dict.c @@ -29,8 +29,12 @@ #include #include #include +#ifdef HAVE_SYS_TYPES_H #include +#endif +#ifdef HAVE_SYS_STAT_H #include +#endif #include diff --git a/lib/easy.c b/lib/easy.c index 228d2aef0..7a8278dd8 100644 --- a/lib/easy.c +++ b/lib/easy.c @@ -29,8 +29,12 @@ #include #include #include +#ifdef HAVE_SYS_TYPES_H #include +#endif +#ifdef HAVE_SYS_STAT_H #include +#endif #include @@ -168,6 +172,11 @@ static long init_flags = 0; * If a memory-using function (like curl_getenv) is used before * curl_global_init() is called, we need to have these pointers set already. */ + +#ifdef _WIN32_WCE +#define strdup _strdup +#endif + curl_malloc_callback Curl_cmalloc = (curl_malloc_callback)malloc; curl_free_callback Curl_cfree = (curl_free_callback)free; curl_realloc_callback Curl_crealloc = (curl_realloc_callback)realloc; diff --git a/lib/file.c b/lib/file.c index 6d6287d74..7831d2ef2 100644 --- a/lib/file.c +++ b/lib/file.c @@ -30,8 +30,12 @@ #include #include #include +#ifdef HAVE_SYS_TYPES_H #include +#endif +#ifdef HAVE_SYS_STAT_H #include +#endif #include @@ -66,9 +70,6 @@ #include #endif -#ifdef HAVE_SYS_STAT_H -#include -#endif #ifdef HAVE_FCNTL_H #include #endif diff --git a/lib/formdata.c b/lib/formdata.c index 442c306f5..fa26ebbe5 100644 --- a/lib/formdata.c +++ b/lib/formdata.c @@ -112,7 +112,9 @@ Content-Disposition: form-data; name="FILECONTENT" #include #include #include +#ifdef HAVE_SYS_STAT_H #include +#endif #if defined(HAVE_LIBGEN_H) && defined(HAVE_BASENAME) #include #endif diff --git a/lib/ftp.c b/lib/ftp.c index e20514047..f056dd81f 100644 --- a/lib/ftp.c +++ b/lib/ftp.c @@ -476,7 +476,7 @@ CURLcode Curl_ftp_connect(struct connectdata *conn) char *buf = data->state.buffer; /* this is our buffer */ struct FTP *ftp; CURLcode result; - int ftpcode, try; + int ftpcode, trynum; ftp = (struct FTP *)malloc(sizeof(struct FTP)); if(!ftp) @@ -564,9 +564,9 @@ CURLcode Curl_ftp_connect(struct connectdata *conn) return CURLE_FAILED_INIT; /* we don't know what to do */ } - for (try = start; ftpauth[count]; try=trynext, count++) { + for (trynum = start; ftpauth[count]; trynum=trynext, count++) { - FTPSENDF(conn, "AUTH %s", ftpauth[try]); + FTPSENDF(conn, "AUTH %s", ftpauth[trynum]); result = Curl_GetFTPResponse(&nread, conn, &ftpcode); @@ -842,8 +842,15 @@ CURLcode Curl_ftp_done(struct connectdata *conn, CURLcode status) #ifdef HAVE_KRB4 Curl_sec_fflush_fd(conn, conn->sock[SECONDARYSOCKET]); #endif + /* shut down the socket to inform the server we're done */ + +#ifdef _WIN32_WCE + shutdown(conn->sock[SECONDARYSOCKET],2); /* SD_BOTH */ +#endif + sclose(conn->sock[SECONDARYSOCKET]); + conn->sock[SECONDARYSOCKET] = CURL_SOCKET_BAD; if(!ftp->no_transfer && !status) { diff --git a/lib/getenv.c b/lib/getenv.c index 8f8311bf0..fbf37a992 100644 --- a/lib/getenv.c +++ b/lib/getenv.c @@ -43,6 +43,9 @@ static char *GetEnv(const char *variable) { +#ifdef _WIN32_WCE + return NULL; +#else #ifdef WIN32 /* This shit requires windows.h (HUGE) to be included */ char env[MAX_PATH]; /* MAX_PATH is from windef.h */ @@ -62,6 +65,7 @@ char *GetEnv(const char *variable) #endif #endif return (env && env[0])?strdup(env):NULL; +#endif } char *curl_getenv(const char *v) diff --git a/lib/hostthre.c b/lib/hostthre.c index fad335b45..2d70f2ef4 100644 --- a/lib/hostthre.c +++ b/lib/hostthre.c @@ -195,7 +195,9 @@ static unsigned __stdcall gethostbyname_thread (void *arg) * hopefully make printouts synchronised. I'm not sure it works * with a static runtime lib (MSVC's libc.lib). */ +#ifndef _WIN32_WCE *stderr = *td->stderr_file; +#endif WSASetLastError (conn->async.status = NO_DATA); /* pending status */ he = gethostbyname (conn->async.hostname); @@ -375,8 +377,15 @@ static bool init_resolve_thread (struct connectdata *conn, } td->stderr_file = stderr; + +#ifdef _WIN32_WCE + td->thread_hnd=(HANDLE) CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) THREAD_FUNC,conn,0,&td->thread_id); +#else + td->thread_hnd = (HANDLE) _beginthreadex(NULL, 0, THREAD_FUNC, conn, 0, &td->thread_id); +#endif + #ifdef CURLRES_IPV6 curlassert(hints); td->hints = *hints; diff --git a/lib/http.c b/lib/http.c index ee5b81ff6..1de316b2f 100644 --- a/lib/http.c +++ b/lib/http.c @@ -30,8 +30,12 @@ #include #include #include +#ifdef HAVE_SYS_TYPES_H #include +#endif +#ifdef HAVE_SYS_STAT_H #include +#endif #include diff --git a/lib/if2ip.c b/lib/if2ip.c index 96ecc5348..8f0a07782 100644 --- a/lib/if2ip.c +++ b/lib/if2ip.c @@ -127,9 +127,9 @@ char *Curl_if2ip(const char *interface, char *buf, int buf_size) /* -- end of if2ip() -- */ #else -char *Curl_if2ip(const char *interface, char *buf, int buf_size) +char *Curl_if2ip(const char *interf, char *buf, int buf_size) { - (void) interface; + (void) interf; (void) buf; (void) buf_size; return NULL; diff --git a/lib/ldap.c b/lib/ldap.c index e140f4ffa..c6f7e5490 100644 --- a/lib/ldap.c +++ b/lib/ldap.c @@ -30,8 +30,12 @@ #include #include #include +#ifdef HAVE_SYS_TYPES_H #include +#endif +#ifdef HAVE_SYS_STAT_H #include +#endif #include #if defined(WIN32) diff --git a/lib/mprintf.c b/lib/mprintf.c index 9135a1308..629a9e07c 100644 --- a/lib/mprintf.c +++ b/lib/mprintf.c @@ -40,6 +40,12 @@ #include +#ifdef _WIN32_WCE +#define CURL_CDECL __cdecl +#else +#define CURL_CDECL +#endif + #ifndef SIZEOF_LONG_DOUBLE #define SIZEOF_LONG_DOUBLE 0 #endif @@ -583,7 +589,12 @@ static int dprintf_formatf( void *data, /* untouched by format(), just sent to the stream() function in the second argument */ /* function pointer called for each output character */ + +#if _WIN32_WCE + int (__cdecl *stream) (int, FILE *), +#else int (*stream)(int, FILE *), +#endif const char *format, /* %-formatted string */ va_list ap_save) /* list of parameters */ { @@ -979,7 +990,7 @@ static int dprintf_formatf( } /* fputc() look-alike */ -static int addbyter(int output, FILE *data) +static int CURL_CDECL addbyter(int output, FILE *data) { struct nsprintf *infop=(struct nsprintf *)data; unsigned char outc = (unsigned char)output; @@ -1027,7 +1038,7 @@ int curl_msnprintf(char *buffer, size_t maxlength, const char *format, ...) } /* fputc() look-alike */ -static int alloc_addbyter(int output, FILE *data) +static int CURL_CDECL alloc_addbyter(int output, FILE *data) { struct asprintf *infop=(struct asprintf *)data; unsigned char outc = (unsigned char)output; @@ -1113,7 +1124,7 @@ char *curl_mvaprintf(const char *format, va_list ap_save) return strdup(""); } -static int storebuffer(int output, FILE *data) +static int CURL_CDECL storebuffer(int output, FILE *data) { char **buffer = (char **)data; unsigned char outc = (unsigned char)output; @@ -1142,6 +1153,7 @@ int curl_mprintf(const char *format, ...) int retcode; va_list ap_save; /* argument pointer */ va_start(ap_save, format); + retcode = dprintf_formatf(stdout, fputc, format, ap_save); va_end(ap_save); return retcode; diff --git a/lib/setup.h b/lib/setup.h index c6ee81181..f121b7320 100644 --- a/lib/setup.h +++ b/lib/setup.h @@ -40,11 +40,15 @@ #ifdef HAVE_CONFIG_H #include "config.h" /* the configure script results */ #else +#ifdef _WIN32_WCE +#include "config-win32ce.h" +#else #ifdef WIN32 /* hand-modified win32 config.h! */ #include "config-win32.h" #endif #endif +#endif #ifdef macintosh /* hand-modified MacOS config.h! */ @@ -173,7 +177,9 @@ defined(HAVE_LIBSSL) && defined(HAVE_LIBCRYPTO) #define _WIN32_WINNT 0x0501 #endif +#if HAVE_WINSOCK2_H #include /* required by telnet.c */ +#endif #if defined(ENABLE_IPV6) || defined(USE_SSLEAY) #include diff --git a/lib/strerror.c b/lib/strerror.c index dd5acc81b..fa84a1731 100644 --- a/lib/strerror.c +++ b/lib/strerror.c @@ -515,15 +515,29 @@ const char *Curl_strerror(struct connectdata *conn, int err) *buf = '\0'; #if defined(WIN32) && !defined(__CYGWIN__) + +#if _WIN32_WCE + buf[0]=0; + { + wchar_t wbuf[256]; + + FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, err, + LANG_NEUTRAL, wbuf, sizeof(wbuf)/sizeof(wchar_t), NULL); + wcstombs(buf,wbuf,max); + } + +#else + /* 'sys_nerr' is the maximum errno number, it is not widely portable */ if (err >= 0 && err < sys_nerr) strncpy(buf, strerror(err), max); else { - if (!get_winsock_error (err, buf, max) && - !FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM, NULL, err, - LANG_NEUTRAL, buf, max, NULL)) + if (!get_winsock_error(err, buf, max) && + !FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, err, + LANG_NEUTRAL, buf, max, NULL)) snprintf(buf, max, "Unknown error %d (%#x)", err, err); } +#endif #else /* not native Windows coming up */ /* These should be atomic and hopefully thread-safe */ diff --git a/lib/telnet.c b/lib/telnet.c index b0f74bb8d..c2813fa2a 100644 --- a/lib/telnet.c +++ b/lib/telnet.c @@ -30,9 +30,12 @@ #include #include #include +#ifdef HAVE_SYS_TYPES_H #include +#endif +#ifdef HAVE_SYS_STAT_H #include - +#endif #include #if defined(WIN32) diff --git a/lib/transfer.c b/lib/transfer.c index 904dbd15b..389ed6e16 100644 --- a/lib/transfer.c +++ b/lib/transfer.c @@ -32,7 +32,9 @@ #ifdef HAVE_SYS_TYPES_H #include #endif +#ifdef HAVE_SYS_STAT_H #include +#endif #include diff --git a/lib/url.c b/lib/url.c index e84d05489..c474bdcab 100644 --- a/lib/url.c +++ b/lib/url.c @@ -30,9 +30,12 @@ #include #include #include +#ifdef HAVE_SYS_TYPES_H #include +#endif +#ifdef HAVE_SYS_STAT_H #include - +#endif #include #if defined(WIN32) && !defined(__GNUC__) || defined(__MINGW32__)