]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
hostname and large file support added
authorDaniel Stenberg <daniel@haxx.se>
Thu, 24 Aug 2000 12:33:16 +0000 (12:33 +0000)
committerDaniel Stenberg <daniel@haxx.se>
Thu, 24 Aug 2000 12:33:16 +0000 (12:33 +0000)
configure.in
largefile.m4 [new file with mode: 0644]
lib/hostip.c
lib/http.c
lib/if2ip.c
lib/sendf.c
lib/sendf.h
lib/url.c
lib/urldata.h

index 8942c99be8ac13f70b114c7932a23f0a2e09b760..67d41af02c508c23264bcea261ccb2c20577ed8c 100644 (file)
@@ -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 (file)
index 0000000..2809dcf
--- /dev/null
@@ -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
+  ])
index fe8a7743f947ea5c62b8b2d12d33c8738e4f5afb..ecfb59de373faca7949ed4a51688266c71560323 100644 (file)
@@ -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
 
index 0632f608446881767954d1ab8dc22d899e3f8048..5e3f1b10c67ebd2890e605637dd6265d95dc98d4 100644 (file)
  * ------------------------------------------------------------
  ****************************************************************************/
 
-#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>
 
 #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",
index ede5cf08cb6e8a9e3d84597080130f353253a34c..25b2c40c25f73e1df69354214f24232a333dff9c 100644 (file)
@@ -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
 
index 87416775c90324d5b698a3d478287fb68c64f3e8..e048637be956b321c3543e55734076a3651cc603 100644 (file)
@@ -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;
+}
+
 
 
 
index c6c7bdb9708be1a61f48490f173e0776d07716a0..79eff1c40bb4241c489d8255b0bb96bdac4b6111 100644 (file)
@@ -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, ...);
 
index ad43bc773df760196dae8237fa7ed72868e05461..e74bb4568d56718e9c2e6db9870750fe4b13f29d 100644 (file)
--- 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;
index 3d03bfce7d11f70ebf0d5cb89363b5278bb2f603..226237db228eca1297fce058b47249a0dd531ef3 100644 (file)
@@ -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 */