diff --git a/configure.in b/configure.in index 8942c99be..67d41af02 100644 --- a/configure.in +++ b/configure.in @@ -13,12 +13,15 @@ AC_CANONICAL_TARGET dnl Checks for programs. AC_PROG_CC + +dnl Check for AIX weirdos +AC_AIX + +AC_SYS_LARGEFILE dnl The install stuff has already been taken care of by the automake stuff dnl AC_PROG_INSTALL AC_PROG_MAKE_SET -dnl Check for AIX weirdos -AC_AIX dnl ********************************************************************** dnl Checks for libraries. diff --git a/largefile.m4 b/largefile.m4 new file mode 100644 index 000000000..2809dcfc4 --- /dev/null +++ b/largefile.m4 @@ -0,0 +1,75 @@ +#serial 12 + +dnl By default, many hosts won't let programs access large files; +dnl one must use special compiler options to get large-file access to work. +dnl For more details about this brain damage please see: +dnl http://www.sas.com/standards/large.file/x_open.20Mar96.html + +dnl Written by Paul Eggert . + +dnl Internal subroutine of AC_SYS_LARGEFILE. +dnl AC_SYS_LARGEFILE_TEST_INCLUDES +AC_DEFUN(AC_SYS_LARGEFILE_TEST_INCLUDES, + [[#include + int a[(off_t) 9223372036854775807 == 9223372036854775807 ? 1 : -1]; + ]]) + +dnl Internal subroutine of AC_SYS_LARGEFILE. +dnl AC_SYS_LARGEFILE_MACRO_VALUE(C-MACRO, VALUE, CACHE-VAR, COMMENT, INCLUDES, FUNCTION-BODY) +AC_DEFUN(AC_SYS_LARGEFILE_MACRO_VALUE, + [AC_CACHE_CHECK([for $1 value needed for large files], $3, + [$3=no + AC_TRY_COMPILE(AC_SYS_LARGEFILE_TEST_INCLUDES +$5 + , + [$6], + , + [AC_TRY_COMPILE([#define $1 $2] +AC_SYS_LARGEFILE_TEST_INCLUDES +$5 + , + [$6], + [$3=$2])])]) + if test "[$]$3" != no; then + AC_DEFINE_UNQUOTED([$1], [$]$3, [$4]) + fi]) + +AC_DEFUN(AC_SYS_LARGEFILE, + [AC_ARG_ENABLE(largefile, + [ --disable-largefile omit support for large files]) + if test "$enable_largefile" != no; then + + AC_CACHE_CHECK([for special C compiler options needed for large files], + ac_cv_sys_largefile_CC, + [ac_cv_sys_largefile_CC=no + if test "$GCC" != yes; then + # IRIX 6.2 and later do not support large files by default, + # so use the C compiler's -n32 option if that helps. + AC_TRY_COMPILE(AC_SYS_LARGEFILE_TEST_INCLUDES, , , + [ac_save_CC="$CC" + CC="$CC -n32" + AC_TRY_COMPILE(AC_SYS_LARGEFILE_TEST_INCLUDES, , + ac_cv_sys_largefile_CC=' -n32') + CC="$ac_save_CC"]) + fi]) + if test "$ac_cv_sys_largefile_CC" != no; then + CC="$CC$ac_cv_sys_largefile_CC" + fi + + AC_SYS_LARGEFILE_MACRO_VALUE(_FILE_OFFSET_BITS, 64, + ac_cv_sys_file_offset_bits, + [Number of bits in a file offset, on hosts where this is settable.]) + AC_SYS_LARGEFILE_MACRO_VALUE(_LARGEFILE_SOURCE, 1, + ac_cv_sys_largefile_source, + [Define to make ftello visible on some hosts (e.g. HP-UX 10.20).], + [#include ], [return !ftello;]) + AC_SYS_LARGEFILE_MACRO_VALUE(_LARGE_FILES, 1, + ac_cv_sys_large_files, + [Define for large files, on AIX-style hosts.]) +dnl lftp does not need ftello, and _XOPEN_SOURCE=500 makes resolv.h fail. +dnl AC_SYS_LARGEFILE_MACRO_VALUE(_XOPEN_SOURCE, 500, +dnl ac_cv_sys_xopen_source, +dnl [Define to make ftello visible on some hosts (e.g. glibc 2.1.3).], +dnl [#include ], [return !ftello;]) + fi + ]) diff --git a/lib/hostip.c b/lib/hostip.c index fe8a7743f..ecfb59de3 100644 --- a/lib/hostip.c +++ b/lib/hostip.c @@ -69,7 +69,7 @@ #include "urldata.h" #include "sendf.h" -#ifndef HAVE_INET_NTOA_R_DECL +#if defined(HAVE_INET_NTOA_R) && !defined(HAVE_INET_NTOA_R_DECL) #include "inet_ntoa_r.h" #endif diff --git a/lib/http.c b/lib/http.c index 0632f6084..5e3f1b10c 100644 --- a/lib/http.c +++ b/lib/http.c @@ -38,12 +38,6 @@ * ------------------------------------------------------------ ****************************************************************************/ -#ifdef NEED_REENTRANT -#define _REENTRANT /* Necessary to use in Solaris, since the silly guys at Sun - made the localtime_r() prototype dependent on it (or - _POSIX_C_SOURCE or _POSIX_PTHREAD_SEMANTICS). */ -#endif - /* -- WIN32 approved -- */ #include #include @@ -57,6 +51,12 @@ #include "setup.h" +#ifdef NEED_REENTRANT +#define _REENTRANT /* Necessary to use in Solaris, since the silly guys at Sun + made the localtime_r() prototype dependent on it (or + _POSIX_C_SOURCE or _POSIX_PTHREAD_SEMANTICS). */ +#endif + #if defined(WIN32) && !defined(__GNUC__) || defined(__MINGW32__) #include #include @@ -378,7 +378,7 @@ CURLcode http(struct connectdata *conn) #ifdef HAVE_LOCALTIME_R /* thread-safe version */ struct tm keeptime; - thistime = localtime_r(&data->timevalue, &keeptime); + thistime = (struct tm *)localtime_r(&data->timevalue, &keeptime); #else thistime = localtime(&data->timevalue); #endif @@ -492,13 +492,19 @@ CURLcode http(struct connectdata *conn) actually set your own */ sendf(data->firstsocket, data, "Content-Length: %d\r\n", - strlen(data->postfields)); + (data->postfieldsize?data->postfieldsize: + strlen(data->postfields)) ); if(!checkheaders(data, "Content-Type:")) sendf(data->firstsocket, data, "Content-Type: application/x-www-form-urlencoded\r\n"); /* and here comes the actual data */ + if(data->postfieldsize) { + ssend(data->firstsocket, data, "\r\n", 2); + ssend(data->firstsocket, data, data->postfields, data->postfieldsize); + ssend(data->firstsocket, data, "\r\n", 2); + } sendf(data->firstsocket, data, "\r\n" "%s\r\n", diff --git a/lib/if2ip.c b/lib/if2ip.c index ede5cf08c..25b2c40c2 100644 --- a/lib/if2ip.c +++ b/lib/if2ip.c @@ -82,7 +82,7 @@ #include #endif -#ifndef HAVE_INET_NTOA_R_DECL +#if defined(HAVE_INET_NTOA_R) && !defined(HAVE_INET_NTOA_R_DECL) #include "inet_ntoa_r.h" #endif diff --git a/lib/sendf.c b/lib/sendf.c index 87416775c..e048637be 100644 --- a/lib/sendf.c +++ b/lib/sendf.c @@ -84,7 +84,6 @@ void failf(struct UrlData *data, char *fmt, ...) } /* sendf() sends the formated data to the server */ - int sendf(int fd, struct UrlData *data, char *fmt, ...) { size_t bytes_written; @@ -110,6 +109,25 @@ int sendf(int fd, struct UrlData *data, char *fmt, ...) return(bytes_written); } +/* ssend() sends plain (binary) data to the server */ +size_t ssend(int fd, struct UrlData *data, void *mem, size_t len) +{ + size_t bytes_written; + + if(data->bits.verbose) + fprintf(data->err, "> [binary output]\n"); +#ifndef USE_SSLEAY + bytes_written = swrite(fd, mem, len); +#else + if (data->use_ssl) { + bytes_written = SSL_write(data->ssl, mem, len); + } else { + bytes_written = swrite(fd, mem, len); + } +#endif /* USE_SSLEAY */ + return bytes_written; +} + diff --git a/lib/sendf.h b/lib/sendf.h index c6c7bdb97..79eff1c40 100644 --- a/lib/sendf.h +++ b/lib/sendf.h @@ -40,7 +40,8 @@ * ------------------------------------------------------------ ****************************************************************************/ -int sendf(int fd, struct UrlData *, char *fmt, ...); +size_t sendf(int fd, struct UrlData *, char *fmt, ...); +size_t ssend(int fd, struct UrlData *, void *fmt, size_t len); void infof(struct UrlData *, char *fmt, ...); void failf(struct UrlData *, char *fmt, ...); diff --git a/lib/url.c b/lib/url.c index ad43bc773..e74bb4568 100644 --- a/lib/url.c +++ b/lib/url.c @@ -421,6 +421,9 @@ CURLcode curl_setopt(CURL *curl, CURLoption option, ...) case CURLOPT_POSTFIELDS: data->postfields = va_arg(param, char *); break; + case CURLOPT_POSTFIELDSIZE: + data->postfieldsize = va_arg(param, long); + break; case CURLOPT_REFERER: data->referer = va_arg(param, char *); data->bits.http_set_referer = (data->referer && *data->referer)?1:0; diff --git a/lib/urldata.h b/lib/urldata.h index 3d03bfce7..226237db2 100644 --- a/lib/urldata.h +++ b/lib/urldata.h @@ -345,6 +345,9 @@ struct UrlData { char *range; /* range, if used. See README for detailed specification on this syntax. */ char *postfields; /* if POST, set the fields' values here */ + long postfieldsize; /* if POST, this might have a size to use instead of + strlen(), and then the data *may* be binary (contain + zero bytes) */ bool free_referer; /* set TRUE if 'referer' points to a string we allocated */