aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--configure.in7
-rw-r--r--largefile.m475
-rw-r--r--lib/hostip.c2
-rw-r--r--lib/http.c22
-rw-r--r--lib/if2ip.c2
-rw-r--r--lib/sendf.c20
-rw-r--r--lib/sendf.h3
-rw-r--r--lib/url.c3
-rw-r--r--lib/urldata.h3
9 files changed, 123 insertions, 14 deletions
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 <eggert@twinsun.com>.
+
+dnl Internal subroutine of AC_SYS_LARGEFILE.
+dnl AC_SYS_LARGEFILE_TEST_INCLUDES
+AC_DEFUN(AC_SYS_LARGEFILE_TEST_INCLUDES,
+ [[#include <sys/types.h>
+ 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 <stdio.h>], [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 <stdio.h>], [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 <stdio.h>
#include <string.h>
@@ -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 <winsock.h>
#include <time.h>
@@ -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 <sys/sockio.h>
#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 */