Compare commits

...

52 Commits

Author SHA1 Message Date
Daniel Stenberg
c2d4fd876c 7.9.5 commit 2002-03-07 08:50:18 +00:00
Daniel Stenberg
58cad04bbb added the "known bugs" file 2002-03-07 08:29:24 +00:00
Daniel Stenberg
9bb64d6827 new VMS messages from Nico Baggus 2002-03-06 23:18:22 +00:00
Daniel Stenberg
4441df90c1 Kevin Roth nicely saved us from this backslash-removing problem! 2002-03-06 22:52:00 +00:00
Daniel Stenberg
f51f2417c5 Brad corrected the include path (again) 2002-03-06 22:19:16 +00:00
Daniel Stenberg
aad617647d corrected the newlines 2002-03-06 22:08:11 +00:00
Daniel Stenberg
49c0d62dda two items since pre6 2002-03-06 15:05:00 +00:00
Daniel Stenberg
f752098ba5 when removed, an easy handle can be curl_easy_perform()ed again 2002-03-06 15:01:45 +00:00
Daniel Stenberg
a4477b9e4b Paul Nolan built it on pocket pc 2002-03-06 12:33:34 +00:00
Daniel Stenberg
ad3cef0fc8 Ralph Mitchell's minor #include patch to prevent some warnings 2002-03-06 09:40:06 +00:00
Daniel Stenberg
d89dbe5bd6 we don't skip what looks like already escaped strings, that was fixed
ages ago
2002-03-06 07:44:49 +00:00
Daniel Stenberg
b0475dbdbc read POST data using the read callback 2002-03-05 14:14:22 +00:00
Daniel Stenberg
60b2e74fa3 corrected the progress callback prototype!!! 2002-03-05 10:15:38 +00:00
Daniel Stenberg
cda16297d1 added text to the progress chapter 2002-03-05 09:01:58 +00:00
Daniel Stenberg
d6c9a72e15 explicitly mention easy handle 2002-03-04 13:10:15 +00:00
Daniel Stenberg
4d7b1512c1 mention 'easy handle' and not just handle, there will soon be other handles
to keep track of too
2002-03-04 13:06:46 +00:00
Daniel Stenberg
d8a35d745e cut off 2001 and put those changes in a separate file 2002-03-04 10:34:58 +00:00
Daniel Stenberg
e22657ea13 added docs/libcurl/
removed multi/
2002-03-04 10:28:02 +00:00
Daniel Stenberg
d06d6b5534 moved lots to the new subdir 'libcurl' 2002-03-04 10:27:37 +00:00
Daniel Stenberg
cec8ab1fde remove this directory, this is history 2002-03-04 10:19:32 +00:00
Daniel Stenberg
9fc62a8dd0 multi interface using examples 2002-03-04 10:15:44 +00:00
Daniel Stenberg
61540b98c2 no longer include the multi dir, the examples should be in the examples
dir
2002-03-04 10:15:12 +00:00
Daniel Stenberg
465ae39e86 moved to the new libcurl/ directory 2002-03-04 10:10:58 +00:00
Daniel Stenberg
01f04b9a41 ripped out from ../ and put in its own directory now 2002-03-04 10:09:48 +00:00
Daniel Stenberg
34f9ab1046 Added packages/EPM 2002-03-04 08:00:25 +00:00
Daniel Stenberg
699876778b Added EPM stuff, thanks to Giuseppe Corbelli 2002-03-04 07:59:53 +00:00
Daniel Stenberg
8fc5a0d19e bug report #524427 pointed out a mistake in the example source 2002-03-01 17:22:40 +00:00
Daniel Stenberg
62b5926d58 initial and still basic curl multi interface documentation 2002-03-01 15:34:23 +00:00
Daniel Stenberg
4d1037f385 removed incorrect and unnecessary words 2002-03-01 13:38:56 +00:00
Daniel Stenberg
e4addb3975 several little things since pre4 2002-03-01 10:48:08 +00:00
Daniel Stenberg
2aef351980 memanalyze is now moved to the tests/ dir 2002-03-01 09:20:03 +00:00
Daniel Stenberg
d88c153c7d include memanalyze.pl in the dist archive 2002-03-01 09:19:28 +00:00
Daniel Stenberg
9e9883082e moved memanalyze.pl into the tests dir 2002-03-01 09:18:54 +00:00
Daniel Stenberg
71440df4c7 Nico Baggus added more error codes to the VMS stuff. 2002-02-28 23:55:18 +00:00
Daniel Stenberg
80b004a57d Wesley Laxton's CURLOPT_PREQUOTE work 2002-02-28 23:31:23 +00:00
Daniel Stenberg
ea8476a2dc Ralph Mitchell's SSL problems made me notice that we didn't increase the
header byte counter properly
2002-02-28 15:13:35 +00:00
Daniel Stenberg
cb85ca18ab more fancy alloc, we store the size in each allocated block so that we
can destroy the full allocated area just before we free it
2002-02-28 12:37:05 +00:00
Daniel Stenberg
f1103b95cf set CURL_MEMDEBUG to enable memory debugging in case curl is compiled
with it
2002-02-28 12:36:25 +00:00
Daniel Stenberg
aa5ff53bcf added -t for trace, helps searching for leaks and similar 2002-02-28 12:35:54 +00:00
Daniel Stenberg
907dabed5d memory debugging is now only enabled if the CURL_MEMDEBUG environment
variable is set when curl is invoked
2002-02-28 12:35:09 +00:00
Daniel Stenberg
0cacbc892c always allocates at least 64 bytes for real, and damages them before free 2002-02-28 12:18:15 +00:00
Daniel Stenberg
6753c3c715 made building outside the source tree work again, Kevin Roth reported 2002-02-27 15:09:23 +00:00
Daniel Stenberg
36e1363e3d minor edit 2002-02-27 12:40:01 +00:00
Daniel Stenberg
d1a711eb6a oops, we weren't doing HTTPS - now we are 2002-02-27 07:50:22 +00:00
Daniel Stenberg
d8dea4dcc7 test 304, HTTPS multipart formpost 2002-02-27 07:49:01 +00:00
Daniel Stenberg
ca161737bc use the correct time in the cookie jar 2002-02-27 07:41:46 +00:00
Daniel Stenberg
3612c3774e made Max-Age work as defined in the RFC.
my brain damaged fix to not parse spaces as part of the value is now fixed
to instead strip off trailing spaces from values.
2002-02-27 07:38:04 +00:00
Daniel Stenberg
e6a65bb3ef modified cookie expire date 2002-02-26 13:38:12 +00:00
Daniel Stenberg
ff291eee48 new field1 functionality testing too 2002-02-26 13:18:39 +00:00
Daniel Stenberg
66b8f48a88 When saving a cookie jar, set field 1 (counted from 0) properly to TRUE if the
domain starts with a dot.
2002-02-26 13:18:08 +00:00
Daniel Stenberg
634760cbdc test 31: "HTTP with weirdly formatted cookies and cookiejar storage" 2002-02-26 13:09:46 +00:00
Daniel Stenberg
a23a897ad2 removed crash on weird input, this also better discards silly input 2002-02-26 13:07:53 +00:00
74 changed files with 2832 additions and 2202 deletions

2053
CHANGES

File diff suppressed because it is too large Load Diff

1957
CHANGES.2001 Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -10,7 +10,7 @@ EXTRA_DIST = \
bin_SCRIPTS = curl-config bin_SCRIPTS = curl-config
SUBDIRS = docs lib src include tests packages multi SUBDIRS = docs lib src include tests packages
# create a root makefile in the distribution: # create a root makefile in the distribution:
dist-hook: dist-hook:

View File

@@ -594,10 +594,10 @@ dnl AC_SUBST(RANLIB)
AC_CONFIG_FILES([Makefile \ AC_CONFIG_FILES([Makefile \
docs/Makefile \ docs/Makefile \
docs/examples/Makefile \ docs/examples/Makefile \
docs/libcurl/Makefile \
include/Makefile \ include/Makefile \
include/curl/Makefile \ include/curl/Makefile \
src/Makefile \ src/Makefile \
multi/Makefile \
lib/Makefile \ lib/Makefile \
tests/Makefile \ tests/Makefile \
tests/data/Makefile \ tests/data/Makefile \
@@ -610,6 +610,8 @@ AC_CONFIG_FILES([Makefile \
packages/Linux/RPM/curl.spec \ packages/Linux/RPM/curl.spec \
packages/Linux/RPM/curl-ssl.spec \ packages/Linux/RPM/curl-ssl.spec \
packages/Solaris/Makefile \ packages/Solaris/Makefile \
packages/EPM/curl.list \
packages/EPM/Makefile \
curl-config curl-config
]) ])
AC_OUTPUT AC_OUTPUT

View File

@@ -408,6 +408,7 @@ PORTS
- HP-PA Linux - HP-PA Linux
- MIPS IRIX 6.2, 6.5 - MIPS IRIX 6.2, 6.5
- MIPS Linux - MIPS Linux
- Pocket PC/Win CE 3.0
- Power AIX 4.2, 4.3.1, 4.3.2 - Power AIX 4.2, 4.3.1, 4.3.2
- PowerPC Darwin 1.0 - PowerPC Darwin 1.0
- PowerPC Linux - PowerPC Linux

View File

@@ -54,7 +54,7 @@ Windows vs Unix
Inside the source code, We make an effort to avoid '#ifdef [Your OS]'. All Inside the source code, We make an effort to avoid '#ifdef [Your OS]'. All
conditionals that deal with features *should* instead be in the format conditionals that deal with features *should* instead be in the format
'#ifdef HAVE_THAT_WEIRD_FUNCTION'. Since Windows can't run configure scripts, '#ifdef HAVE_THAT_WEIRD_FUNCTION'. Since Windows can't run configure scripts,
we maintain two config-win32.h files (one in / and one in src/) that are we maintain two config-win32.h files (one in lib/ and one in src/) that are
supposed to look exactly as a config.h file would have looked like on a supposed to look exactly as a config.h file would have looked like on a
Windows machine! Windows machine!
@@ -69,10 +69,10 @@ Library
rather small and easy-to-follow. All the ones prefixed with 'curl_easy' are rather small and easy-to-follow. All the ones prefixed with 'curl_easy' are
put in the lib/easy.c file. put in the lib/easy.c file.
Starting with libcurl 7.8, curl_global_init_() and curl_global_cleanup() were curl_global_init_() and curl_global_cleanup() should be called by the
introduced. They should be called by the application to initialize and clean application to initialize and clean up global stuff in the library. As of
up global stuff in the library. As of today, they just do the global SSL today, it can handle the global SSL initing if SSL is enabled and it can init
initing if SSL is enabled. libcurl itself has no "global" scope. the socket layer on windows machines. libcurl itself has no "global" scope.
All printf()-style functions use the supplied clones in lib/mprintf.c. This All printf()-style functions use the supplied clones in lib/mprintf.c. This
makes sure we stay absolutely platform independent. makes sure we stay absolutely platform independent.

14
docs/KNOWN_BUGS Normal file
View File

@@ -0,0 +1,14 @@
These are problems known to exist at the time of this release. Feel free to
join in and help us correct one or more of these! Also be sure to check the
changelog of the current development status, as one or more of these problems
may have been fixed since this was written!
* curl_formadd() fails on OSF1. Why? Fix! Need help from OSF1 dudes.
https://sourceforge.net/tracker/index.php?func=detail&aid=524433&group_id=976&atid=100976
* Running 'make test' on Mac OS X gives 4 errors. This seems to be related
to some kind of libtool problem:
http://curl.haxx.se/mail/archive-2002-03/0029.html and
http://curl.haxx.se/mail/archive-2002-03/0033.html
* libcurl does not deal nicely with files larger than 2GB

View File

@@ -246,25 +246,25 @@ POST (HTTP)
-F accepts parameters like -F "name=contents". If you want the contents to -F accepts parameters like -F "name=contents". If you want the contents to
be read from a file, use <@filename> as contents. When specifying a file, be read from a file, use <@filename> as contents. When specifying a file,
you can also specify the file content type by appending ';type=<mime type>' you can also specify the file content type by appending ';type=<mime type>'
to the file name. You can also post the contents of several files in one field. to the file name. You can also post the contents of several files in one
For example, the field name 'coolfiles' is used to send three files, with field. For example, the field name 'coolfiles' is used to send three files,
different content types using the following syntax: with different content types using the following syntax:
curl -F "coolfiles=@fil1.gif;type=image/gif,fil2.txt,fil3.html" \ curl -F "coolfiles=@fil1.gif;type=image/gif,fil2.txt,fil3.html" \
http://www.post.com/postit.cgi http://www.post.com/postit.cgi
If the content-type is not specified, curl will try to guess from the file If the content-type is not specified, curl will try to guess from the file
extension (it only knows a few), or use the previously specified type extension (it only knows a few), or use the previously specified type (from
(from an earlier file if several files are specified in a list) or else it an earlier file if several files are specified in a list) or else it will
will using the default type 'text/plain'. using the default type 'text/plain'.
Emulate a fill-in form with -F. Let's say you fill in three fields in a Emulate a fill-in form with -F. Let's say you fill in three fields in a
form. One field is a file name which to post, one field is your name and one form. One field is a file name which to post, one field is your name and one
field is a file description. We want to post the file we have written named field is a file description. We want to post the file we have written named
"cooltext.txt". To let curl do the posting of this data instead of your "cooltext.txt". To let curl do the posting of this data instead of your
favourite browser, you have to read the HTML source of the form page and find favourite browser, you have to read the HTML source of the form page and
the names of the input fields. In our example, the input field names are find the names of the input fields. In our example, the input field names
'file', 'yourname' and 'filedescription'. are 'file', 'yourname' and 'filedescription'.
curl -F "file=@cooltext.txt" -F "yourname=Daniel" \ curl -F "file=@cooltext.txt" -F "yourname=Daniel" \
-F "filedescription=Cool text file with cool text inside" \ -F "filedescription=Cool text file with cool text inside" \

View File

@@ -6,69 +6,24 @@ AUTOMAKE_OPTIONS = foreign no-dependencies
man_MANS = \ man_MANS = \
curl.1 \ curl.1 \
curl-config.1 \ curl-config.1
curl_easy_cleanup.3 \
curl_easy_getinfo.3 \
curl_easy_init.3 \
curl_easy_perform.3 \
curl_easy_setopt.3 \
curl_easy_duphandle.3 \
curl_formparse.3 \
curl_formadd.3 \
curl_formfree.3 \
curl_getdate.3 \
curl_getenv.3 \
curl_slist_append.3 \
curl_slist_free_all.3 \
curl_version.3 \
curl_escape.3 \
curl_unescape.3 \
curl_strequal.3 \
curl_strnequal.3 \
curl_mprintf.3 \
curl_global_init.3 \
curl_global_cleanup.3 \
libcurl.3
SUBDIRS = examples
HTMLPAGES = \ HTMLPAGES = \
curl.html \ curl.html \
curl-config.html \ curl-config.html
curl_easy_cleanup.html \
curl_easy_getinfo.html \
curl_easy_init.html \
curl_easy_perform.html \
curl_easy_setopt.html \
curl_easy_duphandle.html \
curl_formadd.html \
curl_formparse.html \
curl_formfree.html \
curl_getdate.html \
curl_getenv.html \
curl_slist_append.html \
curl_slist_free_all.html \
curl_version.html \
curl_escape.html \
curl_unescape.html \
curl_strequal.html \
curl_strnequal.html \
curl_mprintf.html \
curl_global_init.html \
curl_global_cleanup.html \
libcurl.html \
index.html
EXTRA_DIST = $(man_MANS) \ SUBDIRS = examples libcurl
MANUAL BUGS CONTRIBUTE FAQ FEATURES INTERNALS \
README.win32 RESOURCES TODO TheArtOfHttpScripting THANKS \ EXTRA_DIST = MANUAL BUGS CONTRIBUTE FAQ FEATURES INTERNALS \
VERSIONS $(HTMLPAGES) README.win32 RESOURCES TODO TheArtOfHttpScripting THANKS \
VERSIONS KNOWN_BUGS $(man_MANS) $(HTMLPAGES)
MAN2HTML= gnroff -man $< | man2html >$@ MAN2HTML= gnroff -man $< | man2html >$@
SUFFIXES = .1 .3 .html SUFFIXES = .1 .3 .html
html: $(HTMLPAGES) html: $(HTMLPAGES)
cd libcurl; make html
.3.html: .3.html:
$(MAN2HTML) $(MAN2HTML)

View File

@@ -78,6 +78,9 @@ TODO
HTTP HTTP
* Make it possible to supply normal POST data through the ordinary read data
callback.
* HTTP PUT for files passed on stdin *OR* when the --crlf option is * HTTP PUT for files passed on stdin *OR* when the --crlf option is
used. Requires libcurl to send the file with chunked content used. Requires libcurl to send the file with chunked content
encoding. [http://curl.haxx.se/dev/HTTP-PUT-stdin.txt] When the filter encoding. [http://curl.haxx.se/dev/HTTP-PUT-stdin.txt] When the filter

View File

@@ -1,29 +0,0 @@
.\" You can view this file with:
.\" nroff -man [file]
.\" $Id$
.\"
.TH curl_easy_cleanup 3 "5 March 2001" "libcurl 7.7" "libcurl Manual"
.SH NAME
curl_easy_cleanup - End a libcurl session
.SH SYNOPSIS
.B #include <curl/curl.h>
.sp
.BI "void curl_easy_cleanup(CURL *" handle ");"
.ad
.SH DESCRIPTION
This function must be the last function to call for a curl session. It is the
opposite of the
.I curl_easy_init
function and must be called with the same
.I handle
as input as the curl_easy_init call returned.
This will effectively close all connections libcurl has been used and possibly
has kept open until now. Don't call this function if you intend to transfer
more files (libcurl 7.7 or later).
.SH RETURN VALUE
None
.SH "SEE ALSO"
.BR curl_easy_init "(3), "
.SH BUGS
Surely there are some, you tell me!

View File

@@ -1,34 +0,0 @@
.\" You can view this file with:
.\" nroff -man [file]
.\" $Id$
.\"
.TH curl_easy_init 3 "14 August 2001" "libcurl 7.8.1" "libcurl Manual"
.SH NAME
curl_easy_init - Start a libcurl session
.SH SYNOPSIS
.B #include <curl/curl.h>
.sp
.BI "CURL *curl_easy_init( );"
.ad
.SH DESCRIPTION
This function must be the first function to call, and it returns a CURL handle
that you shall use as input to the other easy-functions. The init calls
intializes curl and this call MUST have a corresponding call to
.I curl_easy_cleanup
when the operation is complete.
On win32 systems, if you want to init the winsock stuff manually, libcurl will
not do that for you. WSAStartup() and WSACleanup() should then be called
accordingly. If you want libcurl to handle this, use the CURL_GLOBAL_WIN32
flag in the initial curl_global_init() call.
Using libcurl 7.7 and later, you should perform all your sequential file
transfers using the same curl handle. This enables libcurl to use persistant
connections where possible.
.SH RETURN VALUE
If this function returns NULL, something went wrong and you cannot use the
other curl functions.
.SH "SEE ALSO"
.BR curl_easy_cleanup "(3), " curl_global_init "(3)
.SH BUGS
Surely there are some, you tell me!

View File

@@ -470,7 +470,30 @@ HTTP POSTing
Showing Progress Showing Progress
[ built-in progress meter, progress callback ] For historical and traditional reasons, libcurl has a built-in progress meter
that can be switched on and then makes it presents a progress meter in your
terminal.
Switch on the progress meter by, oddly enough, set CURLOPT_NOPROGRESS to
FALSE. This option is set to TRUE by default.
For most applications however, the built-in progress meter is useless and
what instead is interesting is the ability to specify a progress
callback. The function pointer you pass to libcurl will then be called on
irregular intervals with information about the current transfer.
Set the progress callback by using CURLOPT_PROGRESSFUNCTION. And pass a
pointer to a function that matches this prototype:
int progress_callback(void *clientp,
double dltotal,
double dlnow,
double ultotal,
double ulnow);
If any of the input arguments is unknown, a 0 will be passed. The first
argument, the 'clientp' is the pointer you pass to libcurl with
CURLOPT_PROGRESSDATA. libcurl won't touch it.
libcurl with C++ libcurl with C++

68
docs/libcurl/Makefile.am Normal file
View File

@@ -0,0 +1,68 @@
#
# $Id$
#
AUTOMAKE_OPTIONS = foreign no-dependencies
man_MANS = \
curl_easy_cleanup.3 \
curl_easy_getinfo.3 \
curl_easy_init.3 \
curl_easy_perform.3 \
curl_easy_setopt.3 \
curl_easy_duphandle.3 \
curl_formparse.3 \
curl_formadd.3 \
curl_formfree.3 \
curl_getdate.3 \
curl_getenv.3 \
curl_slist_append.3 \
curl_slist_free_all.3 \
curl_version.3 \
curl_escape.3 \
curl_unescape.3 \
curl_strequal.3 \
curl_strnequal.3 \
curl_mprintf.3 \
curl_global_init.3 \
curl_global_cleanup.3 \
libcurl.3
HTMLPAGES = \
curl_easy_cleanup.html \
curl_easy_getinfo.html \
curl_easy_init.html \
curl_easy_perform.html \
curl_easy_setopt.html \
curl_easy_duphandle.html \
curl_formadd.html \
curl_formparse.html \
curl_formfree.html \
curl_getdate.html \
curl_getenv.html \
curl_slist_append.html \
curl_slist_free_all.html \
curl_version.html \
curl_escape.html \
curl_unescape.html \
curl_strequal.html \
curl_strnequal.html \
curl_mprintf.html \
curl_global_init.html \
curl_global_cleanup.html \
libcurl.html \
index.html
EXTRA_DIST = $(man_MANS) $(HTMLPAGES)
MAN2HTML= gnroff -man $< | man2html >$@
SUFFIXES = .1 .3 .html
html: $(HTMLPAGES)
.3.html:
$(MAN2HTML)
.1.html:
$(MAN2HTML)

View File

@@ -0,0 +1,25 @@
.\" You can view this file with:
.\" nroff -man [file]
.\" $Id$
.\"
.TH curl_easy_cleanup 3 "4 March 2002" "libcurl 7.7" "libcurl Manual"
.SH NAME
curl_easy_cleanup - End a libcurl easy session
.SH SYNOPSIS
.B #include <curl/curl.h>
.sp
.BI "void curl_easy_cleanup(CURL *" handle ");"
.ad
.SH DESCRIPTION
This function must be the last function to call for an easy session. It is the
opposite of the \fIcurl_easy_init\fP function and must be called with the same
\fIhandle\fP as input that the curl_easy_init call returned.
This will effectively close all connections this handle has used and possibly
has kept open until now. Don't call this function if you intend to transfer
more files.
.SH RETURN VALUE
None
.SH "SEE ALSO"
.BR curl_easy_init "(3), "

View File

@@ -0,0 +1,25 @@
.\" You can view this file with:
.\" nroff -man [file]
.\" $Id$
.\"
.TH curl_easy_init 3 "4 March 2002" "libcurl 7.8.1" "libcurl Manual"
.SH NAME
curl_easy_init - Start a libcurl easy session
.SH SYNOPSIS
.B #include <curl/curl.h>
.sp
.BI "CURL *curl_easy_init( );"
.ad
.SH DESCRIPTION
This function must be the first function to call, and it returns a CURL easy
handle that you must use as input to other easy-functions. curl_easy_init
intializes curl and this call MUST have a corresponding call to
\fIcurl_easy_cleanup\fP when the operation is complete.
.SH RETURN VALUE
If this function returns NULL, something went wrong and you cannot use the
other curl functions.
.SH "SEE ALSO"
.BR curl_easy_cleanup "(3), " curl_global_init "(3)
.SH BUGS
Surely there are some, you tell me!

View File

@@ -2,7 +2,7 @@
.\" nroff -man [file] .\" nroff -man [file]
.\" $Id$ .\" $Id$
.\" .\"
.TH curl_escape 3 "22 March 2001" "libcurl 7.7" "libcurl Manual" .TH curl_escape 3 "6 March 2002" "libcurl 7.9" "libcurl Manual"
.SH NAME .SH NAME
curl_escape - URL encodes the given string curl_escape - URL encodes the given string
.SH SYNOPSIS .SH SYNOPSIS
@@ -13,10 +13,8 @@ curl_escape - URL encodes the given string
.SH DESCRIPTION .SH DESCRIPTION
This function will convert the given input string to an URL encoded string and This function will convert the given input string to an URL encoded string and
return that as a new allocated string. All input characters that are not a-z, return that as a new allocated string. All input characters that are not a-z,
A-Z or 0-9 will be converted to their "URL escaped" version. If a sequence of A-Z or 0-9 will be converted to their "URL escaped" version (%NN where NN is a
%NN (where NN is a two-digit hexadecimal number) is found in the string to two-digit hexadecimal number).
encode, that 3-letter combination will be copied to the output unmodifed,
assuming that it is an already encoded piece of data.
If the 'length' argument is set to 0, curl_escape() will use strlen() on the If the 'length' argument is set to 0, curl_escape() will use strlen() on the
input 'url' string to find out the size. input 'url' string to find out the size.

View File

@@ -2,7 +2,7 @@
.\" nroff -man [file] .\" nroff -man [file]
.\" $Id$ .\" $Id$
.\" .\"
.TH curl_formadd 3 "29 October 2001" "libcurl 7.9.1" "libcurl Manual" .TH curl_formadd 3 "1 Match 2002" "libcurl 7.9.1" "libcurl Manual"
.SH NAME .SH NAME
curl_formadd - add a section to a multipart/formdata HTTP POST curl_formadd - add a section to a multipart/formdata HTTP POST
.SH SYNOPSIS .SH SYNOPSIS
@@ -87,8 +87,8 @@ Returns non-zero if an error occurs.
.SH EXAMPLE .SH EXAMPLE
.nf .nf
HttpPost* post = NULL; struct HttpPost* post = NULL;
HttpPost* last = NULL; struct HttpPost* last = NULL;
char namebuffer[] = "name buffer"; char namebuffer[] = "name buffer";
long namelength = strlen(namebuffer); long namelength = strlen(namebuffer);
char buffer[] = "test buffer"; char buffer[] = "test buffer";

View File

@@ -0,0 +1,20 @@
.\" $Id$
.\"
.TH curl_multi_add_handle 3 "4 March 2002" "libcurl 7.9.5" "libcurl Manual"
.SH NAME
curl_multi_add_handle - add an easy handle to a multi session
.SH SYNOPSIS
#include <curl/curl.h>
CURLMcode curl_multi_add_handle(CURLM *multi_handle, CURL *easy_handle);
.ad
.SH DESCRIPTION
Adds a standard easy handle to the multi stack. This will make this multi
handle control the specified easy handle.
When an easy handle has been added to a multi stack, you can not and you must
not use curl_easy_perform() on that handle!
.SH RETURN VALUE
CURLMcode type, general libcurl multi interface error code.
.SH "SEE ALSO"
.BR curl_multi_cleanup "(3)," curl_multi_init "(3)"

View File

@@ -0,0 +1,18 @@
.\" $Id$
.\"
.TH curl_multi_cleanup 3 "1 March 2002" "libcurl 7.9.5" "libcurl Manual"
.SH NAME
curl_multi_cleanup - close down a multi session
.SH SYNOPSIS
.B #include <curl/curl.h>
.sp
.BI "CURLMcode curl_multi_cleanup( CURLM *multi_handle );"
.ad
.SH DESCRIPTION
Cleans up and removes a whole multi stack. It does not free or touch any
individual easy handles in any way - they still need to be closed
individually, using the usual curl_easy_cleanup() way.
.SH RETURN VALUE
CURLMcode type, general libcurl multi interface error code.
.SH "SEE ALSO"
.BR curl_multi_init "(3)," curl_easy_cleanup "(3)," curl_easy_init "(3)"

View File

@@ -0,0 +1,23 @@
.\" $Id$
.\"
.TH curl_multi_fdset 3 "1 March 2002" "libcurl 7.9.5" "libcurl Manual"
.SH NAME
curl_multi_fdset - add an easy handle to a multi session
.SH SYNOPSIS
#include <curl/curl.h>
CURLMcode curl_multi_fdset(CURLM *multi_handle,
fd_set *read_fd_set,
fd_set *write_fd_set,
fd_set *exc_fd_set,
int *max_fd);
.ad
.SH DESCRIPTION
This function extracts file descriptor information from a given multi_handle.
libcurl returns its fd_set sets. The application can use these to select() or
poll() on. The curl_multi_perform() function should be called as soon as one
of them are ready to be read from or written to.
.SH RETURN VALUE
CURLMcode type, general libcurl multi interface error code.
.SH "SEE ALSO"
.BR curl_multi_cleanup "(3)," curl_multi_init "(3)"

View File

@@ -0,0 +1,35 @@
.\" $Id$
.\"
.TH curl_multi_info_read 3 "1 March 2002" "libcurl 7.9.5" "libcurl Manual"
.SH NAME
curl_multi_info_read - read multi stack informationals
.SH SYNOPSIS
#include <curl/curl.h>
CURLMsg *curl_multi_info_read( CURLM *multi_handle,
int *msgs_in_queue);
.ad
.SH DESCRIPTION
Ask the multi handle if there's any messages/informationals from the
individual transfers. Messages include informationals such as an error code
from the transfer or just the fact that a transfer is completed. More details
on these should be written down as well.
Repeated calls to this function will return a new struct each time, until a
special "end of msgs" struct is returned as a signal that there is no more to
get at this point. The integer pointed to with \fImsgs_in_queue\fP will
contain the number of remaining messages after this function was called.
The data the returned pointer points to will not survive calling
curl_multi_cleanup().
The 'CURLMsg' struct is very simple and only contain very basic informations.
If more involved information is wanted, the particular "easy handle" in
present in that struct and can thus be used in subsequent regular
curl_easy_getinfo() calls (or similar).
.SH "RETURN VALUE"
A pointer to a filled-in struct, or NULL if it failed or ran out of
structs. It also writes the number of messages left in the queue (after this
read) in the integer the second argument points to.
.SH "SEE ALSO"
.BR curl_multi_cleanup "(3)," curl_multi_init "(3)," curl_multi_perform "(3)"

View File

@@ -0,0 +1,22 @@
.\" $Id$
.\"
.TH curl_multi_init 3 "1 March 2002" "libcurl 7.9.5" "libcurl Manual"
.SH NAME
curl_multi_init - Start a multi session
.SH SYNOPSIS
.B #include <curl/curl.h>
.sp
.BI "CURLM *curl_multi_init( );"
.ad
.SH DESCRIPTION
This function returns a CURLM handle to be used as input to all the other
multi-functions, sometimes refered to as a multi handle on some places in the
documentation. This init call MUST have a corresponding call to
\fIcurl_multi_cleanup\fP when the operation is complete.
.SH RETURN VALUE
If this function returns NULL, something went wrong and you cannot use the
other curl functions.
.SH "SEE ALSO"
.BR curl_multi_cleanup "(3)," curl_global_init "(3)," curl_easy_init "(3)"
.SH BUGS
Surely there are some, you tell me!

View File

@@ -0,0 +1,30 @@
.\" $Id$
.\"
.TH curl_multi_perform 3 "1 March 2002" "libcurl 7.9.5" "libcurl Manual"
.SH NAME
curl_multi_perform - add an easy handle to a multi session
.SH SYNOPSIS
#include <curl/curl.h>
CURLMcode curl_multi_perform(CURLM *multi_handle, int *running_handles);
.ad
.SH DESCRIPTION
When the app thinks there's data available for the multi_handle, it should
call this function to read/write whatever there is to read or write right
now. curl_multi_perform() returns as soon as the reads/writes are done. This
function does not require that there actually is any data available for
reading or that data can be written, it can be called just in case. It will
write the number of handles that still transfer data in the second argument's
integer-pointer.
.SH "RETURN VALUE"
CURLMcode type, general libcurl multi interface error code.
NOTE that this only returns errors etc regarding the whole multi stack. There
might still have occurred problems on invidual transfers even when this
function returns OK.
.SH "TYPICAL USAGE"
Most application will use \fIcurl_multi_fdset\fP to get the multi_handle's
file descriptors, then it'll wait for action on them using select() and as
soon as one or more of them are ready, \fIcurl_multi_perform\fP gets called.
.SH "SEE ALSO"
.BR curl_multi_cleanup "(3)," curl_multi_init "(3)"

View File

@@ -0,0 +1,20 @@
.\" $Id$
.\"
.TH curl_multi_remove_handle 3 "6 March 2002" "libcurl 7.9.5" "libcurl Manual"
.SH NAME
curl_multi_remove_handle - add an easy handle to a multi session
.SH SYNOPSIS
#include <curl/curl.h>
CURLMcode curl_multi_remove_handle(CURLM *multi_handle, CURL *easy_handle);
.ad
.SH DESCRIPTION
Removes a given easy_handle from the multi_handle. This will make the
specified easy handle be removed from this multi handle's control.
When the easy handle has been removed from a multi stack, it is again
perfectly legal to invoke \fIcurl_easy_perform()\fP on this easy handle.
.SH RETURN VALUE
CURLMcode type, general libcurl multi interface error code.
.SH "SEE ALSO"
.BR curl_multi_cleanup "(3)," curl_multi_init "(3)"

View File

@@ -75,10 +75,10 @@ struct HttpPost {
}; };
typedef int (*curl_progress_callback)(void *clientp, typedef int (*curl_progress_callback)(void *clientp,
size_t dltotal, double dltotal,
size_t dlnow, double dlnow,
size_t ultotal, double ultotal,
size_t ulnow); double ulnow);
typedef size_t (*curl_write_callback)(char *buffer, typedef size_t (*curl_write_callback)(char *buffer,
size_t size, size_t size,
@@ -493,6 +493,9 @@ typedef enum {
/* DNS cache timeout */ /* DNS cache timeout */
CINIT(DNS_CACHE_TIMEOUT, LONG, 92), CINIT(DNS_CACHE_TIMEOUT, LONG, 92),
/* send linked-list of pre-transfer QUOTE commands (Wesley Laxton)*/
CINIT(PREQUOTE, OBJECTPOINT, 93),
CURLOPT_LASTENTRY /* the last unusued */ CURLOPT_LASTENTRY /* the last unusued */
} CURLoption; } CURLoption;
@@ -613,7 +616,7 @@ CURLcode curl_global_init(long flags);
void curl_global_cleanup(void); void curl_global_cleanup(void);
/* This is the version number */ /* This is the version number */
#define LIBCURL_VERSION "7.9.5-pre4" #define LIBCURL_VERSION "7.9.5"
#define LIBCURL_VERSION_NUM 0x070905 #define LIBCURL_VERSION_NUM 0x070905
/* linked-list structure for the CURLOPT_QUOTE option (and other) */ /* linked-list structure for the CURLOPT_QUOTE option (and other) */

View File

@@ -12,7 +12,10 @@ EXTRA_DIST = getdate.y \
lib_LTLIBRARIES = libcurl.la lib_LTLIBRARIES = libcurl.la
INCLUDES = -I$(top_srcdir)/include # we use srcdir/include for the static global include files
# we use builddir/lib for the generated lib/config.h file to get found
# we use srcdir/lib for the lib-private header files
INCLUDES = -I$(top_srcdir)/include -I$(top_builddir)/lib -I$(top_srcdir)/lib
libcurl_la_LDFLAGS = -no-undefined -version-info 2:2:0 libcurl_la_LDFLAGS = -no-undefined -version-info 2:2:0
# This flag accepts an argument of the form current[:revision[:age]]. So, # This flag accepts an argument of the form current[:revision[:age]]. So,

View File

@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 2001, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 2002, Daniel Stenberg, <daniel@haxx.se>, et al.
* *
* In order to be useful for every potential user, curl and libcurl are * In order to be useful for every potential user, curl and libcurl are
* dual-licensed under the MPL and the MIT/X-derivate licenses. * dual-licensed under the MPL and the MIT/X-derivate licenses.
@@ -127,22 +127,37 @@ Curl_cookie_add(struct CookieInfo *c,
if(httpheader) { if(httpheader) {
/* This line was read off a HTTP-header */ /* This line was read off a HTTP-header */
char *sep;
semiptr=strchr(lineptr, ';'); /* first, find a semicolon */ semiptr=strchr(lineptr, ';'); /* first, find a semicolon */
ptr = lineptr; ptr = lineptr;
do { do {
/* we have a <what>=<this> pair or a 'secure' word here */ /* we have a <what>=<this> pair or a 'secure' word here */
if(strchr(ptr, '=')) { sep = strchr(ptr, '=');
if(sep && (!semiptr || (semiptr>sep)) ) {
/*
* There is a = sign and if there was a semicolon too, which make sure
* that the semicolon comes _after_ the equal sign.
*/
name[0]=what[0]=0; /* init the buffers */ name[0]=what[0]=0; /* init the buffers */
if(1 <= sscanf(ptr, "%" MAX_NAME_TXT "[^=]=%" if(1 <= sscanf(ptr, "%" MAX_NAME_TXT "[^;=]=%"
MAX_COOKIE_LINE_TXT "[^;\r\n]", MAX_COOKIE_LINE_TXT "[^;\r\n]",
name, what)) { name, what)) {
/* this is a legal <what>=<this> pair */ /* this is a <name>=<what> pair */
/* Strip off trailing whitespace from the 'what' */
int len=strlen(what);
while(len && isspace((int)what[len-1])) {
what[len-1]=0;
len--;
}
if(strequal("path", name)) { if(strequal("path", name)) {
co->path=strdup(what); co->path=strdup(what);
} }
else if(strequal("domain", name)) { else if(strequal("domain", name)) {
co->domain=strdup(what); co->domain=strdup(what);
co->field1= (what[0]=='.')?2:1;
} }
else if(strequal("version", name)) { else if(strequal("version", name)) {
co->version=strdup(what); co->version=strdup(what);
@@ -159,7 +174,7 @@ Curl_cookie_add(struct CookieInfo *c,
*/ */
co->maxage = strdup(what); co->maxage = strdup(what);
co->expires = co->expires =
atoi((*co->maxage=='\"')?&co->maxage[1]:&co->maxage[0]); atoi((*co->maxage=='\"')?&co->maxage[1]:&co->maxage[0]) + now;
} }
else if(strequal("expires", name)) { else if(strequal("expires", name)) {
co->expirestr=strdup(what); co->expirestr=strdup(what);
@@ -187,8 +202,11 @@ Curl_cookie_add(struct CookieInfo *c,
} }
} }
if(!semiptr) if(!semiptr || !*semiptr) {
continue; /* we already know there are no more cookies */ /* we already know there are no more cookies */
semiptr = NULL;
continue;
}
ptr=semiptr+1; ptr=semiptr+1;
while(ptr && *ptr && isspace((int)*ptr)) while(ptr && *ptr && isspace((int)*ptr))
@@ -198,9 +216,23 @@ Curl_cookie_add(struct CookieInfo *c,
if(!semiptr && *ptr) if(!semiptr && *ptr)
/* There are no more semicolons, but there's a final name=value pair /* There are no more semicolons, but there's a final name=value pair
coming up */ coming up */
semiptr=ptr; semiptr=strchr(ptr, '\0');
} while(semiptr); } while(semiptr);
if(NULL == co->name) {
/* we didn't get a cookie name, this is an illegal line, bail out */
if(co->domain)
free(co->domain);
if(co->path)
free(co->path);
if(co->name)
free(co->name);
if(co->value)
free(co->value);
free(co);
return NULL;
}
if(NULL == co->domain) if(NULL == co->domain)
/* no domain given in the header line, set the default now */ /* no domain given in the header line, set the default now */
co->domain=domain?strdup(domain):NULL; co->domain=domain?strdup(domain):NULL;

View File

@@ -1618,6 +1618,12 @@ CURLcode ftp_perform(struct connectdata *conn)
if(result) if(result)
return result; return result;
/* Send any PREQUOTE strings after transfer type is set? (Wesley Laxton)*/
if(data->set.prequote) {
if ((result = ftp_sendquote(conn, data->set.prequote)) != CURLE_OK)
return result;
}
if(conn->resume_from) { if(conn->resume_from) {
/* we're about to continue the uploading of a file */ /* we're about to continue the uploading of a file */
/* 1. get already existing file's size. We use the SIZE /* 1. get already existing file's size. We use the SIZE
@@ -1803,6 +1809,12 @@ CURLcode ftp_perform(struct connectdata *conn)
if(result) if(result)
return result; return result;
/* Send any PREQUOTE strings after transfer type is set? (Wesley Laxton)*/
if(data->set.prequote) {
if ((result = ftp_sendquote(conn, data->set.prequote)) != CURLE_OK)
return result;
}
/* Attempt to get the size, it'll be useful in some cases: for resumed /* Attempt to get the size, it'll be useful in some cases: for resumed
downloads and when talking to servers that don't give away the size downloads and when talking to servers that don't give away the size
in the RETR response line. */ in the RETR response line. */

View File

@@ -47,6 +47,11 @@
/* DONT include memdebug.h here! */ /* DONT include memdebug.h here! */
struct memdebug {
int size;
char mem[1];
};
/* /*
* Note that these debug functions are very simple and they are meant to * Note that these debug functions are very simple and they are meant to
* remain so. For advanced analysis, record a log file and write perl scripts * remain so. For advanced analysis, record a log file and write perl scripts
@@ -67,16 +72,25 @@ void curl_memdebug(const char *logname)
} }
void *curl_domalloc(size_t size, int line, const char *source) void *curl_domalloc(size_t wantedsize, int line, const char *source)
{ {
void *mem=(malloc)(size); struct memdebug *mem;
if(mem) size_t size;
/* alloc at least 64 bytes */
size = sizeof(struct memdebug)+wantedsize;
mem=(struct memdebug *)(malloc)(size);
if(mem) {
/* fill memory with junk */ /* fill memory with junk */
memset(mem, 0xA5, size); memset(mem->mem, 0xA5, wantedsize);
if(logfile) mem->size = wantedsize;
}
if(logfile && source)
fprintf(logfile, "MEM %s:%d malloc(%d) = %p\n", fprintf(logfile, "MEM %s:%d malloc(%d) = %p\n",
source, line, size, mem); source, line, wantedsize, mem->mem);
return mem; return mem->mem;
} }
char *curl_dostrdup(const char *str, int line, const char *source) char *curl_dostrdup(const char *str, int line, const char *source)
@@ -90,32 +104,56 @@ char *curl_dostrdup(const char *str, int line, const char *source)
exit(2); exit(2);
} }
mem=(strdup)(str);
len=strlen(str)+1; len=strlen(str)+1;
mem=curl_domalloc(len, 0, NULL); /* NULL prevents logging */
memcpy(mem, str, len);
if(logfile) if(logfile)
fprintf(logfile, "MEM %s:%d strdup(%p) (%d) = %p\n", fprintf(logfile, "MEM %s:%d strdup(%p) (%d) = %p\n",
source, line, str, len, mem); source, line, str, len, mem);
return mem; return mem;
} }
void *curl_dorealloc(void *ptr, size_t size, int line, const char *source) void *curl_dorealloc(void *ptr, size_t wantedsize,
int line, const char *source)
{ {
void *mem=(realloc)(ptr, size); struct memdebug *mem;
size_t size = sizeof(struct memdebug)+wantedsize;
mem = (struct memdebug *)((char *)ptr - offsetof(struct memdebug, mem));
mem=(struct memdebug *)(realloc)(mem, size);
if(logfile) if(logfile)
fprintf(logfile, "MEM %s:%d realloc(%p, %d) = %p\n", fprintf(logfile, "MEM %s:%d realloc(%p, %d) = %p\n",
source, line, ptr, size, mem); source, line, ptr, wantedsize, mem?mem->mem:NULL);
return mem;
if(mem) {
mem->size = wantedsize;
return mem->mem;
}
return NULL;
} }
void curl_dofree(void *ptr, int line, const char *source) void curl_dofree(void *ptr, int line, const char *source)
{ {
struct memdebug *mem;
if(NULL == ptr) { if(NULL == ptr) {
fprintf(stderr, "ILLEGAL free() on NULL at %s:%d\n", fprintf(stderr, "ILLEGAL free() on NULL at %s:%d\n",
source, line); source, line);
exit(2); exit(2);
} }
mem = (struct memdebug *)((char *)ptr - offsetof(struct memdebug, mem));
(free)(ptr); /* destroy */
memset(mem->mem, 0x13, mem->size);
/* free for real */
(free)(mem);
if(logfile) if(logfile)
fprintf(logfile, "MEM %s:%d free(%p)\n", source, line, ptr); fprintf(logfile, "MEM %s:%d free(%p)\n", source, line, ptr);

View File

@@ -603,6 +603,7 @@ CURLcode Curl_readwrite(struct connectdata *conn,
return result; return result;
data->info.header_size += k->hbuflen; data->info.header_size += k->hbuflen;
conn->headerbytecount += k->hbuflen;
/* reset hbufp pointer && hbuflen */ /* reset hbufp pointer && hbuflen */
k->hbufp = data->state.headerbuff; k->hbufp = data->state.headerbuff;

View File

@@ -735,6 +735,12 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option, ...)
*/ */
data->set.postquote = va_arg(param, struct curl_slist *); data->set.postquote = va_arg(param, struct curl_slist *);
break; break;
case CURLOPT_PREQUOTE:
/*
* List of RAW FTP commands to use prior to RETR (Wesley Laxton)
*/
data->set.prequote = va_arg(param, struct curl_slist *);
break;
case CURLOPT_QUOTE: case CURLOPT_QUOTE:
/* /*
* List of RAW FTP commands to use before a transfer * List of RAW FTP commands to use before a transfer
@@ -1983,8 +1989,8 @@ static CURLcode CreateConnection(struct SessionHandle *data,
conn = conn_temp; /* use this connection from now on */ conn = conn_temp; /* use this connection from now on */
/* we need these pointers if we speak over a proxy */ /* we need these pointers if we speak over a proxy */
conn->hostname = old_conn->gname; conn->hostname = conn->gname;
conn->name = old_conn->name; conn->name = &conn->gname[old_conn->name - old_conn->gname];
free(conn->path); /* free the previously allocated path pointer */ free(conn->path); /* free the previously allocated path pointer */

View File

@@ -604,8 +604,9 @@ struct UserDefined {
char *crypto_engine; /* name of the crypto engine to use */ char *crypto_engine; /* name of the crypto engine to use */
char *cookiejar; /* dump all cookies to this file */ char *cookiejar; /* dump all cookies to this file */
bool crlf; /* convert crlf on ftp upload(?) */ bool crlf; /* convert crlf on ftp upload(?) */
struct curl_slist *quote; /* before the transfer */ struct curl_slist *quote; /* after connection is established */
struct curl_slist *postquote; /* after the transfer */ struct curl_slist *postquote; /* after the transfer */
struct curl_slist *prequote; /* before the transfer, after type (Wesley Laxton)*/
struct curl_slist *telnet_options; /* linked list of telnet options */ struct curl_slist *telnet_options; /* linked list of telnet options */
curl_TimeCond timecondition; /* kind of time/date comparison */ curl_TimeCond timecondition; /* kind of time/date comparison */
time_t timevalue; /* what time to compare with */ time_t timevalue; /* what time to compare with */

View File

@@ -1,21 +0,0 @@
#
# $Id$
#
INCLUDES = -I$(top_srcdir)/include
noinst_PROGRAMS = app single double
app_SOURCES = app.c
app_LDADD = ../lib/libcurl.la
app_DEPENDENCIES = ../lib/libcurl.la
single_SOURCES = single.c
single_LDADD = ../lib/libcurl.la
single_DEPENDENCIES = ../lib/libcurl.la
double_SOURCES = double.c
double_LDADD = ../lib/libcurl.la
double_DEPENDENCIES = ../lib/libcurl.la
AUTOMAKE_OPTIONS = foreign no-dependencies

3
packages/EPM/Makefile.am Normal file
View File

@@ -0,0 +1,3 @@
AUTOMAKE_OPTIONS = foreign
EXTRA_DIST = README curl.list.in

12
packages/EPM/README Normal file
View File

@@ -0,0 +1,12 @@
EPM is a free UNIX software/file packaging program that generates distribution
archives from a list of files. EPM Can:
* Generate portable script-based distribution packages complete with
installation and removal scripts.
* Generate vendor distributions in AIX, BSD, Compaq Tru64, Debian, HP-UX,
IRIX, Red Hat, and Solaris formats.
* Provide a complete, cross-platform software distribution solution for your
applications.
http://www.easysw.com/epm/

58
packages/EPM/curl.list.in Normal file
View File

@@ -0,0 +1,58 @@
# Directories...
$prefix=@prefix@
$exec_prefix=@exec_prefix@
$bindir=@bindir@
$confdir=@sysconfdir@
$docdir=@prefix@/doc
$mandir=@mandir@
$libdir=@libdir@
$srcdir=@top_srcdir@
$includedir=@includedir@
# Product information
%product curl
%copyright 1998-2002 by Daniel Stenberg
%vendor Daniel Stenberg, <daniel@haxx.se>
%license ${srcdir}/MITX.txt
%readme ${srcdir}/README
%description Curl is a command line tool for transfering data specified
%description with URL syntax
%version @VERSION@
%packager Giuseppe "Cowo" Corbelli <cowo@lugbs.linux.it>
f 0644 cowo pppusers ${mandir}/man1/curl.1 ./docs/curl.1
f 0644 cowo pppusers ${mandir}/man1/curl-config.1 ./docs/curl-config.1
f 0644 cowo pppusers ${mandir}/man3/curl_easy_cleanup.3 ./docs/curl_easy_cleanup.3
f 0644 cowo pppusers ${mandir}/man3/curl_easy_getinfo.3 ./docs/curl_easy_getinfo.3
f 0644 cowo pppusers ${mandir}/man3/curl_easy_init.3 ./docs/curl_easy_init.3
f 0644 cowo pppusers ${mandir}/man3/curl_easy_perform.3 ./docs/curl_easy_perform.3
f 0644 cowo pppusers ${mandir}/man3/curl_easy_setopt.3 ./docs/curl_easy_setopt.3
f 0644 cowo pppusers ${mandir}/man3/curl_easy_duphandle.3 ./docs/curl_easy_duphandle.3
f 0644 cowo pppusers ${mandir}/man3/curl_formparse.3 ./docs/curl_formparse.3
f 0644 cowo pppusers ${mandir}/man3/curl_formadd.3 ./docs/curl_formadd.3
f 0644 cowo pppusers ${mandir}/man3/curl_formfree.3 ./docs/curl_formfree.3
f 0644 cowo pppusers ${mandir}/man3/curl_getdate.3 ./docs/curl_getdate.3
f 0644 cowo pppusers ${mandir}/man3/curl_getenv.3 ./docs/curl_getenv.3
f 0644 cowo pppusers ${mandir}/man3/curl_slist_append.3 ./docs/curl_slist_append.3
f 0644 cowo pppusers ${mandir}/man3/curl_slist_free_all.3 ./docs/curl_slist_free_all.3
f 0644 cowo pppusers ${mandir}/man3/curl_version.3 ./docs/curl_version.3
f 0644 cowo pppusers ${mandir}/man3/curl_escape.3 ./docs/curl_escape.3
f 0644 cowo pppusers ${mandir}/man3/curl_unescape.3 ./docs/curl_unescape.3
f 0644 cowo pppusers ${mandir}/man3/curl_strequal.3 ./docs/curl_strequal.3
f 0644 cowo pppusers ${mandir}/man3/curl_strnequal.3 ./docs/curl_strnequal.3
f 0644 cowo pppusers ${mandir}/man3/curl_mprintf.3 ./docs/curl_mprintf.3
f 0644 cowo pppusers ${mandir}/man3/curl_global_init.3 ./docs/curl_global_init.3
f 0644 cowo pppusers ${mandir}/man3/curl_global_cleanup.3 ./docs/curl_global_cleanup.3
f 0644 cowo pppusers ${mandir}/man3/libcurl.3 ./docs/libcurl.3
f 0755 cowo pppusers ${libdir}/libcurl.so.2.0.2 ./lib/.libs/libcurl.so.2.0.2
f 0755 cowo pppusers ${libdir}/libcurl.la ./lib/libcurl.la
f 0755 cowo pppusers ${libdir}/libcurl.la ./lib/.libs/libcurl.la
f 0644 cowo pppusers ${libdir}/libcurl.a ./lib/.libs/libcurl.a
f 0755 cowo pppusers ${bindir}/curl ./src/curl
f 0755 cowo pppusers ${bindir}/curl ./src/.libs/curl
f 0644 cowo pppusers ${includedir}/curl/curl.h ./include/curl/curl.h
f 0644 cowo pppusers ${includedir}/curl/easy.h ./include/curl/easy.h
f 0644 cowo pppusers ${includedir}/curl/mprintf.h ./include/curl/mprintf.h
f 0644 cowo pppusers ${includedir}/curl/stdcheaders.h ./include/curl/stdcheaders.h
f 0644 cowo pppusers ${includedir}/curl/types.h ./include/curl/types.h
f 0755 cowo pppusers ${bindir}/curl-config ./curl-config

View File

@@ -1,3 +1,3 @@
SUBDIRS = Win32 Linux Solaris SUBDIRS = Win32 Linux Solaris EPM
EXTRA_DIST = README EXTRA_DIST = README

View File

@@ -4,7 +4,10 @@
AUTOMAKE_OPTIONS = foreign nostdinc AUTOMAKE_OPTIONS = foreign nostdinc
INCLUDES = -I$(top_srcdir)/include # we use srcdir/include for the static global include files
# we use builddir/src for the generated src/config.h file to get found
# we use srcdir/lib for the client-private header files
INCLUDES = -I$(top_srcdir)/include -I$(top_builddir)/src -I$(top_srcdir)/src
bin_PROGRAMS = curl #memtest bin_PROGRAMS = curl #memtest

View File

@@ -1,21 +1,21 @@
/* src/config.h. Generated automatically by configure. */ /* src/config.h. Generated automatically by configure. */
/* Define cpu-machine-OS */ /* Define cpu-machine-OS */
#define OS "ALPHA-COMPAQ-VMS" #define OS "ALPHA-COMPAQ-VMS"
/* Define if you have the <unistd.h> header file. */ /* Define if you have the <unistd.h> header file. */
#define HAVE_UNISTD_H 1 #define HAVE_UNISTD_H 1
/* Define if you have the <io.h> header file. */ /* Define if you have the <io.h> header file. */
#undef HAVE_IO_H #undef HAVE_IO_H
/* Define if you have strdup() */ /* Define if you have strdup() */
#define HAVE_STRDUP 1 #define HAVE_STRDUP 1
/* Define if you have utime() */ /* Define if you have utime() */
#undef HAVE_UTIME #undef HAVE_UTIME
/* Define if you have the <utime.h> header file */ /* Define if you have the <utime.h> header file */
#undef HAVE_UTIME_H #undef HAVE_UTIME_H
/* Define if you have thhe <sys/utime.h> header file */ /* Define if you have thhe <sys/utime.h> header file */
#undef HAVE_SYS_UTIME_H #undef HAVE_SYS_UTIME_H

View File

@@ -48,4 +48,9 @@ BADPARAM <Internal Error, Bad parameter to function>
BADORDER <Internal Error, Bad function calling order> BADORDER <Internal Error, Bad function calling order>
BADPWD <Bad password entered> BADPWD <Bad password entered>
MNYREDIR <Too many redirects> MNYREDIR <Too many redirects>
UNKTELNET <Unknown TELNET option specified>
UNKMSG <Unknown message (50)>
BADSSLCERT <Remote peer's SSL certificate wasn't OK>
SRVNOERR <The Server didn't reply anything, which here is considered an error>
MAXMSG <This is the LAST KNOWN MESSAGE, appearantly more have been added>
.END .END

View File

@@ -191,6 +191,11 @@ globalvalue int CURL_BADPARAM;
globalvalue int CURL_BADORDER; globalvalue int CURL_BADORDER;
globalvalue int CURL_BADPWD; globalvalue int CURL_BADPWD;
globalvalue int CURL_MNYREDIR; globalvalue int CURL_MNYREDIR;
globalvalue int CURL_UNKTELNET;
globalvalue int CURL_UNKMSG;
globalvalue int CURL_BADSSLCERT;
globalvalue int CURL_SRVNOERR;
globalvalue int CURL_MAXMSG;
long vms_cond[] = { long vms_cond[] = {
VMS_STS(1,FAC_SYSTEM,MSG_NORMAL,SEV_SUCCESS), VMS_STS(1,FAC_SYSTEM,MSG_NORMAL,SEV_SUCCESS),
CURL_UNSUPPROTO, /* these are from curlmsg.msg file..... */ CURL_UNSUPPROTO, /* these are from curlmsg.msg file..... */
@@ -238,7 +243,12 @@ long vms_cond[] = {
CURL_BADPARAM, CURL_BADPARAM,
CURL_BADORDER, CURL_BADORDER,
CURL_BADPWD, CURL_BADPWD,
CURL_MNYREDIR CURL_MNYREDIR,
CURL_UNKTELNET,
CURL_UNKMSG,
CURL_BADSSLCERT,
CURL_SRVNOERR,
CURL_MAXMSG
}; };
#endif #endif
@@ -448,6 +458,7 @@ struct Configurable {
struct curl_slist *quote; struct curl_slist *quote;
struct curl_slist *postquote; struct curl_slist *postquote;
struct curl_slist *prequote;
long ssl_version; long ssl_version;
curl_TimeCond timecond; curl_TimeCond timecond;
@@ -1376,12 +1387,18 @@ static ParameterError getparameter(char *flag, /* f or -long-flag */
break; break;
case 'Q': case 'Q':
/* QUOTE command to send to FTP server */ /* QUOTE command to send to FTP server */
if(nextarg[0] == '-') { switch(nextarg[0]) {
case '-':
/* prefixed with a dash makes it a POST TRANSFER one */ /* prefixed with a dash makes it a POST TRANSFER one */
nextarg++; nextarg++;
config->postquote = curl_slist_append(config->postquote, nextarg); config->postquote = curl_slist_append(config->postquote, nextarg);
} break;
else { case '+':
/* prefixed with a plus makes it a just-before-transfer one */
nextarg++;
config->prequote = curl_slist_append(config->prequote, nextarg);
break;
default:
config->quote = curl_slist_append(config->quote, nextarg); config->quote = curl_slist_append(config->quote, nextarg);
} }
break; break;
@@ -1890,13 +1907,18 @@ operate(struct Configurable *config, int argc, char *argv[])
int res = 0; int res = 0;
int i; int i;
errorbuffer[0]=0; /* prevent junk from being output */
#ifdef MALLOCDEBUG #ifdef MALLOCDEBUG
/* this sends all memory debug messages to a logfile named memdump */ /* this sends all memory debug messages to a logfile named memdump */
curl_memdebug("memdump"); char *env;
env = curl_getenv("CURL_MEMDEBUG");
if(env) {
free(env);
curl_memdebug("memdump");
}
#endif #endif
errorbuffer[0]=0; /* prevent junk from being output */
main_init(); /* inits */ main_init(); /* inits */
config->showerror=TRUE; config->showerror=TRUE;
@@ -2477,6 +2499,7 @@ int main(int argc, char *argv[])
free_config_fields(&config); free_config_fields(&config);
#ifdef VMS #ifdef VMS
if (res > 52) res = 53; /* MAXMSG, porting helper */
return (vms_cond[res]|vms_show); return (vms_cond[res]|vms_show);
#else #else
return res; return res;

View File

@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 2001, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 2002, Daniel Stenberg, <daniel@haxx.se>, et al.
* *
* In order to be useful for every potential user, curl and libcurl are * In order to be useful for every potential user, curl and libcurl are
* dual-licensed under the MPL and the MIT/X-derivate licenses. * dual-licensed under the MPL and the MIT/X-derivate licenses.
@@ -222,15 +222,19 @@ GlobCode glob_word(URLGlob *glob, char *pattern, int pos, int *amount)
*amount = 1; /* default is one single string */ *amount = 1; /* default is one single string */
while (*pattern != '\0' && *pattern != '{' && *pattern != '[') { while (*pattern != '\0' && *pattern != '{' && *pattern != '[') {
if (*pattern == '}' || *pattern == ']') { if (*pattern == '}' || *pattern == ']')
return GLOB_ERROR; return GLOB_ERROR;
}
if (*pattern == '\\') { /* escape character, skip '\' */ /* only allow \ to escape known "special letters" */
if (*pattern == '\\' &&
(*(pattern+1) == '{' || *(pattern+1) == '[' ||
*(pattern+1) == '}' || *(pattern+1) == ']') ) {
/* escape character, skip '\' */
++pattern; ++pattern;
++pos; ++pos;
if (*pattern == '\0') { /* but no escaping of '\0'! */ if (*pattern == '\0') /* but no escaping of '\0'! */
return GLOB_ERROR; return GLOB_ERROR;
}
} }
*buf++ = *pattern++; /* copy character to literal */ *buf++ = *pattern++; /* copy character to literal */
++pos; ++pos;

View File

@@ -1,3 +1,3 @@
#define CURL_NAME "curl" #define CURL_NAME "curl"
#define CURL_VERSION "7.9.5-pre4" #define CURL_VERSION "7.9.5"
#define CURL_ID CURL_NAME " " CURL_VERSION " (" OS ") " #define CURL_ID CURL_NAME " " CURL_VERSION " (" OS ") "

View File

@@ -1,6 +1,6 @@
EXTRA_DIST = ftpserver.pl httpserver.pl httpsserver.pl runtests.pl \ EXTRA_DIST = ftpserver.pl httpserver.pl httpsserver.pl runtests.pl \
ftpsserver.pl stunnel.pm getpart.pm FILEFORMAT README \ ftpsserver.pl stunnel.pm getpart.pm FILEFORMAT README \
stunnel.pem stunnel.pem memanalyze.pl
SUBDIRS = data server SUBDIRS = data server

View File

@@ -12,6 +12,8 @@ test101 test110 test12 test15 test202 test3 test4 test6 \
test102 test111 test120 test16 test21 test30 test400 test7 \ test102 test111 test120 test16 test21 test30 test400 test7 \
test103 test112 test121 test17 test22 test300 test401 test8 \ test103 test112 test121 test17 test22 test300 test401 test8 \
test104 test113 test122 test18 test23 test301 test402 test9 \ test104 test113 test122 test18 test23 test301 test402 test9 \
test105 test114 test123 test19 test24 test302 test43 \ test105 test114 test123 test19 test24 test302 test43 test31 \
test106 test115 test124 test190 test25 test303 test44 test38 \ test106 test115 test124 test190 test25 test303 test44 test38 \
test107 test116 test125 test2 test26 test33 test45 test126 test107 test116 test125 test2 test26 test33 test45 test126 \
test304

58
tests/data/test304 Normal file
View File

@@ -0,0 +1,58 @@
# Server-side
<reply>
<data>
HTTP/1.1 200 OK
Date: Thu, 09 Nov 2010 14:49:00 GMT
Server: test-server/fake
blablabla
</data>
</reply>
# Client-side
<client>
<name>
HTTPS multipart formpost
</name>
<command>
https://%HOSTIP:%HTTPSPORT/we/want/304 -F name=daniel -F tool=curl -F file=@log/test304.txt
</command>
# We create this file before the command is invoked!
<file name="log/test304.txt">
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
</file>
</test>
# Verify data after the test has been "shot"
<verify>
<strip>
^(User-Agent:|Content-Type: multipart/form-data;|--curl).*
</strip>
<protocol>
POST /we/want/304 HTTP/1.1
User-Agent: curl/7.9.5-pre4 (sparc-sun-solaris2.7) libcurl 7.9.5-pre4 (OpenSSL 0.9.6c) (krb4 enabled)
Host: 127.0.0.1:8433
Pragma: no-cache
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*
Content-Length: 1354
Expect: 100-continue
Content-Type: multipart/form-data; boundary=curlfPpkLyYwSYaH6Fkg0WkEldoJyAQ
--curlfPpkLyYwSYaH6Fkg0WkEldoJyAQ
Content-Disposition: form-data; name="name"
daniel
--curlfPpkLyYwSYaH6Fkg0WkEldoJyAQ
Content-Disposition: form-data; name="tool"
curl
--curlfPpkLyYwSYaH6Fkg0WkEldoJyAQ
Content-Disposition: form-data; name="file"; filename="log/test304.txt"
Content-Type: text/plain
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
--curlfPpkLyYwSYaH6Fkg0WkEldoJyAQ--
</protocol>
</verify>

56
tests/data/test31 Normal file
View File

@@ -0,0 +1,56 @@
# Server-side
<reply>
<data>
HTTP/1.1 200 OK
Date: Thu, 09 Nov 2010 14:49:00 GMT
Server: test-server/fake
Content-Type: text/html
Funny-head: yesyes
Set-Cookie: foobar=name; domain=127.0.0.1; path=/ ; secure
Set-Cookie:mismatch=this ; domain=127.0.0.1; path=/silly/
Set-Cookie: partmatch=present; domain=127.0.0.1 ; path=/;
Set-Cookie: eat=this; domain=moo.foo.moo;
Set-Cookie: eat=this-too; domain=.foo.moo;
Set-Cookie: nodomainnovalue
Set-Cookie: nodomain=value; expires=Tue Feb 1 11:56:27 MET 2014
Set-Cookie: nodomainnovalue; domain=reallysilly
boo
</data>
</reply>
# Client-side
<client>
<name>
HTTP with weirdly formatted cookies and cookiejar storage
</name>
<command>
http://%HOSTIP:%HOSTPORT/we/want/31 -b none -c log/jar31.txt
</command>
</test>
# Verify data after the test has been "shot"
<verify>
<strip>
^User-Agent:.*
</strip>
<protocol>
GET /we/want/31 HTTP/1.1
Host: 127.0.0.1:8999
Pragma: no-cache
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*
</protocol>
<file name="log/jar31.txt">
# Netscape HTTP Cookie File
# http://www.netscape.com/newsref/std/cookie_spec.html
# This file was generated by libcurl! Edit at your own risk.
127.0.0.1 FALSE / TRUE 0 foobar name
127.0.0.1 FALSE /silly/ FALSE 0 ismatch this
127.0.0.1 FALSE / FALSE 0 partmatch present
moo.foo.moo FALSE / FALSE 0 eat this
.foo.moo TRUE / FALSE 0 eat this-too
127.0.0.1 FALSE / FALSE 1391252187 nodomain value
</file>
</verify>

View File

@@ -5,7 +5,7 @@ HTTP/1.1 200 OK
Server: Microsoft-IIS/4.0 Server: Microsoft-IIS/4.0
Date: Tue, 25 Sep 2001 19:37:44 GMT Date: Tue, 25 Sep 2001 19:37:44 GMT
Content-Type: text/html Content-Type: text/html
Set-Cookie: ckyPersistent=permanent; expires=Tue, 01-Jan-2002 05:00:00 GMT; path=/ Set-Cookie: ckyPersistent=permanent; expires=Tue, 01-Jan-2010 05:00:00 GMT; path=/
Set-Cookie: ckySession=temporary; path=/ Set-Cookie: ckySession=temporary; path=/
Set-Cookie: ASPSESSIONIDQGGQQSJJ=GKNBDIFAAOFDPDAIEAKDIBKE; path=/ Set-Cookie: ASPSESSIONIDQGGQQSJJ=GKNBDIFAAOFDPDAIEAKDIBKE; path=/
Cache-control: private Cache-control: private
@@ -55,7 +55,7 @@ Cookie: mooo=indeed
www.fake.come FALSE / FALSE 1022144953 cookiecliente si www.fake.come FALSE / FALSE 1022144953 cookiecliente si
www.loser.com FALSE / FALSE 1139150993 UID 99 www.loser.com FALSE / FALSE 1139150993 UID 99
127.0.0.1 FALSE / FALSE 1139150993 mooo indeed 127.0.0.1 FALSE / FALSE 1139150993 mooo indeed
127.0.0.1 FALSE / FALSE 1009861200 ckyPersistent permanent 127.0.0.1 FALSE / FALSE 1262322000 ckyPersistent permanent
127.0.0.1 FALSE / FALSE 0 ckySession temporary 127.0.0.1 FALSE / FALSE 0 ckySession temporary
127.0.0.1 FALSE / FALSE 0 ASPSESSIONIDQGGQQSJJ GKNBDIFAAOFDPDAIEAKDIBKE 127.0.0.1 FALSE / FALSE 0 ASPSESSIONIDQGGQQSJJ GKNBDIFAAOFDPDAIEAKDIBKE
</file> </file>

View File

@@ -10,6 +10,9 @@ do {
if($ARGV[0] eq "-v") { if($ARGV[0] eq "-v") {
$verbose=1; $verbose=1;
} }
elsif($ARGV[0] eq "-t") {
$trace=1;
}
} while (shift @ARGV); } while (shift @ARGV);
my $maxmem; my $maxmem;
@@ -43,11 +46,11 @@ while(<STDIN>) {
print "FREE ERROR: Previously freed at: ".$getmem{$addr}."\n"; print "FREE ERROR: Previously freed at: ".$getmem{$addr}."\n";
} }
else { else {
if(0 && $verbose) {
print "malloc at ".$getmem{$addr}." is freed again at $source:$linenum\n";
}
$totalmem -= $sizeataddr{$addr}; $totalmem -= $sizeataddr{$addr};
if($trace) {
print "FREE: malloc at ".$getmem{$addr}." is freed again at $source:$linenum\n";
printf("FREE: %d bytes freed, left allocated: $totalmem bytes\n", $sizeataddr{$addr});
}
newtotal($totalmem); newtotal($totalmem);
$frees++; $frees++;
@@ -69,8 +72,9 @@ while(<STDIN>) {
$sizeataddr{$addr}=$size; $sizeataddr{$addr}=$size;
$totalmem += $size; $totalmem += $size;
if(0 && $verbose) { if($trace) {
print "malloc($size) at $source:$linenum\n"; print "MALLOC: malloc($size) at $source:$linenum",
" makes totally $totalmem bytes\n";
} }
newtotal($totalmem); newtotal($totalmem);
@@ -84,11 +88,18 @@ while(<STDIN>) {
$newaddr = $3; $newaddr = $3;
$totalmem -= $sizeataddr{$oldaddr}; $totalmem -= $sizeataddr{$oldaddr};
if($trace) {
printf("REALLOC: %d less bytes and ", $sizeataddr{$oldaddr});
}
$sizeataddr{$oldaddr}=0; $sizeataddr{$oldaddr}=0;
$totalmem += $newsize; $totalmem += $newsize;
$sizeataddr{$newaddr}=$newsize; $sizeataddr{$newaddr}=$newsize;
if($trace) {
printf("%d more bytes ($source:$linenum)\n", $newsize);
}
newtotal($totalmem); newtotal($totalmem);
$reallocs++; $reallocs++;
@@ -106,6 +117,11 @@ while(<STDIN>) {
$totalmem += $size; $totalmem += $size;
if($trace) {
printf("STRDUP: $size bytes at %s, makes totally: %d bytes\n",
$getmem{$addr}, $totalmem);
}
newtotal($totalmem); newtotal($totalmem);
$strdups++; $strdups++;
} }

View File

@@ -52,7 +52,7 @@ my $memory_debug=0;
my $memdump="memdump"; my $memdump="memdump";
# the path to the script that analyzes the memory debug output file: # the path to the script that analyzes the memory debug output file:
my $memanalyze="../memanalyze.pl"; my $memanalyze="./memanalyze.pl";
my $checkstunnel = &checkstunnel; my $checkstunnel = &checkstunnel;
@@ -74,6 +74,9 @@ my $pwd; # current working directory
chomp($pwd = `pwd`); chomp($pwd = `pwd`);
# enable memory debugging if curl is compiled with it
$ENV{'CURL_MEMDEBUG'} = 1;
####################################################################### #######################################################################
# Return the pid of the server as found in the given pid file # Return the pid of the server as found in the given pid file
# #
@@ -171,7 +174,7 @@ sub runhttpserver {
} }
} }
if($pid) { if($pid > 0) {
my $res = kill (9, $pid); # die! my $res = kill (9, $pid); # die!
if(!$res) { if(!$res) {
print "Failed to kill our HTTP test server, do it manually and", print "Failed to kill our HTTP test server, do it manually and",

View File

@@ -5,6 +5,7 @@
#include <string.h> #include <string.h>
#include <unistd.h> #include <unistd.h>
#include <signal.h> #include <signal.h>
#include <time.h>
#include <sys/time.h> #include <sys/time.h>
#include <sys/types.h> #include <sys/types.h>
#include <sys/wait.h> #include <sys/wait.h>