diff --git a/docs/curl_easy_setopt.3 b/docs/curl_easy_setopt.3 index 8e6fd1b31..db776644d 100644 --- a/docs/curl_easy_setopt.3 +++ b/docs/curl_easy_setopt.3 @@ -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 diff --git a/include/curl/curl.h b/include/curl/curl.h index 850c4fcd1..cf846c338 100644 --- a/include/curl/curl.h +++ b/include/curl/curl.h @@ -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 diff --git a/lib/url.c b/lib/url.c index c54cfe8d0..3fef8b651 100644 --- 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; diff --git a/lib/urldata.h b/lib/urldata.h index 8a0c1f19b..a0580975d 100644 --- a/lib/urldata.h +++ b/lib/urldata.h @@ -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) */ diff --git a/src/main.c b/src/main.c index ed25e7c38..046fa1d19 100644 --- a/src/main.c +++ b/src/main.c @@ -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) { diff --git a/tests/runtests.pl b/tests/runtests.pl index ff7fdbb7b..7e5c29ef3 100755 --- a/tests/runtests.pl +++ b/tests/runtests.pl @@ -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 <