'FILE *' changed to 'void *' in all callback functions
authorDaniel Stenberg <daniel@haxx.se>
Fri, 4 May 2001 07:47:11 +0000 (07:47 +0000)
committerDaniel Stenberg <daniel@haxx.se>
Fri, 4 May 2001 07:47:11 +0000 (07:47 +0000)
docs/curl_easy_setopt.3
include/curl/curl.h
lib/url.c
lib/urldata.h
src/main.c
tests/runtests.pl

index 8e6fd1b31cb159c2351dddc63bddd12ded1ce47b..db776644d322364e9749027993d8824e4c176408 100644 (file)
@@ -42,54 +42,43 @@ call.
 These options are in a bit of random order, but you'll figure it out!
 .TP 0.8i
 .B CURLOPT_FILE
-Data pointer to pass instead of FILE * to the file write function. Note that
-if you specify the
+Data pointer to pass to file write function. Note that if you specify the
 .I CURLOPT_WRITEFUNCTION
-, this is the pointer you'll get as input.
+, this is the pointer you'll get as input. If you don't use a callback, you
+must pass a 'FILE *' as libcurl passes it to fwrite() when writing data.
 
-NOTE: If you're using libcurl as a win32 .DLL, you MUST use a
-.I CURLOPT_WRITEFUNCTION
-if you set the
-.I CURLOPT_FILE
-option.
+NOTE: If you're using libcurl as a win32 DLL, you MUST use the
+\fICURLOPT_WRITEFUNCTION\fP if you set this option.
 .TP
 .B CURLOPT_WRITEFUNCTION
 Function pointer that should match the following prototype:
-.BI "size_t function( void *ptr, size_t size, size_t nmemb, FILE *stream);"
+.BI "size_t function( void *ptr, size_t size, size_t nmemb, void *stream);"
 This function gets called by libcurl as soon as there is received data that
-needs to be written down. The size of the data pointed to by
-.I ptr 
-is
-.I size
-multiplied with
-.I nmemb.
-Return the number of bytes actually written or return -1 to signal error to the library (it will cause it to abort the transfer).
+needs to be written down. The size of the data pointed to by \fIptr\fP is
+\fIsize\fP multiplied with \fInmemb\fP.  Return the number of bytes actually
+written or return -1 to signal error to the library (it will cause it to abort
+the transfer with CURLE_WRITE_ERROR).
+
+Set the \fIstream\fP argument with the \fBCURLOPT_FILE\fP option.
 .TP
 .B CURLOPT_INFILE
-Data pointer to pass instead of FILE * to the file read function. Note that if
-you specify the
-.I CURLOPT_READFUNCTION
-, this is the pointer you'll get as input.
+Data pointer to pass to the file read function. Note that if you specify the
+\fICURLOPT_READFUNCTION\fP, this is the pointer you'll get as input. If you
+don't specify a read callback, this must be a valid FILE *.
 
-NOTE: If you're using libcurl as a win32 .DLL, you MUST use a
-.I CURLOPT_READFUNCTION
-if you set the
-.I CURLOPT_INFILE
-option.
+NOTE: If you're using libcurl as a win32 DLL, you MUST use a
+\fICURLOPT_READFUNCTION\fP if you set this option.
 .TP
 .B CURLOPT_READFUNCTION
 Function pointer that should match the following prototype:
-.BI "size_t function( void *ptr, size_t size, size_t nmemb, FILE *stream);"
+.BI "size_t function( void *ptr, size_t size, size_t nmemb, void *stream);"
 This function gets called by libcurl as soon as it needs to read data in order
-to send it to the peer. The data area pointed at by the pointer
-.I ptr
-may be filled with at most
-.I size
-multiplied with
-.I nmemb
-number of bytes. Your function must return the actual number of bytes that you
-stored in that memory area. Returning -1 will signal an error to the library
-and cause it to abort the current transfer immediately.
+to send it to the peer. The data area pointed at by the pointer \fIptr\fP may
+be filled with at most \fIsize\fP multiplied with \fInmemb\fP number of
+bytes. Your function must return the actual number of bytes that you stored in
+that memory area. Returning -1 will signal an error to the library and cause
+it to abort the current transfer immediately (with a CURLE_READ_ERROR return
+code).
 .TP
 .B CURLOPT_INFILESIZE
 When uploading a file to a remote site, this option should be used to tell
@@ -317,16 +306,15 @@ struct curl_slist structs properly filled in as described for
 .I "CURLOPT_QUOTE"
 .TP
 .B CURLOPT_WRITEHEADER
-Pass a FILE * to be used to write the header part of the received data to. The
-headers are guaranteed to be written one-by-one to this file handle and only
-complete lines are written. Parsing headers should be easy enough using
-this. See also the
-.I CURLOPT_HEADERFUNCTION
-option.
+Pass a pointer to be used to write the header part of the received data to. If
+you don't use a callback to take care of the writing, this must be a FILE
+*. The headers are guaranteed to be written one-by-one and only complete lines
+are written. Parsing headers should be easy enough using this. See also the
+\fICURLOPT_HEADERFUNCTION\fP option.
 .TP
 .B CURLOPT_HEADERFUNCTION
 Function pointer that should match the following prototype:
-.BI "size_t function( void *ptr, size_t size, size_t nmemb, FILE *stream);"
+.BI "size_t function( void *ptr, size_t size, size_t nmemb, void *stream);"
 This function gets called by libcurl as soon as there is received header data
 that needs to be written down. The function will be called once for each
 header with a complete header line in each invoke. The size of the data
index 850c4fcd17fe86054e21656b318b073403bec6b1..cf846c3382436b9235ed3f5ef9d1f04066492cf1 100644 (file)
@@ -76,12 +76,12 @@ typedef int (*curl_progress_callback)(void *clientp,
 typedef size_t (*curl_write_callback)(char *buffer,
                                       size_t size,
                                       size_t nitems,
-                                      FILE *outstream);
+                                      void *outstream);
 
 typedef size_t (*curl_read_callback)(char *buffer,
                                      size_t size,
                                      size_t nitems,
-                                     FILE *instream);
+                                     void *instream);
 
 typedef int (*curl_passwd_callback)(void *clientp,
                                     char *prompt,
@@ -173,7 +173,7 @@ typedef enum {
 typedef enum {
   CINIT(NOTHING, LONG, 0), /********* the first one is unused ************/
   
-  /* This is the FILE * the regular output should be written to. */
+  /* This is the FILE * or void * the regular output should be written to. */
   CINIT(FILE, OBJECTPOINT, 1),
 
   /* The full URL to get/put */
@@ -276,7 +276,8 @@ typedef enum {
   /* send linked-list of QUOTE commands */
   CINIT(QUOTE, OBJECTPOINT, 28),
 
-  /* send FILE * to store headers to */
+  /* send FILE * or void * to store headers to, if you use a callback it
+     is simply passed to the callback unmodified */
   CINIT(WRITEHEADER, OBJECTPOINT, 29),
 
 #ifdef MULTIDOC
index c54cfe8d01db4e5dd4fe6bf5335b22054ff1cfd8..3fef8b65179de1e61ce0ad6cde1ebbd6983b8c84 100644 (file)
--- a/lib/url.c
+++ b/lib/url.c
@@ -216,10 +216,10 @@ CURLcode Curl_open(CURL **curl, char *url)
     data->err  = stderr;  /* default stderr to stderr */
 
     /* use fwrite as default function to store output */
-    data->fwrite = (size_t (*)(char *, size_t, size_t, FILE *))fwrite;
+    data->fwrite = (curl_write_callback)fwrite;
 
     /* use fread as default function to read input */
-    data->fread = (size_t (*)(char *, size_t, size_t, FILE *))fread;
+    data->fread = (curl_read_callback)fread;
 
     /* set the default passwd function */
     data->fpasswd = my_getpass;
index 8a0c1f19b2e1fb9706be92d1f241342219ec5014..a0580975d22e3c63cc92caf8765a9ff92ce4e4d4 100644 (file)
@@ -456,9 +456,10 @@ struct UrlData {
   long header_size;  /* size of read header(s) in bytes */
   long request_size; /* the amount of bytes sent in the request(s) */
 
-  FILE *out;    /* the fetched file goes here */
-  FILE *in;     /* the uploaded file is read from here */
-  FILE *writeheader; /* write the header to this is non-NULL */
+  void *out;         /* the fetched file goes here */
+  void *in;          /* the uploaded file is read from here */
+  void *writeheader; /* write the header to this is non-NULL */
+
   char *url;   /* what to get */
   char *freethis; /* if non-NULL, an allocated string for the URL */
   long use_port;  /* which port to use (when not using default) */
index ed25e7c389eeef68ed730a8c37a2cc9f45bd0cb0..046fa1d19c8a4ad8b363e987fdee680066605326 100644 (file)
@@ -1268,7 +1268,7 @@ struct OutStruct {
   struct Configurable *config;
 };
 
-int my_fwrite(void *buffer, size_t size, size_t nmemb, FILE *stream)
+int my_fwrite(void *buffer, size_t size, size_t nmemb, void *stream)
 {
   struct OutStruct *out=(struct OutStruct *)stream;
   if(out && !out->stream) {
index ff7fdbb7b689cd68130b21b8d8fe962d6bb716fc..7e5c29ef3fe0210912b61d0114e18e80f5d948f0 100755 (executable)
@@ -20,7 +20,6 @@ my $CURL="../src/curl"; # what curl executable to run on the tests
 my $LOGDIR="log";
 my $TESTDIR="data";
 my $SERVERIN="$LOGDIR/server.input"; # what curl sent the server
-my $CURLOUT="$LOGDIR/curl.out"; # curl output if not stdout
 my $CURLLOG="$LOGDIR/curl.log"; # all command lines run
 my $FTPDCMD="$LOGDIR/ftpserver.cmd"; # copy ftp server instructions here
 
@@ -59,7 +58,8 @@ my $short;
 my $verbose;
 my $debugprotocol;
 my $anyway;
-my $gdbthis; # run test case with gdb debugger
+my $gdbthis;      # run test case with gdb debugger
+my $keepoutfiles; # keep stdout and stderr files after tests
 
 #######################################################################
 # Return the pid of the server as found in the given pid file
@@ -432,6 +432,8 @@ sub singletest {
     # if this file exists, it is FTP server instructions:
     my $ftpservercmd="$TESTDIR/ftpd$NUMBER.txt";
 
+    my $CURLOUT="$LOGDIR/curl$NUMBER.out"; # curl output if not stdout
+
     if(! -r $CURLCMD) {
         if($verbose) {
             # this is not a test
@@ -603,12 +605,15 @@ sub singletest {
 
     }
 
-    # remove the stdout and stderr files
-    unlink($STDOUT);
-    unlink($STDERR);
+    if(!$keepoutfiles) {
+        # remove the stdout and stderr files
+        unlink($STDOUT);
+        unlink($STDERR);
+        unlink($CURLOUT); # remove the downloaded results
+
+        unlink("$LOGDIR/upload.$NUMBER");  # remove upload leftovers
+    }
 
-    unlink("$LOGDIR/upload.$NUMBER");  # remove upload leftovers
-    unlink($CURLOUT); # remove the downloaded results
     unlink($FTPDCMD); # remove the instructions for this test
 
     if($memory_debug) {
@@ -737,6 +742,10 @@ do {
         # continue anyway, even if a test fail
         $anyway=1;
     }
+    elsif($ARGV[0] eq "-k") {
+        # keep stdout and stderr files after tests
+        $keepoutfiles=1;
+    }
     elsif($ARGV[0] eq "-h") {
         # show help text
         print <<EOHELP
@@ -745,6 +754,7 @@ Usage: runtests.pl [options]
   -d       display server debug info
   -g       run the test case with gdb
   -h       this help text
+  -k       keep stdout and stderr files present after tests
   -s       short output
   -v       verbose output
   [num]    like "5 6 9" or " 5 to 22 " to run those tests only