From 8e9f0a73d051f430b7aa9ac7b2f5e57610e20067 Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Wed, 18 Apr 2001 13:41:04 +0000 Subject: [PATCH] Georg Horn's updates, this is _also_ called 1.1.3 ! ;-) --- perl/Curl_easy/Changes | 6 +-- perl/Curl_easy/MANIFEST | 1 + perl/Curl_easy/README | 18 +++---- perl/Curl_easy/easy.xs | 105 +++++++++++++++++++--------------------- 4 files changed, 62 insertions(+), 68 deletions(-) diff --git a/perl/Curl_easy/Changes b/perl/Curl_easy/Changes index 647017c54..11d45e5af 100644 --- a/perl/Curl_easy/Changes +++ b/perl/Curl_easy/Changes @@ -2,9 +2,9 @@ Revision history for Perl extension Curl::easy. Check out the file README for more info. 1.1.3 Wed Apr 18 2001: - Cris Bailiff - - Change/shorten module function names: - Curl::easy::curl_easy_setopt becomes Curl::easy::setopt etc. - This requires minor changes to existing scripts.... + - Change/shorten module function names: Curl::easy::curl_easy_setopt + becomes Curl::easy::setopt etc. This requires minor changes to existing + scripts.... - Added callback function support to pass arbitrary SV * (including FILE globs) from perl through libcurl to the perl callback. - Make callbacks still work with existing scripts which use STDIO diff --git a/perl/Curl_easy/MANIFEST b/perl/Curl_easy/MANIFEST index b106c934b..d60043d7a 100644 --- a/perl/Curl_easy/MANIFEST +++ b/perl/Curl_easy/MANIFEST @@ -1,6 +1,7 @@ Changes MANIFEST Makefile.PL +README easy.pm easy.xs test.pl diff --git a/perl/Curl_easy/README b/perl/Curl_easy/README index 2eee408a0..619fd7d77 100644 --- a/perl/Curl_easy/README +++ b/perl/Curl_easy/README @@ -12,16 +12,16 @@ installed. You then may install this module via the usual way: make install The module provides the same functionality as libcurl provides to C programs, -please refer to the documentation of libcurl. +please refer to the documentation of libcurl. Some examples may be found in +test.pl. -A short example how to use the module may be found in test.pl. +This software is distributed AS IS, WITHOUT WARRANTY OF ANY KIND, either +express or implied. Send praise, patches, money, beer and pizza to the author. +Send complaints to /dev/null. ;-) -This Software is distributed AS IS, WITHOUT WARRANTY OF ANY KIND, -either express or implied. Send praise, patches, money, beer and -pizza to the author. Send complaints to /dev/null. ;-) +The author of this software is Georg Horn +Parts of the callback support have been added by Cris Bailiff + and Forrest Cahoon -The author of this module is Georg Horn - -The latest version of this module can be dowloaded from -http://koblenz-net.de/~horn/export/ +The latest version can be downloaded from http://koblenz-net.de/~horn/export/ diff --git a/perl/Curl_easy/easy.xs b/perl/Curl_easy/easy.xs index 4fff2b332..50b70280b 100644 --- a/perl/Curl_easy/easy.xs +++ b/perl/Curl_easy/easy.xs @@ -29,8 +29,8 @@ static char *errbufvarname = NULL; static SV *read_callback = NULL, *write_callback = NULL, *progress_callback = NULL, *passwd_callback = NULL, - *header_callback = NULL; - /* *closepolicy_callback = NULL; */ + *header_callback = NULL; + /* *closepolicy_callback = NULL; */ /* For storing the content */ @@ -87,58 +87,58 @@ fwrite_wrapper (const void *ptr, void *stream, void *call_function) { - dSP ; - int count,status; + dSP; + int count, status; SV *sv; if (call_function) { - /* then we are doing a callback to perl */ + /* then we are doing a callback to perl */ - ENTER ; - SAVETMPS ; - - PUSHMARK(SP) ; + ENTER; + SAVETMPS; - if (stream == stdout) { - sv = newSViv(0); /* FIXME: should cast stdout to GLOB somehow? */ - } else { /* its already an SV */ - sv = stream; - } - - if (ptr != NULL) { - XPUSHs(sv_2mortal(newSVpvn(ptr, size * nmemb))); + PUSHMARK(SP); + + if (stream == stdout) { + sv = newSViv(0); /* FIXME: should cast stdout to GLOB somehow? */ + } else { /* its already an SV */ + sv = stream; + } + + if (ptr != NULL) { + XPUSHs(sv_2mortal(newSVpvn(ptr, size * nmemb))); } else { - XPUSHs(sv_2mortal(newSVpv("",0))); - } - XPUSHs(sv_2mortal(newSVsv(sv))); /* CURLOPT_FILE SV* */ - PUTBACK ; + XPUSHs(sv_2mortal(newSVpv("", 0))); + } + XPUSHs(sv_2mortal(newSVsv(sv))); /* CURLOPT_FILE SV* */ + PUTBACK; - count = call_sv((SV *)call_function, G_SCALAR); - - SPAGAIN; - if (count != 1) - croak("Big trouble, perl_call_sv(write_callback) didn't return status\n"); + count = perl_call_sv((SV *) call_function, G_SCALAR); - status = POPi; + SPAGAIN; + if (count != 1) + croak("Big trouble, perl_call_sv(write_callback) didn't return status\n"); - PUTBACK ; - - FREETMPS ; - LEAVE ; - return status; + status = POPi; - } else { - /* default to a normal 'fwrite' */ - /* stream could be a FILE * or an SV * */ - FILE *f; - - if (stream == stdout) { /* the only possible FILE ? Think so*/ - f = stream; - } else { /* its a GLOB */ - f = IoIFP(sv_2io(stream)); /* may barf if not a GLOB */ - } + PUTBACK; - return fwrite(ptr,size,nmemb,f); + FREETMPS; + LEAVE; + return status; + + } else { + /* default to a normal 'fwrite' */ + /* stream could be a FILE * or an SV * */ + FILE *f; + + if (stream == stdout) { /* the only possible FILE ? Think so */ + f = stream; + } else { /* its a GLOB */ + f = IoIFP(sv_2io(stream)); /* may barf if not a GLOB */ + } + + return fwrite(ptr, size, nmemb, f); } } @@ -192,7 +192,7 @@ read_callback_func( void *ptr, size_t size, XPUSHs(sv_2mortal(newSVsv(sv))); /* CURLOPT_INFILE SV* */ PUTBACK ; - count = call_sv(read_callback, G_SCALAR); + count = perl_call_sv(read_callback, G_SCALAR); SPAGAIN; if (count != 1) @@ -209,7 +209,6 @@ read_callback_func( void *ptr, size_t size, FREETMPS ; LEAVE ; return (size_t) (mylen/size); - } else { /* default to a normal 'fread' */ /* stream could be a FILE * or an SV * */ @@ -284,7 +283,7 @@ static int passwd_callback_func(void *clientp, char *prompt, char *buffer, count = perl_call_sv(passwd_callback, G_ARRAY); SPAGAIN; if (count != 2) - croak("Big trouble, perl_call_sv(passwd_callback) didn't return status + data\n"); + croak("Big trouble, perl_call_sv(passwd_callback) didn't return status + data\n"); sv = POPs; count = POPi; @@ -294,7 +293,7 @@ static int passwd_callback_func(void *clientp, char *prompt, char *buffer, /* only allowed to return the number of bytes asked for */ mylen = len<(buflen-1) ? len : (buflen-1); memcpy(buffer,p,mylen); - buffer[buflen]=0; /* ensure C string terminates */ + buffer[buflen]=0; /* ensure C string terminates */ PUTBACK; FREETMPS; @@ -318,12 +317,11 @@ closepolicy_callback_func(void *clientp) PUSHMARK(SP); PUTBACK; - argc = call_sv(closepolicy_callback, G_SCALAR); + argc = perl_call_sv(closepolicy_callback, G_SCALAR); SPAGAIN; if (argc != 1) { - croak - ("Unexpected number of arguments returned from closefunction callback\n"); + croak("Unexpected number of arguments returned from closefunction callback\n"); } pl_status = POPs; status = SvTRUE(pl_status) ? 0 : 1; @@ -560,22 +558,18 @@ int option SV * value CODE: if (option < CURLOPTTYPE_OBJECTPOINT) { - /* This is an option specifying an integer value: */ RETVAL = curl_easy_setopt(curl, option, (long)SvIV(value)); - } else if (option == CURLOPT_FILE || option == CURLOPT_INFILE || option == CURLOPT_WRITEHEADER || option == CURLOPT_PROGRESSDATA || - option == CURLOPT_PASSWDDATA) { + option == CURLOPT_PASSWDDATA) { /* This is an option specifying an SV * value: */ RETVAL = curl_easy_setopt(curl, option, newSVsv(ST(2))); - } else if (option == CURLOPT_ERRORBUFFER) { /* Pass in variable name for storing error messages... */ RETVAL = curl_easy_setopt(curl, option, errbuf); if (errbufvarname) free(errbufvarname); errbufvarname = strdup((char *)SvPV(value, PL_na)); - } else if (option == CURLOPT_WRITEFUNCTION || option == CURLOPT_READFUNCTION || option == CURLOPT_PROGRESSFUNCTION || option == CURLOPT_PASSWDFUNCTION || option == CURLOPT_HEADERFUNCTION) { @@ -608,7 +602,6 @@ CODE: */ } RETVAL = -1; - } else if (option == CURLOPT_HTTPHEADER || option == CURLOPT_QUOTE || option == CURLOPT_POSTQUOTE) { /* This is an option specifying a list of curl_slist structs: */