Compare commits
165 Commits
curl-7_9_1
...
pre-host-c
Author | SHA1 | Date | |
---|---|---|---|
![]() |
6aaee5f23b | ||
![]() |
dd06dcebe1 | ||
![]() |
b35c26b751 | ||
![]() |
128f341635 | ||
![]() |
e48bc1be48 | ||
![]() |
0077b9c0a2 | ||
![]() |
fe37fb5921 | ||
![]() |
221ecd0a30 | ||
![]() |
560492707d | ||
![]() |
dfdf4916fa | ||
![]() |
97a8c98886 | ||
![]() |
62fb70e9d1 | ||
![]() |
8a9098a36c | ||
![]() |
28027c2aa2 | ||
![]() |
d60029d66e | ||
![]() |
226fe8bdf9 | ||
![]() |
33237b4502 | ||
![]() |
af6c394785 | ||
![]() |
558d12d7f6 | ||
![]() |
bfa8a6da26 | ||
![]() |
aa6b3d22a2 | ||
![]() |
2eb355733f | ||
![]() |
e66cdacb93 | ||
![]() |
c67f2da283 | ||
![]() |
e192261788 | ||
![]() |
c63ca99c1c | ||
![]() |
1c99c4ad11 | ||
![]() |
bbcfc10677 | ||
![]() |
47e67eab26 | ||
![]() |
650b95045d | ||
![]() |
5603134e58 | ||
![]() |
d12fd897cb | ||
![]() |
5e95203a5d | ||
![]() |
cad4a571ce | ||
![]() |
139ab3740a | ||
![]() |
7b832e1745 | ||
![]() |
914b9e441b | ||
![]() |
f0f6ab49f5 | ||
![]() |
436d147925 | ||
![]() |
4bd78a7df4 | ||
![]() |
7ee6a9dc25 | ||
![]() |
1b56ae8478 | ||
![]() |
d52c0b6f05 | ||
![]() |
3ff2bfa0e4 | ||
![]() |
aa21a3d5c3 | ||
![]() |
fc33ad8cf2 | ||
![]() |
779043f7a3 | ||
![]() |
265bb99382 | ||
![]() |
7493db2338 | ||
![]() |
c3ad019c99 | ||
![]() |
05b84bfe91 | ||
![]() |
dbfa1e55b6 | ||
![]() |
a0fd63f611 | ||
![]() |
4ec0401529 | ||
![]() |
61e6554b7f | ||
![]() |
f6f3f79aa8 | ||
![]() |
c16c017f8b | ||
![]() |
2f03ef39d1 | ||
![]() |
db33926432 | ||
![]() |
946090b9cd | ||
![]() |
1f7f0fda71 | ||
![]() |
b84d947be4 | ||
![]() |
07c67138c9 | ||
![]() |
10717bd39b | ||
![]() |
302bb4a4b3 | ||
![]() |
81b5af2d1b | ||
![]() |
87c562845c | ||
![]() |
6c81d74626 | ||
![]() |
533c24a471 | ||
![]() |
6a9697387a | ||
![]() |
85c8981b3d | ||
![]() |
6c5b8e1d59 | ||
![]() |
2cc16d89e6 | ||
![]() |
42eb74922d | ||
![]() |
c528a7ee33 | ||
![]() |
eb2da7ec2b | ||
![]() |
01ed950bbe | ||
![]() |
b1076e0a9e | ||
![]() |
332eb7651a | ||
![]() |
cfdcf5c933 | ||
![]() |
820de919b6 | ||
![]() |
a32cd520bd | ||
![]() |
b93a60daf9 | ||
![]() |
e2844f5e04 | ||
![]() |
cabb46db3d | ||
![]() |
d09b436937 | ||
![]() |
10fdb1d743 | ||
![]() |
f0d3fccd4b | ||
![]() |
aff19f64b5 | ||
![]() |
15a56b42d6 | ||
![]() |
d3706814e9 | ||
![]() |
6513dcef68 | ||
![]() |
81f22465ba | ||
![]() |
dccc77a325 | ||
![]() |
13ac89af24 | ||
![]() |
ffefcab1bc | ||
![]() |
0226b53b75 | ||
![]() |
bbf80d0f93 | ||
![]() |
6003f24f78 | ||
![]() |
4382a80b9a | ||
![]() |
9fe920cd90 | ||
![]() |
f0ee7115d3 | ||
![]() |
5986c653ef | ||
![]() |
0e7203be89 | ||
![]() |
52dbc96c32 | ||
![]() |
1c8da21083 | ||
![]() |
8f304d8167 | ||
![]() |
30a0bd9cf5 | ||
![]() |
ae40cdf92f | ||
![]() |
b342fbdcda | ||
![]() |
d1ea596f88 | ||
![]() |
064cf971ef | ||
![]() |
91b1598756 | ||
![]() |
17b18bca3c | ||
![]() |
be3d601217 | ||
![]() |
ca0fd33d2d | ||
![]() |
271f96f78f | ||
![]() |
b0130e6b3b | ||
![]() |
d0c1f3e25b | ||
![]() |
b244710ddb | ||
![]() |
d465291ded | ||
![]() |
84e462d5f6 | ||
![]() |
508466a175 | ||
![]() |
e6dd4a6456 | ||
![]() |
8d62e21072 | ||
![]() |
25fe47f262 | ||
![]() |
fe8365d214 | ||
![]() |
2519a8cc9f | ||
![]() |
b8ff21124a | ||
![]() |
6aafc2dfd2 | ||
![]() |
65b22480f4 | ||
![]() |
60f19269d0 | ||
![]() |
5121499082 | ||
![]() |
3e049a90b7 | ||
![]() |
c5d97df7f1 | ||
![]() |
c2479ccb7a | ||
![]() |
fc07eb45f4 | ||
![]() |
c7cdb0f266 | ||
![]() |
92aedf850e | ||
![]() |
dd157fc349 | ||
![]() |
05f3ca880f | ||
![]() |
a18d41a463 | ||
![]() |
1affbff8f9 | ||
![]() |
c55d0bb804 | ||
![]() |
0ffec712e1 | ||
![]() |
6ebac3dc76 | ||
![]() |
3b976ea9f1 | ||
![]() |
2c16dfb526 | ||
![]() |
fe3a78ab19 | ||
![]() |
1a984ea847 | ||
![]() |
2a0cde3041 | ||
![]() |
3552775b52 | ||
![]() |
818a632e80 | ||
![]() |
00afb0f638 | ||
![]() |
2e32d415c0 | ||
![]() |
3dfc509d33 | ||
![]() |
4379142af7 | ||
![]() |
8a6dc57212 | ||
![]() |
af636c535c | ||
![]() |
2f77b0a4c6 | ||
![]() |
08ad385e0e | ||
![]() |
5623e0bb0e | ||
![]() |
3d438d8d64 | ||
![]() |
d89c495782 | ||
![]() |
f5ba174f4d |
331
CHANGES
331
CHANGES
@@ -6,6 +6,333 @@
|
||||
|
||||
History of Changes
|
||||
|
||||
Daniel (3 January 2002)
|
||||
- As the test case uses --include and then --head, I had to modify src/main.c
|
||||
to deal with this situation slightly better than previously. When done, we
|
||||
have 100% good tests again in the main branch.
|
||||
|
||||
Daniel (2 January 2002)
|
||||
- Made test case 25 run again in the multi-dev branch. But it seems that the
|
||||
changes done on dec-20 made test case 104 cease to work (in both branches).
|
||||
|
||||
- Philip Gladstone pointed out a few portability problems in the source code
|
||||
that didn't compile on 64-bit sparcs using Sun's native compiler...
|
||||
|
||||
Daniel (20 December 2001)
|
||||
- Bj<42>rn Stenberg caught an unpleasent (but hard-to-find) bug that could cause
|
||||
libcurl to hang on transfers over proxy, when the proxy was specified with
|
||||
an environment variable!
|
||||
|
||||
- Added code to make ftp operations treat the NO_BODY and HEADERS options
|
||||
better:
|
||||
|
||||
NO_BODY set TRUE and HEADERS set TRUE:
|
||||
Return a set of headers with file info
|
||||
|
||||
NO_BODY set FALSE
|
||||
Transfer data as usual, HEADERS is ignored
|
||||
|
||||
NO_BODY set TRUE and HEADERS set FALSE
|
||||
Don't transfer any data, don't return any headers. Just perform the set
|
||||
of FTP commands.
|
||||
|
||||
Daniel (17 December 2001)
|
||||
- G<>tz Babin-Ebell dove into the dark dungeons of the OpenSSL ENGINE stuff and
|
||||
made libcurl support it! This allows libcurl to do SSL connections with the
|
||||
private key stored in external hardware.
|
||||
|
||||
To make this good, he had to add a bunch of new library options that'll be
|
||||
useful to others as well:
|
||||
|
||||
CURLOPT_SSLCERTTYPE set SSL cert type (PEM/DER)
|
||||
CURLOPT_SSLKEY set SSL private key (file)
|
||||
CURLOPT_SSLKEYTYPE: set SSL key type (PEM/DER/ENG)
|
||||
CURLOPT_SSLKEYPASSWD: set the passphrase for your private key
|
||||
(CURLOPT_SSLCERTPASSWD is an alias)
|
||||
CURLOPT_SSLENGINE: set the name of the crypto engine
|
||||
(returns CURLE_SSL_ENGINE_NOTFOUND on error)
|
||||
CURLOPT_SSLENGINE_DEFAULT: set the default engine
|
||||
|
||||
There are two new failure codes:
|
||||
|
||||
CURLE_SSL_ENGINE_NOTFOUND
|
||||
CURLE_SSL_ENGINE_SETFAILED
|
||||
|
||||
Daniel (14 December 2001)
|
||||
- We have "branched" the source-tree at a few places. Checkout the CVS sources
|
||||
with the 'multi-dev' label to get the latest multi interface development
|
||||
tree. The idea is to only branch affected files and to restrict the branch
|
||||
to the v8 multi interface development only.
|
||||
|
||||
*NOTE* that if we get bug reports and patches etc, we might need to apply
|
||||
them in both branches!
|
||||
|
||||
The multi-dev branch is what we are gonna use as main branch in the future
|
||||
if it turns out successful. Thus, we must maintain both now in case we need
|
||||
them. The current main branch will be used if we want to release a 7.9.3 or
|
||||
perhaps a 7.10 release before version 8. Which is very likely.
|
||||
|
||||
- Marcus Webster provided code for the new CURLFORM_CONTENTHEADER option for
|
||||
curl_formadd(), that lets an application add a set of headers for that
|
||||
particular part in a multipart/form-post. He also provided a section to the
|
||||
man page that describes the new option.
|
||||
|
||||
Daniel (11 December 2001)
|
||||
- Ben Greear made me aware of the fact that the Curl_failf() usage internally
|
||||
was a bit sloppy with adding newlines or not to the error messages. Let's
|
||||
once and for all say that they do not belong there!
|
||||
|
||||
- When uploading files with -T to give a local file name, and you end the URL
|
||||
with a slash to have the local file name used remote too, we now no longer
|
||||
use the local directory as well. Only the file part of the -T file name
|
||||
will be appended to the right of the slash in the URL.
|
||||
|
||||
Daniel (7 December 2001)
|
||||
- Michal Bonino pointed out that Digital Unix doesn't have gmtime_r so the
|
||||
link failed. Added a configure check and corrected source code.
|
||||
|
||||
Version 7.9.2
|
||||
|
||||
Daniel (5 December 2001)
|
||||
- Jon Travis found out that if you used libcurl and CURLOPT_UPLOAD and then
|
||||
on the same handle used CURLOPT_HTTPGET it would still attempt to upload.
|
||||
His suggested fix was perfect.
|
||||
|
||||
Daniel (4 December 2001)
|
||||
- Incorporated more macos fixes and added four specific files in a new
|
||||
subdirectory below src.
|
||||
|
||||
Daniel (3 December 2001)
|
||||
- Eric Lavigne reported two problems:
|
||||
|
||||
First one in the curl_strnequal() function. I think this problem is rather
|
||||
macos 9 specific, as most platform provides a function to use instead of the
|
||||
one provided by libcurl.
|
||||
|
||||
A second, more important, was in the way we take care of FTP responses. The
|
||||
code would read a large chunk of data and search for the end-of-response
|
||||
line within that chunk. When found, it would just skip the rest of the
|
||||
data. However, when the network connections are special, or perhaps the
|
||||
server is, we could actually get more than one response in that chunk of
|
||||
data so that when the next invoke to this function was done, the response
|
||||
had already been read and thrown away. Now, we cache the data not used in
|
||||
one call, as it could be useful in the subsequent call. Test case 126 was
|
||||
added and the test ftp server modified, to exercise this particular case.
|
||||
|
||||
Version 7.9.2-pre8
|
||||
|
||||
Daniel (2 December 2001)
|
||||
- Bug report #487825 correctly identified a problem when using a proxy and
|
||||
following a redirection from HTTP to HTTPS. libcurl then re-used the same
|
||||
proxy connection but without doing a proper HTTPS request.
|
||||
|
||||
- Fixed win32 compiling quirks.
|
||||
|
||||
Version 7.9.2-pre7
|
||||
|
||||
Daniel (30 November 2001)
|
||||
- Documented --disable-epsv and CURLOPT_FTP_USE_EPSV.
|
||||
|
||||
Daniel (29 November 2001)
|
||||
- Added --disable-epsv as an option. When used, curl won't attempt to use the
|
||||
EPSV command when doing passive FTP downloads. Wrote a test case for it.
|
||||
|
||||
- Eric provided a few more fixes for building on Macs. He also pointed out
|
||||
a flaw in the signal handler restoration code.
|
||||
|
||||
Daniel (28 November 2001)
|
||||
- Fiddled with some Tru64 problems reported by Dimitris Sarris. They appeared
|
||||
only when using VERBOSE ftp transfers. Do we use a too small buffer for
|
||||
gethostbyaddr_r(), was the lack of using in_addr_t wrong or is it that the
|
||||
hostent struct must be blanked before use? With Dimitris help and these
|
||||
patches, the problems seem to be history.
|
||||
|
||||
- CURLOPT_FTP_USE_EPSV was added and can be set to FALSE to prevent libcurl
|
||||
from using the EPSV command before trying the normal PASV. Heikki Korpela
|
||||
pointed out that some firewalls and similar don't like the EPSV so we must
|
||||
be able to shut if off to work everywhere.
|
||||
|
||||
- I added a configure check for 'in_addr_t' and made the ftp code use that to
|
||||
receive the inet_addr() return code in. Works on Solaris and Linux at
|
||||
least. The Linux man page for inet_addr() doesn't even mention in_addr_t...
|
||||
|
||||
- Adjusted (almost) all FTP tests to the new command sequence.
|
||||
|
||||
- FTP command sequence changes:
|
||||
|
||||
EPSV is now always attempted before PASV. It is the final touch to make IPv6
|
||||
passive FTP downloads to work, but EPSV is not restricted to IPv6 but works
|
||||
fine with IPv4 too on the servers that support it.
|
||||
|
||||
SIZE is now always issued before RETR. It makes curl know the actual
|
||||
download size before the download takes place, as it makes it less important
|
||||
to find the size sent in RETR responses. Many sites don't include the size
|
||||
in there.
|
||||
|
||||
Both these changes made it necessary to change the test suite's ftp server
|
||||
code, and all FTP test cases need to be checked and adjusted!
|
||||
|
||||
Daniel (27 November 2001)
|
||||
- Hans Steegers pointed out that the telnet code read from stdout, not stdin
|
||||
as it is supposed to do!
|
||||
|
||||
Version 7.9.2-pre6
|
||||
|
||||
Daniel (27 November 2001)
|
||||
- Eric Lavigne's minor changes to build on MacOS before OS X were applied.
|
||||
|
||||
- greep at mindspring.com provided a main index.html page for our release
|
||||
archive docs directory. It just links to all the existing HTML files, but
|
||||
I think it may come useful to people.
|
||||
|
||||
- There's now some initial code to support the EPSV FTP command. That should
|
||||
be used to do passive transfers IPv6-style. The code is still #if 0'ed in
|
||||
lib/ftp.c as I have no IPv6 ftp server to test this with.
|
||||
|
||||
Daniel (26 November 2001)
|
||||
- Robert Schlabbach had problems to understand how to do resumed transfers,
|
||||
and I clarified the man page -C section somewhat.
|
||||
|
||||
Version 7.9.2-pre5
|
||||
|
||||
Daniel (22 November 2001)
|
||||
- Andr<64>s Garc<72>a helped me out to track down the roots of bug report #479537,
|
||||
which was concerning curl returning the wrong error code when failing to
|
||||
connect. This didn't happen on all systems, and more specificly I've so far
|
||||
only seen this happen on IPv4-only Linux hosts.
|
||||
|
||||
- I applied the fixes for the two bugs Eric Lavigne found when doing his MacOS
|
||||
port. A missing comma in arpa_telnet.h and a pretty wild write in the FTP
|
||||
response reader function. The latter write is however likely to occur in our
|
||||
own buffer unless very big FTP server replies (>25K) are read. I've never
|
||||
seen such a reply ever, so I think this is a relatively minor risk.
|
||||
|
||||
Daniel (21 November 2001)
|
||||
- Moonesamy provided code to prevent junk from being output when libcurl
|
||||
returns an error code but no error description and that corrects how make is
|
||||
run in the Makefile.dist file (that appears as root Makefile in release
|
||||
archives).
|
||||
|
||||
- Eric Lavigne mailed me bugfixes and patches for building libcurl on MacOS
|
||||
(non-X).
|
||||
|
||||
- Kevin Roth modified the cygwin files once again, now to build against the
|
||||
shared OpenSSL DLLs.
|
||||
|
||||
Version 7.9.2-pre4
|
||||
|
||||
Daniel (20 November 2001)
|
||||
- Georg Horn brought a patch that introduced CURLINFO_STARTTRANSFER_TIME,
|
||||
complete with man page updates!
|
||||
|
||||
Daniel (19 November 2001)
|
||||
- Miklos Nemeth provided details enough to update the Borland makefile
|
||||
properly.
|
||||
|
||||
- Lars M Gustafsson found a case with a bad free(). In fact, it was so bad I'm
|
||||
amazed we never saw this before!
|
||||
|
||||
- Kevin Roth patched the cygwin Makfile.
|
||||
|
||||
Daniel (16 November 2001)
|
||||
- Klevtsov Vadim fixed a bug in how time-conditionals were sent when doing
|
||||
HTTP.
|
||||
|
||||
Version 7.9.2-pre3
|
||||
|
||||
Daniel (14 November 2001)
|
||||
- Samuel Listopad patched away the problem with SSL we got when someone call
|
||||
curl_global_init() => curl_global_cleanup() => curl_global_init(). The
|
||||
second init would not "take" and SSL would be unusable with curl from that
|
||||
point. This doesn't change the fact that calling the functions that way is
|
||||
wrong. curl_global_init() should be called exactly once and not more.
|
||||
|
||||
Daniel (13 November 2001)
|
||||
- Fixed some minor variable type mixups in ftp.c that caused compiler warnings
|
||||
on HP-UX 11.00.
|
||||
|
||||
- The FTP fix I did yesterday used an uninitialized variable that caused
|
||||
spurious errors when doing FTP.
|
||||
|
||||
Version 7.9.2-pre2
|
||||
|
||||
Daniel (12 November 2001)
|
||||
- Ricardo Cadime fell over a multiple-requests problem when first a FTP
|
||||
directory fetch failed and then a second request is made after that. The
|
||||
second request happened to get the FTP server response back from the
|
||||
previous request, when it did its initial CWD command.
|
||||
|
||||
- Bjorn Reese pointed out that we could improve the time diff function to
|
||||
prevent truncation a bit.
|
||||
|
||||
- Kai-Uwe Rommel made me aware that -p (http proxy tunnel) silly enough didn't
|
||||
work for plain HTTP requests! So I made that work.
|
||||
|
||||
Version 7.9.2-pre1
|
||||
|
||||
Daniel (12 November 2001)
|
||||
- Rewrote the Curl_ConnectHTTPProxyTunnel(). It should now not only work a lot
|
||||
faster, it should also support such ("broken") proxies that John Lask
|
||||
previously have reported problems with. His proxy sends a trailing zero byte
|
||||
after the end of the (proxy-) headers. I've tested this myself and it seems
|
||||
to work on a proxy the previous version also worked with...! This rewrite is
|
||||
due to the problems John Lask previously experienced.
|
||||
|
||||
- Andr<64>s Garc<72>a found out why the "current speed" meter sometimes showed 2048K
|
||||
for very quick transfers. It turned out the "time diff"-function returned a
|
||||
zero millisecond diff. We now always say it is at least one millisecond! In
|
||||
reality, these timers very rarely have that good resolution so even though
|
||||
the time diff was longer than 1 millisecond, it was reported as no diff.
|
||||
|
||||
- I also modified the getinfo() again when returning times, as Paul Harrington
|
||||
reports that 7.9.1 only returns times with 1 second accuracy, which indeed
|
||||
is wrong.
|
||||
|
||||
Daniel (8 November 2001)
|
||||
- Marcus Webster found out that curl_formadd() could read one byte outside a
|
||||
buffer boundary, which then of course could lead to a crash. Marcus also
|
||||
gracefully provided a patch for this this.
|
||||
|
||||
- Glen Scott ran configure on his Cobalt Qube and it didn't figure out the
|
||||
correct way of calling gethostbyname_r() and thus failed to resolve hosts.
|
||||
This is two errors: it shouldn't continue the configure script if it finds
|
||||
gethostbyname_r() but can't figure out how to use it, and it should really
|
||||
figure out how to use it as it was running Linux and we know how that
|
||||
works...
|
||||
|
||||
Daniel (7 November 2001)
|
||||
- docs/VERSIONS is a new file in the archive that explains the version number
|
||||
system we use in the curl project.
|
||||
|
||||
- Did some more fixes that now makes libcurl only ignore signals as long as
|
||||
it needs to, and then restore (if any) previous signal handler again.
|
||||
|
||||
Daniel (6 November 2001)
|
||||
- Enrik Berkhan posted bug report #478780, in which he very correctly pointed
|
||||
out two bad timeout matters in libcurl: we didn't restore the sigaction
|
||||
struct (the alarm handler for SIGALRM) nor did we restore the previous
|
||||
alarm() timeout that could've been set by a "parent" process or similar.
|
||||
|
||||
- Kevin Roth made the cygwin binary get stripped before install.
|
||||
|
||||
Daniel (5 November 2001)
|
||||
- Detlef Schmier reported that curl didn't compile using Solaris 8 with the
|
||||
native cc compiler. It was due to a bad function prototype. Fixed now.
|
||||
Unfortunately, I can't enable the -Wstrict-prototypes in my debug builds
|
||||
though, as gcc then complains like crazy on OpenSSL include files... :-(
|
||||
|
||||
- John Lask provided SSL over HTTP proxy fixes. They'll need some tweaking
|
||||
to work on all platforms.
|
||||
|
||||
- John Lask added the -1/--TLSv1 options that forces SSL into using TLS
|
||||
version 1 when speaking HTTPS.
|
||||
|
||||
- John Lask brought a brand new VC++ makefile for the lib directory, that
|
||||
works a lot better than the previous!
|
||||
|
||||
- Ramana Mokkapati brought some clever insights on the LDAP failures (bug
|
||||
report #475407), and his suggested changes are now applied.
|
||||
|
||||
Version 7.9.1
|
||||
|
||||
Daniel (4 November 2001)
|
||||
@@ -34,8 +361,8 @@ Daniel (1 November 2001)
|
||||
Version 7.9.1-pre7
|
||||
|
||||
Daniel (31 October 2001)
|
||||
- The curl_easy_getinfo() timers accidentally lost they're subsecond accuracy
|
||||
as the calculations used longs instead of doubles! Paul Harrington reported.
|
||||
- The curl_easy_getinfo() timers accidentally lost their subsecond accuracy as
|
||||
the calculations used longs instead of doubles! Paul Harrington reported.
|
||||
|
||||
- The SSL SocketIsDead() checks weren't good enough (as expected really), so I
|
||||
had to add a generic internal try-it-out system. If the request on a re-used
|
||||
|
835
CHANGES.0
835
CHANGES.0
@@ -1,838 +1,3 @@
|
||||
Daniel (28 December 1999):
|
||||
- Tim Verhoeven correctly identified that curl
|
||||
doesn't support URL formatted file names when getting ftp. Now, there's a
|
||||
problem with getting very weird file names off FTP servers. RFC 959 defines
|
||||
that the file name syntax to use should be the same as in the native OS of
|
||||
the server. Since we don't know the peer server system we currently just
|
||||
translate the URL syntax into plain letters. It is still better and with
|
||||
the solaris 2.6-supplied ftp server it works with spaces in the file names.
|
||||
|
||||
Daniel (27 December 1999):
|
||||
- When curl parsed cookies straight off a remote site, it corrupted the input
|
||||
data, which, if the downloaded headers were stored made very odd characters
|
||||
in the saved data. Correctly identified and reported by Paul Harrington.
|
||||
|
||||
Daniel (13 December 1999):
|
||||
- General cleanups in the library interface. There had been some bad kludges
|
||||
added during times of stress and I did my best to clean them off. It was
|
||||
both regarding the lib API as well as include file confusions.
|
||||
|
||||
Daniel (3 December 1999):
|
||||
- A small --stderr bug was reported by Eetu Ojanen...
|
||||
|
||||
- who also brought the suggestion of extending the -X flag to ftp list as
|
||||
well. So, now it is and the long option is now --request instead. It is
|
||||
only for ftp list for now (and the former http stuff too of course).
|
||||
|
||||
Lars J. Aas (24 November 1999):
|
||||
- Patched curl to compile and build under BeOS. Doesn't work yet though!
|
||||
|
||||
- Corrected the Makefile.am files to allow putting object files in
|
||||
different directories than the sources.
|
||||
|
||||
Version 6.3.1
|
||||
|
||||
Daniel (23 November 1999):
|
||||
- I've had this major disk crash. My good old trust-worthy source disk died
|
||||
along with the machine that hosted it. Thank goodness most of all the
|
||||
things I've done are either backed up elsewhere or stored in this CVS
|
||||
server!
|
||||
|
||||
- Michael S. Steuer pointed out a bug in the -F handling
|
||||
that made curl hang if you posted an empty variable such as '-F name='. It
|
||||
was one of those old bugs that never have worked properly...
|
||||
|
||||
- Jason Baietto pointed out a general flaw in the HTTP
|
||||
download. Curl didn't complain if it was prematurely aborted before the
|
||||
entire download was completed. It does now.
|
||||
|
||||
Daniel (19 November 1999):
|
||||
- Chris Maltby very accurately criticized the lack of
|
||||
return code checks on the fwrite() calls. I did a thorough check for all
|
||||
occurrences and corrected this.
|
||||
|
||||
Daniel (17 November 1999):
|
||||
- Paul Harrington pointed out that the -m/--max-time option
|
||||
doesn't work for the slow system calls like gethostbyname()... I don't have
|
||||
any good fix yet, just a slightly less bad one that makes curl exit hard
|
||||
when the timeout is reached.
|
||||
|
||||
- Bjorn Reese helped me point out a possible problem that might be the reason
|
||||
why Thomas Hurst experience problems in his Amiga version.
|
||||
|
||||
Daniel (12 November 1999):
|
||||
- I found a crash in the new cookie file parser. It crashed when you gave
|
||||
a plain http header file as input...
|
||||
|
||||
Version 6.3
|
||||
|
||||
Daniel (10 November 1999):
|
||||
- I kind of found out that the HTTP time-conditional GETs (-z) aren't always
|
||||
respected by the web server and the document is therefore sent in whole
|
||||
again, even though it doesn't match the requested condition. After reading
|
||||
section 13.3.4 of RFC 2616, I think I'm doing the right thing now when I do
|
||||
my own check as well. If curl thinks the condition isn't met, the transfer
|
||||
is aborted prematurely (after all the headers have been received).
|
||||
|
||||
- After comments from Robert Linden I also rewrote some parts of the man page
|
||||
to better describe how the -F works.
|
||||
|
||||
- Michael Anti put up a new curl download mirror in
|
||||
China: http://www.pshowing.com/curl/
|
||||
|
||||
- I added the list of download mirrors to the README file
|
||||
|
||||
- I did add more explanations to the man page
|
||||
|
||||
Daniel (8 November 1999):
|
||||
- I made the -b/--cookie option capable of reading netscape formatted cookie
|
||||
files as well as normal http-header files. It should be able to
|
||||
transparently figure out what kind of file it got as input.
|
||||
|
||||
Daniel (29 October 1999):
|
||||
- Another one of Sebastiaan van Erk's ideas (that has been requested before
|
||||
but I seem to have forgotten who it was), is to add support for ranges in
|
||||
FTP downloads. As usual, one request is just a request, when they're two
|
||||
it is a demand. I've added simple support for X-Y style fetches. X has to
|
||||
be the lower number, though you may omit one of the numbers. Use the -r/
|
||||
--range switch (previously HTTP-only).
|
||||
|
||||
- Sebastiaan van Erk suggested that curl should be
|
||||
able to show the file size of a specified file. I think this is a splendid
|
||||
idea and the -I flag is now working for FTP. It displays the file size in
|
||||
this manner:
|
||||
Content-Length: XXXX
|
||||
As it resembles normal headers, and leaves us the opportunity to add more
|
||||
info in that display if we can come up with more in the future! It also
|
||||
makes sense since if you access ftp through a HTTP proxy, you'd get the
|
||||
file size the same way.
|
||||
|
||||
I changed the order of the QUOTE command executions. They're now executed
|
||||
just after the login and before any other command. I made this to enable
|
||||
quote commands to run before the -I stuff is done too.
|
||||
|
||||
- I found out that -D/--dump-header and -V/--version weren't documented in
|
||||
the man page.
|
||||
|
||||
- Many HTTP/1.1 servers do not support ranges. Don't ask me why. I did add
|
||||
some text about this in the man page for the range option. The thread in
|
||||
the mailing list that started this was initiated by Michael Anti.
|
||||
|
||||
- I get reports about nroff crashes on solaris 2.6+ when displaying the curl
|
||||
man page. Switch to gnroff instead, it is reported to work(!). Adam Barclay
|
||||
reported and brought the suggestion.
|
||||
|
||||
- In a dialogue with Johannes G. Kristinsson we came
|
||||
up with the idea to let -H/--header specified headers replace the
|
||||
internally generated headers, if you happened to select to add a header
|
||||
that curl normally uses by itself. The advantage with this is not entirely
|
||||
obvious, but in Johannes' case it means that he can use another Host: than
|
||||
the one curl would set.
|
||||
|
||||
Daniel (27 October 1999):
|
||||
- Jongki Suwandi brought a nice patch for (yet another) crash when following
|
||||
a location:. This time you had to follow a https:// server's redirect to
|
||||
get the core.
|
||||
|
||||
Version 6.2
|
||||
|
||||
Daniel (21 October 1999):
|
||||
- I think I managed to remove the suspicious (nil) that has been seen just
|
||||
before the "Host:" in HTTP requests when -v was used.
|
||||
- I found out that if you followed a location: when using a proxy, without
|
||||
having specified http:// in the URL, the protocol part was added once again
|
||||
when moving to the next URL! (The protocol part has to be added to the
|
||||
URL when going through a proxy since it has no protocol-guessing system
|
||||
such as curl has.)
|
||||
- Benjamin Ritcey reported a core dump under solaris 2.6
|
||||
with OpenSSL 0.9.4. It turned out this was due to a bad free() in main.c
|
||||
that occurred after the download was done and completed.
|
||||
- Benjamin found ftp downloads to show the first line of the download meter
|
||||
to get written twice, and I removed that problem. It was introduced with
|
||||
the multiple URL support.
|
||||
- Dan Zitter correctly pointed out that curl 6.1 and earlier versions didn't
|
||||
honor RFC 2616 chapter 4 section 2, "Message Headers": "...Field names are
|
||||
case-insensitive..." HTTP header parsing assumed a certain casing. Dan
|
||||
also provided me with a patch that corrected this, which I took the liberty
|
||||
of editing slightly.
|
||||
- Dan Zitter also provided a nice patch for config.guess to better recognize
|
||||
the Mac OS X
|
||||
- Dan also corrected a minor problem in the lib/Makefile that caused linking
|
||||
to fail on OS X.
|
||||
|
||||
Daniel (19 October 1999):
|
||||
- Len Marinaccio came up with some problems with curl. Since Windows has a
|
||||
crippled shell, it can't redirect stderr and that causes trouble. I added
|
||||
--stderr today which allows the user to redirect the stderr stream to a
|
||||
file or stdout.
|
||||
|
||||
Daniel (18 October 1999):
|
||||
- The configure script now understands the '--without-ssl' flag, which now
|
||||
totally disable SSL/https support. Previously it wasn't possible to force
|
||||
the configure script to leave SSL alone. The previous functionality has
|
||||
been retained. Troy Engel helped test this new one.
|
||||
|
||||
Version 6.1
|
||||
|
||||
Daniel (17 October 1999):
|
||||
- I ifdef'ed or commented all the zlib stuff in the sources and configure
|
||||
script. It turned out we needed to mock more with zlib than I initially
|
||||
thought, to make it capable of downloading compressed HTTP documents and
|
||||
uncompress them on the fly. I didn't mean the zlib parts of curl to become
|
||||
more than minor so this means I halt the zlib expedition for now and wait
|
||||
until someone either writes the code or zlib gets updated and better
|
||||
adjusted for this kind of usage. I won't get into details here, but a
|
||||
short a summary is suitable:
|
||||
- zlib can't automatically detect whether to use zlib or gzip
|
||||
decompression methods.
|
||||
- zlib is very neat for reading gzipped files from a file descriptor,
|
||||
although not as nice for reading buffer-based data such as we would
|
||||
want it.
|
||||
- there are still some problems with the win32 version when reading from
|
||||
a file descriptor if that is a socket
|
||||
|
||||
Daniel (14 October 1999):
|
||||
- Moved the (external) include files for libcurl into a subdirectory named
|
||||
curl and adjusted all #include lines to use <curl/XXXX> to maintain a
|
||||
better name space and control of the headers. This has been requested.
|
||||
|
||||
Daniel (12 October 1999):
|
||||
- I modified the 'maketgz' script to perform a 'make' too before a release
|
||||
archive is put together in an attempt to make the time stamps better and
|
||||
hopefully avoid the double configure-running that use to occur.
|
||||
|
||||
Daniel (11 October 1999):
|
||||
- Applied J<>rn's patches that fixes zlib for mingw32 compiles as well as
|
||||
some other missing zlib #ifdef and more text on the multiple URL docs in
|
||||
the man page.
|
||||
|
||||
Version 6.1beta
|
||||
|
||||
Daniel (6 October 1999):
|
||||
- Douglas E. Wegscheid sent me a patch that made the exact same thing as I
|
||||
just made: the -d switch is now capable of reading post data from a named
|
||||
file or stdin. Use it similarly to the -F. To read the post data from a
|
||||
given file:
|
||||
|
||||
curl -d @path/to/filename www.postsite.com
|
||||
|
||||
or let curl read it out from stdin:
|
||||
|
||||
curl -d @- www.postit.com
|
||||
|
||||
J<>rn Hartroth (3 October 1999):
|
||||
- Brought some more patches for multiple URL functionality. The MIME
|
||||
separation ideas are almost scrapped now, and a custom separator is being
|
||||
used instead. This is still compile-time "flagged".
|
||||
|
||||
Daniel
|
||||
- Updated curl.1 with multiple URL info.
|
||||
|
||||
Daniel (30 September 1999):
|
||||
- Felix von Leitner brought openssl-check fixes for configure.in to work
|
||||
out-of-the-box when the openssl files are installed in the system default
|
||||
dirs.
|
||||
|
||||
Daniel (28 September 1999)
|
||||
- Added libz functionality. This should enable decompressing gzip, compress
|
||||
or deflate encoding HTTP documents. It also makes curl send an accept that
|
||||
it accepts that kind of encoding. Compressed contents usually shortens
|
||||
download time. I *need* someone to tell me a site that uses compressed HTTP
|
||||
documents so that I can test this out properly.
|
||||
|
||||
- As a result of the adding of zlib awareness, I changed the version string
|
||||
a little. I plan to add openldap version reporting in there too.
|
||||
|
||||
Daniel (17 September 1999)
|
||||
- Made the -F option allow stdin when specifying files. By using '-' instead
|
||||
of file name, the data will be read from stdin.
|
||||
|
||||
Version 6.0
|
||||
|
||||
Daniel (13 September 1999)
|
||||
- Added -X/--http-request <request> to enable any HTTP command to be sent.
|
||||
Do not that your server has to support the exact string you enter. This
|
||||
should possibly a string like DELETE or TRACE.
|
||||
|
||||
- Applied Douglas' mingw32-fixes for the makefiles.
|
||||
|
||||
Daniel (10 September 1999)
|
||||
- Douglas E. Wegscheid pointed out a problem. Curl didn't check the FTP
|
||||
servers return code properly after the --quote commands were issued. It
|
||||
took anything non 200 as an error, when all 2XX codes should be accepted as
|
||||
OK.
|
||||
|
||||
- Sending cookies to the same site in multiple lines like curl used to do
|
||||
turned out to be bad and breaking the cookie specs. Curl now sends all
|
||||
cookies on a single Cookie: line. Curl is not yet RFC 2109 compliant, but I
|
||||
doubt that many servers do use that syntax (yet).
|
||||
|
||||
Daniel (8 September 1999)
|
||||
- J<>rn helped me make sure it still compiles nicely with mingw32 under win32.
|
||||
|
||||
Daniel (7 September 1999)
|
||||
- FTP upload through proxy is now turned into a HTTP PUT. Requested by
|
||||
Stefan Kanthak.
|
||||
|
||||
- Added the ldap files to the .m32 makefile.
|
||||
|
||||
Daniel (3 September 1999)
|
||||
- Made cookie matching work while using HTTP proxy.
|
||||
|
||||
Bjorn Reese (31 August 1999)
|
||||
- Passed his ldap:// patch. Note that this requires the openldap shared
|
||||
library to be installed and that LD_LIBRARY_PATH points to the
|
||||
directory where the lib will be found when curl is run with a
|
||||
ldap:// URL.
|
||||
|
||||
J<>rn Hartroth (31 August 1999)
|
||||
- Made the Mingw32 makefiles into single files.
|
||||
- Made file:// work for Win32. The same code is now used for unix as well for
|
||||
performance reasons.
|
||||
|
||||
Douglas E. Wegscheid (30 August 1999)
|
||||
- Patched the Mingw32 makefiles for SSL builds.
|
||||
|
||||
Matthew Clarke (30 August 1999)
|
||||
- Made a cool patch for configure.in to allow --with-ssl to specify the
|
||||
root dir of the openssl installation, as in
|
||||
|
||||
./configure --with-ssl=/usr/ssl_here
|
||||
|
||||
- Corrected the 'reconf' script to work better with some shells.
|
||||
|
||||
J<>rn Hartroth (26 August 1999)
|
||||
- Fixed the Mingw32 makefiles in lib/ and corrected the file.c for win32
|
||||
compiles.
|
||||
|
||||
Version 5.11
|
||||
|
||||
Daniel (25 August 1999)
|
||||
- John Weismiller pointed out a bug in the header-line
|
||||
realloc() system in download.c.
|
||||
|
||||
- I added lib/file.[ch] to offer a first, simple, file:// support. It
|
||||
probably won't do much good on win32 system at this point, but I see it
|
||||
as a start.
|
||||
|
||||
- Made the release archives get a Makefile in the root dir, which can be
|
||||
used to start the compiling/building process easier. I haven't really
|
||||
changed any INSTALL text yet, I wanted to get some feed-back on this
|
||||
first.
|
||||
|
||||
Daniel (17 August 1999)
|
||||
- Another Location: bug. Curl didn't do proper relative locations if the
|
||||
original URL had cgi-parameters that contained a slash. Nusu's page
|
||||
again.
|
||||
|
||||
- Corrected the NO_PROXY usage. It is a list of substrings that if one of
|
||||
them matches the tail of the host name it should connect to, curl should
|
||||
not use a proxy to connect there. Pointed out to me by Douglas
|
||||
E. Wegscheid. I also changed the README text a little regarding this.
|
||||
|
||||
Daniel (16 August 1999)
|
||||
- Fixed a memory bug with http-servers that sent Location: to a Location:
|
||||
page. Nusu's page showed this too.
|
||||
|
||||
- Made cookies work a lot better. Setting the same cookie name several times
|
||||
used to add more cookies instead of replacing the former one which it
|
||||
should've. Nusu <nus at intergorj.ro> brought me an URL that made this
|
||||
painfully visible...
|
||||
|
||||
Troy (15 August 1999)
|
||||
- Brought new .spec files as well as a patch for configure.in that lets the
|
||||
configure script find the openssl files better, even when the include
|
||||
files are in /usr/include/openssl
|
||||
|
||||
Version 5.10
|
||||
|
||||
Daniel (13 August 1999)
|
||||
- SSL_CTX_set_default_passwd_cb() has been modified in the 0.9.4 version of
|
||||
OpenSSL. Now why couldn't they simply add a *new* function instead of
|
||||
modifying the parameters of an already existing function? This way, we get
|
||||
a compiler warning if compiling with 0.9.4 but not with earlier. So, I had
|
||||
to come up with a #if construction that deals with this...
|
||||
|
||||
- Made curl output the SSL version number get displayed properly with 0.9.4.
|
||||
|
||||
Troy (12 August 1999)
|
||||
- Added MingW32 (GCC-2.95) support under Win32. The INSTALL file was also
|
||||
a bit rearranged.
|
||||
|
||||
Daniel (12 August 1999)
|
||||
- I had to copy a good <arpa/telnet.h> include file into the curl source
|
||||
tree to enable the silly win32 systems to compile. The distribution rights
|
||||
allows us to do that as long as the file remains unmodified.
|
||||
|
||||
- I corrected a few minor things that made the compiler complain when
|
||||
-Wall -pedantic was used.
|
||||
|
||||
- I'm moving the official curl web page to http://curl.haxx.nu. I think it
|
||||
will make it easier to remember as it is a lot shorter and less cryptic.
|
||||
The old one still works and shows the same info.
|
||||
|
||||
Daniel (11 August 1999)
|
||||
- Albert Chin-A-Young mailed me another correction for NROFF in the
|
||||
configure.in that is supposed to be better for IRIX users.
|
||||
|
||||
Daniel (10 August 1999)
|
||||
- Albert Chin-A-Young helped me with some stupid Makefile things, as well as
|
||||
some fiddling with the getdate.c stuff that he had problems with under
|
||||
HP-UX v10. getdate.y will now be compiled into getdate.c if the appropriate
|
||||
yacc or bison is found by the configure script. Since this is slightly new,
|
||||
we need to test the output getdate.c with win32 systems to make sure it
|
||||
still compiles there.
|
||||
|
||||
Daniel (5 August 1999)
|
||||
- I've just setup a new mailing list with the intention to keep discussions
|
||||
around libcurl development in it. I mainly expect it to be for thoughts and
|
||||
brainstorming around a "next generation" library, rather than nitpicking
|
||||
about the current implementation or details in the current libcurl.
|
||||
|
||||
To join our happy bunch of future-looking geeks, enter 'subscribe
|
||||
<address>' in the body of a mail and send it to
|
||||
libcurl-request@listserv.fts.frontec.se. Curl bug reports, the usual curl
|
||||
talk and everything else should still be kept in this mailing list. I've
|
||||
started to archive this mailing list and have put the libcurl web page at
|
||||
www.fts.frontec.se/~dast/libcurl/.
|
||||
|
||||
- Stefan Kanthak contacted me regarding a few problems in the configure
|
||||
script which he discovered when trying to make curl compile and build under
|
||||
Siemens SINIX-Z V5.42B2004!
|
||||
|
||||
- Marcus Klein very accurately informed me that src/version.h was not present
|
||||
in the CVS repository. Oh, how silly...
|
||||
|
||||
- Linus Nielsen rewrote the telnet:// part and now curl offers limited telnet
|
||||
support. If you run curl like 'curl telnet://host' you'll get all output on
|
||||
the screen and curl will read input from stdin. You'll be able to login and
|
||||
run commands etc, but since the output is buffered, expect to get a little
|
||||
weird output.
|
||||
|
||||
This is still in its infancy and it might get changed. We need your
|
||||
feed-back and input in how this is best done.
|
||||
|
||||
WIN32 NOTE: I bet we'll get problems when trying to compile the current
|
||||
lib/telnet.c on win32, but I think we can sort them out in time.
|
||||
|
||||
- David Sanderson reported that FORCE_ALLOCA_H or HAVE_ALLOCA_H must be
|
||||
defined for getdate.c to compile properly on HP-UX 11.0. I updated the
|
||||
configure script to check for alloca.h which should make it.
|
||||
|
||||
Daniel (4 August 1999)
|
||||
- I finally got to understand Marcus Klein's ftp download resume problem,
|
||||
which turns out to be due to different outputs from different ftp
|
||||
servers. It makes ftp download resuming a little trickier, but I've made
|
||||
some modifications I really believe will work for most ftp servers and I do
|
||||
hope you report if you have problems with this!
|
||||
|
||||
- Added text about file transfer resuming to README.curl.
|
||||
|
||||
Daniel (2 August 1999)
|
||||
- Applied a progress-bar patch from Lars J. Aas. It offers
|
||||
a new styled progress bar enabled with -#/--progress-bar.
|
||||
|
||||
T. Yamada <tai at imasy.or.jp> (30 July 1999)
|
||||
- It breaks with segfault when 1) curl is using .netrc to obtain
|
||||
username/password (option '-n'), and 2) is automatically redirected to
|
||||
another location (option '-L').
|
||||
|
||||
There is a small bug in lib/url.c (block starting from line 641), which
|
||||
tries to take out username/password from user- supplied command-line
|
||||
argument ('-u' option). This block is never executed on first attempt since
|
||||
CONF_USERPWD bit isn't set at first, but curl later turns it on when it
|
||||
checks for CONF_NETRC bit. So when curl tries to redo everything due to
|
||||
redirection, it segfaults trying to access *data->userpwd.
|
||||
|
||||
Version 5.9.1
|
||||
|
||||
Daniel (30 July 1999)
|
||||
- Steve Walch pointed out that there is a memory leak in the formdata
|
||||
functions. I added a FormFree() function that is now used and supposed to
|
||||
correct this flaw.
|
||||
|
||||
- Mark Wotton reported:
|
||||
'curl -L https://www.cwa.com.au/' core dumps. I managed to cure this by
|
||||
correcting the cleanup procedure. The bug seems to be gone with my OpenSSL
|
||||
0.9.2b, although still occurs when I run the ~100 years old SSLeay 0.8.0. I
|
||||
don't know whether it is curl or SSLeay that is to blame for that.
|
||||
|
||||
- Marcus Klein:
|
||||
Reported an FTP upload resume bug that I really can't repeat nor understand.
|
||||
I leave it here so that it won't be forgotten.
|
||||
|
||||
Daniel (29 July 1999)
|
||||
- Costya Shulyupin suggested support for longer URLs when following Location:
|
||||
and I could only agree and fix it!
|
||||
|
||||
- Leigh Purdie found a problem in the upload/POST department. It turned out
|
||||
that http.c accidentaly cleared the pointer instead of the byte counter
|
||||
when supposed to.
|
||||
|
||||
- Costya Shulyupin pointed out a problem with port numbers and Location:. If
|
||||
you had a server at a non-standard port that redirected to an URL using a
|
||||
standard port number, curl still used that first port number.
|
||||
|
||||
- Ralph Beckmann pointed out a problem when using both CONF_FOLLOWLOCATION
|
||||
and CONF_FAILONERROR simultaneously. Since the CONF_FAILONERROR exits on
|
||||
the 302-code that the follow location header outputs it will never show any
|
||||
html on location: pages. I have now made it look for >=400 codes if
|
||||
CONF_FOLLOWLOCATION is set.
|
||||
|
||||
- 'struct slist' is now renamed to 'struct curl_slist' (as suggested by Ralph
|
||||
Beckmann).
|
||||
|
||||
- Joshua Swink and Rick Welykochy were the first to point out to me that the
|
||||
latest OpenSSL package now have moved the standard include path. It is now
|
||||
in /usr/local/ssl/include/openssl and I have now modified the --enable-ssl
|
||||
option for the configure script to use that as the primary path, and I
|
||||
leave the former path too to work with older packages of OpenSSL too.
|
||||
|
||||
Daniel (9 June 1999)
|
||||
- I finally understood the IRIX problem and now it seem to compile on it!
|
||||
I am gonna remove those #define strcasecmp() things once and for all now.
|
||||
|
||||
Daniel (4 June 1999)
|
||||
- I adjusted the FTP reply 227 parser to make the PASV command work better
|
||||
with more ftp servers. Appearantly the Roxen Challanger server replied
|
||||
something curl 5.9 could deal with! :-( Reported by Ashley Reid-Montanaro
|
||||
and Mark Butler brought a solution for it.
|
||||
|
||||
Daniel (26 May 1999)
|
||||
- Rearranged. README is new, the old one is now README.curl and I added a
|
||||
README.libcurl with text I got from Ralph Beckmann.
|
||||
|
||||
- I also updated the INSTALL text.
|
||||
|
||||
Daniel (25 May 1999)
|
||||
- David Jonathan Lowsky correctly pointed out that curl didn't properly deal
|
||||
with form posting where the variable shouldn't have any content, as in curl
|
||||
-F "form=" www.site.com. It was now fixed.
|
||||
|
||||
Version 5.9
|
||||
|
||||
Daniel (22 May 1999)
|
||||
- I've got a bug report from Aaron Scarisbrick in which he states he has some
|
||||
problems with -L under FreeBSD 3.0. I have previously got another bug
|
||||
report from Stefan Grether which points at an error with similar sympthoms
|
||||
when using win32. I made the allocation of the new url string a bit faster
|
||||
and different, don't know if it actually improves anything though...
|
||||
|
||||
Daniel (20 May 1999)
|
||||
- Made the cookie parser deal with CRLF newlines too.
|
||||
|
||||
Daniel (19 May 1999)
|
||||
- Download() didn't properly deal with failing return codes from the sread()
|
||||
function. Adam Coyne found the problem in the win32 version, and Troy Engel
|
||||
helped me out isolating it.
|
||||
|
||||
Daniel (16 May 1999)
|
||||
- Richard Adams pointed out a bug I introduced in 5.8. --dump-header doesn't
|
||||
work anymore! :-/ I fixed it now.
|
||||
|
||||
- After a suggestion by Joshua Swink I added -S / --show-error to force curl
|
||||
to display the error message in case of an error, even if -s/--silent was
|
||||
used.
|
||||
|
||||
Daniel (10 May 1999)
|
||||
- I moved the stuff concerning HTTP, DICT and TELNET it their own source
|
||||
files now. It is a beginning on my clean-up of the sources to make them
|
||||
layer all those protocols better to enable more to be added easier in the
|
||||
future!
|
||||
|
||||
- Leon Breedt sent me some files I've not put into the main curl
|
||||
archive. They're for creating the Debian package thingie. He also sent me a
|
||||
debian package that I've made available for download at the web page
|
||||
|
||||
Daniel (9 May 1999)
|
||||
- Made it compile on cygwin too.
|
||||
|
||||
Troy Engel (7 May 1999)
|
||||
- Brought a series of patches to allow curl to compile smoothly on MSVC++ 6
|
||||
again!
|
||||
|
||||
Daniel (6 May 1999)
|
||||
- I changed the #ifdef HAVE_STRFTIME placement for the -z code so that it
|
||||
will be easier to discover systems that don't have that function and thus
|
||||
can't use -z successfully. Made the strftime() get used if WIN32 is defined
|
||||
too.
|
||||
|
||||
Version 5.8
|
||||
|
||||
Daniel (5 May 1999)
|
||||
- I've had it with this autoconf/automake mess. It seems to work allright
|
||||
for most people who don't have automake installed, but for those who have
|
||||
there are problems all over.
|
||||
|
||||
I've got like five different bug reports on this only the last
|
||||
week... Claudio Neves and Federico Bianchi and root <duggerj001 at
|
||||
hawaii.rr.com> are some of them reporting this.
|
||||
|
||||
Currently, I have no really good fix since I want to use automake myself to
|
||||
generate the Makefile.in files. I've found out that the @SHELL@-problems
|
||||
can often be fixed by manually invoking 'automake' in the archive root
|
||||
before you run ./configure... I've hacked my maketgz script now to fiddle
|
||||
a bit with this and my tests seem to work better than before at least!
|
||||
|
||||
Daniel (4 May 1999)
|
||||
- mkhelp.pl has been doing badly lately. I corrected a case problem in
|
||||
the regexes.
|
||||
|
||||
- I've now remade the -o option to not touch the file unless it needs to.
|
||||
I had to do this to make -z option really fine, since now you can make a
|
||||
curl fetch and use a local copy's time when downloading to that file, as
|
||||
in:
|
||||
|
||||
curl -z dump -o dump remote.site.com/file.html
|
||||
|
||||
This will only get the file if the remote one is newer than the local.
|
||||
I'm aware that this alters previous behaviour a little. Some scripts out
|
||||
there may depend on that the file is always touched...
|
||||
|
||||
- Corrected a bug in the SSLv2/v3 selection.
|
||||
|
||||
- Felix von Leitner requested that curl should be able to send
|
||||
"If-Modified-Since" headers, which indeed is a fair idea. I implemented it
|
||||
right away! Try -z <expression> where expression is a full GNU date
|
||||
expression or a file name to get the date from!
|
||||
|
||||
Stephan Lagerholm (30 Apr 1999)
|
||||
- Pointed out a problem with the src/Makefile for FreeBSD. The RM variable
|
||||
isn't set and causes the make to fail.
|
||||
|
||||
Daniel (26 April 1999)
|
||||
- Am I silly or what? Irving Wolfe pointed out to me that the curl version
|
||||
number was not set properly. Hasn't been since 5.6. This was due to a bug
|
||||
in my maketgz script!
|
||||
|
||||
David Eriksson (25 Apr 1999)
|
||||
- Found a bug in cookies.c that made it crash at times.
|
||||
|
||||
Version 5.7.1
|
||||
|
||||
Doug Kaufman (23 Apr 1999)
|
||||
- Brought two sunos 4 fixes. One of them being the hostip.c fix mentioned
|
||||
below and the other one a correction in include/stdcheaders.h
|
||||
|
||||
- Added a paragraph about compiling with the US-version of openssl to the
|
||||
INSTALL file.
|
||||
|
||||
Daniel
|
||||
- New mailing list address. Info updated on the web page as well as in the
|
||||
README file
|
||||
|
||||
Greg Onufer (20 Apr 1999)
|
||||
- hostip.c didn't compile properly on SunOS 5.5.1.
|
||||
It needs an #include <sys/types.h>
|
||||
|
||||
Version 5.7
|
||||
|
||||
Daniel (Apr 20 1999)
|
||||
- Decided to upload a non-beta version right now!
|
||||
|
||||
- Made curl support any-length HTTP headers. The destination buffer is now
|
||||
simply enlarged every time it turns out to be too small!
|
||||
|
||||
- Added the FAQ file to the archive. Still a bit smallish, but it is a
|
||||
start.
|
||||
|
||||
Eric Thelin (15 Apr 1999)
|
||||
- Made -D accept '-' instead of filename to write to stdout.
|
||||
|
||||
Version 5.6.3beta
|
||||
|
||||
Daniel (Apr 12 1999)
|
||||
|
||||
- Changed two #ifdef WIN32 to better #ifdef <errorcode> when connect()ing
|
||||
in url.c and ftp.c. Makes cygwin32 deal with them better too. We should
|
||||
try to get some decent win32-replacement there. Anyone?
|
||||
|
||||
- The old -3/--crlf option is now ONLY --crlf!
|
||||
|
||||
- I changed the "SSL fix" to a more lame one, but that doesn't remove as
|
||||
much functionality. Now I've enabled the lib to select what SSL version it
|
||||
should try first. Appearantly some older SSL-servers don't like when you
|
||||
talk v3 with them so you need to be able to force curl to talk v2 from the
|
||||
start. The fix dated April 6 and posted on the mailing list forced curl to
|
||||
use v2 at all times using a modern OpenSSL version, but we don't really
|
||||
want such a crippled solution.
|
||||
|
||||
- Marc Boucher sent me a patch that corrected a math error for the
|
||||
"Curr.Speed" progress meter.
|
||||
|
||||
- Eric Thelin sent me a patch that enables '-K -' to read a config file from
|
||||
stdin.
|
||||
|
||||
- I found out we didn't close the file properly before so I added it!
|
||||
|
||||
Daniel (Apr 9 1999)
|
||||
- Yu Xin pointed out a problem with ftp download resume. It didn't work at
|
||||
all! ;-O
|
||||
|
||||
Daniel (Apr 6 1999)
|
||||
- Corrected the version string part generated for the SSL version.
|
||||
|
||||
- I found a way to make some other SSL page work with openssl 0.9.1+ that
|
||||
previously didn't (ssleay 0.8.0 works with it though!). Trying to get
|
||||
some real info from the OpenSSL guys to see how I should do to behave the
|
||||
best way. SSLeay 0.8.0 shouldn't be that much in use anyway these days!
|
||||
|
||||
Version 5.6.2beta
|
||||
|
||||
Daniel (Apr 4 1999)
|
||||
- Finally have curl more cookie "aware". Now read carefully. This is how
|
||||
it works.
|
||||
To make curl read cookies from an already existing file, in plain header-
|
||||
format (like from the headers of a previous fetch) invoke curl with the
|
||||
-b flag like:
|
||||
|
||||
curl -b file http://site/foo.html
|
||||
|
||||
Curl will then use all cookies it finds matching. The old style that sets
|
||||
a single cookie with -b is still supported and is used if the string
|
||||
following -b includes a '=' letter, as in "-b name=daniel".
|
||||
|
||||
To make curl read the cookies sent in combination with a location: (which
|
||||
sites often do) point curl to read a non-existing file at first (i.e
|
||||
to start with no existing cookies), like:
|
||||
|
||||
curl -b nowhere http://site/setcookieandrelocate.html
|
||||
|
||||
- Added a paragraph in the TODO file about the SSL problems recently
|
||||
reported. Evidently, some kind of SSL-problem curl may need to address.
|
||||
|
||||
- Better "Location:" following.
|
||||
|
||||
Douglas E. Wegscheid (Tue, 30 Mar 1999)
|
||||
- A subsecond display patch.
|
||||
|
||||
Daniel (Mar 14 1999)
|
||||
- I've separated the version number of libcurl and curl now. To make
|
||||
things a little easier, I decided to start the curl numbering from
|
||||
5.6 and the former version number known as "curl" is now the one
|
||||
set for libcurl.
|
||||
|
||||
- Removed the 'enable-no-pass' from configure, I doubt anyone wanted
|
||||
that.
|
||||
|
||||
- Made lots of tiny adjustments to compile smoothly with cygwin under
|
||||
win32. It's a killer for porting this to win32, bye bye VC++! ;-)
|
||||
Compiles and builds out-of-the-box now. See the new wordings in
|
||||
INSTALL for details.
|
||||
|
||||
- Beginning experiments with downloading multiple document from a http
|
||||
server while remaining connected.
|
||||
|
||||
Version 5.6beta
|
||||
|
||||
Daniel (Mar 13 1999)
|
||||
- Since I've changed so much, I thought I'd just go ahead and implement the
|
||||
suggestion from Douglas E. Wegscheid. -D or --dump-header is now storing
|
||||
HTTP headers separately in the specified file.
|
||||
|
||||
- Added new text to INSTALL on what to do to build this on win32 now.
|
||||
|
||||
- Aaargh. I had to take a step back and prefix the shared #include files
|
||||
in the sources with "../include/" to please VC++...
|
||||
|
||||
Daniel (Mar 12 1999)
|
||||
- Split the url.c source into many tiny sources for better readability
|
||||
and smaller size.
|
||||
|
||||
Daniel (Mar 11 1999)
|
||||
- Started to change stuff for a move to make libcurl and a more separate
|
||||
curl application that uses the libcurl. Made the libcurl sources into
|
||||
the new lib directory while the curl application will remain in src as
|
||||
before. New makefiles, adjusted configure script and so.
|
||||
|
||||
libcurl.a built quickly and easily. I better make a better interface to
|
||||
the lib functions though.
|
||||
|
||||
The new root dir include/ is supposed to contain the public information
|
||||
about the new libcurl. It is a little ugly so far :-)
|
||||
|
||||
|
||||
Daniel (Mar 1 1999)
|
||||
- Todd Kaufmann sent me a good link to Netscape's cookie spec as well as the
|
||||
info that RFC 2109 specifies how to use them. The link is now in the
|
||||
README and the RFC in the RESOURCES.
|
||||
|
||||
Daniel (Feb 23 1999)
|
||||
- Finally made configure accept --with-ssl to look for SSL libs and includes
|
||||
in the "standard" place /usr/local/ssl...
|
||||
|
||||
Daniel (Feb 22 1999)
|
||||
- Verified that curl linked fine with OpenSSL 0.9.1c which seems to be
|
||||
the most recent.
|
||||
|
||||
Henri Gomez (Fri Feb 5 1999)
|
||||
- Sent in an updated curl-ssl.spec. I still miss the script that builds an
|
||||
RPM automatically...
|
||||
|
||||
Version 5.5.1
|
||||
|
||||
Mark Butler (27 Jan 1999)
|
||||
- Corrected problems in Download().
|
||||
|
||||
Danitel Stenberg (25 Jan 1999)
|
||||
- Jeremie Petit pointed out a few flaws in the source that prevented it from
|
||||
compile warning free with the native compiler under Digital Unix v4.0d.
|
||||
|
||||
Version 5.5
|
||||
|
||||
Daniel Stenberg (15 Jan 1999)
|
||||
- Added Bjorns small text to the README about the DICT protocol.
|
||||
|
||||
Daniel Stenberg (11 Jan 1999)
|
||||
- <jswink at softcom.net> reported about the win32-versioin: "Doesn't use
|
||||
ALL_PROXY environment variable". Turned out to be because of the static-
|
||||
buffer nature of the win32 environment variable calls!
|
||||
|
||||
Bjorn Reese (10 Jan 1999)
|
||||
- I have attached a simple addition for the DICT protocol (RFC 2229).
|
||||
It performs dictionary lookups. The output still needs to be better
|
||||
formatted.
|
||||
|
||||
To test it try (the exact format, and more examples are described in
|
||||
the RFC)
|
||||
|
||||
dict://dict.org/m:hello
|
||||
dict://dict.org/m:hello::soundex
|
||||
|
||||
|
||||
Vicente Garcia (10 Jan 1999)
|
||||
- Corrected the progress meter for files larger than 20MB.
|
||||
|
||||
Daniel Stenberg (7 Jan 1999)
|
||||
- Corrected the -t and -T help texts. They claimed to be FTP only.
|
||||
|
||||
Version 5.4
|
||||
|
||||
Daniel Stenberg
|
||||
(7 Jan 1999)
|
||||
- Irving Wolfe reported that curl -s didn't always supress the progress
|
||||
reporting. It was the form post that autoamtically always switched it on
|
||||
again. This is now corrected!
|
||||
|
||||
(4 Jan 1999)
|
||||
- Andreas Kostyrka suggested I'd add PUT and he helped me out to test it. If
|
||||
you use -t or -T now on a http or https server, PUT will be used for file
|
||||
upload.
|
||||
|
||||
I removed the former use of -T with HTTP. I doubt anyone ever really used
|
||||
that.
|
||||
|
||||
(4 Jan 1999)
|
||||
- Erik Jacobsen found a width bug in the mprintf() function. I corrected it
|
||||
now.
|
||||
|
||||
(4 Jan 1999)
|
||||
- As John V. Chow pointed out to me, curl accepted very limited URL sizes. It
|
||||
should now accept path parts that are up to at least 4096 bytes.
|
||||
|
||||
- Somehow I screwed up when applying the AIX fix from Gilbert Ramirez, so
|
||||
I redid that now.
|
||||
|
||||
Version 5.3a (win32 only)
|
||||
|
||||
Troy Engel
|
||||
|
835
CHANGES.1999
Normal file
835
CHANGES.1999
Normal file
@@ -0,0 +1,835 @@
|
||||
Daniel (28 December 1999):
|
||||
- Tim Verhoeven correctly identified that curl
|
||||
doesn't support URL formatted file names when getting ftp. Now, there's a
|
||||
problem with getting very weird file names off FTP servers. RFC 959 defines
|
||||
that the file name syntax to use should be the same as in the native OS of
|
||||
the server. Since we don't know the peer server system we currently just
|
||||
translate the URL syntax into plain letters. It is still better and with
|
||||
the solaris 2.6-supplied ftp server it works with spaces in the file names.
|
||||
|
||||
Daniel (27 December 1999):
|
||||
- When curl parsed cookies straight off a remote site, it corrupted the input
|
||||
data, which, if the downloaded headers were stored made very odd characters
|
||||
in the saved data. Correctly identified and reported by Paul Harrington.
|
||||
|
||||
Daniel (13 December 1999):
|
||||
- General cleanups in the library interface. There had been some bad kludges
|
||||
added during times of stress and I did my best to clean them off. It was
|
||||
both regarding the lib API as well as include file confusions.
|
||||
|
||||
Daniel (3 December 1999):
|
||||
- A small --stderr bug was reported by Eetu Ojanen...
|
||||
|
||||
- who also brought the suggestion of extending the -X flag to ftp list as
|
||||
well. So, now it is and the long option is now --request instead. It is
|
||||
only for ftp list for now (and the former http stuff too of course).
|
||||
|
||||
Lars J. Aas (24 November 1999):
|
||||
- Patched curl to compile and build under BeOS. Doesn't work yet though!
|
||||
|
||||
- Corrected the Makefile.am files to allow putting object files in
|
||||
different directories than the sources.
|
||||
|
||||
Version 6.3.1
|
||||
|
||||
Daniel (23 November 1999):
|
||||
- I've had this major disk crash. My good old trust-worthy source disk died
|
||||
along with the machine that hosted it. Thank goodness most of all the
|
||||
things I've done are either backed up elsewhere or stored in this CVS
|
||||
server!
|
||||
|
||||
- Michael S. Steuer pointed out a bug in the -F handling
|
||||
that made curl hang if you posted an empty variable such as '-F name='. It
|
||||
was one of those old bugs that never have worked properly...
|
||||
|
||||
- Jason Baietto pointed out a general flaw in the HTTP
|
||||
download. Curl didn't complain if it was prematurely aborted before the
|
||||
entire download was completed. It does now.
|
||||
|
||||
Daniel (19 November 1999):
|
||||
- Chris Maltby very accurately criticized the lack of
|
||||
return code checks on the fwrite() calls. I did a thorough check for all
|
||||
occurrences and corrected this.
|
||||
|
||||
Daniel (17 November 1999):
|
||||
- Paul Harrington pointed out that the -m/--max-time option
|
||||
doesn't work for the slow system calls like gethostbyname()... I don't have
|
||||
any good fix yet, just a slightly less bad one that makes curl exit hard
|
||||
when the timeout is reached.
|
||||
|
||||
- Bjorn Reese helped me point out a possible problem that might be the reason
|
||||
why Thomas Hurst experience problems in his Amiga version.
|
||||
|
||||
Daniel (12 November 1999):
|
||||
- I found a crash in the new cookie file parser. It crashed when you gave
|
||||
a plain http header file as input...
|
||||
|
||||
Version 6.3
|
||||
|
||||
Daniel (10 November 1999):
|
||||
- I kind of found out that the HTTP time-conditional GETs (-z) aren't always
|
||||
respected by the web server and the document is therefore sent in whole
|
||||
again, even though it doesn't match the requested condition. After reading
|
||||
section 13.3.4 of RFC 2616, I think I'm doing the right thing now when I do
|
||||
my own check as well. If curl thinks the condition isn't met, the transfer
|
||||
is aborted prematurely (after all the headers have been received).
|
||||
|
||||
- After comments from Robert Linden I also rewrote some parts of the man page
|
||||
to better describe how the -F works.
|
||||
|
||||
- Michael Anti put up a new curl download mirror in
|
||||
China: http://www.pshowing.com/curl/
|
||||
|
||||
- I added the list of download mirrors to the README file
|
||||
|
||||
- I did add more explanations to the man page
|
||||
|
||||
Daniel (8 November 1999):
|
||||
- I made the -b/--cookie option capable of reading netscape formatted cookie
|
||||
files as well as normal http-header files. It should be able to
|
||||
transparently figure out what kind of file it got as input.
|
||||
|
||||
Daniel (29 October 1999):
|
||||
- Another one of Sebastiaan van Erk's ideas (that has been requested before
|
||||
but I seem to have forgotten who it was), is to add support for ranges in
|
||||
FTP downloads. As usual, one request is just a request, when they're two
|
||||
it is a demand. I've added simple support for X-Y style fetches. X has to
|
||||
be the lower number, though you may omit one of the numbers. Use the -r/
|
||||
--range switch (previously HTTP-only).
|
||||
|
||||
- Sebastiaan van Erk suggested that curl should be
|
||||
able to show the file size of a specified file. I think this is a splendid
|
||||
idea and the -I flag is now working for FTP. It displays the file size in
|
||||
this manner:
|
||||
Content-Length: XXXX
|
||||
As it resembles normal headers, and leaves us the opportunity to add more
|
||||
info in that display if we can come up with more in the future! It also
|
||||
makes sense since if you access ftp through a HTTP proxy, you'd get the
|
||||
file size the same way.
|
||||
|
||||
I changed the order of the QUOTE command executions. They're now executed
|
||||
just after the login and before any other command. I made this to enable
|
||||
quote commands to run before the -I stuff is done too.
|
||||
|
||||
- I found out that -D/--dump-header and -V/--version weren't documented in
|
||||
the man page.
|
||||
|
||||
- Many HTTP/1.1 servers do not support ranges. Don't ask me why. I did add
|
||||
some text about this in the man page for the range option. The thread in
|
||||
the mailing list that started this was initiated by Michael Anti.
|
||||
|
||||
- I get reports about nroff crashes on solaris 2.6+ when displaying the curl
|
||||
man page. Switch to gnroff instead, it is reported to work(!). Adam Barclay
|
||||
reported and brought the suggestion.
|
||||
|
||||
- In a dialogue with Johannes G. Kristinsson we came
|
||||
up with the idea to let -H/--header specified headers replace the
|
||||
internally generated headers, if you happened to select to add a header
|
||||
that curl normally uses by itself. The advantage with this is not entirely
|
||||
obvious, but in Johannes' case it means that he can use another Host: than
|
||||
the one curl would set.
|
||||
|
||||
Daniel (27 October 1999):
|
||||
- Jongki Suwandi brought a nice patch for (yet another) crash when following
|
||||
a location:. This time you had to follow a https:// server's redirect to
|
||||
get the core.
|
||||
|
||||
Version 6.2
|
||||
|
||||
Daniel (21 October 1999):
|
||||
- I think I managed to remove the suspicious (nil) that has been seen just
|
||||
before the "Host:" in HTTP requests when -v was used.
|
||||
- I found out that if you followed a location: when using a proxy, without
|
||||
having specified http:// in the URL, the protocol part was added once again
|
||||
when moving to the next URL! (The protocol part has to be added to the
|
||||
URL when going through a proxy since it has no protocol-guessing system
|
||||
such as curl has.)
|
||||
- Benjamin Ritcey reported a core dump under solaris 2.6
|
||||
with OpenSSL 0.9.4. It turned out this was due to a bad free() in main.c
|
||||
that occurred after the download was done and completed.
|
||||
- Benjamin found ftp downloads to show the first line of the download meter
|
||||
to get written twice, and I removed that problem. It was introduced with
|
||||
the multiple URL support.
|
||||
- Dan Zitter correctly pointed out that curl 6.1 and earlier versions didn't
|
||||
honor RFC 2616 chapter 4 section 2, "Message Headers": "...Field names are
|
||||
case-insensitive..." HTTP header parsing assumed a certain casing. Dan
|
||||
also provided me with a patch that corrected this, which I took the liberty
|
||||
of editing slightly.
|
||||
- Dan Zitter also provided a nice patch for config.guess to better recognize
|
||||
the Mac OS X
|
||||
- Dan also corrected a minor problem in the lib/Makefile that caused linking
|
||||
to fail on OS X.
|
||||
|
||||
Daniel (19 October 1999):
|
||||
- Len Marinaccio came up with some problems with curl. Since Windows has a
|
||||
crippled shell, it can't redirect stderr and that causes trouble. I added
|
||||
--stderr today which allows the user to redirect the stderr stream to a
|
||||
file or stdout.
|
||||
|
||||
Daniel (18 October 1999):
|
||||
- The configure script now understands the '--without-ssl' flag, which now
|
||||
totally disable SSL/https support. Previously it wasn't possible to force
|
||||
the configure script to leave SSL alone. The previous functionality has
|
||||
been retained. Troy Engel helped test this new one.
|
||||
|
||||
Version 6.1
|
||||
|
||||
Daniel (17 October 1999):
|
||||
- I ifdef'ed or commented all the zlib stuff in the sources and configure
|
||||
script. It turned out we needed to mock more with zlib than I initially
|
||||
thought, to make it capable of downloading compressed HTTP documents and
|
||||
uncompress them on the fly. I didn't mean the zlib parts of curl to become
|
||||
more than minor so this means I halt the zlib expedition for now and wait
|
||||
until someone either writes the code or zlib gets updated and better
|
||||
adjusted for this kind of usage. I won't get into details here, but a
|
||||
short a summary is suitable:
|
||||
- zlib can't automatically detect whether to use zlib or gzip
|
||||
decompression methods.
|
||||
- zlib is very neat for reading gzipped files from a file descriptor,
|
||||
although not as nice for reading buffer-based data such as we would
|
||||
want it.
|
||||
- there are still some problems with the win32 version when reading from
|
||||
a file descriptor if that is a socket
|
||||
|
||||
Daniel (14 October 1999):
|
||||
- Moved the (external) include files for libcurl into a subdirectory named
|
||||
curl and adjusted all #include lines to use <curl/XXXX> to maintain a
|
||||
better name space and control of the headers. This has been requested.
|
||||
|
||||
Daniel (12 October 1999):
|
||||
- I modified the 'maketgz' script to perform a 'make' too before a release
|
||||
archive is put together in an attempt to make the time stamps better and
|
||||
hopefully avoid the double configure-running that use to occur.
|
||||
|
||||
Daniel (11 October 1999):
|
||||
- Applied J<>rn's patches that fixes zlib for mingw32 compiles as well as
|
||||
some other missing zlib #ifdef and more text on the multiple URL docs in
|
||||
the man page.
|
||||
|
||||
Version 6.1beta
|
||||
|
||||
Daniel (6 October 1999):
|
||||
- Douglas E. Wegscheid sent me a patch that made the exact same thing as I
|
||||
just made: the -d switch is now capable of reading post data from a named
|
||||
file or stdin. Use it similarly to the -F. To read the post data from a
|
||||
given file:
|
||||
|
||||
curl -d @path/to/filename www.postsite.com
|
||||
|
||||
or let curl read it out from stdin:
|
||||
|
||||
curl -d @- www.postit.com
|
||||
|
||||
J<>rn Hartroth (3 October 1999):
|
||||
- Brought some more patches for multiple URL functionality. The MIME
|
||||
separation ideas are almost scrapped now, and a custom separator is being
|
||||
used instead. This is still compile-time "flagged".
|
||||
|
||||
Daniel
|
||||
- Updated curl.1 with multiple URL info.
|
||||
|
||||
Daniel (30 September 1999):
|
||||
- Felix von Leitner brought openssl-check fixes for configure.in to work
|
||||
out-of-the-box when the openssl files are installed in the system default
|
||||
dirs.
|
||||
|
||||
Daniel (28 September 1999)
|
||||
- Added libz functionality. This should enable decompressing gzip, compress
|
||||
or deflate encoding HTTP documents. It also makes curl send an accept that
|
||||
it accepts that kind of encoding. Compressed contents usually shortens
|
||||
download time. I *need* someone to tell me a site that uses compressed HTTP
|
||||
documents so that I can test this out properly.
|
||||
|
||||
- As a result of the adding of zlib awareness, I changed the version string
|
||||
a little. I plan to add openldap version reporting in there too.
|
||||
|
||||
Daniel (17 September 1999)
|
||||
- Made the -F option allow stdin when specifying files. By using '-' instead
|
||||
of file name, the data will be read from stdin.
|
||||
|
||||
Version 6.0
|
||||
|
||||
Daniel (13 September 1999)
|
||||
- Added -X/--http-request <request> to enable any HTTP command to be sent.
|
||||
Do not that your server has to support the exact string you enter. This
|
||||
should possibly a string like DELETE or TRACE.
|
||||
|
||||
- Applied Douglas' mingw32-fixes for the makefiles.
|
||||
|
||||
Daniel (10 September 1999)
|
||||
- Douglas E. Wegscheid pointed out a problem. Curl didn't check the FTP
|
||||
servers return code properly after the --quote commands were issued. It
|
||||
took anything non 200 as an error, when all 2XX codes should be accepted as
|
||||
OK.
|
||||
|
||||
- Sending cookies to the same site in multiple lines like curl used to do
|
||||
turned out to be bad and breaking the cookie specs. Curl now sends all
|
||||
cookies on a single Cookie: line. Curl is not yet RFC 2109 compliant, but I
|
||||
doubt that many servers do use that syntax (yet).
|
||||
|
||||
Daniel (8 September 1999)
|
||||
- J<>rn helped me make sure it still compiles nicely with mingw32 under win32.
|
||||
|
||||
Daniel (7 September 1999)
|
||||
- FTP upload through proxy is now turned into a HTTP PUT. Requested by
|
||||
Stefan Kanthak.
|
||||
|
||||
- Added the ldap files to the .m32 makefile.
|
||||
|
||||
Daniel (3 September 1999)
|
||||
- Made cookie matching work while using HTTP proxy.
|
||||
|
||||
Bjorn Reese (31 August 1999)
|
||||
- Passed his ldap:// patch. Note that this requires the openldap shared
|
||||
library to be installed and that LD_LIBRARY_PATH points to the
|
||||
directory where the lib will be found when curl is run with a
|
||||
ldap:// URL.
|
||||
|
||||
J<>rn Hartroth (31 August 1999)
|
||||
- Made the Mingw32 makefiles into single files.
|
||||
- Made file:// work for Win32. The same code is now used for unix as well for
|
||||
performance reasons.
|
||||
|
||||
Douglas E. Wegscheid (30 August 1999)
|
||||
- Patched the Mingw32 makefiles for SSL builds.
|
||||
|
||||
Matthew Clarke (30 August 1999)
|
||||
- Made a cool patch for configure.in to allow --with-ssl to specify the
|
||||
root dir of the openssl installation, as in
|
||||
|
||||
./configure --with-ssl=/usr/ssl_here
|
||||
|
||||
- Corrected the 'reconf' script to work better with some shells.
|
||||
|
||||
J<>rn Hartroth (26 August 1999)
|
||||
- Fixed the Mingw32 makefiles in lib/ and corrected the file.c for win32
|
||||
compiles.
|
||||
|
||||
Version 5.11
|
||||
|
||||
Daniel (25 August 1999)
|
||||
- John Weismiller pointed out a bug in the header-line
|
||||
realloc() system in download.c.
|
||||
|
||||
- I added lib/file.[ch] to offer a first, simple, file:// support. It
|
||||
probably won't do much good on win32 system at this point, but I see it
|
||||
as a start.
|
||||
|
||||
- Made the release archives get a Makefile in the root dir, which can be
|
||||
used to start the compiling/building process easier. I haven't really
|
||||
changed any INSTALL text yet, I wanted to get some feed-back on this
|
||||
first.
|
||||
|
||||
Daniel (17 August 1999)
|
||||
- Another Location: bug. Curl didn't do proper relative locations if the
|
||||
original URL had cgi-parameters that contained a slash. Nusu's page
|
||||
again.
|
||||
|
||||
- Corrected the NO_PROXY usage. It is a list of substrings that if one of
|
||||
them matches the tail of the host name it should connect to, curl should
|
||||
not use a proxy to connect there. Pointed out to me by Douglas
|
||||
E. Wegscheid. I also changed the README text a little regarding this.
|
||||
|
||||
Daniel (16 August 1999)
|
||||
- Fixed a memory bug with http-servers that sent Location: to a Location:
|
||||
page. Nusu's page showed this too.
|
||||
|
||||
- Made cookies work a lot better. Setting the same cookie name several times
|
||||
used to add more cookies instead of replacing the former one which it
|
||||
should've. Nusu <nus at intergorj.ro> brought me an URL that made this
|
||||
painfully visible...
|
||||
|
||||
Troy (15 August 1999)
|
||||
- Brought new .spec files as well as a patch for configure.in that lets the
|
||||
configure script find the openssl files better, even when the include
|
||||
files are in /usr/include/openssl
|
||||
|
||||
Version 5.10
|
||||
|
||||
Daniel (13 August 1999)
|
||||
- SSL_CTX_set_default_passwd_cb() has been modified in the 0.9.4 version of
|
||||
OpenSSL. Now why couldn't they simply add a *new* function instead of
|
||||
modifying the parameters of an already existing function? This way, we get
|
||||
a compiler warning if compiling with 0.9.4 but not with earlier. So, I had
|
||||
to come up with a #if construction that deals with this...
|
||||
|
||||
- Made curl output the SSL version number get displayed properly with 0.9.4.
|
||||
|
||||
Troy (12 August 1999)
|
||||
- Added MingW32 (GCC-2.95) support under Win32. The INSTALL file was also
|
||||
a bit rearranged.
|
||||
|
||||
Daniel (12 August 1999)
|
||||
- I had to copy a good <arpa/telnet.h> include file into the curl source
|
||||
tree to enable the silly win32 systems to compile. The distribution rights
|
||||
allows us to do that as long as the file remains unmodified.
|
||||
|
||||
- I corrected a few minor things that made the compiler complain when
|
||||
-Wall -pedantic was used.
|
||||
|
||||
- I'm moving the official curl web page to http://curl.haxx.nu. I think it
|
||||
will make it easier to remember as it is a lot shorter and less cryptic.
|
||||
The old one still works and shows the same info.
|
||||
|
||||
Daniel (11 August 1999)
|
||||
- Albert Chin-A-Young mailed me another correction for NROFF in the
|
||||
configure.in that is supposed to be better for IRIX users.
|
||||
|
||||
Daniel (10 August 1999)
|
||||
- Albert Chin-A-Young helped me with some stupid Makefile things, as well as
|
||||
some fiddling with the getdate.c stuff that he had problems with under
|
||||
HP-UX v10. getdate.y will now be compiled into getdate.c if the appropriate
|
||||
yacc or bison is found by the configure script. Since this is slightly new,
|
||||
we need to test the output getdate.c with win32 systems to make sure it
|
||||
still compiles there.
|
||||
|
||||
Daniel (5 August 1999)
|
||||
- I've just setup a new mailing list with the intention to keep discussions
|
||||
around libcurl development in it. I mainly expect it to be for thoughts and
|
||||
brainstorming around a "next generation" library, rather than nitpicking
|
||||
about the current implementation or details in the current libcurl.
|
||||
|
||||
To join our happy bunch of future-looking geeks, enter 'subscribe
|
||||
<address>' in the body of a mail and send it to
|
||||
libcurl-request@listserv.fts.frontec.se. Curl bug reports, the usual curl
|
||||
talk and everything else should still be kept in this mailing list. I've
|
||||
started to archive this mailing list and have put the libcurl web page at
|
||||
www.fts.frontec.se/~dast/libcurl/.
|
||||
|
||||
- Stefan Kanthak contacted me regarding a few problems in the configure
|
||||
script which he discovered when trying to make curl compile and build under
|
||||
Siemens SINIX-Z V5.42B2004!
|
||||
|
||||
- Marcus Klein very accurately informed me that src/version.h was not present
|
||||
in the CVS repository. Oh, how silly...
|
||||
|
||||
- Linus Nielsen rewrote the telnet:// part and now curl offers limited telnet
|
||||
support. If you run curl like 'curl telnet://host' you'll get all output on
|
||||
the screen and curl will read input from stdin. You'll be able to login and
|
||||
run commands etc, but since the output is buffered, expect to get a little
|
||||
weird output.
|
||||
|
||||
This is still in its infancy and it might get changed. We need your
|
||||
feed-back and input in how this is best done.
|
||||
|
||||
WIN32 NOTE: I bet we'll get problems when trying to compile the current
|
||||
lib/telnet.c on win32, but I think we can sort them out in time.
|
||||
|
||||
- David Sanderson reported that FORCE_ALLOCA_H or HAVE_ALLOCA_H must be
|
||||
defined for getdate.c to compile properly on HP-UX 11.0. I updated the
|
||||
configure script to check for alloca.h which should make it.
|
||||
|
||||
Daniel (4 August 1999)
|
||||
- I finally got to understand Marcus Klein's ftp download resume problem,
|
||||
which turns out to be due to different outputs from different ftp
|
||||
servers. It makes ftp download resuming a little trickier, but I've made
|
||||
some modifications I really believe will work for most ftp servers and I do
|
||||
hope you report if you have problems with this!
|
||||
|
||||
- Added text about file transfer resuming to README.curl.
|
||||
|
||||
Daniel (2 August 1999)
|
||||
- Applied a progress-bar patch from Lars J. Aas. It offers
|
||||
a new styled progress bar enabled with -#/--progress-bar.
|
||||
|
||||
T. Yamada <tai at imasy.or.jp> (30 July 1999)
|
||||
- It breaks with segfault when 1) curl is using .netrc to obtain
|
||||
username/password (option '-n'), and 2) is automatically redirected to
|
||||
another location (option '-L').
|
||||
|
||||
There is a small bug in lib/url.c (block starting from line 641), which
|
||||
tries to take out username/password from user- supplied command-line
|
||||
argument ('-u' option). This block is never executed on first attempt since
|
||||
CONF_USERPWD bit isn't set at first, but curl later turns it on when it
|
||||
checks for CONF_NETRC bit. So when curl tries to redo everything due to
|
||||
redirection, it segfaults trying to access *data->userpwd.
|
||||
|
||||
Version 5.9.1
|
||||
|
||||
Daniel (30 July 1999)
|
||||
- Steve Walch pointed out that there is a memory leak in the formdata
|
||||
functions. I added a FormFree() function that is now used and supposed to
|
||||
correct this flaw.
|
||||
|
||||
- Mark Wotton reported:
|
||||
'curl -L https://www.cwa.com.au/' core dumps. I managed to cure this by
|
||||
correcting the cleanup procedure. The bug seems to be gone with my OpenSSL
|
||||
0.9.2b, although still occurs when I run the ~100 years old SSLeay 0.8.0. I
|
||||
don't know whether it is curl or SSLeay that is to blame for that.
|
||||
|
||||
- Marcus Klein:
|
||||
Reported an FTP upload resume bug that I really can't repeat nor understand.
|
||||
I leave it here so that it won't be forgotten.
|
||||
|
||||
Daniel (29 July 1999)
|
||||
- Costya Shulyupin suggested support for longer URLs when following Location:
|
||||
and I could only agree and fix it!
|
||||
|
||||
- Leigh Purdie found a problem in the upload/POST department. It turned out
|
||||
that http.c accidentaly cleared the pointer instead of the byte counter
|
||||
when supposed to.
|
||||
|
||||
- Costya Shulyupin pointed out a problem with port numbers and Location:. If
|
||||
you had a server at a non-standard port that redirected to an URL using a
|
||||
standard port number, curl still used that first port number.
|
||||
|
||||
- Ralph Beckmann pointed out a problem when using both CONF_FOLLOWLOCATION
|
||||
and CONF_FAILONERROR simultaneously. Since the CONF_FAILONERROR exits on
|
||||
the 302-code that the follow location header outputs it will never show any
|
||||
html on location: pages. I have now made it look for >=400 codes if
|
||||
CONF_FOLLOWLOCATION is set.
|
||||
|
||||
- 'struct slist' is now renamed to 'struct curl_slist' (as suggested by Ralph
|
||||
Beckmann).
|
||||
|
||||
- Joshua Swink and Rick Welykochy were the first to point out to me that the
|
||||
latest OpenSSL package now have moved the standard include path. It is now
|
||||
in /usr/local/ssl/include/openssl and I have now modified the --enable-ssl
|
||||
option for the configure script to use that as the primary path, and I
|
||||
leave the former path too to work with older packages of OpenSSL too.
|
||||
|
||||
Daniel (9 June 1999)
|
||||
- I finally understood the IRIX problem and now it seem to compile on it!
|
||||
I am gonna remove those #define strcasecmp() things once and for all now.
|
||||
|
||||
Daniel (4 June 1999)
|
||||
- I adjusted the FTP reply 227 parser to make the PASV command work better
|
||||
with more ftp servers. Appearantly the Roxen Challanger server replied
|
||||
something curl 5.9 could deal with! :-( Reported by Ashley Reid-Montanaro
|
||||
and Mark Butler brought a solution for it.
|
||||
|
||||
Daniel (26 May 1999)
|
||||
- Rearranged. README is new, the old one is now README.curl and I added a
|
||||
README.libcurl with text I got from Ralph Beckmann.
|
||||
|
||||
- I also updated the INSTALL text.
|
||||
|
||||
Daniel (25 May 1999)
|
||||
- David Jonathan Lowsky correctly pointed out that curl didn't properly deal
|
||||
with form posting where the variable shouldn't have any content, as in curl
|
||||
-F "form=" www.site.com. It was now fixed.
|
||||
|
||||
Version 5.9
|
||||
|
||||
Daniel (22 May 1999)
|
||||
- I've got a bug report from Aaron Scarisbrick in which he states he has some
|
||||
problems with -L under FreeBSD 3.0. I have previously got another bug
|
||||
report from Stefan Grether which points at an error with similar sympthoms
|
||||
when using win32. I made the allocation of the new url string a bit faster
|
||||
and different, don't know if it actually improves anything though...
|
||||
|
||||
Daniel (20 May 1999)
|
||||
- Made the cookie parser deal with CRLF newlines too.
|
||||
|
||||
Daniel (19 May 1999)
|
||||
- Download() didn't properly deal with failing return codes from the sread()
|
||||
function. Adam Coyne found the problem in the win32 version, and Troy Engel
|
||||
helped me out isolating it.
|
||||
|
||||
Daniel (16 May 1999)
|
||||
- Richard Adams pointed out a bug I introduced in 5.8. --dump-header doesn't
|
||||
work anymore! :-/ I fixed it now.
|
||||
|
||||
- After a suggestion by Joshua Swink I added -S / --show-error to force curl
|
||||
to display the error message in case of an error, even if -s/--silent was
|
||||
used.
|
||||
|
||||
Daniel (10 May 1999)
|
||||
- I moved the stuff concerning HTTP, DICT and TELNET it their own source
|
||||
files now. It is a beginning on my clean-up of the sources to make them
|
||||
layer all those protocols better to enable more to be added easier in the
|
||||
future!
|
||||
|
||||
- Leon Breedt sent me some files I've not put into the main curl
|
||||
archive. They're for creating the Debian package thingie. He also sent me a
|
||||
debian package that I've made available for download at the web page
|
||||
|
||||
Daniel (9 May 1999)
|
||||
- Made it compile on cygwin too.
|
||||
|
||||
Troy Engel (7 May 1999)
|
||||
- Brought a series of patches to allow curl to compile smoothly on MSVC++ 6
|
||||
again!
|
||||
|
||||
Daniel (6 May 1999)
|
||||
- I changed the #ifdef HAVE_STRFTIME placement for the -z code so that it
|
||||
will be easier to discover systems that don't have that function and thus
|
||||
can't use -z successfully. Made the strftime() get used if WIN32 is defined
|
||||
too.
|
||||
|
||||
Version 5.8
|
||||
|
||||
Daniel (5 May 1999)
|
||||
- I've had it with this autoconf/automake mess. It seems to work allright
|
||||
for most people who don't have automake installed, but for those who have
|
||||
there are problems all over.
|
||||
|
||||
I've got like five different bug reports on this only the last
|
||||
week... Claudio Neves and Federico Bianchi and root <duggerj001 at
|
||||
hawaii.rr.com> are some of them reporting this.
|
||||
|
||||
Currently, I have no really good fix since I want to use automake myself to
|
||||
generate the Makefile.in files. I've found out that the @SHELL@-problems
|
||||
can often be fixed by manually invoking 'automake' in the archive root
|
||||
before you run ./configure... I've hacked my maketgz script now to fiddle
|
||||
a bit with this and my tests seem to work better than before at least!
|
||||
|
||||
Daniel (4 May 1999)
|
||||
- mkhelp.pl has been doing badly lately. I corrected a case problem in
|
||||
the regexes.
|
||||
|
||||
- I've now remade the -o option to not touch the file unless it needs to.
|
||||
I had to do this to make -z option really fine, since now you can make a
|
||||
curl fetch and use a local copy's time when downloading to that file, as
|
||||
in:
|
||||
|
||||
curl -z dump -o dump remote.site.com/file.html
|
||||
|
||||
This will only get the file if the remote one is newer than the local.
|
||||
I'm aware that this alters previous behaviour a little. Some scripts out
|
||||
there may depend on that the file is always touched...
|
||||
|
||||
- Corrected a bug in the SSLv2/v3 selection.
|
||||
|
||||
- Felix von Leitner requested that curl should be able to send
|
||||
"If-Modified-Since" headers, which indeed is a fair idea. I implemented it
|
||||
right away! Try -z <expression> where expression is a full GNU date
|
||||
expression or a file name to get the date from!
|
||||
|
||||
Stephan Lagerholm (30 Apr 1999)
|
||||
- Pointed out a problem with the src/Makefile for FreeBSD. The RM variable
|
||||
isn't set and causes the make to fail.
|
||||
|
||||
Daniel (26 April 1999)
|
||||
- Am I silly or what? Irving Wolfe pointed out to me that the curl version
|
||||
number was not set properly. Hasn't been since 5.6. This was due to a bug
|
||||
in my maketgz script!
|
||||
|
||||
David Eriksson (25 Apr 1999)
|
||||
- Found a bug in cookies.c that made it crash at times.
|
||||
|
||||
Version 5.7.1
|
||||
|
||||
Doug Kaufman (23 Apr 1999)
|
||||
- Brought two sunos 4 fixes. One of them being the hostip.c fix mentioned
|
||||
below and the other one a correction in include/stdcheaders.h
|
||||
|
||||
- Added a paragraph about compiling with the US-version of openssl to the
|
||||
INSTALL file.
|
||||
|
||||
Daniel
|
||||
- New mailing list address. Info updated on the web page as well as in the
|
||||
README file
|
||||
|
||||
Greg Onufer (20 Apr 1999)
|
||||
- hostip.c didn't compile properly on SunOS 5.5.1.
|
||||
It needs an #include <sys/types.h>
|
||||
|
||||
Version 5.7
|
||||
|
||||
Daniel (Apr 20 1999)
|
||||
- Decided to upload a non-beta version right now!
|
||||
|
||||
- Made curl support any-length HTTP headers. The destination buffer is now
|
||||
simply enlarged every time it turns out to be too small!
|
||||
|
||||
- Added the FAQ file to the archive. Still a bit smallish, but it is a
|
||||
start.
|
||||
|
||||
Eric Thelin (15 Apr 1999)
|
||||
- Made -D accept '-' instead of filename to write to stdout.
|
||||
|
||||
Version 5.6.3beta
|
||||
|
||||
Daniel (Apr 12 1999)
|
||||
|
||||
- Changed two #ifdef WIN32 to better #ifdef <errorcode> when connect()ing
|
||||
in url.c and ftp.c. Makes cygwin32 deal with them better too. We should
|
||||
try to get some decent win32-replacement there. Anyone?
|
||||
|
||||
- The old -3/--crlf option is now ONLY --crlf!
|
||||
|
||||
- I changed the "SSL fix" to a more lame one, but that doesn't remove as
|
||||
much functionality. Now I've enabled the lib to select what SSL version it
|
||||
should try first. Appearantly some older SSL-servers don't like when you
|
||||
talk v3 with them so you need to be able to force curl to talk v2 from the
|
||||
start. The fix dated April 6 and posted on the mailing list forced curl to
|
||||
use v2 at all times using a modern OpenSSL version, but we don't really
|
||||
want such a crippled solution.
|
||||
|
||||
- Marc Boucher sent me a patch that corrected a math error for the
|
||||
"Curr.Speed" progress meter.
|
||||
|
||||
- Eric Thelin sent me a patch that enables '-K -' to read a config file from
|
||||
stdin.
|
||||
|
||||
- I found out we didn't close the file properly before so I added it!
|
||||
|
||||
Daniel (Apr 9 1999)
|
||||
- Yu Xin pointed out a problem with ftp download resume. It didn't work at
|
||||
all! ;-O
|
||||
|
||||
Daniel (Apr 6 1999)
|
||||
- Corrected the version string part generated for the SSL version.
|
||||
|
||||
- I found a way to make some other SSL page work with openssl 0.9.1+ that
|
||||
previously didn't (ssleay 0.8.0 works with it though!). Trying to get
|
||||
some real info from the OpenSSL guys to see how I should do to behave the
|
||||
best way. SSLeay 0.8.0 shouldn't be that much in use anyway these days!
|
||||
|
||||
Version 5.6.2beta
|
||||
|
||||
Daniel (Apr 4 1999)
|
||||
- Finally have curl more cookie "aware". Now read carefully. This is how
|
||||
it works.
|
||||
To make curl read cookies from an already existing file, in plain header-
|
||||
format (like from the headers of a previous fetch) invoke curl with the
|
||||
-b flag like:
|
||||
|
||||
curl -b file http://site/foo.html
|
||||
|
||||
Curl will then use all cookies it finds matching. The old style that sets
|
||||
a single cookie with -b is still supported and is used if the string
|
||||
following -b includes a '=' letter, as in "-b name=daniel".
|
||||
|
||||
To make curl read the cookies sent in combination with a location: (which
|
||||
sites often do) point curl to read a non-existing file at first (i.e
|
||||
to start with no existing cookies), like:
|
||||
|
||||
curl -b nowhere http://site/setcookieandrelocate.html
|
||||
|
||||
- Added a paragraph in the TODO file about the SSL problems recently
|
||||
reported. Evidently, some kind of SSL-problem curl may need to address.
|
||||
|
||||
- Better "Location:" following.
|
||||
|
||||
Douglas E. Wegscheid (Tue, 30 Mar 1999)
|
||||
- A subsecond display patch.
|
||||
|
||||
Daniel (Mar 14 1999)
|
||||
- I've separated the version number of libcurl and curl now. To make
|
||||
things a little easier, I decided to start the curl numbering from
|
||||
5.6 and the former version number known as "curl" is now the one
|
||||
set for libcurl.
|
||||
|
||||
- Removed the 'enable-no-pass' from configure, I doubt anyone wanted
|
||||
that.
|
||||
|
||||
- Made lots of tiny adjustments to compile smoothly with cygwin under
|
||||
win32. It's a killer for porting this to win32, bye bye VC++! ;-)
|
||||
Compiles and builds out-of-the-box now. See the new wordings in
|
||||
INSTALL for details.
|
||||
|
||||
- Beginning experiments with downloading multiple document from a http
|
||||
server while remaining connected.
|
||||
|
||||
Version 5.6beta
|
||||
|
||||
Daniel (Mar 13 1999)
|
||||
- Since I've changed so much, I thought I'd just go ahead and implement the
|
||||
suggestion from Douglas E. Wegscheid. -D or --dump-header is now storing
|
||||
HTTP headers separately in the specified file.
|
||||
|
||||
- Added new text to INSTALL on what to do to build this on win32 now.
|
||||
|
||||
- Aaargh. I had to take a step back and prefix the shared #include files
|
||||
in the sources with "../include/" to please VC++...
|
||||
|
||||
Daniel (Mar 12 1999)
|
||||
- Split the url.c source into many tiny sources for better readability
|
||||
and smaller size.
|
||||
|
||||
Daniel (Mar 11 1999)
|
||||
- Started to change stuff for a move to make libcurl and a more separate
|
||||
curl application that uses the libcurl. Made the libcurl sources into
|
||||
the new lib directory while the curl application will remain in src as
|
||||
before. New makefiles, adjusted configure script and so.
|
||||
|
||||
libcurl.a built quickly and easily. I better make a better interface to
|
||||
the lib functions though.
|
||||
|
||||
The new root dir include/ is supposed to contain the public information
|
||||
about the new libcurl. It is a little ugly so far :-)
|
||||
|
||||
|
||||
Daniel (Mar 1 1999)
|
||||
- Todd Kaufmann sent me a good link to Netscape's cookie spec as well as the
|
||||
info that RFC 2109 specifies how to use them. The link is now in the
|
||||
README and the RFC in the RESOURCES.
|
||||
|
||||
Daniel (Feb 23 1999)
|
||||
- Finally made configure accept --with-ssl to look for SSL libs and includes
|
||||
in the "standard" place /usr/local/ssl...
|
||||
|
||||
Daniel (Feb 22 1999)
|
||||
- Verified that curl linked fine with OpenSSL 0.9.1c which seems to be
|
||||
the most recent.
|
||||
|
||||
Henri Gomez (Fri Feb 5 1999)
|
||||
- Sent in an updated curl-ssl.spec. I still miss the script that builds an
|
||||
RPM automatically...
|
||||
|
||||
Version 5.5.1
|
||||
|
||||
Mark Butler (27 Jan 1999)
|
||||
- Corrected problems in Download().
|
||||
|
||||
Danitel Stenberg (25 Jan 1999)
|
||||
- Jeremie Petit pointed out a few flaws in the source that prevented it from
|
||||
compile warning free with the native compiler under Digital Unix v4.0d.
|
||||
|
||||
Version 5.5
|
||||
|
||||
Daniel Stenberg (15 Jan 1999)
|
||||
- Added Bjorns small text to the README about the DICT protocol.
|
||||
|
||||
Daniel Stenberg (11 Jan 1999)
|
||||
- <jswink at softcom.net> reported about the win32-versioin: "Doesn't use
|
||||
ALL_PROXY environment variable". Turned out to be because of the static-
|
||||
buffer nature of the win32 environment variable calls!
|
||||
|
||||
Bjorn Reese (10 Jan 1999)
|
||||
- I have attached a simple addition for the DICT protocol (RFC 2229).
|
||||
It performs dictionary lookups. The output still needs to be better
|
||||
formatted.
|
||||
|
||||
To test it try (the exact format, and more examples are described in
|
||||
the RFC)
|
||||
|
||||
dict://dict.org/m:hello
|
||||
dict://dict.org/m:hello::soundex
|
||||
|
||||
|
||||
Vicente Garcia (10 Jan 1999)
|
||||
- Corrected the progress meter for files larger than 20MB.
|
||||
|
||||
Daniel Stenberg (7 Jan 1999)
|
||||
- Corrected the -t and -T help texts. They claimed to be FTP only.
|
||||
|
||||
Version 5.4
|
||||
|
||||
Daniel Stenberg
|
||||
(7 Jan 1999)
|
||||
- Irving Wolfe reported that curl -s didn't always supress the progress
|
||||
reporting. It was the form post that autoamtically always switched it on
|
||||
again. This is now corrected!
|
||||
|
||||
(4 Jan 1999)
|
||||
- Andreas Kostyrka suggested I'd add PUT and he helped me out to test it. If
|
||||
you use -t or -T now on a http or https server, PUT will be used for file
|
||||
upload.
|
||||
|
||||
I removed the former use of -T with HTTP. I doubt anyone ever really used
|
||||
that.
|
||||
|
||||
(4 Jan 1999)
|
||||
- Erik Jacobsen found a width bug in the mprintf() function. I corrected it
|
||||
now.
|
||||
|
||||
(4 Jan 1999)
|
||||
- As John V. Chow pointed out to me, curl accepted very limited URL sizes. It
|
||||
should now accept path parts that are up to at least 4096 bytes.
|
||||
|
||||
- Somehow I screwed up when applying the AIX fix from Gilbert Ramirez, so
|
||||
I redid that now.
|
||||
|
40
CVS-INFO
40
CVS-INFO
@@ -10,14 +10,10 @@ This file is only present in the CVS - never in release archives. It contains
|
||||
information about other files and things that the CVS repository keeps in its
|
||||
inner sanctum.
|
||||
|
||||
Use autoconf 2.50 and no earlier. Also, try having automake 1.5 and libtool
|
||||
1.4.1 at least.
|
||||
|
||||
You will need perl to generate the src/hugehelp.c file. The file
|
||||
src/hugehelp.c.cvs is a one-shot file that you can rename to src/hugehelp.c if
|
||||
you really can't generate the true file yourself!
|
||||
Compile and build instructions follow below.
|
||||
|
||||
CHANGES.0 contains ancient changes.
|
||||
CHANGES.$year contains changes for the particular year.
|
||||
|
||||
memanalyze.pl is for analyzing the output generated by curl if -DMALLOCDEBUG
|
||||
is used when compiling
|
||||
@@ -26,12 +22,38 @@ you really can't generate the true file yourself!
|
||||
|
||||
Makefile.dist is included as the root Makefile in distribution archives
|
||||
|
||||
perl/contrib/ is a subdirectory with various perl scripts
|
||||
|
||||
java/ is a subdirectory with the Java interface to libcurl
|
||||
perl/ is a subdirectory with various perl scripts
|
||||
|
||||
To build after having extracted everything from CVS, do this:
|
||||
|
||||
./buildconf
|
||||
./configure
|
||||
make
|
||||
|
||||
REQUIREMENTS
|
||||
|
||||
You need the following software installed:
|
||||
|
||||
o autoconf 2.50 (or later)
|
||||
o automake 1.5 (or later)
|
||||
o libtool 1.4 (or later)
|
||||
o GNU m4 (required by autoconf)
|
||||
|
||||
o nroff + perl (if you don't have nroff and perl and you for some reason
|
||||
don't want to install them, you can rename the source file
|
||||
src/hugehelp.c.cvs to src/hugehelp.c and avoid having to generate this
|
||||
file. This will of course give you an older version of the file that isn't
|
||||
up-to-date. That file was checked in once and won't be updated very
|
||||
regularly.)
|
||||
|
||||
MAC OS X
|
||||
|
||||
For Mac OS X users, Guido Neitzer write down the following step-by-step guide:
|
||||
|
||||
1. Install fink (http://fink.sourceforge.net)
|
||||
2. Update fink to the newest version (with the installed fink)
|
||||
3. Install the latest version of autoconf, automake and m4 with fink
|
||||
4. Install version 1.4.1 of libtool - you find it in the "unstable" section
|
||||
(read the manual to see how to get unstable versions)
|
||||
5. Get cURL from the cvs
|
||||
6. Build cURL with "./buildconf", "./configure", "make", "sudo make install"
|
||||
|
2
LEGAL
2
LEGAL
@@ -1,4 +1,4 @@
|
||||
Copyright (C) 2000, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
Copyright (C) 1998-2001, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
|
||||
Everyone is permitted to copy and distribute verbatim copies of this license
|
||||
document, but changing it is not allowed.
|
||||
|
@@ -6,9 +6,8 @@ AUTOMAKE_OPTIONS = foreign no-dependencies
|
||||
|
||||
EXTRA_DIST = \
|
||||
CHANGES LEGAL maketgz MITX.txt MPL-1.1.txt \
|
||||
config-win32.h reconf Makefile.dist \
|
||||
curl-config.in build_vms.com config-riscos.h \
|
||||
config-vms.h curl-mode.el
|
||||
reconf Makefile.dist curl-config.in build_vms.com curl-mode.el \
|
||||
config-vms.h config-win32.h config-riscos.h config-mac.h
|
||||
|
||||
bin_SCRIPTS = curl-config
|
||||
|
||||
|
@@ -5,7 +5,7 @@
|
||||
# | (__| |_| | _ <| |___
|
||||
# \___|\___/|_| \_\_____|
|
||||
#
|
||||
# Copyright (C) 2000, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
# Copyright (C) 2001, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
#
|
||||
# In order to be useful for every potential user, curl and libcurl are
|
||||
# dual-licensed under the MPL and the MIT/X-derivate licenses.
|
||||
@@ -43,13 +43,13 @@ mingw32-ssl:
|
||||
|
||||
vc:
|
||||
cd lib
|
||||
nmake -f Makefile.vc6
|
||||
nmake -f Makefile.vc6 cfg=release
|
||||
cd ..\src
|
||||
nmake -f Makefile.vc6
|
||||
|
||||
vc-ssl:
|
||||
cd lib
|
||||
nmake -f Makefile.vc6 release-ssl
|
||||
nmake -f Makefile.vc6 cfg=release-ssl
|
||||
cd ..\src
|
||||
nmake -f Makefile.vc6
|
||||
|
||||
|
2
README
2
README
@@ -26,7 +26,7 @@ README
|
||||
The official download mirror sites are:
|
||||
|
||||
Sweden -- ftp://ftp.sunet.se/pub/www/utilities/curl/
|
||||
Sweden -- ftp://cool.haxx.se/curl/
|
||||
Sweden -- http://cool.haxx.se/curl/
|
||||
Germany -- ftp://ftp.fu-berlin.de/pub/unix/network/curl/
|
||||
|
||||
To download the very latest source off the CVS server do this:
|
||||
|
@@ -62,3 +62,5 @@
|
||||
#undef HAVE_O_NONBLOCK
|
||||
#undef HAVE_DISABLED_NONBLOCKING
|
||||
|
||||
/* Define this to 'int' if in_addr_t is not an available typedefed type */
|
||||
#undef in_addr_t
|
||||
|
45
acinclude.m4
45
acinclude.m4
@@ -143,6 +143,43 @@ AC_DEFUN([TYPE_SOCKLEN_T],
|
||||
#include <sys/socket.h>])
|
||||
])
|
||||
|
||||
dnl Check for in_addr_t: it is used to receive the return code of inet_addr()
|
||||
dnl and a few other things. If not found, we set it to unsigned int, as even
|
||||
dnl 64-bit implementations use to set it to a 32-bit type.
|
||||
AC_DEFUN([TYPE_IN_ADDR_T],
|
||||
[
|
||||
AC_CHECK_TYPE([in_addr_t], ,[
|
||||
AC_MSG_CHECKING([for in_addr_t equivalent])
|
||||
AC_CACHE_VAL([curl_cv_in_addr_t_equiv],
|
||||
[
|
||||
# Systems have either "struct sockaddr *" or
|
||||
# "void *" as the second argument to getpeername
|
||||
curl_cv_in_addr_t_equiv=
|
||||
for t in int size_t unsigned long "unsigned long"; do
|
||||
AC_TRY_COMPILE([
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <arpa/inet.h>
|
||||
],[
|
||||
$t data = inet_addr ("1.2.3.4");
|
||||
],[
|
||||
curl_cv_in_addr_t_equiv="$t"
|
||||
break
|
||||
])
|
||||
done
|
||||
|
||||
if test "x$curl_cv_in_addr_t_equiv" = x; then
|
||||
AC_MSG_ERROR([Cannot find a type to use in place of in_addr_t])
|
||||
fi
|
||||
])
|
||||
AC_MSG_RESULT($curl_cv_in_addr_t_equiv)
|
||||
AC_DEFINE_UNQUOTED(in_addr_t, $curl_cv_in_addr_t_equiv,
|
||||
[type to use in place of in_addr_t if not defined])],
|
||||
[#include <sys/types.h>
|
||||
#include <sys/socket.h>,
|
||||
#include <arpa/inet.h>])
|
||||
])
|
||||
|
||||
dnl ************************************************************
|
||||
dnl check for "localhost", if it doesn't exist, we can't do the
|
||||
dnl gethostbyname_r tests!
|
||||
@@ -335,6 +372,8 @@ AC_DEFUN(CURL_CHECK_GETHOSTBYNAME_R,
|
||||
#include <string.h>
|
||||
#include <sys/types.h>
|
||||
#include <netdb.h>
|
||||
#undef NULL
|
||||
#define NULL (void *)0
|
||||
|
||||
int
|
||||
gethostbyname_r(const char *, struct hostent *, struct hostent_data *);],[
|
||||
@@ -350,6 +389,8 @@ gethostbyname_r(NULL, NULL, NULL);],[
|
||||
#include <string.h>
|
||||
#include <sys/types.h>
|
||||
#include <netdb.h>
|
||||
#undef NULL
|
||||
#define NULL (void *)0
|
||||
|
||||
int
|
||||
gethostbyname_r(const char *,struct hostent *, struct hostent_data *);],[
|
||||
@@ -363,6 +404,8 @@ gethostbyname_r(NULL, NULL, NULL);],[
|
||||
AC_TRY_COMPILE([
|
||||
#include <sys/types.h>
|
||||
#include <netdb.h>
|
||||
#undef NULL
|
||||
#define NULL (void *)0
|
||||
|
||||
struct hostent *
|
||||
gethostbyname_r(const char *, struct hostent *, char *, int, int *);],[
|
||||
@@ -375,6 +418,8 @@ gethostbyname_r(NULL, NULL, NULL, 0, NULL);],[
|
||||
AC_TRY_COMPILE([
|
||||
#include <sys/types.h>
|
||||
#include <netdb.h>
|
||||
#undef NULL
|
||||
#define NULL (void *)0
|
||||
|
||||
int
|
||||
gethostbyname_r(const char *, struct hostent *, char *, size_t,
|
||||
|
@@ -5,7 +5,7 @@ die(){
|
||||
exit
|
||||
}
|
||||
|
||||
automake || die "The command 'automake $MAKEFILES' failed"
|
||||
aclocal || die "The command 'aclocal' failed"
|
||||
autoheader || die "The command 'autoheader' failed"
|
||||
autoconf || die "The command 'autoconf' failed"
|
||||
automake || die "The command 'automake $MAKEFILES' failed"
|
||||
|
45
config-mac.h
Normal file
45
config-mac.h
Normal file
@@ -0,0 +1,45 @@
|
||||
#define OS "mac"
|
||||
|
||||
#define HAVE_NETINET_IN_H 1
|
||||
#define HAVE_SYS_SOCKET_H 1
|
||||
#define HAVE_SYS_SELECT_H 1
|
||||
#define HAVE_NETDB_H 1
|
||||
#define HAVE_ARPA_INET_H 1
|
||||
#define HAVE_UNISTD_H 1
|
||||
#define HAVE_NET_IF_H 1
|
||||
#define HAVE_SYS_TYPES_H 1
|
||||
#define HAVE_GETTIMEOFDAY 1
|
||||
#define HAVE_FCNTL_H 1
|
||||
#define HAVE_SYS_STAT_H 1
|
||||
#define HAVE_ALLOCA_H 1
|
||||
#define HAVE_TIME_H 1
|
||||
#define HAVE_STDLIB_H 1
|
||||
#define HAVE_UTIME_H 1
|
||||
|
||||
#define TIME_WITH_SYS_TIME 1
|
||||
|
||||
#define HAVE_STRDUP 1
|
||||
#define HAVE_UTIME 1
|
||||
#define HAVE_INET_NTOA 1
|
||||
#define HAVE_SETVBUF 1
|
||||
#define HAVE_STRFTIME 1
|
||||
#define HAVE_INET_ADDR 1
|
||||
#define HAVE_MEMCPY 1
|
||||
#define HAVE_SELECT 1
|
||||
#define HAVE_SOCKET 1
|
||||
|
||||
//#define HAVE_STRICMP 1
|
||||
#define HAVE_SIGACTION 1
|
||||
|
||||
#ifdef MACOS_SSL_SUPPORT
|
||||
# define USE_SSLEAY 1
|
||||
# define USE_OPENSSL 1
|
||||
#endif
|
||||
|
||||
#define HAVE_RAND_STATUS 1
|
||||
#define HAVE_RAND_EGD 1
|
||||
|
||||
#define HAVE_FIONBIO 1
|
||||
|
||||
#include <extra/stricmp.h>
|
||||
#include <extra/strdup.h>
|
@@ -42,7 +42,7 @@
|
||||
#define SIZEOF_LONG_DOUBLE 16
|
||||
|
||||
/* The number of bytes in a long long. */
|
||||
#define SIZEOF_LONG_LONG 8
|
||||
/* #define SIZEOF_LONG_LONG 8 */
|
||||
|
||||
/* Define if you have the gethostbyaddr function. */
|
||||
#define HAVE_GETHOSTBYADDR 1
|
||||
@@ -179,6 +179,9 @@
|
||||
/* Define if you have the RAND_screen function when using SSL */
|
||||
#define HAVE_RAND_SCREEN 1
|
||||
|
||||
/* Define this to if in_addr_t is not an available typedefed type */
|
||||
#define in_addr_t unsigned long
|
||||
|
||||
/*************************************************
|
||||
* This section is for compiler specific defines.*
|
||||
*************************************************/
|
||||
|
@@ -392,6 +392,10 @@ else
|
||||
OPENSSL_ENABLED=1)
|
||||
fi
|
||||
|
||||
dnl Check for the OpenSSL engine header, it is kind of "separated"
|
||||
dnl from the main SSL check
|
||||
AC_CHECK_HEADERS(openssl/engine.h)
|
||||
|
||||
AC_SUBST(OPENSSL_ENABLED)
|
||||
|
||||
fi
|
||||
@@ -469,6 +473,8 @@ else
|
||||
dnl is there a localtime_r()
|
||||
CURL_CHECK_LOCALTIME_R()
|
||||
|
||||
AC_CHECK_FUNCS( gmtime_r )
|
||||
|
||||
fi
|
||||
|
||||
dnl **********************************************************************
|
||||
@@ -492,7 +498,6 @@ AC_CHECK_HEADERS( \
|
||||
sys/stat.h \
|
||||
sys/types.h \
|
||||
sys/time.h \
|
||||
getopt.h \
|
||||
sys/param.h \
|
||||
termios.h \
|
||||
termio.h \
|
||||
@@ -527,6 +532,7 @@ AC_CHECK_SIZEOF(long long, 4)
|
||||
AC_CHECK_TYPE(ssize_t, int)
|
||||
|
||||
TYPE_SOCKLEN_T
|
||||
TYPE_IN_ADDR_T
|
||||
|
||||
dnl Checks for library functions.
|
||||
dnl AC_PROG_GCC_TRADITIONAL
|
||||
|
16
docs/BUGS
16
docs/BUGS
@@ -1,3 +1,4 @@
|
||||
$Id$
|
||||
_ _ ____ _
|
||||
___| | | | _ \| |
|
||||
/ __| | | | |_) | |
|
||||
@@ -35,23 +36,24 @@ BUGS
|
||||
The address and how to subscribe to the mailing list is detailed in the
|
||||
MANUAL file.
|
||||
|
||||
HOW TO GET A STACK TRACE with a common unix debugger
|
||||
====================================================
|
||||
How To Get A Stack Trace
|
||||
========================
|
||||
|
||||
First, you must make sure that you compile all sources with -g and that you
|
||||
don't 'strip' the final executable.
|
||||
don't 'strip' the final executable. Try to avoid optimizing the code as
|
||||
well, remove -O, -O2 etc from the compiler options.
|
||||
|
||||
Run the program until it bangs.
|
||||
Run the program until it dumps core.
|
||||
|
||||
Run your debugger on the core file, like '<debugger> curl core'. <debugger>
|
||||
should be replaced with the name of your debugger, in most cases that will
|
||||
be 'gdb', but 'dbx' and others also occur.
|
||||
|
||||
When the debugger has finished loading the core file and presents you a
|
||||
prompt, you can give the compiler instructions. Enter 'where' (without the
|
||||
quotes) and press return.
|
||||
prompt, enter 'where' (without the quotes) and press return.
|
||||
|
||||
The list that is presented is the stack trace. If everything worked, it is
|
||||
supposed to contain the chain of functions that were called when curl
|
||||
crashed.
|
||||
crashed. Include the stack trace with your detailed bug report. It'll help a
|
||||
lot.
|
||||
|
||||
|
60
docs/FAQ
60
docs/FAQ
@@ -1,4 +1,4 @@
|
||||
Updated: November 1, 2001 (http://curl.haxx.se/docs/faq.shtml)
|
||||
Updated: December 21, 2001 (http://curl.haxx.se/docs/faq.shtml)
|
||||
_ _ ____ _
|
||||
___| | | | _ \| |
|
||||
/ __| | | | |_) | |
|
||||
@@ -33,10 +33,10 @@ FAQ
|
||||
3.6 Does curl support javascript, ASP, XML, XHTML or HTML version Y?
|
||||
3.7 Can I use curl to delete/rename a file through FTP?
|
||||
3.8 How do I tell curl to follow HTTP redirects?
|
||||
3.9 How do I use curl in PHP, Perl, Tcl, Ruby or Java?
|
||||
3.9 How do I use curl in my favourite programming language?
|
||||
3.10 What about SOAP, WebDAV, XML-RPC or similar protocols over HTTP?
|
||||
3.11 How do I POST with a different Content-Type?
|
||||
3.12 Why do FTP specific features over HTTP proxy fails?
|
||||
3.12 Why do FTP specific features over HTTP proxy fail?
|
||||
|
||||
4. Running Problems
|
||||
4.1 Problems connecting to SSL servers.
|
||||
@@ -49,6 +49,7 @@ FAQ
|
||||
4.5.3 "403 Forbidden"
|
||||
4.5.4 "404 Not Found"
|
||||
4.5.5 "405 Method Not Allowed"
|
||||
4.5.6 "301 Moved Permanently"
|
||||
4.6 Can you tell me what error code 142 means?
|
||||
4.7 How do I keep user names and passwords secret in Curl command lines?
|
||||
4.8 I found a bug!
|
||||
@@ -154,9 +155,9 @@ FAQ
|
||||
have them inserted in the main sources (of course on the condition that
|
||||
developers agree on that the fixes are good).
|
||||
|
||||
The list of contributors in the bottom of the man page is only a small part
|
||||
of all the people that every day provide us with bug reports, suggestions,
|
||||
ideas and source code.
|
||||
The list of contributors in the docs/THANKS file is only a small part of all
|
||||
the people that every day provide us with bug reports, suggestions, ideas
|
||||
and source code.
|
||||
|
||||
curl is developed by a community, with Daniel at the wheel.
|
||||
|
||||
@@ -171,9 +172,11 @@ FAQ
|
||||
sourceforge.net hosts several project tools we take advantage from like the
|
||||
bug tracker, mailing lists and more.
|
||||
|
||||
If you feel you want to show support our project with a donation, a very
|
||||
nice way of doing that would be to buy "gift certificates" at useful online
|
||||
shopping sites, such as amazon.com or thinkgeek.com.
|
||||
If you want to support our project with a donation or similar, one way of
|
||||
doing that would be to buy "gift certificates" at useful online shopping
|
||||
sites, such as amazon.com or thinkgeek.com. Another way would be to sponsor
|
||||
us through a banner-program or by simply helping us coding, documenting,
|
||||
testing etc.
|
||||
|
||||
1.7 What about CURL from curl.com?
|
||||
|
||||
@@ -332,11 +335,12 @@ FAQ
|
||||
|
||||
curl -L http://redirector.com
|
||||
|
||||
3.9 How do I use curl in PHP, Perl, Tcl, Ruby or Java?
|
||||
3.9 How do I use curl in my favourite programming language?
|
||||
|
||||
There exist many language-interfaces for curl that integrates it better with
|
||||
various languages. If you are fluid in a script language, you may very well
|
||||
opt to use such an interface instead of using the command line tool.
|
||||
There exist many language interfaces/bindings for curl that integrates it
|
||||
better with various languages. If you are fluid in a script language, you
|
||||
may very well opt to use such an interface instead of using the command line
|
||||
tool.
|
||||
|
||||
At the time of writing, there are bindings for the five language mentioned
|
||||
above, but chances are there are even more by the time you read this. Or you
|
||||
@@ -347,16 +351,9 @@ FAQ
|
||||
|
||||
http://curl.haxx.se/libcurl/
|
||||
|
||||
PHP4 has the ability to use libcurl as an internal module if built with that
|
||||
option enabled. You then get a set of extra functions that can be used
|
||||
within your PHP programs. You find all details about those functions in the
|
||||
curl section in the PHP manual, see the online version at:
|
||||
|
||||
http://www.php.net/manual/ref.curl.php
|
||||
|
||||
PHP also offers the option to run a command line, and then you can of course
|
||||
invoke the curl tool using a command line. This is the way to use curl if
|
||||
you're using PHP3 or PHP4 built without curl module support.
|
||||
In December 2001, there are interfaces available for the following
|
||||
languages: C/C++, Cocoa, Dylan, Java, Perl, PHP, Python, Rexx, Ruby, Scheme
|
||||
and Tcl. By the time you read this, additional ones may have appeared!
|
||||
|
||||
3.10 What about SOAP, WebDAV, XML-RPC or similar protocols over HTTP?
|
||||
|
||||
@@ -383,8 +380,8 @@ FAQ
|
||||
etc.
|
||||
|
||||
There is one exception to this rule, and that is if you can "tunnel through"
|
||||
the given HTTP proxy. Proxy tunneling is enabled with a special option (-P)
|
||||
and is generally not available as proxy admins usuable disable tunneling to
|
||||
the given HTTP proxy. Proxy tunneling is enabled with a special option (-p)
|
||||
and is generally not available as proxy admins usually disable tunneling to
|
||||
other ports than 443 (which is used for HTTPS access through proxies).
|
||||
|
||||
4. Running Problems
|
||||
@@ -476,11 +473,22 @@ FAQ
|
||||
identified by the Request-URI. The response MUST include an Allow header
|
||||
containing a list of valid methods for the requested resource.
|
||||
|
||||
4.5.6 "301 Moved Permanently"
|
||||
|
||||
If you get this return code and an HTML outpt similar to this:
|
||||
|
||||
<H1>Moved Permanently</H1> The document has moved <A
|
||||
HREF="http://same_url_now_with_a_trailing_slash/">here</A>.
|
||||
|
||||
it might be because you request a directory URL but without the trailing
|
||||
slash. Try the same operation again _with_ the trailing URL, or use the
|
||||
-L/--location option to follow the redirection.
|
||||
|
||||
4.6. Can you tell me what error code 142 means?
|
||||
|
||||
All error codes that are larger than the highest documented error code means
|
||||
that curl has exited due to a crash. This is a serious error, and we
|
||||
appriciate a detailed bug report from you that describes how we could go
|
||||
appreciate a detailed bug report from you that describes how we could go
|
||||
ahead and repeat this!
|
||||
|
||||
4.7. How do I keep user names and passwords secret in Curl command lines?
|
||||
|
@@ -56,7 +56,7 @@ FTP
|
||||
- download
|
||||
- authentication
|
||||
- kerberos security
|
||||
- PORT or PASV
|
||||
- active/passive using PORT, EPRT, PASV or EPSV
|
||||
- single file size information (compare to HTTP HEAD)
|
||||
- 'type=' URL support
|
||||
- dir listing
|
||||
|
34
docs/INSTALL
34
docs/INSTALL
@@ -36,8 +36,7 @@ UNIX
|
||||
The configure script always tries to find a working SSL library unless
|
||||
explicitly told not to. If you have OpenSSL installed in the default search
|
||||
path for your compiler/linker, you don't need to do anything special. If
|
||||
you have OpenSSL installed in e.g /usr/local/ssl, you can run configure
|
||||
like:
|
||||
you have OpenSSL installed in /usr/local/ssl, you can run configure like:
|
||||
|
||||
./configure --with-ssl
|
||||
|
||||
@@ -46,13 +45,13 @@ UNIX
|
||||
|
||||
./configure --with-ssl=/opt/OpenSSL
|
||||
|
||||
If you insist on forcing a build *without* SSL support, even though you may
|
||||
have it installed in your system, you can run configure like this:
|
||||
If you insist on forcing a build without SSL support, even though you may
|
||||
have OpenSSL installed in your system, you can run configure like this:
|
||||
|
||||
./configure --without-ssl
|
||||
|
||||
If you have OpenSSL installed, but with the libraries in one place and the
|
||||
header files somewhere else, you'll have to set the LDFLAGS and CPPFLAGS
|
||||
header files somewhere else, you have to set the LDFLAGS and CPPFLAGS
|
||||
environment variables prior to running configure. Something like this
|
||||
should work:
|
||||
|
||||
@@ -72,7 +71,7 @@ UNIX
|
||||
LIBS=-lRSAglue -lrsaref
|
||||
(as suggested by Doug Kaufman)
|
||||
|
||||
KNOWN PROBLEMS
|
||||
KNOWN PROBLEMS (these ones should not happen anymore)
|
||||
|
||||
If you happen to have autoconf installed, but a version older than 2.12
|
||||
you will get into trouble. Then you can still build curl by issuing these
|
||||
@@ -101,8 +100,8 @@ UNIX
|
||||
|
||||
MORE OPTIONS
|
||||
|
||||
Remember, to force configure to use the standard cc compiler if both
|
||||
cc and gcc are present, run configure like
|
||||
To force configure to use the standard cc compiler if both cc and gcc are
|
||||
present, run configure like
|
||||
|
||||
CC=cc ./configure
|
||||
or
|
||||
@@ -130,11 +129,6 @@ UNIX
|
||||
|
||||
./configure --with-krb4=/usr/athena
|
||||
|
||||
If your system support shared libraries, but you want to built a static
|
||||
version only, you can disable building the shared version by using:
|
||||
|
||||
./configure --disable-shared
|
||||
|
||||
If you're a curl developer and use gcc, you might want to enable more
|
||||
debug options with the --enable-debug option.
|
||||
|
||||
@@ -177,9 +171,9 @@ Win32
|
||||
Make the sources in the src/ drawer be a "win32 console application"
|
||||
project. Name it curl.
|
||||
|
||||
With VC++, add 'wsock32.lib' to the link libs when you build curl!
|
||||
Borland seems to do that itself magically. Of course you have to
|
||||
make sure it links with the libcurl too!
|
||||
With VC++, add 'ws2_32.lib' to the link libs when you build curl!
|
||||
Borland seems to do that itself magically. Of course you have to make
|
||||
sure it links with the libcurl too!
|
||||
|
||||
For VC++ 6, there's an included Makefile.vc6 that should be possible
|
||||
to use out-of-the-box.
|
||||
@@ -370,7 +364,8 @@ CROSS COMPILE
|
||||
PORTS
|
||||
=====
|
||||
This is a probably incomplete list of known hardware and operating systems
|
||||
that curl has been compiled for:
|
||||
that curl has been compiled for. If you know one system curl compiles and
|
||||
runs on, that isn't listed, please let us know!
|
||||
|
||||
- Alpha DEC OSF 4
|
||||
- Alpha Digital UNIX v3.2
|
||||
@@ -379,10 +374,13 @@ PORTS
|
||||
- Alpha OpenVMS V7.1-1H2
|
||||
- Alpha Tru64 v5.0 5.1
|
||||
- HP-PA HP-UX 9.X 10.X 11.X
|
||||
- HP-PA Linux
|
||||
- MIPS IRIX 6.2, 6.5
|
||||
- MIPS Linux
|
||||
- Power AIX 4.2, 4.3.1, 4.3.2
|
||||
- PowerPC Darwin 1.0
|
||||
- PowerPC Linux
|
||||
- PowerPC Mac OS 9
|
||||
- PowerPC Mac OS X
|
||||
- SINIX-Z v5
|
||||
- Sparc Linux
|
||||
@@ -394,6 +392,7 @@ PORTS
|
||||
- Ultrix 4.3a
|
||||
- i386 BeOS
|
||||
- i386 FreeBSD
|
||||
- i386 HURD
|
||||
- i386 Linux 1.3, 2.0, 2.2, 2.3, 2.4
|
||||
- i386 NetBSD
|
||||
- i386 OS/2
|
||||
@@ -403,6 +402,7 @@ PORTS
|
||||
- i386 Windows 95, 98, ME, NT, 2000
|
||||
- ia64 Linux 2.3.99
|
||||
- m68k AmigaOS 3
|
||||
- m68k Linux
|
||||
- m68k OpenBSD
|
||||
- s390 Linux
|
||||
|
||||
|
@@ -56,12 +56,13 @@ HTMLPAGES = \
|
||||
curl_mprintf.html \
|
||||
curl_global_init.html \
|
||||
curl_global_cleanup.html \
|
||||
libcurl.html
|
||||
libcurl.html \
|
||||
index.html
|
||||
|
||||
EXTRA_DIST = $(man_MANS) \
|
||||
MANUAL BUGS CONTRIBUTE FAQ FEATURES INTERNALS \
|
||||
README.win32 RESOURCES TODO TheArtOfHttpScripting THANKS \
|
||||
$(HTMLPAGES)
|
||||
VERSIONS $(HTMLPAGES)
|
||||
|
||||
MAN2HTML= gnroff -man $< | man2html >$@
|
||||
|
||||
|
@@ -12,18 +12,11 @@ README.win32
|
||||
systems. While not being the main develop target, a fair share of curl users
|
||||
are win32-based.
|
||||
|
||||
Some documentation in this archive will be tricky to read for Windows
|
||||
people, as they come in unix-style man pages. You can either download a
|
||||
freely available nroff binary for win32 (*pointers appriciated*), convert
|
||||
the files into plain-text on your neighbor's unix machine or run over to the
|
||||
curl web site and view them as plain HTML.
|
||||
The unix-style man pages are tricky to read on windows, so therefore are all
|
||||
those pages also converted to HTML and those are also included in the
|
||||
release archives.
|
||||
|
||||
The main curl.1 man page is "built-in". Use a command line similar to this
|
||||
in order to extract a separate text file:
|
||||
The main curl.1 man page is also "built-in" in the command line tool. Use a
|
||||
command line similar to this in order to extract a separate text file:
|
||||
|
||||
curl -M >manual.txt
|
||||
|
||||
Download all the libcurl man pages in HTML format using the link on the
|
||||
bottom of this page:
|
||||
|
||||
http://curl.haxx.se/libcurl/c/
|
||||
|
@@ -53,7 +53,7 @@ that have contributed with non-trivial parts:
|
||||
- Albert Chin-A-Young <china@thewrittenword.com>
|
||||
- Stephen Kick <skick@epicrealm.com>
|
||||
- Martin Hedenfalk <mhe@stacken.kth.se>
|
||||
- Richard Prescott
|
||||
- Richard Prescott <rip at step.polymtl.ca>
|
||||
- Jason S. Priebe <priebe@wral-tv.com>
|
||||
- T. Bharath <TBharath@responsenetworks.com>
|
||||
- Alexander Kourakos <awk@users.sourceforge.net>
|
||||
@@ -75,3 +75,7 @@ that have contributed with non-trivial parts:
|
||||
- Andrew Francis <locust@familyhealth.com.au>
|
||||
- Tomasz Lacki <Tomasz.Lacki@primark.pl>
|
||||
- Georg Huettenegger <georg@ist.org>
|
||||
- John Lask <johnlask@hotmail.com>
|
||||
- Eric Lavigne <erlavigne@wanadoo.fr>
|
||||
- Marcus Webster <marcus.webster@phocis.com>
|
||||
- G<>tz Babin-Ebell <babin<69>ebell@trustcenter.de>
|
||||
|
25
docs/TODO
25
docs/TODO
@@ -34,6 +34,8 @@ TODO
|
||||
|
||||
* Add asynchronous name resolving. http://curl.haxx.se/dev/async-resolver.txt
|
||||
|
||||
* Strip any trailing CR from the error message when Curl_failf() is used.
|
||||
|
||||
DOCUMENTATION
|
||||
|
||||
* Document all CURLcode error codes, why they happen and what most likely
|
||||
@@ -58,9 +60,6 @@ TODO
|
||||
likely that we know the size when downloading. Some sites support SIZE but
|
||||
don't show the size in the RETR response!
|
||||
|
||||
* Make FTP PASV work with IPv6 support. RFC 2428 "FTP Extensions for IPv6 and
|
||||
NATs" is interesting.
|
||||
|
||||
HTTP
|
||||
|
||||
* HTTP PUT for files passed on stdin *OR* when the --crlf option is
|
||||
@@ -101,14 +100,30 @@ TODO
|
||||
|
||||
SSL
|
||||
|
||||
* Add an interface to libcurl that enables "session IDs" to get
|
||||
exported/imported. Cris Bailiff said: "OpenSSL has functions which can
|
||||
serialise the current SSL state to a buffer of your choice, and
|
||||
recover/reset the state from such a buffer at a later date - this is used
|
||||
by mod_ssl for apache to implement and SSL session ID cache"
|
||||
|
||||
* Make curl's SSL layer option capable of using other free SSL libraries.
|
||||
Such as the Mozilla Security Services
|
||||
(http://www.mozilla.org/projects/security/pki/nss/) and GNUTLS
|
||||
(http://gnutls.hellug.gr/)
|
||||
|
||||
LDAP
|
||||
CLIENT
|
||||
|
||||
* Multiple URL requests don't work. [http://sourceforge.net/tracker/index.php?func=detail&aid=475407&group_id=976&atid=100976]
|
||||
* "curl ftp://site.com/*.txt"
|
||||
|
||||
* Several URLs can be specified to get downloaded. We should be able to use
|
||||
the same syntax to specify several files to get uploaded (using the same
|
||||
persistant connection), using -T.
|
||||
|
||||
* Say you have a list of FTP addresses to download in a file named
|
||||
ftp-list.txt: "cat ftp-list.txt | xargs curl -O -O -O [...]". curl _needs_
|
||||
an "-Oalways" flag -- all addresses on the command line use the base
|
||||
filename to store locally. Else a script must precount the # of URLs,
|
||||
construct the proper number of "-O"s...
|
||||
|
||||
TEST SUITE
|
||||
|
||||
|
64
docs/VERSIONS
Normal file
64
docs/VERSIONS
Normal file
@@ -0,0 +1,64 @@
|
||||
_ _ ____ _
|
||||
___| | | | _ \| |
|
||||
/ __| | | | |_) | |
|
||||
| (__| |_| | _ <| |___
|
||||
\___|\___/|_| \_\_____|
|
||||
|
||||
Version Numbers and Releases
|
||||
|
||||
Curl is not only curl. Curl is also libcurl. They're actually individually
|
||||
versioned, but they mostly follow each other rather closely.
|
||||
|
||||
The version numbering is always built up using the same system:
|
||||
|
||||
X.Y[.Z][-preN]
|
||||
|
||||
Where
|
||||
X is main version number
|
||||
Y is release number
|
||||
Z is patch number
|
||||
N is pre-release number
|
||||
|
||||
One of these numbers will get bumped in each new release. The numbers to the
|
||||
right of a bumped number will be reset to zero. If Z is zero, it is not
|
||||
included in the version number. The pre release number is only included in
|
||||
pre releases (they're never used in public, official, releases).
|
||||
|
||||
The main version number will get bumped when *really* big, world colliding
|
||||
changes are made. The release number is bumped when big changes are
|
||||
performed. The patch number is bumped when the changes are mere bugfixes and
|
||||
only minor feature changes. The pre-release is a counter, to identify which
|
||||
pre-release a certain release is.
|
||||
|
||||
When reaching the end of a pre-release period, the version without the
|
||||
pre-release part will be released as a public release.
|
||||
|
||||
It means that after release 1.2.3, we can release 2.0 if something really big
|
||||
has been made, 1.3 if not that big changes were made or 1.2.4 if mostly bugs
|
||||
were fixed. Before 1.2.4 is released, we might release a 1.2.4-pre1 release
|
||||
for the brave people to try before the actual release.
|
||||
|
||||
Bumping, as in increasing the number with 1, is unconditionally only
|
||||
affecting one of the numbers (except the ones to the right of it, that may be
|
||||
set to zero). 1 becomes 2, 3 becomes 4, 9 becomes 10, 88 becomes 89 and 99
|
||||
becomes 100. So, after 1.2.9 comes 1.2.10. After 3.99.3, 3.100 might come.
|
||||
|
||||
All original curl source release archives are named according to the libcurl
|
||||
version (not according to the curl client version that, as said before, might
|
||||
differ).
|
||||
|
||||
As a service to any application that might want to support new libcurl
|
||||
features while still being able to build with older versions, all releases
|
||||
have the libcurl version stored in the curl/curl.h file using a static
|
||||
numbering scheme that can be used for comparison. The version number is
|
||||
defined as:
|
||||
|
||||
#define LIBCURL_VERSION_NUM 0xXXYYZZ
|
||||
|
||||
Where XX, YY and ZZ are the main version, release and patch numbers in
|
||||
hexadecimal. All three numbers are always represented using two digits. 1.2
|
||||
would appear as "0x010200" while version 9.11.7 appears as "0x090b07".
|
||||
|
||||
This 6-digit hexadecimal number does not show pre-release number, and it is
|
||||
always a greater number in a more recent release. It makes comparisons with
|
||||
greater than and less than work.
|
45
docs/curl.1
45
docs/curl.1
@@ -2,10 +2,9 @@
|
||||
.\" nroff -man curl.1
|
||||
.\" Written by Daniel Stenberg
|
||||
.\"
|
||||
.TH curl 1 "30 Oct 2001" "Curl 7.9.1" "Curl Manual"
|
||||
.TH curl 1 "30 Nov 2001" "Curl 7.9.2" "Curl Manual"
|
||||
.SH NAME
|
||||
curl \- get a URL with FTP, TELNET, LDAP, GOPHER, DICT, FILE, HTTP or
|
||||
HTTPS syntax.
|
||||
curl \- transfer a URL
|
||||
.SH SYNOPSIS
|
||||
.B curl [options]
|
||||
.I [URL...]
|
||||
@@ -117,13 +116,13 @@ be written to stdout. (Option added in curl 7.9)
|
||||
If this option is used several times, the last specfied file name will be
|
||||
used.
|
||||
.IP "-C/--continue-at <offset>"
|
||||
Continue/Resume a previous file transfer at the given offset. The
|
||||
given offset is the exact number of bytes that will be skipped
|
||||
counted from the beginning of the source file before it is transfered
|
||||
to the destination.
|
||||
If used with uploads, the ftp server command SIZE will not be used by
|
||||
curl. Upload resume is for FTP only.
|
||||
HTTP resume is only possible with HTTP/1.1 or later servers.
|
||||
Continue/Resume a previous file transfer at the given offset. The given offset
|
||||
is the exact number of bytes that will be skipped counted from the beginning
|
||||
of the source file before it is transfered to the destination. If used with
|
||||
uploads, the ftp server command SIZE will not be used by curl.
|
||||
|
||||
Use "-C -" to tell curl to automatically find out where/how to resume the
|
||||
transfer. It then uses the given output/input files to figure that out.
|
||||
|
||||
If this option is used several times, the last one will be used.
|
||||
.IP "-d/--data <data>"
|
||||
@@ -161,10 +160,14 @@ using this option the entire context of the posted data is kept as-is. If you
|
||||
want to post a binary file without the strip-newlines feature of the
|
||||
--data-ascii option, this is for you.
|
||||
|
||||
If this option is used several times, the last one will be used.
|
||||
|
||||
If this option is used several times, the ones following the first will
|
||||
append data.
|
||||
.IP "--disable-epsv"
|
||||
(FTP) Tell curl to disable the use of the EPSV command when doing passive FTP
|
||||
downloads. Curl will normally always first attempt to use EPSV before PASV,
|
||||
but with this option, it will not try using EPSV.
|
||||
|
||||
IF this option is used several times, each occurrence will toggle this on/off.
|
||||
.IP "-D/--dump-header <file>"
|
||||
(HTTP/FTP)
|
||||
Write the HTTP headers to this file. Write the FTP file info to this
|
||||
@@ -569,6 +572,11 @@ The time, in seconds, it took from the start until the file transfer is just
|
||||
about to begin. This includes all pre-transfer commands and negotiations that
|
||||
are specific to the particular protocol(s) involved.
|
||||
.TP
|
||||
.B time_starttransfer
|
||||
The time, in seconds, it took from the start until the first byte is just about
|
||||
to be transfered. This includes time_pretransfer and also the time the
|
||||
server needs to calculate the result.
|
||||
.TP
|
||||
.B size_download
|
||||
The total amount of bytes that were downloaded.
|
||||
.TP
|
||||
@@ -668,7 +676,7 @@ If this option is used several times, the last one will be used.
|
||||
Default config file.
|
||||
|
||||
.SH ENVIRONMENT
|
||||
.IP "HTTP_PROXY [protocol://]<host>[:port]"
|
||||
.IP "http_proxy [protocol://]<host>[:port]"
|
||||
Sets proxy server to use for HTTP.
|
||||
.IP "HTTPS_PROXY [protocol://]<host>[:port]"
|
||||
Sets proxy server to use for HTTPS.
|
||||
@@ -679,11 +687,8 @@ Sets proxy server to use for GOPHER.
|
||||
.IP "ALL_PROXY [protocol://]<host>[:port]"
|
||||
Sets proxy server to use if no protocol-specific proxy is set.
|
||||
.IP "NO_PROXY <comma-separated list of hosts>"
|
||||
list of host names that shouldn't go through any proxy. If set to a
|
||||
asterisk '*' only, it matches all hosts.
|
||||
.IP "COLUMNS <integer>"
|
||||
The width of the terminal. This variable only affects curl when the
|
||||
--progress-bar option is used.
|
||||
list of host names that shouldn't go through any proxy. If set to a asterisk
|
||||
'*' only, it matches all hosts.
|
||||
.SH EXIT CODES
|
||||
There exists a bunch of different error codes and their corresponding error
|
||||
messages that may appear during bad conditions. At the time of this writing,
|
||||
@@ -790,6 +795,10 @@ Too many redirects. When following redirects, curl hit the maximum amount.
|
||||
Unknown TELNET option specified.
|
||||
.IP 49
|
||||
Malformed telnet option.
|
||||
.IP 51
|
||||
The remote peer's SSL certificate wasn't ok
|
||||
.IP 52
|
||||
The server didn't reply anything, which here is considered an error.
|
||||
.IP XX
|
||||
There will appear more error codes here in future releases. The existing ones
|
||||
are meant to never change.
|
||||
|
@@ -52,6 +52,12 @@ start until the file transfer is just about to begin. This includes all
|
||||
pre-transfer commands and negotiations that are specific to the particular
|
||||
protocol(s) involved.
|
||||
.TP
|
||||
.B CURLINFO_STARTTRANSFER_TIME
|
||||
Pass a pointer to a double to receive the time, in seconds, it took from the
|
||||
start until the first byte is just about to be transfered. This includes
|
||||
CURLINFO_PRETRANSFER_TIME and also the time the server needs to calculate
|
||||
the result.
|
||||
.TP
|
||||
.B CURLINFO_SIZE_UPLOAD
|
||||
Pass a pointer to a double to receive the total amount of bytes that were
|
||||
uploaded.
|
||||
|
@@ -2,7 +2,7 @@
|
||||
.\" nroff -man [file]
|
||||
.\" $Id$
|
||||
.\"
|
||||
.TH curl_easy_setopt 3 "11 Oct 2001" "libcurl 7.9.1" "libcurl Manual"
|
||||
.TH curl_easy_setopt 3 "10 Dec 2001" "libcurl 7.9.2" "libcurl Manual"
|
||||
.SH NAME
|
||||
curl_easy_setopt - Set curl easy-session options
|
||||
.SH SYNOPSIS
|
||||
@@ -77,9 +77,8 @@ 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 \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 \fICURLE_READ_ERROR\fP
|
||||
return code).
|
||||
that memory area. Returning 0 will signal end-of-file to the library and cause
|
||||
it to stop the current transfer.
|
||||
.TP
|
||||
.B CURLOPT_INFILESIZE
|
||||
When uploading a file to a remote site, this option should be used to tell
|
||||
@@ -336,13 +335,15 @@ Pass a pointer to a linked list of FTP commands to pass to the server prior to
|
||||
your ftp request. The linked list should be a fully valid list of 'struct
|
||||
curl_slist' structs properly filled in. Use \fIcurl_slist_append(3)\fP to
|
||||
append strings (commands) to the list, and clear the entire list afterwards
|
||||
with \fIcurl_slist_free_all(3)\fP.
|
||||
with \fIcurl_slist_free_all(3)\fP. Disable this operation again by setting a
|
||||
NULL to this option.
|
||||
.TP
|
||||
.B CURLOPT_POSTQUOTE
|
||||
Pass a pointer to a linked list of FTP commands to pass to the server after
|
||||
your ftp transfer request. The linked list should be a fully valid list of
|
||||
struct curl_slist structs properly filled in as described for
|
||||
\fICURLOPT_QUOTE\fP.
|
||||
\fICURLOPT_QUOTE\fP. Disable this operation again by setting a NULL to this
|
||||
option.
|
||||
.TP
|
||||
.B CURLOPT_WRITEHEADER
|
||||
Pass a pointer to be used to write the header part of the received data to. If
|
||||
@@ -545,6 +546,29 @@ compile OpenSSL.
|
||||
|
||||
You'll find more details about cipher lists on this URL:
|
||||
\fIhttp://www.openssl.org/docs/apps/ciphers.html\fP
|
||||
.TP
|
||||
.B CURLOPT_HTTP_VERSION
|
||||
Pass a long, set to one of the values described below. They force libcurl to
|
||||
use the specific HTTP versions. This is not sensible to do unless you have a
|
||||
good reason.
|
||||
.RS
|
||||
.TP 5
|
||||
.B CURL_HTTP_VERSION_NONE
|
||||
We don't care about what version the library uses. libcurl will use whatever
|
||||
it thinks fit.
|
||||
.TP
|
||||
.B CURL_HTTP_VERSION_1_0
|
||||
Enforce HTTP 1.0 requests.
|
||||
.TP
|
||||
.B CURL_HTTP_VERSION_1_1
|
||||
Enforce HTTP 1.1 requests.
|
||||
.RE
|
||||
.TP
|
||||
.B CURLOPT_FTP_USE_EPSV
|
||||
Pass a long. If the value is non-zero, it tells curl to use the EPSV command
|
||||
when doing passive FTP downloads (which is always does by default). Using EPSV
|
||||
means that it will first attempt to use EPSV before using PASV, but if you
|
||||
pass FALSE (zero) to this option, it will not try using EPSV, only plain PASV.
|
||||
.PP
|
||||
.SH RETURN VALUE
|
||||
CURLE_OK (zero) means that the option was set properly, non-zero means an
|
||||
|
@@ -58,6 +58,13 @@ are allowed. The effect of this parameter is the same as giving multiple
|
||||
\fBCURLFORM_FILE\fP options possibly with \fBCURLFORM_CONTENTTYPE\fP after or
|
||||
before each \fBCURLFORM_FILE\fP option.
|
||||
|
||||
Should you need to specify extra headers for the form POST section, use
|
||||
\fBCURLFORM_CONTENTHEADER\fP. This takes a curl_slist prepared in the usual way
|
||||
using \fBcurl_slist_append\fP and appends the list of headers to those Curl
|
||||
automatically generates for \fBCURLFORM_CONTENTTYPE\fP and the content
|
||||
disposition. The list must exist while the POST occurs, if you free it before
|
||||
the post completes you may experience problems.
|
||||
|
||||
The last argument in such an array must always be \fBCURLFORM_END\fP.
|
||||
|
||||
The pointers \fI*firstitem\fP and \fI*lastitem\fP should both be pointing to
|
||||
|
@@ -2,7 +2,7 @@
|
||||
.\" nroff -man [file]
|
||||
.\" $Id$
|
||||
.\"
|
||||
.TH curl_formparse 3 "21 May 2001" "libcurl 7.7.4" "libcurl Manual"
|
||||
.TH curl_formparse 3 "17 Dec 2001" "libcurl 7.9.2" "libcurl Manual"
|
||||
.SH NAME
|
||||
curl_formparse - add a section to a multipart/formdata HTTP POST:
|
||||
deprecated (use curl_formadd instead)
|
||||
@@ -13,75 +13,6 @@ deprecated (use curl_formadd instead)
|
||||
.BI "struct HttpPost ** " lastitem ");"
|
||||
.ad
|
||||
.SH DESCRIPTION
|
||||
curl_formparse() is used to append sections when building a multipart/formdata
|
||||
HTTP POST (sometimes refered to as rfc1867-style posts). Append one section at
|
||||
a time until you've added all the sections you want included and then you pass
|
||||
the \fIfirstitem\fP pointer as parameter to \fBCURLOPT_HTTPPOST\fP.
|
||||
\fIlastitem\fP is set after each call and on repeated invokes it should be
|
||||
left as set to allow repeated invokes to find the end of the list in a faster
|
||||
way. \fIstring\fP must be a zero terminated string abiding to the syntax
|
||||
described in a section below
|
||||
|
||||
The pointers \fI*firstitem\fP and \fI*lastitem\fP should both be pointing to
|
||||
NULL in the first call to this function. All list-data will be allocated by
|
||||
the function itself. You must call \fIcurl_formfree\fP after the form post has
|
||||
been done to free the resources again.
|
||||
|
||||
This function will copy all input data and keep its own version of it
|
||||
allocated until you call \fIcurl_formfree\fP. When you've passed the pointer
|
||||
to \fIcurl_easy_setopt\fP, you must not free the list until after you've
|
||||
called \fIcurl_easy_cleanup\fP for the curl handle.
|
||||
|
||||
See example below.
|
||||
.SH "FORM PARSE STRINGS"
|
||||
The
|
||||
.I string
|
||||
parameter must be using one of the following patterns. Note that the []
|
||||
letters should not be included in the real-life string.
|
||||
.TP 0.8i
|
||||
.B [name]=[contents]
|
||||
Add a form field named 'name' with the contents 'contents'. This is the
|
||||
typcial contents of the HTML tag <input type=text>.
|
||||
.TP
|
||||
.B [name]=@[filename]
|
||||
Add a form field named 'name' with the contents as read from the local file
|
||||
named 'filename'. This is the typcial contents of the HTML tag <input
|
||||
type=file>.
|
||||
.TP
|
||||
.B [name]=@[filename1,filename2,...]
|
||||
Add a form field named 'name' with the contents as read from the local files
|
||||
named 'filename1' and 'filename2'. This is identical to the upper, except that
|
||||
you get the contents of several files in one section.
|
||||
.TP
|
||||
.B [name]=@[filename];[type=<content-type>]
|
||||
Whenever you specify a file to read from, you can optionally specify the
|
||||
content-type as well. The content-type is passed to the server together with
|
||||
the contents of the file. curl_formparse() will guess content-type for a
|
||||
number of well-known extensions and otherwise it will set it to binary. You
|
||||
can override the internal decision by using this option.
|
||||
.TP
|
||||
.B [name]=@[filename1,filename2,...];[type=<content-type>]
|
||||
When you specify several files to read the contents from, you can set the
|
||||
content-type for all of them in the same way as with a single file.
|
||||
.PP
|
||||
.SH RETURN VALUE
|
||||
Returns non-zero if an error occurs.
|
||||
.SH EXAMPLE
|
||||
|
||||
HttpPost* post = NULL;
|
||||
HttpPost* last = NULL;
|
||||
|
||||
/* Add an image section */
|
||||
curl_formparse("picture=@my-face.jpg", &post, &last);
|
||||
/* Add a normal text section */
|
||||
curl_formparse("name=FooBar", &post, &last);
|
||||
/* Set the form info */
|
||||
curl_easy_setopt(curl, CURLOPT_HTTPPOST, post);
|
||||
|
||||
.SH "SEE ALSO"
|
||||
.BR curl_easy_setopt "(3), "
|
||||
.BR curl_formadd "(3), "
|
||||
.BR curl_formfree "(3)
|
||||
.SH BUGS
|
||||
Surely there are some, you tell me!
|
||||
|
||||
This has been removed deliberately. The \fBcurl_formadd\fP has been introduced
|
||||
to replace this function. Do not use this. Convert to the new function
|
||||
now. curl_formparse() will be removed from a future version of libcurl.
|
||||
|
@@ -2,7 +2,7 @@
|
||||
.\" nroff -man [file]
|
||||
.\" $Id$
|
||||
.\"
|
||||
.TH curl_global_init 3 "14 August 2001" "libcurl 7.8.1" "libcurl Manual"
|
||||
.TH curl_global_init 3 "13 Nov 2001" "libcurl 7.9.1" "libcurl Manual"
|
||||
.SH NAME
|
||||
curl_global_init - Global libcurl initialisation
|
||||
.SH SYNOPSIS
|
||||
@@ -11,8 +11,8 @@ curl_global_init - Global libcurl initialisation
|
||||
.BI "CURLcode curl_global_init(long " flags ");"
|
||||
.ad
|
||||
.SH DESCRIPTION
|
||||
This function should be called once (no matter how many threads or libcurl
|
||||
sessions that'll be used) by every application that uses libcurl.
|
||||
This function should only be called once (no matter how many threads or
|
||||
libcurl sessions that'll be used) by every application that uses libcurl.
|
||||
|
||||
If this function hasn't been invoked when \fIcurl_easy_init\fP is called, it
|
||||
will be done automatically by libcurl.
|
||||
@@ -23,6 +23,8 @@ init, as described below. Set the desired bits by ORing the values together.
|
||||
You must however \fBalways\fP use the \fIcurl_global_cleanup\fP function, as
|
||||
that cannot be called automatically for you by libcurl.
|
||||
|
||||
Calling this function more than once will cause unpredictable results.
|
||||
|
||||
This function was added in libcurl 7.8.
|
||||
.SH FLAGS
|
||||
.TP 5
|
||||
|
@@ -6,7 +6,8 @@ AUTOMAKE_OPTIONS = foreign no-dependencies
|
||||
|
||||
EXTRA_DIST = README curlgtk.c sepheaders.c simple.c postit.c postit2.c \
|
||||
win32sockets.c persistant.c ftpget.c Makefile.example \
|
||||
multithread.c getinmemory.c ftpupload.c httpput.c
|
||||
multithread.c getinmemory.c ftpupload.c httpput.c \
|
||||
simplessl.c
|
||||
|
||||
all:
|
||||
@echo "done"
|
||||
|
110
docs/examples/simplessl.c
Normal file
110
docs/examples/simplessl.c
Normal file
@@ -0,0 +1,110 @@
|
||||
/*****************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
* / __| | | | |_) | |
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include <curl/curl.h>
|
||||
#include <curl/types.h>
|
||||
#include <curl/easy.h>
|
||||
|
||||
|
||||
/* some requirements for this to work:
|
||||
1. set pCertFile to the file with the client certificate
|
||||
2. if the key is passphrase protected, set pPassphrase to the
|
||||
passphrase you use
|
||||
3. if you are using a crypto engine:
|
||||
3.1. set a #define USE_ENGINE
|
||||
3.2. set pEngine to the name of the crypto engine you use
|
||||
3.3. set pKeyName to the key identifier you want to use
|
||||
4. if you don't use a crypto engine:
|
||||
4.1. set pKeyName to the file name of your client key
|
||||
4.2. if the format of the key file is DER, set pKeyType to "DER"
|
||||
|
||||
!! verify of the server certificate is not implemented here !!
|
||||
*/
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
CURL *curl;
|
||||
CURLcode res;
|
||||
FILE *headerfile;
|
||||
|
||||
const char *pCertFile = "testcert.pem";
|
||||
|
||||
const char *pKeyName;
|
||||
const char *pKeyType;
|
||||
|
||||
const char *pEngine;
|
||||
|
||||
#if USE_ENGINE
|
||||
pKeyName = "rsa_test";
|
||||
pKeyType = "ENG";
|
||||
pEngine = "chil"; /* for nChiper HSM... */
|
||||
#else
|
||||
pKeyName = "testkey.pem";
|
||||
pKeyType = "PEM";
|
||||
pEngine = NULL;
|
||||
#endif
|
||||
|
||||
const char *pPassphrase = NULL;
|
||||
|
||||
headerfile = fopen("dumpit", "w");
|
||||
|
||||
curl_global_init(CURL_GLOBAL_DEFAULT);
|
||||
|
||||
curl = curl_easy_init();
|
||||
if(curl) {
|
||||
/* what call to write: */
|
||||
curl_easy_setopt(curl, CURLOPT_URL, "HTTPS://curl.haxx.se");
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEHEADER, headerfile);
|
||||
|
||||
while(1) /* do some ugly short cut... */
|
||||
{
|
||||
if (pEngine) /* use crypto engine */
|
||||
{
|
||||
if (curl_easy_setopt(curl, CURLOPT_SSLENGINE,pEngine) != CURLE_OK)
|
||||
{ /* load the crypto engine */
|
||||
fprintf(stderr,"can't set crypto engine\n");
|
||||
break;
|
||||
}
|
||||
if (curl_easy_setopt(curl, CURLOPT_SSLENGINE_DEFAULT,1) != CURLE_OK)
|
||||
{ /* set the crypto engine as default */
|
||||
/* only needed for the first time you load
|
||||
a engine in a curl object... */
|
||||
fprintf(stderr,"can't set crypto engine as default\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
/* cert is stored PEM coded in file... */
|
||||
/* since PEM is default, we needn't set it for PEM */
|
||||
curl_easy_setopt(curl,CURLOPT_SSLCERTTYPE,"PEM");
|
||||
/* set the cert for client authentication */
|
||||
curl_easy_setopt(curl,CURLOPT_SSLCERT,pCertFile);
|
||||
/* sorry, for engine we must set the passphrase
|
||||
(if the key has one...) */
|
||||
if (pPassphrase)
|
||||
curl_easy_setopt(curl,CURLOPT_SSLKEYPASSWD,pPassphrase);
|
||||
/* if we use a key stored in a crypto engine,
|
||||
we must set the key type to "ENG" */
|
||||
curl_easy_setopt(curl,CURLOPT_SSLKEYTYPE,pKeyType);
|
||||
/* set the private key (file or ID in engine) */
|
||||
curl_easy_setopt(curl,CURLOPT_SSLKEY,pKeyName);
|
||||
|
||||
res = curl_easy_perform(curl);
|
||||
break; /* we are done... */
|
||||
}
|
||||
/* always cleanup */
|
||||
curl_easy_cleanup(curl);
|
||||
}
|
||||
|
||||
curl_global_cleanup();
|
||||
|
||||
return 0;
|
||||
}
|
38
docs/index.html
Normal file
38
docs/index.html
Normal file
@@ -0,0 +1,38 @@
|
||||
HTML>
|
||||
<HEAD>
|
||||
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
|
||||
<TITLE>Index to Curl documentation</TITLE>
|
||||
</HEAD>
|
||||
|
||||
<BODY>
|
||||
<H1 ALIGN="CENTER">Index to Curl documentation</H1>
|
||||
|
||||
<H2>Programs</H2>
|
||||
<P><A HREF="curl-config.html">curl-config.html</A>
|
||||
<P><A HREF="curl.html">curl.html</A>
|
||||
|
||||
<H2>Library routines</H2>
|
||||
<P><A HREF="libcurl.html">libcurl.html</A>
|
||||
<P><A HREF="curl_easy_cleanup.html">curl_easy_cleanup.html</A>
|
||||
<P><A HREF="curl_easy_duphandle.html">curl_easy_duphandle.html</A>
|
||||
<P><A HREF="curl_easy_getinfo.html">curl_easy_getinfo.html</A>
|
||||
<P><A HREF="curl_easy_init.html">curl_easy_init.html</A>
|
||||
<P><A HREF="curl_easy_perform.html">curl_easy_perform.html</A>
|
||||
<P><A HREF="curl_easy_setopt.html">curl_easy_setopt.html</A>
|
||||
<P><A HREF="curl_escape.html">curl_escape.html</A>
|
||||
<P><A HREF="curl_formadd.html">curl_formadd.html</A>
|
||||
<P><A HREF="curl_formfree.html">curl_formfree.html</A>
|
||||
<P><A HREF="curl_formparse.html">curl_formparse.html</A>
|
||||
<P><A HREF="curl_getdate.html">curl_getdate.html</A>
|
||||
<P><A HREF="curl_getenv.html">curl_getenv.html</A>
|
||||
<P><A HREF="curl_global_cleanup.html">curl_global_cleanup.html</A>
|
||||
<P><A HREF="curl_global_init.html">curl_global_init.html</A>
|
||||
<P><A HREF="curl_mprintf.html">curl_mprintf.html</A>
|
||||
<P><A HREF="curl_slist_append.html">curl_slist_append.html</A>
|
||||
<P><A HREF="curl_slist_free_all.html">curl_slist_free_all.html</A>
|
||||
<P><A HREF="curl_strequal.html">curl_strequal.html</A>
|
||||
<P><A HREF="curl_strnequal.html">curl_strnequal.html</A>
|
||||
<P><A HREF="curl_unescape.html">curl_unescape.html</A>
|
||||
<P><A HREF="curl_version.html">curl_version.html</A>
|
||||
</BODY>
|
||||
</HTML>
|
@@ -62,6 +62,7 @@ struct HttpPost {
|
||||
char *contents; /* pointer to allocated data contents */
|
||||
long contentslength; /* length of contents field */
|
||||
char *contenttype; /* Content-Type */
|
||||
struct curl_slist* contentheader; /* list of extra headers for this form */
|
||||
struct HttpPost *more; /* if one field name has more than one file, this
|
||||
link should link to following files */
|
||||
long flags; /* as defined below */
|
||||
@@ -155,6 +156,8 @@ typedef enum {
|
||||
CURLE_OBSOLETE, /* 50 - removed after 7.7.3 */
|
||||
CURLE_SSL_PEER_CERTIFICATE, /* 51 - peer's certificate wasn't ok */
|
||||
CURLE_GOT_NOTHING, /* 52 - when this is a specific error */
|
||||
CURLE_SSL_ENGINE_NOTFOUND, /* 53 - SSL crypto engine not found */
|
||||
CURLE_SSL_ENGINE_SETFAILED, /* 54 - can not set SSL crypto engine as default */
|
||||
|
||||
CURL_LAST /* never use! */
|
||||
} CURLcode;
|
||||
@@ -212,10 +215,8 @@ typedef enum {
|
||||
in the CURLOPT_FLAGS to activate this */
|
||||
CINIT(RANGE, OBJECTPOINT, 7),
|
||||
|
||||
#if 0
|
||||
/* Configuration flags */
|
||||
CINIT(FLAGS, LONG, 8),
|
||||
#endif
|
||||
/* not used */
|
||||
|
||||
/* Specified file stream to upload from (use as input): */
|
||||
CINIT(INFILE, OBJECTPOINT, 9),
|
||||
|
||||
@@ -280,8 +281,10 @@ typedef enum {
|
||||
/* name of the file keeping your private SSL-certificate */
|
||||
CINIT(SSLCERT, OBJECTPOINT, 25),
|
||||
|
||||
/* password for the SSL-certificate */
|
||||
/* password for the SSL-private key, keep this for compatibility */
|
||||
CINIT(SSLCERTPASSWD, OBJECTPOINT, 26),
|
||||
/* password for the SSL private key */
|
||||
CINIT(SSLKEYPASSWD, OBJECTPOINT, 26),
|
||||
|
||||
/* send TYPE parameter? */
|
||||
CINIT(CRLF, LONG, 27),
|
||||
@@ -298,7 +301,7 @@ typedef enum {
|
||||
CINIT(COOKIEFILE, OBJECTPOINT, 31),
|
||||
|
||||
/* What version to specifly try to use.
|
||||
3 = SSLv3, 2 = SSLv2, all else makes it try v3 first then v2 */
|
||||
See CURL_SSLVERSION defines below. */
|
||||
CINIT(SSLVERSION, LONG, 32),
|
||||
|
||||
/* What kind of HTTP time condition to use, see defines */
|
||||
@@ -321,11 +324,8 @@ typedef enum {
|
||||
/* HTTP request, for odd commands like DELETE, TRACE and others */
|
||||
CINIT(STDERR, OBJECTPOINT, 37),
|
||||
|
||||
#if 0
|
||||
/* Progress mode set alternative progress mode displays. Alternative
|
||||
ones should now be made by the client, not the lib! */
|
||||
CINIT(PROGRESSMODE, LONG, 38),
|
||||
#endif
|
||||
/* 38 is not used */
|
||||
|
||||
/* send linked-list of post-transfer QUOTE commands */
|
||||
CINIT(POSTQUOTE, OBJECTPOINT, 39),
|
||||
|
||||
@@ -466,6 +466,28 @@ typedef enum {
|
||||
CURL_HTTP_VERSION* enums set below. */
|
||||
CINIT(HTTP_VERSION, LONG, 84),
|
||||
|
||||
/* Specificly switch on or off the FTP engine's use of the EPSV command. By
|
||||
default, that one will always be attempted before the more traditional
|
||||
PASV command. */
|
||||
CINIT(FTP_USE_EPSV, LONG, 85),
|
||||
|
||||
/* type of the file keeping your SSL-certificate ("DER", "PEM", "ENG") */
|
||||
CINIT(SSLCERTTYPE, OBJECTPOINT, 86),
|
||||
|
||||
/* name of the file keeping your private SSL-key */
|
||||
CINIT(SSLKEY, OBJECTPOINT, 87),
|
||||
|
||||
/* type of the file keeping your private SSL-key ("DER", "PEM", "ENG") */
|
||||
CINIT(SSLKEYTYPE, OBJECTPOINT, 88),
|
||||
|
||||
/* crypto engine for the SSL-sub system */
|
||||
CINIT(SSLENGINE, OBJECTPOINT, 89),
|
||||
|
||||
/* set the crypto engine for the SSL-sub system as default
|
||||
the param has no meaning...
|
||||
*/
|
||||
CINIT(SSLENGINE_DEFAULT, LONG, 90),
|
||||
|
||||
CURLOPT_LASTENTRY /* the last unusued */
|
||||
} CURLoption;
|
||||
|
||||
@@ -480,6 +502,15 @@ enum {
|
||||
CURL_HTTP_VERSION_LAST /* *ILLEGAL* http version */
|
||||
};
|
||||
|
||||
enum {
|
||||
CURL_SSLVERSION_DEFAULT,
|
||||
CURL_SSLVERSION_TLSv1,
|
||||
CURL_SSLVERSION_SSLv2,
|
||||
CURL_SSLVERSION_SSLv3,
|
||||
|
||||
CURL_SSLVERSION_LAST /* never use, keep last */
|
||||
};
|
||||
|
||||
|
||||
typedef enum {
|
||||
TIMECOND_NONE,
|
||||
@@ -534,6 +565,7 @@ typedef enum {
|
||||
CFINIT(ARRAY_START), /* below are the options allowed within a array */
|
||||
CFINIT(FILE),
|
||||
CFINIT(CONTENTTYPE),
|
||||
CFINIT(CONTENTHEADER),
|
||||
CFINIT(END),
|
||||
CFINIT(ARRAY_END), /* up are the options allowed within a array */
|
||||
|
||||
@@ -575,8 +607,8 @@ CURLcode curl_global_init(long flags);
|
||||
void curl_global_cleanup(void);
|
||||
|
||||
/* This is the version number */
|
||||
#define LIBCURL_VERSION "7.9.1"
|
||||
#define LIBCURL_VERSION_NUM 0x070901
|
||||
#define LIBCURL_VERSION "7.9.2"
|
||||
#define LIBCURL_VERSION_NUM 0x070902
|
||||
|
||||
/* linked-list structure for the CURLOPT_QUOTE option (and other) */
|
||||
struct curl_slist {
|
||||
@@ -626,7 +658,9 @@ typedef enum {
|
||||
CURLINFO_CONTENT_LENGTH_DOWNLOAD = CURLINFO_DOUBLE + 15,
|
||||
CURLINFO_CONTENT_LENGTH_UPLOAD = CURLINFO_DOUBLE + 16,
|
||||
|
||||
CURLINFO_LASTONE = 17
|
||||
CURLINFO_STARTTRANSFER_TIME = CURLINFO_DOUBLE + 17,
|
||||
|
||||
CURLINFO_LASTONE = 18
|
||||
} CURLINFO;
|
||||
|
||||
/* unfortunately, the easy.h include file needs the options and info stuff
|
||||
|
@@ -10,9 +10,6 @@ EXTRA_DIST = getdate.y \
|
||||
|
||||
lib_LTLIBRARIES = libcurl.la
|
||||
|
||||
# Some flags needed when trying to cause warnings ;-)
|
||||
# CFLAGS = -DMALLOCDEBUG -g # -Wall #-pedantic
|
||||
|
||||
INCLUDES = -I$(top_srcdir)/include
|
||||
|
||||
|
||||
|
@@ -23,7 +23,7 @@ INCDIRS = -I$(CURNTDIR);$(TOPDIR)/include/
|
||||
# 'BCCDIR' has to be set up in your c:\autoexec.bat
|
||||
# i.e. SET BCCDIR = c:\Borland\BCC55
|
||||
# where c:\Borland\BCC55 is the compiler is installed
|
||||
LINKLIB = $(BCCDIR)/lib/psdk/wsock32.lib
|
||||
LINKLIB = $(BCCDIR)/lib/psdk/ws2_32.lib
|
||||
LIBCURLLIB = libcurl.lib
|
||||
|
||||
.SUFFIXES: .c
|
||||
|
@@ -27,5 +27,5 @@
|
||||
+version.obj &
|
||||
+easy.obj &
|
||||
+strequal.obj &
|
||||
+strtok.obj
|
||||
|
||||
+strtok.obj &
|
||||
+connect.obj
|
||||
|
547
lib/Makefile.vc6
547
lib/Makefile.vc6
@@ -1,377 +1,218 @@
|
||||
#############################################################
|
||||
#
|
||||
## Makefile for building libcurl.lib with MSVC6
|
||||
## Use: nmake -f makefile.vc6 [release | release-ssl | debug]
|
||||
## (default is release)
|
||||
##
|
||||
## Originally written by: Troy Engel <tengel@sonic.net>
|
||||
## Updated by: Craig Davison <cd@securityfocus.com>
|
||||
## Updated by: SM <sm@technologist.com>
|
||||
# Makefile for building libcurl with MSVC6
|
||||
#
|
||||
# Usage: see usage message below
|
||||
# Should be invoked from \lib directory
|
||||
# Edit the paths and desired library name
|
||||
# SSL path is only required if you intend compiling
|
||||
# with SSL.
|
||||
#
|
||||
# This make file leaves the result either a .lib or .dll file
|
||||
# in the \lib directory. It should be called from the \lib
|
||||
# directory.
|
||||
#
|
||||
# An option would have been to allow the source directory to
|
||||
# be specified, but I saw no requirement.
|
||||
#
|
||||
# Another option would have been to leave the .lib and .dll
|
||||
# files in the "cfg" directory, but then the make file
|
||||
# in \src would need to be changed.
|
||||
#
|
||||
##############################################################
|
||||
# CHANGE LOG
|
||||
# ------------------------------------------------------------
|
||||
# 05.11.2001 John Lask Initial Release
|
||||
#
|
||||
#
|
||||
##############################################################
|
||||
|
||||
PROGRAM_NAME = libcurl.lib
|
||||
PROGRAM_NAME_DEBUG = libcurld.lib
|
||||
#OPENSSL_PATH = ../../openssl-0.9.6b
|
||||
LIB_NAME = libcurl
|
||||
LIB_NAME_DEBUG = libcurld
|
||||
OPENSSL_PATH = ../../openssl-0.9.6
|
||||
|
||||
########################################################
|
||||
#############################################################
|
||||
## Nothing more to do below this line!
|
||||
|
||||
## Release
|
||||
CCR = cl.exe /MD /O2 /D "NDEBUG"
|
||||
LINKR = link.exe -lib /out:$(PROGRAM_NAME)
|
||||
|
||||
## Debug
|
||||
CCD = cl.exe /MDd /Gm /ZI /Od /D "_DEBUG" /GZ
|
||||
LINKD = link.exe -lib /out:$(PROGRAM_NAME_DEBUG)
|
||||
|
||||
## SSL Release
|
||||
CCRS = cl.exe /MD /O2 /D "NDEBUG" /D "USE_SSLEAY" /I "$(OPENSSL_PATH)/inc32" /I "$(OPENSSL_PATH)/inc32/openssl"
|
||||
LINKRS = link.exe -lib /out:$(PROGRAM_NAME) /LIBPATH:$(OPENSSL_PATH)/out32dll
|
||||
|
||||
CCNODBG = cl.exe /MD /O2 /D "NDEBUG"
|
||||
CCDEBUG = cl.exe /MDd /Od /Gm /Zi /D "_DEBUG" /GZ
|
||||
CFLAGSSSL = /D "USE_SSLEAY" /I "$(OPENSSL_PATH)/inc32" /I "$(OPENSSL_PATH)/inc32/openssl"
|
||||
CFLAGS = /I "../include" /nologo /W3 /GX /D "WIN32" /D "VC6" /D "_MBCS" /D "_LIB" /YX /FD /c /D "MSDOS"
|
||||
|
||||
LNKDLL = link.exe /DLL /def:libcurl.def
|
||||
LNKLIB = link.exe -lib
|
||||
LFLAGS = /nologo
|
||||
LFLAGSSSL = /LIBPATH:$(OPENSSL_PATH)/out32dll
|
||||
LINKLIBS = ws2_32.lib
|
||||
LINKSLIBS = libeay32.lib ssleay32.lib RSAglue.lib
|
||||
SSLLIBS = libeay32.lib ssleay32.lib RSAglue.lib
|
||||
CFGSET = FALSE
|
||||
|
||||
RELEASE_OBJS= \
|
||||
base64r.obj \
|
||||
cookier.obj \
|
||||
transferr.obj \
|
||||
escaper.obj \
|
||||
formdatar.obj \
|
||||
ftpr.obj \
|
||||
httpr.obj \
|
||||
http_chunksr.obj \
|
||||
ldapr.obj \
|
||||
dictr.obj \
|
||||
telnetr.obj \
|
||||
getdater.obj \
|
||||
getenvr.obj \
|
||||
getpassr.obj \
|
||||
hostipr.obj \
|
||||
if2ipr.obj \
|
||||
mprintfr.obj \
|
||||
netrcr.obj \
|
||||
progressr.obj \
|
||||
sendfr.obj \
|
||||
speedcheckr.obj \
|
||||
ssluser.obj \
|
||||
timevalr.obj \
|
||||
urlr.obj \
|
||||
filer.obj \
|
||||
getinfor.obj \
|
||||
versionr.obj \
|
||||
easyr.obj \
|
||||
strequalr.obj \
|
||||
strtokr.obj \
|
||||
connectr.obj
|
||||
######################
|
||||
# release
|
||||
|
||||
DEBUG_OBJS= \
|
||||
base64d.obj \
|
||||
cookied.obj \
|
||||
transferd.obj \
|
||||
escaped.obj \
|
||||
formdatad.obj \
|
||||
ftpd.obj \
|
||||
httpd.obj \
|
||||
http_chunksd.obj \
|
||||
ldapd.obj \
|
||||
dictd.obj \
|
||||
telnetd.obj \
|
||||
getdated.obj \
|
||||
getenvd.obj \
|
||||
getpassd.obj \
|
||||
hostipd.obj \
|
||||
if2ipd.obj \
|
||||
mprintfd.obj \
|
||||
netrcd.obj \
|
||||
progressd.obj \
|
||||
sendfd.obj \
|
||||
speedcheckd.obj \
|
||||
sslused.obj \
|
||||
timevald.obj \
|
||||
urld.obj \
|
||||
filed.obj \
|
||||
getinfod.obj \
|
||||
versiond.obj \
|
||||
easyd.obj \
|
||||
strequald.obj \
|
||||
strtokd.obj \
|
||||
connectd.obj
|
||||
!IF "$(CFG)" == "release"
|
||||
TARGET =$(LIB_NAME).lib
|
||||
DIROBJ =.\$(CFG)
|
||||
LNK = $(LNKLIB) /out:$(TARGET)
|
||||
CC = $(CCNODBG)
|
||||
CFGSET = TRUE
|
||||
!ENDIF
|
||||
|
||||
RELEASE_SSL_OBJS= \
|
||||
base64rs.obj \
|
||||
cookiers.obj \
|
||||
transferrs.obj \
|
||||
escapers.obj \
|
||||
formdatars.obj \
|
||||
ftprs.obj \
|
||||
httprs.obj \
|
||||
http_chunksrs.obj \
|
||||
ldaprs.obj \
|
||||
dictrs.obj \
|
||||
telnetrs.obj \
|
||||
getdaters.obj \
|
||||
getenvrs.obj \
|
||||
getpassrs.obj \
|
||||
hostiprs.obj \
|
||||
if2iprs.obj \
|
||||
mprintfrs.obj \
|
||||
netrcrs.obj \
|
||||
progressrs.obj \
|
||||
sendfrs.obj \
|
||||
speedcheckrs.obj \
|
||||
sslusers.obj \
|
||||
timevalrs.obj \
|
||||
urlrs.obj \
|
||||
filers.obj \
|
||||
getinfors.obj \
|
||||
versionrs.obj \
|
||||
easyrs.obj \
|
||||
strequalrs.obj \
|
||||
strtokrs.obj \
|
||||
connectrs.obj
|
||||
######################
|
||||
# release-dll
|
||||
|
||||
LINK_OBJS= \
|
||||
base64.obj \
|
||||
cookie.obj \
|
||||
transfer.obj \
|
||||
escape.obj \
|
||||
formdata.obj \
|
||||
ftp.obj \
|
||||
http.obj \
|
||||
http_chunks.obj \
|
||||
ldap.obj \
|
||||
dict.obj \
|
||||
telnet.obj \
|
||||
getdate.obj \
|
||||
getenv.obj \
|
||||
getpass.obj \
|
||||
hostip.obj \
|
||||
if2ip.obj \
|
||||
mprintf.obj \
|
||||
netrc.obj \
|
||||
progress.obj \
|
||||
sendf.obj \
|
||||
speedcheck.obj \
|
||||
ssluse.obj \
|
||||
timeval.obj \
|
||||
url.obj \
|
||||
file.obj \
|
||||
getinfo.obj \
|
||||
version.obj \
|
||||
easy.obj \
|
||||
strequal.obj \
|
||||
strtok.obj \
|
||||
connect.obj
|
||||
!IF "$(CFG)" == "release-dll"
|
||||
TARGET =$(LIB_NAME).dll
|
||||
DIROBJ =.\$(CFG)
|
||||
LNK = $(LNKDLL) /out:$(TARGET) /IMPLIB:"$(LIB_NAME).lib"
|
||||
CC = $(CCNODBG)
|
||||
CFGSET = TRUE
|
||||
!ENDIF
|
||||
|
||||
all : release
|
||||
######################
|
||||
# release-ssl
|
||||
|
||||
release: $(RELEASE_OBJS)
|
||||
$(LINKR) $(LFLAGS) $(LINKLIBS) $(LINK_OBJS)
|
||||
!IF "$(CFG)" == "release-ssl"
|
||||
TARGET =$(LIB_NAME).lib
|
||||
DIROBJ =.\$(CFG)
|
||||
LNK = $(LNKLIB) $(LFLAGSSSL) /out:$(TARGET)
|
||||
LINKLIBS = $(LINKLIBS) $(SSLLIBS)
|
||||
CC = $(CCNODBG) $(CFLAGSSSL)
|
||||
CFGSET = TRUE
|
||||
!ENDIF
|
||||
|
||||
debug: $(DEBUG_OBJS)
|
||||
$(LINKD) $(LFLAGS) $(LINKLIBS) $(LINK_OBJS)
|
||||
######################
|
||||
# release-ssl-dll
|
||||
|
||||
release-ssl: $(RELEASE_SSL_OBJS)
|
||||
$(LINKRS) $(LFLAGS) $(LINKLIBS) $(LINKSLIBS) $(LINK_OBJS)
|
||||
!IF "$(CFG)" == "release-ssl-dll"
|
||||
TARGET =$(LIB_NAME).dll
|
||||
DIROBJ =.\$(CFG)
|
||||
LNK = $(LNKDLL) $(LFLAGSSSL) /out:$(TARGET) /IMPLIB:"$(LIB_NAME).lib"
|
||||
LINKLIBS = $(LINKLIBS) $(SSLLIBS)
|
||||
CC = $(CCNODBG) $(CFLAGSSSL)
|
||||
CFGSET = TRUE
|
||||
!ENDIF
|
||||
|
||||
## Release
|
||||
base64r.obj: base64.c
|
||||
$(CCR) $(CFLAGS) base64.c
|
||||
cookier.obj: cookie.c
|
||||
$(CCR) $(CFLAGS) cookie.c
|
||||
transferr.obj: transfer.c
|
||||
$(CCR) $(CFLAGS) transfer.c
|
||||
escaper.obj: escape.c
|
||||
$(CCR) $(CFLAGS) escape.c
|
||||
formdatar.obj: formdata.c
|
||||
$(CCR) $(CFLAGS) formdata.c
|
||||
ftpr.obj: ftp.c
|
||||
$(CCR) $(CFLAGS) ftp.c
|
||||
httpr.obj: http.c
|
||||
$(CCR) $(CFLAGS) http.c
|
||||
http_chunksr.obj: http_chunks.c
|
||||
$(CCR) $(CFLAGS) http_chunks.c
|
||||
ldapr.obj: ldap.c
|
||||
$(CCR) $(CFLAGS) ldap.c
|
||||
dictr.obj: dict.c
|
||||
$(CCR) $(CFLAGS) dict.c
|
||||
telnetr.obj: telnet.c
|
||||
$(CCR) $(CFLAGS) telnet.c
|
||||
getdater.obj: getdate.c
|
||||
$(CCR) $(CFLAGS) getdate.c
|
||||
getenvr.obj: getenv.c
|
||||
$(CCR) $(CFLAGS) getenv.c
|
||||
getpassr.obj: getpass.c
|
||||
$(CCR) $(CFLAGS) getpass.c
|
||||
hostipr.obj: hostip.c
|
||||
$(CCR) $(CFLAGS) hostip.c
|
||||
if2ipr.obj: if2ip.c
|
||||
$(CCR) $(CFLAGS) if2ip.c
|
||||
mprintfr.obj: mprintf.c
|
||||
$(CCR) $(CFLAGS) mprintf.c
|
||||
netrcr.obj: netrc.c
|
||||
$(CCR) $(CFLAGS) netrc.c
|
||||
progressr.obj: progress.c
|
||||
$(CCR) $(CFLAGS) progress.c
|
||||
sendfr.obj: sendf.c
|
||||
$(CCR) $(CFLAGS) sendf.c
|
||||
speedcheckr.obj: speedcheck.c
|
||||
$(CCR) $(CFLAGS) speedcheck.c
|
||||
ssluser.obj: ssluse.c
|
||||
$(CCR) $(CFLAGS) ssluse.c
|
||||
timevalr.obj: timeval.c
|
||||
$(CCR) $(CFLAGS) timeval.c
|
||||
urlr.obj: url.c
|
||||
$(CCR) $(CFLAGS) url.c
|
||||
filer.obj: file.c
|
||||
$(CCR) $(CFLAGS) file.c
|
||||
getinfor.obj: getinfo.c
|
||||
$(CCR) $(CFLAGS) getinfo.c
|
||||
versionr.obj: version.c
|
||||
$(CCR) $(CFLAGS) version.c
|
||||
easyr.obj: easy.c
|
||||
$(CCR) $(CFLAGS) easy.c
|
||||
strequalr.obj: strequal.c
|
||||
$(CCR) $(CFLAGS) strequal.c
|
||||
strtokr.obj:strtok.c
|
||||
$(CCR) $(CFLAGS) strtok.c
|
||||
connectr.obj:connect.c
|
||||
$(CCR) $(CFLAGS) connect.c
|
||||
|
||||
## Debug
|
||||
base64d.obj: base64.c
|
||||
$(CCD) $(CFLAGS) base64.c
|
||||
cookied.obj: cookie.c
|
||||
$(CCD) $(CFLAGS) cookie.c
|
||||
transferd.obj: transfer.c
|
||||
$(CCD) $(CFLAGS) transfer.c
|
||||
escaped.obj: escape.c
|
||||
$(CCD) $(CFLAGS) escape.c
|
||||
formdatad.obj: formdata.c
|
||||
$(CCD) $(CFLAGS) formdata.c
|
||||
ftpd.obj: ftp.c
|
||||
$(CCD) $(CFLAGS) ftp.c
|
||||
httpd.obj: http.c
|
||||
$(CCD) $(CFLAGS) http.c
|
||||
http_chunksd.obj: http_chunks.c
|
||||
$(CCD) $(CFLAGS) http_chunks.c
|
||||
ldapd.obj: ldap.c
|
||||
$(CCD) $(CFLAGS) ldap.c
|
||||
dictd.obj: dict.c
|
||||
$(CCD) $(CFLAGS) dict.c
|
||||
telnetd.obj: telnet.c
|
||||
$(CCD) $(CFLAGS) telnet.c
|
||||
getdated.obj: getdate.c
|
||||
$(CCD) $(CFLAGS) getdate.c
|
||||
getenvd.obj: getenv.c
|
||||
$(CCD) $(CFLAGS) getenv.c
|
||||
getpassd.obj: getpass.c
|
||||
$(CCD) $(CFLAGS) getpass.c
|
||||
hostipd.obj: hostip.c
|
||||
$(CCD) $(CFLAGS) hostip.c
|
||||
if2ipd.obj: if2ip.c
|
||||
$(CCD) $(CFLAGS) if2ip.c
|
||||
mprintfd.obj: mprintf.c
|
||||
$(CCD) $(CFLAGS) mprintf.c
|
||||
netrcd.obj: netrc.c
|
||||
$(CCD) $(CFLAGS) netrc.c
|
||||
progressd.obj: progress.c
|
||||
$(CCD) $(CFLAGS) progress.c
|
||||
sendfd.obj: sendf.c
|
||||
$(CCD) $(CFLAGS) sendf.c
|
||||
speedcheckd.obj: speedcheck.c
|
||||
$(CCD) $(CFLAGS) speedcheck.c
|
||||
sslused.obj: ssluse.c
|
||||
$(CCD) $(CFLAGS) ssluse.c
|
||||
timevald.obj: timeval.c
|
||||
$(CCD) $(CFLAGS) timeval.c
|
||||
urld.obj: url.c
|
||||
$(CCD) $(CFLAGS) url.c
|
||||
filed.obj: file.c
|
||||
$(CCD) $(CFLAGS) file.c
|
||||
getinfod.obj: getinfo.c
|
||||
$(CCD) $(CFLAGS) getinfo.c
|
||||
versiond.obj: version.c
|
||||
$(CCD) $(CFLAGS) version.c
|
||||
easyd.obj: easy.c
|
||||
$(CCD) $(CFLAGS) easy.c
|
||||
strequald.obj: strequal.c
|
||||
$(CCD) $(CFLAGS) strequal.c
|
||||
strtokd.obj:strtok.c
|
||||
$(CCD) $(CFLAGS) strtok.c
|
||||
connectd.obj:connect.c
|
||||
$(CCR) $(CFLAGS) connect.c
|
||||
|
||||
## Release SSL
|
||||
base64rs.obj: base64.c
|
||||
$(CCRS) $(CFLAGS) base64.c
|
||||
cookiers.obj: cookie.c
|
||||
$(CCRS) $(CFLAGS) cookie.c
|
||||
transferrs.obj: transfer.c
|
||||
$(CCRS) $(CFLAGS) transfer.c
|
||||
escapers.obj: escape.c
|
||||
$(CCRS) $(CFLAGS) escape.c
|
||||
formdatars.obj: formdata.c
|
||||
$(CCRS) $(CFLAGS) formdata.c
|
||||
ftprs.obj: ftp.c
|
||||
$(CCRS) $(CFLAGS) ftp.c
|
||||
httprs.obj: http.c
|
||||
$(CCRS) $(CFLAGS) http.c
|
||||
http_chunksrs.obj: http_chunks.c
|
||||
$(CCRS) $(CFLAGS) http_chunks.c
|
||||
ldaprs.obj: ldap.c
|
||||
$(CCRS) $(CFLAGS) ldap.c
|
||||
dictrs.obj: dict.c
|
||||
$(CCRS) $(CFLAGS) dict.c
|
||||
telnetrs.obj: telnet.c
|
||||
$(CCRS) $(CFLAGS) telnet.c
|
||||
getdaters.obj: getdate.c
|
||||
$(CCRS) $(CFLAGS) getdate.c
|
||||
getenvrs.obj: getenv.c
|
||||
$(CCRS) $(CFLAGS) getenv.c
|
||||
getpassrs.obj: getpass.c
|
||||
$(CCRS) $(CFLAGS) getpass.c
|
||||
hostiprs.obj: hostip.c
|
||||
$(CCRS) $(CFLAGS) hostip.c
|
||||
if2iprs.obj: if2ip.c
|
||||
$(CCRS) $(CFLAGS) if2ip.c
|
||||
mprintfrs.obj: mprintf.c
|
||||
$(CCRS) $(CFLAGS) mprintf.c
|
||||
netrcrs.obj: netrc.c
|
||||
$(CCRS) $(CFLAGS) netrc.c
|
||||
progressrs.obj: progress.c
|
||||
$(CCRS) $(CFLAGS) progress.c
|
||||
sendfrs.obj: sendf.c
|
||||
$(CCRS) $(CFLAGS) sendf.c
|
||||
speedcheckrs.obj: speedcheck.c
|
||||
$(CCRS) $(CFLAGS) speedcheck.c
|
||||
sslusers.obj: ssluse.c
|
||||
$(CCRS) $(CFLAGS) ssluse.c
|
||||
timevalrs.obj: timeval.c
|
||||
$(CCRS) $(CFLAGS) timeval.c
|
||||
urlrs.obj: url.c
|
||||
$(CCRS) $(CFLAGS) url.c
|
||||
filers.obj: file.c
|
||||
$(CCRS) $(CFLAGS) file.c
|
||||
getinfors.obj: getinfo.c
|
||||
$(CCRS) $(CFLAGS) getinfo.c
|
||||
versionrs.obj: version.c
|
||||
$(CCRS) $(CFLAGS) version.c
|
||||
easyrs.obj: easy.c
|
||||
$(CCRS) $(CFLAGS) easy.c
|
||||
strequalrs.obj: strequal.c
|
||||
$(CCRS) $(CFLAGS) strequal.c
|
||||
strtokrs.obj:strtok.c
|
||||
$(CCRS) $(CFLAGS) strtok.c
|
||||
connectrs.obj:connect.c
|
||||
$(CCR) $(CFLAGS) connect.c
|
||||
|
||||
######################
|
||||
# debug
|
||||
|
||||
!IF "$(CFG)" == "debug"
|
||||
TARGET =$(LIB_NAME_DEBUG).lib
|
||||
DIROBJ =.\$(CFG)
|
||||
LNK = $(LNKLIB) /out:$(TARGET)
|
||||
CC = $(CCDEBUG)
|
||||
CFGSET = TRUE
|
||||
!ENDIF
|
||||
|
||||
######################
|
||||
# debug-dll
|
||||
|
||||
!IF "$(CFG)" == "debug-dll"
|
||||
TARGET =$(LIB_NAME_DEBUG).dll
|
||||
DIROBJ =.\$(CFG)
|
||||
LNK = $(LNKDLL) /out:$(TARGET) /IMPLIB:"$(LIB_NAME_DEBUG).lib"
|
||||
CC = $(CCDEBUG)
|
||||
CFGSET = TRUE
|
||||
!ENDIF
|
||||
|
||||
######################
|
||||
# debug-ssl
|
||||
#todo
|
||||
!IF "$(CFG)" == "debug-ssl"
|
||||
TARGET = $(LIB_NAME_DEBUG).lib
|
||||
DIROBJ =.\$(CFG)
|
||||
LNK = $(LNKLIB) $(LFLAGSSSL) /out:$(TARGET)
|
||||
LINKLIBS = $(LINKLIBS) $(SSLLIBS)
|
||||
CC = $(CCDEBUG) $(CFLAGSSSL)
|
||||
CFGSET = TRUE
|
||||
!ENDIF
|
||||
|
||||
######################
|
||||
# debug-ssl-dll
|
||||
|
||||
!IF "$(CFG)" == "debug-ssl-dll"
|
||||
TARGET =$(LIB_NAME_DEBUG).dll
|
||||
DIROBJ =.\$(CFG)
|
||||
LNK = $(LNKDLL) $(LFLAGSSSL) /out:$(TARGET) /IMPLIB:"$(LIB_NAME_DEBUG).lib"
|
||||
LINKLIBS = $(LINKLIBS) $(SSLLIBS)
|
||||
CC = $(CCDEBUG) $(CFLAGSSSL)
|
||||
CFGSET = TRUE
|
||||
!ENDIF
|
||||
|
||||
#######################
|
||||
# Usage
|
||||
#
|
||||
!IF "$(CFGSET)" == "FALSE"
|
||||
!MESSAGE Usage: nmake -f makefile.vc6 CFG=<config> <target>
|
||||
!MESSAGE where <config> is one of:
|
||||
!MESSAGE release - release static library
|
||||
!MESSAGE release-dll - release dll
|
||||
!MESSAGE release-ssl - release static library with ssl
|
||||
!MESSAGE release-ssl-dll - release dll library with ssl
|
||||
!MESSAGE debug - debug static library
|
||||
!MESSAGE debug-dll - debug dll
|
||||
!MESSAGE debug-ssl - debug static library with ssl
|
||||
!MESSAGE debug-ssl-dll - debug dll library with ssl
|
||||
!MESSAGE <target> can be left blank in which case all is assumed
|
||||
!ERROR please choose a valid configuration "$(CFG)"
|
||||
!ENDIF
|
||||
|
||||
#######################
|
||||
#
|
||||
X_OBJS= \
|
||||
$(DIROBJ)\base64.obj \
|
||||
$(DIROBJ)\cookie.obj \
|
||||
$(DIROBJ)\transfer.obj \
|
||||
$(DIROBJ)\escape.obj \
|
||||
$(DIROBJ)\formdata.obj \
|
||||
$(DIROBJ)\ftp.obj \
|
||||
$(DIROBJ)\http.obj \
|
||||
$(DIROBJ)\http_chunks.obj \
|
||||
$(DIROBJ)\ldap.obj \
|
||||
$(DIROBJ)\dict.obj \
|
||||
$(DIROBJ)\telnet.obj \
|
||||
$(DIROBJ)\getdate.obj \
|
||||
$(DIROBJ)\getenv.obj \
|
||||
$(DIROBJ)\getpass.obj \
|
||||
$(DIROBJ)\hostip.obj \
|
||||
$(DIROBJ)\if2ip.obj \
|
||||
$(DIROBJ)\mprintf.obj \
|
||||
$(DIROBJ)\netrc.obj \
|
||||
$(DIROBJ)\progress.obj \
|
||||
$(DIROBJ)\sendf.obj \
|
||||
$(DIROBJ)\speedcheck.obj \
|
||||
$(DIROBJ)\ssluse.obj \
|
||||
$(DIROBJ)\timeval.obj \
|
||||
$(DIROBJ)\url.obj \
|
||||
$(DIROBJ)\file.obj \
|
||||
$(DIROBJ)\getinfo.obj \
|
||||
$(DIROBJ)\version.obj \
|
||||
$(DIROBJ)\easy.obj \
|
||||
$(DIROBJ)\strequal.obj \
|
||||
$(DIROBJ)\strtok.obj \
|
||||
$(DIROBJ)\connect.obj
|
||||
|
||||
|
||||
all : $(TARGET)
|
||||
|
||||
|
||||
$(TARGET): $(X_OBJS)
|
||||
$(LNK) $(LFLAGS) $(LINKLIBS) $(X_OBJS)
|
||||
|
||||
$(X_OBJS): $(DIROBJ)
|
||||
|
||||
$(DIROBJ):
|
||||
@if not exist "$(DIROBJ)" mkdir $(DIROBJ)
|
||||
|
||||
.SUFFIXES: .c .obj
|
||||
|
||||
{.\}.c{$(DIROBJ)\}.obj:
|
||||
$(CC) $(CFLAGS) /Fo"$@" $<
|
||||
|
||||
clean:
|
||||
-@erase *.obj
|
||||
-@erase $(DIROBJ)\*.obj
|
||||
-@erase vc60.idb
|
||||
-@erase vc60.pch
|
||||
|
||||
distrib: clean
|
||||
-@erase $(PROGRAM_NAME)
|
||||
|
||||
|
@@ -42,7 +42,7 @@
|
||||
static const char *telnetoptions[]=
|
||||
{
|
||||
"BINARY", "ECHO", "RCP", "SUPPRESS GO AHEAD",
|
||||
"NAME", "STATUS" "TIMING MARK", "RCTE",
|
||||
"NAME", "STATUS", "TIMING MARK", "RCTE",
|
||||
"NAOL", "NAOP", "NAOCRD", "NAOHTS",
|
||||
"NAOHTD", "NAOFFD", "NAOVTS", "NAOVTD",
|
||||
"NAOLFD", "EXTEND ASCII", "LOGOUT", "BYTE MACRO",
|
||||
|
@@ -44,6 +44,10 @@
|
||||
#ifdef HAVE_ARPA_INET_H
|
||||
#include <arpa/inet.h>
|
||||
#endif
|
||||
#ifdef HAVE_STDLIB_H
|
||||
#include <stdlib.h> /* required for free() prototype, without it, this crashes
|
||||
on macos 68K */
|
||||
#endif
|
||||
|
||||
#endif
|
||||
#include <stdio.h>
|
||||
@@ -61,6 +65,7 @@
|
||||
#include <winsock.h>
|
||||
#define EINPROGRESS WSAEINPROGRESS
|
||||
#define EWOULDBLOCK WSAEWOULDBLOCK
|
||||
#define EISCONN WSAEISCONN
|
||||
#endif
|
||||
|
||||
#include "urldata.h"
|
||||
@@ -188,7 +193,7 @@ static CURLcode bindlocal(struct connectdata *conn,
|
||||
#ifdef HAVE_INET_NTOA
|
||||
|
||||
#ifndef INADDR_NONE
|
||||
#define INADDR_NONE (unsigned long) ~0
|
||||
#define INADDR_NONE (in_addr_t) ~0
|
||||
#endif
|
||||
|
||||
struct SessionHandle *data = conn->data;
|
||||
@@ -202,7 +207,7 @@ static CURLcode bindlocal(struct connectdata *conn,
|
||||
char *hostdataptr=NULL;
|
||||
size_t size;
|
||||
char myhost[256] = "";
|
||||
unsigned long in;
|
||||
in_addr_t in;
|
||||
|
||||
if(Curl_if2ip(data->set.device, myhost, sizeof(myhost))) {
|
||||
h = Curl_getaddrinfo(data, myhost, 0, &hostdataptr);
|
||||
@@ -231,7 +236,8 @@ static CURLcode bindlocal(struct connectdata *conn,
|
||||
|
||||
infof(data, "We bind local end to %s\n", myhost);
|
||||
|
||||
if ( (in=inet_addr(myhost)) != INADDR_NONE ) {
|
||||
in=inet_addr(myhost);
|
||||
if (INADDR_NONE != in) {
|
||||
|
||||
if ( h ) {
|
||||
memset((char *)&sa, 0, sizeof(sa));
|
||||
@@ -279,7 +285,7 @@ static CURLcode bindlocal(struct connectdata *conn,
|
||||
failf(data, "Insufficient kernel memory was available: %d", errno);
|
||||
break;
|
||||
default:
|
||||
failf(data, "errno %d\n", errno);
|
||||
failf(data, "errno %d", errno);
|
||||
break;
|
||||
} /* end of switch(errno) */
|
||||
|
||||
@@ -309,9 +315,8 @@ static CURLcode bindlocal(struct connectdata *conn,
|
||||
|
||||
return CURLE_HTTP_PORT_FAILED;
|
||||
}
|
||||
#else /* end of ipv4-specific section */
|
||||
#endif /* end of ipv4-specific section */
|
||||
|
||||
/* we only use socketerror() on IPv6-enabled machines */
|
||||
static
|
||||
int socketerror(int sockfd)
|
||||
{
|
||||
@@ -324,7 +329,6 @@ int socketerror(int sockfd)
|
||||
|
||||
return err;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* TCP connect to the given host with timeout, proxy or remote doesn't matter.
|
||||
@@ -525,6 +529,16 @@ CURLcode Curl_connecthost(struct connectdata *conn, /* context */
|
||||
}
|
||||
}
|
||||
|
||||
if(0 == rc) {
|
||||
int err = socketerror(sockfd);
|
||||
if ((0 == err) || (EISCONN == err)) {
|
||||
/* we are connected, awesome! */
|
||||
break;
|
||||
}
|
||||
/* nope, not connected for real */
|
||||
rc = -1;
|
||||
}
|
||||
|
||||
if(0 != rc) {
|
||||
/* get a new timeout for next attempt */
|
||||
after = Curl_tvnow();
|
||||
@@ -542,6 +556,7 @@ CURLcode Curl_connecthost(struct connectdata *conn, /* context */
|
||||
/* no good connect was made */
|
||||
sclose(sockfd);
|
||||
*sockconn = -1;
|
||||
failf(data, "Couldn't connect to host");
|
||||
return CURLE_COULDNT_CONNECT;
|
||||
}
|
||||
|
||||
|
@@ -28,7 +28,7 @@ int Curl_nonblock(int socket, /* operate on this */
|
||||
|
||||
CURLcode Curl_connecthost(struct connectdata *conn,
|
||||
Curl_addrinfo *host, /* connect to this */
|
||||
long port, /* connect to this port number */
|
||||
int port, /* connect to this port number */
|
||||
int *sockconn, /* not set if error is returned */
|
||||
Curl_ipconnect **addr /* the one we used */
|
||||
); /* index we used */
|
||||
|
@@ -121,7 +121,7 @@ CURLcode Curl_dict(struct connectdata *conn)
|
||||
}
|
||||
|
||||
if ((word == NULL) || (*word == (char)0)) {
|
||||
failf(data, "lookup word is missing\n");
|
||||
failf(data, "lookup word is missing");
|
||||
}
|
||||
if ((database == NULL) || (*database == (char)0)) {
|
||||
database = (char *)"!";
|
||||
@@ -174,7 +174,7 @@ CURLcode Curl_dict(struct connectdata *conn)
|
||||
}
|
||||
|
||||
if ((word == NULL) || (*word == (char)0)) {
|
||||
failf(data, "lookup word is missing\n");
|
||||
failf(data, "lookup word is missing");
|
||||
}
|
||||
if ((database == NULL) || (*database == (char)0)) {
|
||||
database = (char *)"!";
|
||||
|
@@ -402,6 +402,7 @@ static struct HttpPost * AddHttpPost (char * name,
|
||||
long contentslength,
|
||||
char *contenttype,
|
||||
long flags,
|
||||
struct curl_slist* contentHeader,
|
||||
struct HttpPost *parent_post,
|
||||
struct HttpPost **httppost,
|
||||
struct HttpPost **last_post)
|
||||
@@ -415,6 +416,7 @@ static struct HttpPost * AddHttpPost (char * name,
|
||||
post->contents = value;
|
||||
post->contentslength = contentslength;
|
||||
post->contenttype = contenttype;
|
||||
post->contentheader = contentHeader;
|
||||
post->flags = flags;
|
||||
}
|
||||
else
|
||||
@@ -823,6 +825,21 @@ FORMcode FormAdd(struct HttpPost **httppost,
|
||||
}
|
||||
break;
|
||||
}
|
||||
case CURLFORM_CONTENTHEADER:
|
||||
{
|
||||
struct curl_slist* list = NULL;
|
||||
if( array_state )
|
||||
list = (struct curl_slist*)array_value;
|
||||
else
|
||||
list = va_arg(params,struct curl_slist*);
|
||||
|
||||
if( current_form->contentheader )
|
||||
return_value = FORMADD_OPTION_TWICE;
|
||||
else
|
||||
current_form->contentheader = list;
|
||||
|
||||
break;
|
||||
}
|
||||
default:
|
||||
fprintf (stderr, "got unknown CURLFORM_OPTION: %d\n", option);
|
||||
return_value = FORMADD_UNKNOWN_OPTION;
|
||||
@@ -872,13 +889,16 @@ FORMcode FormAdd(struct HttpPost **httppost,
|
||||
break;
|
||||
}
|
||||
}
|
||||
if ( (post = AddHttpPost(form->name, form->namelength,
|
||||
post = AddHttpPost(form->name, form->namelength,
|
||||
form->value, form->contentslength,
|
||||
form->contenttype, form->flags,
|
||||
form->contentheader,
|
||||
post, httppost,
|
||||
last_post)) == NULL) {
|
||||
last_post);
|
||||
|
||||
if(!post)
|
||||
return_value = FORMADD_MEMORY;
|
||||
}
|
||||
|
||||
if (form->contenttype)
|
||||
prevtype = form->contenttype;
|
||||
}
|
||||
@@ -923,7 +943,7 @@ static int AddFormData(struct FormData **formp,
|
||||
length = strlen((char *)line);
|
||||
|
||||
newform->line = (char *)malloc(length+1);
|
||||
memcpy(newform->line, line, length+1);
|
||||
memcpy(newform->line, line, length);
|
||||
newform->length = length;
|
||||
newform->line[length]=0; /* zero terminate for easier debugging */
|
||||
|
||||
@@ -1029,6 +1049,8 @@ struct FormData *Curl_getFormData(struct HttpPost *post,
|
||||
int size =0;
|
||||
char *boundary;
|
||||
char *fileboundary=NULL;
|
||||
struct curl_slist* curList;
|
||||
|
||||
|
||||
if(!post)
|
||||
return NULL; /* no input => no output! */
|
||||
@@ -1090,6 +1112,13 @@ struct FormData *Curl_getFormData(struct HttpPost *post,
|
||||
file->contenttype);
|
||||
}
|
||||
|
||||
curList = file->contentheader;
|
||||
while( curList ) {
|
||||
/* Process the additional headers specified for this form */
|
||||
size += AddFormDataf( &form, "\r\n%s", curList->data );
|
||||
curList = curList->next;
|
||||
}
|
||||
|
||||
#if 0
|
||||
/* The header Content-Transfer-Encoding: seems to confuse some receivers
|
||||
* (like the built-in PHP engine). While I can't see any reason why it
|
||||
|
@@ -44,6 +44,7 @@ typedef struct FormInfo {
|
||||
long contentslength;
|
||||
char *contenttype;
|
||||
long flags;
|
||||
struct curl_slist* contentheader;
|
||||
struct FormInfo *more;
|
||||
} FormInfo;
|
||||
|
||||
|
225
lib/ftp.c
225
lib/ftp.c
@@ -197,6 +197,8 @@ int Curl_GetFTPResponse(char *buf,
|
||||
#define SELECT_TIMEOUT 2
|
||||
int error = SELECT_OK;
|
||||
|
||||
struct FTP *ftp = conn->proto.ftp;
|
||||
|
||||
if (ftpcode)
|
||||
*ftpcode = 0; /* 0 for errors */
|
||||
|
||||
@@ -229,6 +231,7 @@ int Curl_GetFTPResponse(char *buf,
|
||||
interval.tv_sec = timeout;
|
||||
interval.tv_usec = 0;
|
||||
|
||||
if(!ftp->cache)
|
||||
switch (select (sockfd+1, &readfd, NULL, NULL, &interval)) {
|
||||
case -1: /* select() error, stop reading */
|
||||
error = SELECT_ERROR;
|
||||
@@ -239,13 +242,30 @@ int Curl_GetFTPResponse(char *buf,
|
||||
failf(data, "Transfer aborted due to timeout");
|
||||
break;
|
||||
default:
|
||||
error = SELECT_OK;
|
||||
break;
|
||||
}
|
||||
if(SELECT_OK == error) {
|
||||
/*
|
||||
* This code previously didn't use the kerberos sec_read() code
|
||||
* to read, but when we use Curl_read() it may do so. Do confirm
|
||||
* that this is still ok and then remove this comment!
|
||||
*/
|
||||
if(CURLE_OK != Curl_read(conn, sockfd, ptr, BUFSIZE-nread, &gotbytes))
|
||||
if(ftp->cache) {
|
||||
/* we had data in the "cache", copy that instead of doing an actual
|
||||
read */
|
||||
memcpy(ptr, ftp->cache, ftp->cache_size);
|
||||
gotbytes = ftp->cache_size;
|
||||
free(ftp->cache); /* free the cache */
|
||||
ftp->cache = NULL; /* clear the pointer */
|
||||
ftp->cache_size = 0; /* zero the size just in case */
|
||||
}
|
||||
else if(CURLE_OK != Curl_read(conn, sockfd, ptr,
|
||||
BUFSIZE-nread, &gotbytes))
|
||||
keepon = FALSE;
|
||||
|
||||
if(!keepon)
|
||||
;
|
||||
else if(gotbytes <= 0) {
|
||||
keepon = FALSE;
|
||||
error = SELECT_ERROR;
|
||||
@@ -279,20 +299,35 @@ int Curl_GetFTPResponse(char *buf,
|
||||
* line to the start of the buffer and zero terminate,
|
||||
* for old times sake (and krb4)! */
|
||||
char *meow;
|
||||
int i;
|
||||
for(meow=line_start, i=0; meow<ptr; meow++, i++)
|
||||
buf[i] = *meow;
|
||||
meow[i]=0; /* zero terminate */
|
||||
int n;
|
||||
for(meow=line_start, n=0; meow<ptr; meow++, n++)
|
||||
buf[n] = *meow;
|
||||
*meow=0; /* zero terminate */
|
||||
keepon=FALSE;
|
||||
line_start = ptr+1; /* advance pointer */
|
||||
i++; /* skip this before getting out */
|
||||
break;
|
||||
}
|
||||
perline=0; /* line starts over here */
|
||||
line_start = ptr+1;
|
||||
}
|
||||
}
|
||||
if(!keepon && (i != gotbytes)) {
|
||||
/* We found the end of the response lines, but we didn't parse the
|
||||
full chunk of data we have read from the server. We therefore
|
||||
need to store the rest of the data to be checked on the next
|
||||
invoke as it may actually contain another end of response
|
||||
already! Cleverly figured out by Eric Lavigne in December
|
||||
2001. */
|
||||
ftp->cache_size = gotbytes - i;
|
||||
ftp->cache = (char *)malloc(ftp->cache_size);
|
||||
if(ftp->cache)
|
||||
memcpy(ftp->cache, line_start, ftp->cache_size);
|
||||
else
|
||||
return CURLE_OUT_OF_MEMORY; /**BANG**/
|
||||
}
|
||||
break;
|
||||
} /* switch */
|
||||
} /* there was data */
|
||||
} /* if(no error) */
|
||||
} /* while there's buffer left and loop is requested */
|
||||
|
||||
if(!error)
|
||||
@@ -558,6 +593,7 @@ CURLcode Curl_ftp_done(struct connectdata *conn)
|
||||
ssize_t nread;
|
||||
char *buf = data->state.buffer; /* this is our buffer */
|
||||
int ftpcode;
|
||||
CURLcode result=CURLE_OK;
|
||||
|
||||
if(data->set.upload) {
|
||||
if((-1 != data->set.infilesize) && (data->set.infilesize != *ftp->bytecountp)) {
|
||||
@@ -575,8 +611,12 @@ CURLcode Curl_ftp_done(struct connectdata *conn)
|
||||
else if(!conn->bits.resume_done &&
|
||||
!data->set.no_body &&
|
||||
(0 == *ftp->bytecountp)) {
|
||||
/* We consider this an error, but there's no true FTP error received
|
||||
why we need to continue to "read out" the server response too.
|
||||
We don't want to leave a "waiting" server reply if we'll get told
|
||||
to make a second request on this same connection! */
|
||||
failf(data, "No data was received!");
|
||||
return CURLE_FTP_COULDNT_RETR_FILE;
|
||||
result = CURLE_FTP_COULDNT_RETR_FILE;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -604,12 +644,10 @@ CURLcode Curl_ftp_done(struct connectdata *conn)
|
||||
conn->bits.resume_done = FALSE; /* clean this for next connection */
|
||||
|
||||
/* Send any post-transfer QUOTE strings? */
|
||||
if(data->set.postquote) {
|
||||
CURLcode result = ftp_sendquote(conn, data->set.postquote);
|
||||
return result;
|
||||
}
|
||||
if(!result && data->set.postquote)
|
||||
result = ftp_sendquote(conn, data->set.postquote);
|
||||
|
||||
return CURLE_OK;
|
||||
return result;
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
@@ -633,8 +671,7 @@ CURLcode ftp_sendquote(struct connectdata *conn, struct curl_slist *quote)
|
||||
if (item->data) {
|
||||
FTPSENDF(conn, "%s", item->data);
|
||||
|
||||
nread = Curl_GetFTPResponse(
|
||||
conn->data->state.buffer, conn, &ftpcode);
|
||||
nread = Curl_GetFTPResponse(conn->data->state.buffer, conn, &ftpcode);
|
||||
if (nread < 0)
|
||||
return CURLE_OPERATION_TIMEOUTED;
|
||||
|
||||
@@ -810,10 +847,10 @@ ftp_pasv_verbose(struct connectdata *conn,
|
||||
#ifdef HAVE_INET_NTOA_R
|
||||
char ntoa_buf[64];
|
||||
#endif
|
||||
char hostent_buf[8192];
|
||||
char hostent_buf[9000];
|
||||
|
||||
#if defined(HAVE_INET_ADDR)
|
||||
unsigned long address;
|
||||
in_addr_t address;
|
||||
# if defined(HAVE_GETHOSTBYADDR_R)
|
||||
int h_errnop;
|
||||
# endif
|
||||
@@ -822,12 +859,19 @@ ftp_pasv_verbose(struct connectdata *conn,
|
||||
# ifdef HAVE_GETHOSTBYADDR_R
|
||||
|
||||
# ifdef HAVE_GETHOSTBYADDR_R_5
|
||||
/* AIX, Digital Unix style:
|
||||
/* AIX, Digital Unix (OSF1, Tru64) style:
|
||||
extern int gethostbyaddr_r(char *addr, size_t len, int type,
|
||||
struct hostent *htent, struct hostent_data *ht_data); */
|
||||
|
||||
/* Fred Noz helped me try this out, now it at least compiles! */
|
||||
|
||||
/* Bjorn Reese (November 28 2001):
|
||||
The Tru64 man page on gethostbyaddr_r() says that
|
||||
the hostent struct must be filled with zeroes before the call to
|
||||
gethostbyaddr_r(). */
|
||||
|
||||
memset(hostent_buf, 0, sizeof(struct hostent));
|
||||
|
||||
if(gethostbyaddr_r((char *) &address,
|
||||
sizeof(address), AF_INET,
|
||||
(struct hostent *)hostent_buf,
|
||||
@@ -1125,7 +1169,6 @@ CURLcode ftp_use_port(struct connectdata *conn)
|
||||
struct sockaddr_in sa;
|
||||
struct hostent *h=NULL;
|
||||
char *hostdataptr=NULL;
|
||||
size_t size;
|
||||
unsigned short porttouse;
|
||||
char myhost[256] = "";
|
||||
|
||||
@@ -1149,6 +1192,7 @@ CURLcode ftp_use_port(struct connectdata *conn)
|
||||
|
||||
if ( h ) {
|
||||
if( (portsock = socket(AF_INET, SOCK_STREAM, 0)) >= 0 ) {
|
||||
int size;
|
||||
|
||||
/* we set the secondary socket variable to this for now, it
|
||||
is only so that the cleanup function will close it in case
|
||||
@@ -1167,10 +1211,10 @@ CURLcode ftp_use_port(struct connectdata *conn)
|
||||
if(bind(portsock, (struct sockaddr *)&sa, size) >= 0) {
|
||||
/* we succeeded to bind */
|
||||
struct sockaddr_in add;
|
||||
size = sizeof(add);
|
||||
socklen_t socksize = sizeof(add);
|
||||
|
||||
if(getsockname(portsock, (struct sockaddr *) &add,
|
||||
(socklen_t *)&size)<0) {
|
||||
&socksize)<0) {
|
||||
failf(data, "getsockname() failed");
|
||||
return CURLE_FTP_PORT_FAILED;
|
||||
}
|
||||
@@ -1256,23 +1300,53 @@ CURLcode ftp_use_pasv(struct connectdata *conn)
|
||||
char *buf = data->state.buffer; /* this is our buffer */
|
||||
int ftpcode; /* receive FTP response codes in this */
|
||||
CURLcode result;
|
||||
Curl_addrinfo *addr=NULL;
|
||||
Curl_ipconnect *conninfo;
|
||||
|
||||
/*
|
||||
Here's the excecutive summary on what to do:
|
||||
|
||||
PASV is RFC959, expect:
|
||||
227 Entering Passive Mode (a1,a2,a3,a4,p1,p2)
|
||||
|
||||
LPSV is RFC1639, expect:
|
||||
228 Entering Long Passive Mode (4,4,a1,a2,a3,a4,2,p1,p2)
|
||||
|
||||
EPSV is RFC2428, expect:
|
||||
229 Entering Extended Passive Mode (|||port|)
|
||||
|
||||
*/
|
||||
|
||||
#if 1
|
||||
const char *mode[] = { "EPSV", "PASV", NULL };
|
||||
int results[] = { 229, 227, 0 };
|
||||
#else
|
||||
#if 0
|
||||
/* no support for IPv6 passive mode yet */
|
||||
char *mode[] = { "EPSV", "LPSV", "PASV", NULL };
|
||||
int results[] = { 229, 228, 227, 0 };
|
||||
#else
|
||||
const char *mode[] = { "PASV", NULL };
|
||||
int results[] = { 227, 0 };
|
||||
#endif
|
||||
#endif
|
||||
int modeoff;
|
||||
unsigned short connectport; /* the local port connect() should use! */
|
||||
unsigned short newport; /* remote port, not necessary the local one */
|
||||
char *hostdataptr=NULL;
|
||||
|
||||
for (modeoff = 0; mode[modeoff]; modeoff++) {
|
||||
FTPSENDF(conn, mode[modeoff], "");
|
||||
/* newhost must be able to hold a full IP-style address in ASCII, which
|
||||
in the IPv6 case means 5*8-1 = 39 letters */
|
||||
char newhost[48];
|
||||
char *newhostp=NULL;
|
||||
|
||||
for (modeoff = (data->set.ftp_use_epsv?0:1);
|
||||
mode[modeoff]; modeoff++) {
|
||||
result = Curl_ftpsendf(conn, mode[modeoff]);
|
||||
if(result)
|
||||
return result;
|
||||
nread = Curl_GetFTPResponse(buf, conn, &ftpcode);
|
||||
if(nread < 0)
|
||||
return CURLE_OPERATION_TIMEOUTED;
|
||||
|
||||
if (ftpcode == results[modeoff])
|
||||
break;
|
||||
}
|
||||
@@ -1281,16 +1355,9 @@ CURLcode ftp_use_pasv(struct connectdata *conn)
|
||||
failf(data, "Odd return code after PASV");
|
||||
return CURLE_FTP_WEIRD_PASV_REPLY;
|
||||
}
|
||||
else if (strcmp(mode[modeoff], "PASV") == 0) {
|
||||
else if (227 == results[modeoff]) {
|
||||
int ip[4];
|
||||
int port[2];
|
||||
unsigned short newport; /* remote port, not necessary the local one */
|
||||
unsigned short connectport; /* the local port connect() should use! */
|
||||
char newhost[32];
|
||||
|
||||
Curl_addrinfo *addr;
|
||||
char *hostdataptr=NULL;
|
||||
Curl_ipconnect *conninfo;
|
||||
char *str=buf;
|
||||
|
||||
/*
|
||||
@@ -1318,7 +1385,40 @@ CURLcode ftp_use_pasv(struct connectdata *conn)
|
||||
}
|
||||
|
||||
sprintf(newhost, "%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]);
|
||||
newhostp = newhost;
|
||||
newport = (port[0]<<8) + port[1];
|
||||
}
|
||||
#if 1
|
||||
else if (229 == results[modeoff]) {
|
||||
char *ptr = strchr(buf, '(');
|
||||
if(ptr) {
|
||||
unsigned int num;
|
||||
char separator[4];
|
||||
ptr++;
|
||||
if(5 == sscanf(ptr, "%c%c%c%u%c",
|
||||
&separator[0],
|
||||
&separator[1],
|
||||
&separator[2],
|
||||
&num,
|
||||
&separator[3])) {
|
||||
/* the four separators should be identical */
|
||||
newport = num;
|
||||
|
||||
/* we should use the same host we already are connected to */
|
||||
newhostp = conn->name;
|
||||
}
|
||||
else
|
||||
ptr=NULL;
|
||||
}
|
||||
if(!ptr) {
|
||||
failf(data, "Weirdly formatted EPSV reply");
|
||||
return CURLE_FTP_WEIRD_PASV_REPLY;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
else
|
||||
return CURLE_FTP_CANT_RECONNECT;
|
||||
|
||||
if(data->change.proxy) {
|
||||
/*
|
||||
* This is a tunnel through a http proxy and we need to connect to the
|
||||
@@ -1331,7 +1431,7 @@ CURLcode ftp_use_pasv(struct connectdata *conn)
|
||||
}
|
||||
else {
|
||||
/* normal, direct, ftp connection */
|
||||
addr = Curl_getaddrinfo(data, newhost, newport, &hostdataptr);
|
||||
addr = Curl_getaddrinfo(data, newhostp, newport, &hostdataptr);
|
||||
if(!addr) {
|
||||
failf(data, "Can't resolve new host %s", newhost);
|
||||
return CURLE_FTP_CANT_GET_HOST;
|
||||
@@ -1363,9 +1463,6 @@ CURLcode ftp_use_pasv(struct connectdata *conn)
|
||||
if(CURLE_OK != result)
|
||||
return result;
|
||||
}
|
||||
}
|
||||
else
|
||||
return CURLE_FTP_CANT_RECONNECT;
|
||||
|
||||
return CURLE_OK;
|
||||
}
|
||||
@@ -1420,9 +1517,10 @@ CURLcode ftp_perform(struct connectdata *conn)
|
||||
return result;
|
||||
}
|
||||
|
||||
/* If we have selected NOBODY, it means that we only want file information.
|
||||
Which in FTP can't be much more than the file size! */
|
||||
if(data->set.no_body) {
|
||||
/* If we have selected NOBODY and HEADER, it means that we only want file
|
||||
information. Which in FTP can't be much more than the file size and
|
||||
date. */
|
||||
if(data->set.no_body && data->set.include_header) {
|
||||
/* The SIZE command is _not_ RFC 959 specified, and therefor many servers
|
||||
may not support it! It is however the only way we have to get a file's
|
||||
size! */
|
||||
@@ -1468,20 +1566,27 @@ CURLcode ftp_perform(struct connectdata *conn)
|
||||
return CURLE_OK;
|
||||
}
|
||||
|
||||
if(data->set.no_body)
|
||||
/* don't transfer the data */
|
||||
;
|
||||
/* Get us a second connection up and connected */
|
||||
if(data->set.ftp_use_port)
|
||||
else if(data->set.ftp_use_port) {
|
||||
/* We have chosen to use the PORT command */
|
||||
result = ftp_use_port(conn);
|
||||
else
|
||||
if(CURLE_OK == result)
|
||||
/* we have the data connection ready */
|
||||
infof(data, "Connected the data stream with PORT!\n");
|
||||
}
|
||||
else {
|
||||
/* We have chosen (this is default) to use the PASV command */
|
||||
result = ftp_use_pasv(conn);
|
||||
if(CURLE_OK == result)
|
||||
infof(data, "Connected the data stream with PASV!\n");
|
||||
}
|
||||
|
||||
if(result)
|
||||
return result;
|
||||
|
||||
/* we have the data connection ready */
|
||||
infof(data, "Connected the data stream!\n");
|
||||
|
||||
if(data->set.upload) {
|
||||
|
||||
/* Set type to binary (unless specified ASCII) */
|
||||
@@ -1506,11 +1611,13 @@ CURLcode ftp_perform(struct connectdata *conn)
|
||||
if(conn->resume_from < 0 ) {
|
||||
/* we could've got a specified offset from the command line,
|
||||
but now we know we didn't */
|
||||
ssize_t gottensize;
|
||||
|
||||
if(CURLE_OK != ftp_getsize(conn, ftp->file, &conn->resume_from)) {
|
||||
if(CURLE_OK != ftp_getsize(conn, ftp->file, &gottensize)) {
|
||||
failf(data, "Couldn't get remote file size");
|
||||
return CURLE_FTP_COULDNT_GET_SIZE;
|
||||
}
|
||||
conn->resume_from = gottensize;
|
||||
}
|
||||
|
||||
if(conn->resume_from) {
|
||||
@@ -1535,7 +1642,7 @@ CURLcode ftp_perform(struct connectdata *conn)
|
||||
|
||||
passed += actuallyread;
|
||||
if(actuallyread != readthisamountnow) {
|
||||
failf(data, "Could only read %d bytes from the input\n", passed);
|
||||
failf(data, "Could only read %d bytes from the input", passed);
|
||||
return CURLE_FTP_COULDNT_USE_REST;
|
||||
}
|
||||
}
|
||||
@@ -1602,7 +1709,7 @@ CURLcode ftp_perform(struct connectdata *conn)
|
||||
return result;
|
||||
|
||||
}
|
||||
else {
|
||||
else if(!data->set.no_body) {
|
||||
/* Retrieve file or directory */
|
||||
bool dirlist=FALSE;
|
||||
long downloadsize=-1;
|
||||
@@ -1665,22 +1772,32 @@ CURLcode ftp_perform(struct connectdata *conn)
|
||||
(data->set.ftp_list_only?"NLST":"LIST"));
|
||||
}
|
||||
else {
|
||||
ssize_t foundsize;
|
||||
|
||||
/* Set type to binary (unless specified ASCII) */
|
||||
result = ftp_transfertype(conn, data->set.ftp_ascii);
|
||||
if(result)
|
||||
return result;
|
||||
|
||||
/* 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
|
||||
in the RETR response line. */
|
||||
result = ftp_getsize(conn, ftp->file, &foundsize);
|
||||
if(CURLE_OK == result)
|
||||
downloadsize = foundsize;
|
||||
|
||||
if(conn->resume_from) {
|
||||
|
||||
/* Daniel: (August 4, 1999)
|
||||
*
|
||||
* We start with trying to use the SIZE command to figure out the size
|
||||
* of the file we're gonna get. If we can get the size, this is by far
|
||||
* the best way to know if we're trying to resume beyond the EOF. */
|
||||
int foundsize=-1;
|
||||
|
||||
result = ftp_getsize(conn, ftp->file, &foundsize);
|
||||
|
||||
* the best way to know if we're trying to resume beyond the EOF.
|
||||
*
|
||||
* Daniel, November 28, 2001. We *always* get the size on downloads
|
||||
* now, so it is done before this even when not doing resumes. I saved
|
||||
* the comment above for nostalgical reasons! ;-)
|
||||
*/
|
||||
if(CURLE_OK != result) {
|
||||
infof(data, "ftp server doesn't support SIZE\n");
|
||||
/* We couldn't get the size and therefore we can't know if there
|
||||
@@ -1954,6 +2071,8 @@ CURLcode Curl_ftp_disconnect(struct connectdata *conn)
|
||||
if(ftp) {
|
||||
if(ftp->entrypath)
|
||||
free(ftp->entrypath);
|
||||
if(ftp->cache)
|
||||
free(ftp->cache);
|
||||
}
|
||||
return CURLE_OK;
|
||||
}
|
||||
|
@@ -28,7 +28,7 @@ CURLcode Curl_ftp_done(struct connectdata *conn);
|
||||
CURLcode Curl_ftp_connect(struct connectdata *conn);
|
||||
CURLcode Curl_ftp_disconnect(struct connectdata *conn);
|
||||
|
||||
size_t Curl_ftpsendf(struct connectdata *, const char *fmt, ...);
|
||||
CURLcode Curl_ftpsendf(struct connectdata *, const char *fmt, ...);
|
||||
|
||||
/* The kerberos stuff needs this: */
|
||||
int Curl_GetFTPResponse(char *buf, struct connectdata *conn,
|
||||
|
@@ -21,6 +21,8 @@
|
||||
* $Id$
|
||||
*****************************************************************************/
|
||||
|
||||
#include "setup.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
@@ -43,6 +43,7 @@ CURLcode Curl_initinfo(struct SessionHandle *data)
|
||||
pro->t_nslookup = 0;
|
||||
pro->t_connect = 0;
|
||||
pro->t_pretransfer = 0;
|
||||
pro->t_starttransfer = 0;
|
||||
|
||||
info->httpcode = 0;
|
||||
info->httpversion=0;
|
||||
@@ -107,6 +108,9 @@ CURLcode Curl_getinfo(struct SessionHandle *data, CURLINFO info, ...)
|
||||
case CURLINFO_PRETRANSFER_TIME:
|
||||
*param_doublep = data->progress.t_pretransfer;
|
||||
break;
|
||||
case CURLINFO_STARTTRANSFER_TIME:
|
||||
*param_doublep = data->progress.t_starttransfer;
|
||||
break;
|
||||
case CURLINFO_SIZE_UPLOAD:
|
||||
*param_doublep = data->progress.uploaded;
|
||||
break;
|
||||
|
@@ -35,9 +35,7 @@
|
||||
* Daniel Stenberg <daniel@haxx.se>
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
# include <config.h>
|
||||
#endif
|
||||
#include "setup.h" /* setup.h is required for read() prototype */
|
||||
|
||||
#ifndef HAVE_GETPASS_R
|
||||
|
||||
|
@@ -28,7 +28,6 @@
|
||||
|
||||
#define _REENTRANT
|
||||
|
||||
|
||||
#if defined(WIN32) && !defined(__GNUC__) || defined(__MINGW32__)
|
||||
#include <winsock.h>
|
||||
#else
|
||||
@@ -47,6 +46,9 @@
|
||||
#ifdef HAVE_ARPA_INET_H
|
||||
#include <arpa/inet.h>
|
||||
#endif
|
||||
#ifdef HAVE_STDLIB_H
|
||||
#include <stdlib.h> /* required for free() prototypes */
|
||||
#endif
|
||||
#ifdef VMS
|
||||
#include <inet.h>
|
||||
#include <stdlib.h>
|
||||
@@ -263,7 +265,7 @@ Curl_addrinfo *Curl_getaddrinfo(struct SessionHandle *data,
|
||||
char **bufp)
|
||||
{
|
||||
struct hostent *h = NULL;
|
||||
unsigned long in;
|
||||
in_addr_t in;
|
||||
int ret; /* this variable is unused on several platforms but used on some */
|
||||
|
||||
#define CURL_NAMELOOKUP_SIZE 9000
|
||||
|
167
lib/http.c
167
lib/http.c
@@ -204,28 +204,6 @@ CURLcode add_buffer(send_buffer *in, const void *inptr, size_t size)
|
||||
/* end of the add_buffer functions */
|
||||
/* ------------------------------------------------------------------------- */
|
||||
|
||||
/*
|
||||
* Read everything until a newline.
|
||||
*/
|
||||
|
||||
static
|
||||
int GetLine(int sockfd, char *ptr, struct connectdata *conn)
|
||||
{
|
||||
ssize_t nread;
|
||||
|
||||
/* get us a full line, terminated with a newline */
|
||||
for(nread=0; (nread<BUFSIZE); nread++, ptr++) {
|
||||
if((CURLE_OK != Curl_read(conn, sockfd, ptr, 1, &nread)) ||
|
||||
(nread <= 0) || (*ptr == '\n'))
|
||||
break;
|
||||
}
|
||||
*ptr=0; /* zero terminate */
|
||||
|
||||
return nread>0?nread:0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* This function checks the linked list of custom HTTP headers for a particular
|
||||
* header (prefix).
|
||||
@@ -258,6 +236,22 @@ CURLcode Curl_ConnectHTTPProxyTunnel(struct connectdata *conn,
|
||||
struct SessionHandle *data=conn->data;
|
||||
CURLcode result;
|
||||
|
||||
int nread; /* total size read */
|
||||
int perline; /* count bytes per line */
|
||||
bool keepon=TRUE;
|
||||
ssize_t gotbytes;
|
||||
char *ptr;
|
||||
int timeout = 3600; /* default timeout in seconds */
|
||||
struct timeval interval;
|
||||
fd_set rkeepfd;
|
||||
fd_set readfd;
|
||||
char *line_start;
|
||||
|
||||
#define SELECT_OK 0
|
||||
#define SELECT_ERROR 1
|
||||
#define SELECT_TIMEOUT 2
|
||||
int error = SELECT_OK;
|
||||
|
||||
infof(data, "Establish HTTP proxy tunnel to %s:%d\n", hostname, remote_port);
|
||||
|
||||
/* OK, now send the connect request to the proxy */
|
||||
@@ -276,19 +270,105 @@ CURLcode Curl_ConnectHTTPProxyTunnel(struct connectdata *conn,
|
||||
return result;
|
||||
}
|
||||
|
||||
/* wait for the proxy to send us a HTTP/1.0 200 OK header */
|
||||
while(GetLine(tunnelsocket, data->state.buffer, conn)) {
|
||||
if('\r' == data->state.buffer[0])
|
||||
break; /* end of headers */
|
||||
if(data->set.verbose)
|
||||
fprintf(data->set.err, "< %s\n", data->state.buffer);
|
||||
/* Now, read the full reply we get from the proxy */
|
||||
|
||||
if(2 == sscanf(data->state.buffer, "HTTP/1.%d %d",
|
||||
|
||||
if(data->set.timeout) {
|
||||
/* if timeout is requested, find out how much remaining time we have */
|
||||
timeout = data->set.timeout - /* timeout time */
|
||||
Curl_tvdiff(Curl_tvnow(), conn->now)/1000; /* spent time */
|
||||
if(timeout <=0 ) {
|
||||
failf(data, "Transfer aborted due to timeout");
|
||||
return -SELECT_TIMEOUT; /* already too little time */
|
||||
}
|
||||
}
|
||||
|
||||
FD_ZERO (&readfd); /* clear it */
|
||||
FD_SET (tunnelsocket, &readfd); /* read socket */
|
||||
|
||||
/* get this in a backup variable to be able to restore it on each lap in the
|
||||
select() loop */
|
||||
rkeepfd = readfd;
|
||||
|
||||
ptr=data->state.buffer;
|
||||
line_start = ptr;
|
||||
|
||||
nread=0;
|
||||
perline=0;
|
||||
keepon=TRUE;
|
||||
|
||||
while((nread<BUFSIZE) && (keepon && !error)) {
|
||||
readfd = rkeepfd; /* set every lap */
|
||||
interval.tv_sec = timeout;
|
||||
interval.tv_usec = 0;
|
||||
|
||||
switch (select (tunnelsocket+1, &readfd, NULL, NULL, &interval)) {
|
||||
case -1: /* select() error, stop reading */
|
||||
error = SELECT_ERROR;
|
||||
failf(data, "Transfer aborted due to select() error");
|
||||
break;
|
||||
case 0: /* timeout */
|
||||
error = SELECT_TIMEOUT;
|
||||
failf(data, "Transfer aborted due to timeout");
|
||||
break;
|
||||
default:
|
||||
/*
|
||||
* This code previously didn't use the kerberos sec_read() code
|
||||
* to read, but when we use Curl_read() it may do so. Do confirm
|
||||
* that this is still ok and then remove this comment!
|
||||
*/
|
||||
if(CURLE_OK != Curl_read(conn, tunnelsocket, ptr, BUFSIZE-nread,
|
||||
&gotbytes))
|
||||
keepon = FALSE;
|
||||
else if(gotbytes <= 0) {
|
||||
keepon = FALSE;
|
||||
error = SELECT_ERROR;
|
||||
failf(data, "Connection aborted");
|
||||
}
|
||||
else {
|
||||
/* we got a whole chunk of data, which can be anything from one
|
||||
* byte to a set of lines and possibly just a piece of the last
|
||||
* line */
|
||||
int i;
|
||||
|
||||
nread += gotbytes;
|
||||
for(i = 0; i < gotbytes; ptr++, i++) {
|
||||
perline++; /* amount of bytes in this line so far */
|
||||
if(*ptr=='\n') {
|
||||
/* a newline is CRLF in ftp-talk, so the CR is ignored as
|
||||
the line isn't really terminated until the LF comes */
|
||||
|
||||
/* output debug output if that is requested */
|
||||
if(data->set.verbose) {
|
||||
fputs("< ", data->set.err);
|
||||
fwrite(line_start, perline, 1, data->set.err);
|
||||
/* no need to output LF here, it is part of the data */
|
||||
}
|
||||
|
||||
if('\r' == line_start[0]) {
|
||||
/* end of headers */
|
||||
keepon=FALSE;
|
||||
break; /* breaks out of loop, not switch */
|
||||
}
|
||||
|
||||
if(2 == sscanf(line_start, "HTTP/1.%d %d",
|
||||
&subversion,
|
||||
&httperror)) {
|
||||
;
|
||||
}
|
||||
|
||||
perline=0; /* line starts over here */
|
||||
line_start = ptr+1;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
} /* switch */
|
||||
} /* while there's buffer left and loop is requested */
|
||||
|
||||
if(error)
|
||||
return CURLE_READ_ERROR;
|
||||
|
||||
if(200 != httperror) {
|
||||
if(407 == httperror)
|
||||
/* Added Nov 6 1998 */
|
||||
@@ -318,15 +398,18 @@ CURLcode Curl_http_connect(struct connectdata *conn)
|
||||
* us to the host we want to talk to. Only after the connect
|
||||
* has occured, can we start talking SSL
|
||||
*/
|
||||
if (conn->protocol & PROT_HTTPS) {
|
||||
if (data->change.proxy) {
|
||||
/* HTTPS through a proxy can only be done with a tunnel */
|
||||
|
||||
if(data->change.proxy &&
|
||||
((conn->protocol & PROT_HTTPS) || data->set.tunnel_thru_httpproxy)) {
|
||||
|
||||
/* either HTTPS over proxy, OR explicitly asked for a tunnel */
|
||||
result = Curl_ConnectHTTPProxyTunnel(conn, conn->firstsocket,
|
||||
conn->hostname, conn->remote_port);
|
||||
if(CURLE_OK != result)
|
||||
return result;
|
||||
}
|
||||
|
||||
if(conn->protocol & PROT_HTTPS) {
|
||||
/* now, perform the SSL initialization for this socket */
|
||||
result = Curl_SSLConnect(conn);
|
||||
if(result)
|
||||
@@ -366,7 +449,7 @@ CURLcode Curl_http_done(struct connectdata *conn)
|
||||
if(0 == (http->readbytecount + conn->headerbytecount)) {
|
||||
/* nothing was read from the HTTP server, this can't be right
|
||||
so we return an error here */
|
||||
failf(data, "Empty reply from server\n");
|
||||
failf(data, "Empty reply from server");
|
||||
return CURLE_GOT_NOTHING;
|
||||
}
|
||||
|
||||
@@ -450,7 +533,9 @@ CURLcode Curl_http(struct connectdata *conn)
|
||||
host, ppath,
|
||||
conn->protocol&PROT_HTTPS?TRUE:FALSE);
|
||||
}
|
||||
if ((data->change.proxy) && !(conn->protocol&PROT_HTTPS)) {
|
||||
if (data->change.proxy &&
|
||||
!data->set.tunnel_thru_httpproxy &&
|
||||
!(conn->protocol&PROT_HTTPS)) {
|
||||
/* The path sent to the proxy is in fact the entire URL */
|
||||
ppath = data->change.url;
|
||||
}
|
||||
@@ -525,7 +610,7 @@ CURLcode Curl_http(struct connectdata *conn)
|
||||
|
||||
passed += actuallyread;
|
||||
if(actuallyread != readthisamountnow) {
|
||||
failf(data, "Could only read %d bytes from the input\n",
|
||||
failf(data, "Could only read %d bytes from the input",
|
||||
passed);
|
||||
return CURLE_READ_ERROR;
|
||||
}
|
||||
@@ -536,7 +621,7 @@ CURLcode Curl_http(struct connectdata *conn)
|
||||
data->set.infilesize -= conn->resume_from;
|
||||
|
||||
if(data->set.infilesize <= 0) {
|
||||
failf(data, "File already completely uploaded\n");
|
||||
failf(data, "File already completely uploaded");
|
||||
return CURLE_PARTIAL_FILE;
|
||||
}
|
||||
}
|
||||
@@ -650,10 +735,8 @@ CURLcode Curl_http(struct connectdata *conn)
|
||||
* equal to UTC (Coordinated Universal Time)." (see page 20 of RFC2616).
|
||||
*/
|
||||
|
||||
#ifdef HAVE_LOCALTIME_R
|
||||
#ifdef HAVE_GMTIME_R
|
||||
/* thread-safe version */
|
||||
/* We assume that the presense of localtime_r() proves the presense
|
||||
of gmtime_r() which is a bit ugly but might work */
|
||||
struct tm keeptime;
|
||||
thistime = (struct tm *)gmtime_r(&data->set.timevalue, &keeptime);
|
||||
#else
|
||||
@@ -666,7 +749,7 @@ CURLcode Curl_http(struct connectdata *conn)
|
||||
|
||||
#ifdef HAVE_STRFTIME
|
||||
/* format: "Tue, 15 Nov 1994 12:45:26 GMT" */
|
||||
strftime(buf, BUFSIZE-1, "%a, %d %b %Y %H:%M:%S %Z", thistime);
|
||||
strftime(buf, BUFSIZE-1, "%a, %d %b %Y %H:%M:%S GMT", thistime);
|
||||
#else
|
||||
/* TODO: Right, we *could* write a replacement here */
|
||||
strcpy(buf, "no strftime() support");
|
||||
@@ -710,7 +793,7 @@ CURLcode Curl_http(struct connectdata *conn)
|
||||
char contentType[256];
|
||||
int linelength=0;
|
||||
if(Curl_FormInit(&http->form, http->sendit)) {
|
||||
failf(data, "Internal HTTP POST error!\n");
|
||||
failf(data, "Internal HTTP POST error!");
|
||||
return CURLE_HTTP_POST_ERROR;
|
||||
}
|
||||
|
||||
@@ -741,7 +824,7 @@ CURLcode Curl_http(struct connectdata *conn)
|
||||
1,
|
||||
(FILE *)&http->form);
|
||||
if(linelength == -1) {
|
||||
failf(data, "Could not get Content-Type header line!\n");
|
||||
failf(data, "Could not get Content-Type header line!");
|
||||
return CURLE_HTTP_POST_ERROR;
|
||||
}
|
||||
add_buffer(req_buffer, contentType, linelength);
|
||||
|
@@ -374,7 +374,7 @@ void Curl_krb_kauth(struct connectdata *conn)
|
||||
memset(schedule, 0, sizeof(schedule));
|
||||
memset(passwd, 0, sizeof(passwd));
|
||||
if(Curl_base64_encode(tktcopy.dat, tktcopy.length, &p) < 0) {
|
||||
failf(conn->data, "Out of memory base64-encoding.\n");
|
||||
failf(conn->data, "Out of memory base64-encoding.");
|
||||
Curl_set_command_prot(conn, save);
|
||||
return;
|
||||
}
|
||||
|
@@ -95,9 +95,11 @@ static void DynaClose(void)
|
||||
#if defined(HAVE_DLOPEN) || defined(HAVE_LIBDL)
|
||||
if (libldap) {
|
||||
dlclose(libldap);
|
||||
libldap=NULL;
|
||||
}
|
||||
if (liblber) {
|
||||
dlclose(liblber);
|
||||
liblber=NULL;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
@@ -174,7 +176,9 @@ CURLcode Curl_ldap(struct connectdata *conn)
|
||||
conn->hostname, conn->port);
|
||||
status = CURLE_COULDNT_CONNECT;
|
||||
} else {
|
||||
rc = ldap_simple_bind_s(server, data->state.user, data->state.passwd);
|
||||
rc = ldap_simple_bind_s(server,
|
||||
conn->bits.user_passwd?data->state.user:NULL,
|
||||
conn->bits.user_passwd?data->state.passwd:NULL);
|
||||
if (rc != 0) {
|
||||
failf(data, "LDAP: %s", ldap_err2string(rc));
|
||||
status = CURLE_LDAP_CANNOT_BIND;
|
||||
|
@@ -70,6 +70,9 @@ void curl_memdebug(const char *logname)
|
||||
void *curl_domalloc(size_t size, int line, const char *source)
|
||||
{
|
||||
void *mem=(malloc)(size);
|
||||
if(mem)
|
||||
/* fill memory with junk */
|
||||
memset(mem, 0xA5, size);
|
||||
if(logfile)
|
||||
fprintf(logfile, "MEM %s:%d malloc(%d) = %p\n",
|
||||
source, line, size, mem);
|
||||
|
@@ -1,6 +1,14 @@
|
||||
#ifdef MALLOCDEBUG
|
||||
|
||||
#include "setup.h"
|
||||
|
||||
#ifdef HAVE_SYS_TYPES_H
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_SYS_SOCKET_H
|
||||
#include <sys/socket.h>
|
||||
#endif
|
||||
#include <stdio.h>
|
||||
#ifdef HAVE_MEMORY_H
|
||||
#include <memory.h>
|
||||
|
@@ -92,14 +92,7 @@
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
static const char rcsid[] = "@(#)$Id$";
|
||||
|
||||
/*
|
||||
* To test:
|
||||
*
|
||||
* Use WIDTH, PRECISION and NUMBERED ARGUMENT combined.
|
||||
*/
|
||||
|
||||
#include "setup.h"
|
||||
#include <sys/types.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
@@ -909,14 +902,14 @@ static int dprintf_formatf(
|
||||
}
|
||||
else {
|
||||
/* Write "(nil)" for a nil pointer. */
|
||||
static char nil[] = "(nil)";
|
||||
static char strnil[] = "(nil)";
|
||||
register char *point;
|
||||
|
||||
width -= sizeof(nil) - 1;
|
||||
width -= sizeof(strnil) - 1;
|
||||
if (p->flags & FLAGS_LEFT)
|
||||
while (width-- > 0)
|
||||
OUTCHAR(' ');
|
||||
for (point = nil; *point != '\0'; ++point)
|
||||
for (point = strnil; *point != '\0'; ++point)
|
||||
OUTCHAR(*point);
|
||||
if (! (p->flags & FLAGS_LEFT))
|
||||
while (width-- > 0)
|
||||
|
315
lib/multi.c
Normal file
315
lib/multi.c
Normal file
@@ -0,0 +1,315 @@
|
||||
/*****************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
* / __| | | | |_) | |
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 2001, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
*
|
||||
* In order to be useful for every potential user, curl and libcurl are
|
||||
* dual-licensed under the MPL and the MIT/X-derivate licenses.
|
||||
*
|
||||
* You may opt to use, copy, modify, merge, publish, distribute and/or sell
|
||||
* copies of the Software, and permit persons to whom the Software is
|
||||
* furnished to do so, under the terms of the MPL or the MIT/X-derivate
|
||||
* licenses. You may pick one of these licenses.
|
||||
*
|
||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||
* KIND, either express or implied.
|
||||
*
|
||||
* $Id$
|
||||
*****************************************************************************/
|
||||
|
||||
#include "setup.h"
|
||||
#include <curl/curl.h>
|
||||
|
||||
#include "multi.h" /* will become <curl/multi.h> soon */
|
||||
|
||||
struct Curl_message {
|
||||
/* the 'CURLMsg' is the part that is visible to the external user */
|
||||
struct CURLMsg extmsg;
|
||||
struct Curl_message *next;
|
||||
};
|
||||
|
||||
typedef enum {
|
||||
CURLM_STATE_INIT,
|
||||
CURLM_STATE_CONNECT,
|
||||
CURLM_STATE_DO,
|
||||
CURLM_STATE_PERFORM,
|
||||
CURLM_STATE_DONE,
|
||||
CURLM_STATE_COMPLETED,
|
||||
|
||||
CURLM_STATE_LAST /* not a true state, never use this */
|
||||
} CURLMstate;
|
||||
|
||||
struct Curl_one_easy {
|
||||
/* first, two fields for the linked list of these */
|
||||
struct Curl_one_easy *next;
|
||||
struct Curl_one_easy *prev;
|
||||
|
||||
CURL *easy_handle; /* this is the easy handle for this unit */
|
||||
CURLMstate state; /* the handle's state */
|
||||
CURLcode result; /* previous result */
|
||||
};
|
||||
|
||||
|
||||
#define CURL_MULTI_HANDLE 0x000bab1e
|
||||
|
||||
#define GOOD_MULTI_HANDLE(x) ((x)&&(((struct Curl_multi *)x)->type == CURL_MULTI_HANDLE))
|
||||
#define GOOD_EASY_HANDLE(x) (x)
|
||||
|
||||
/* This is the struct known as CURLM on the outside */
|
||||
struct Curl_multi {
|
||||
/* First a simple identifier to easier detect if a user mix up
|
||||
this multi handle with an easy handle. Set this to CURL_MULTI_HANDLE. */
|
||||
long type;
|
||||
|
||||
/* We have a linked list with easy handles */
|
||||
struct Curl_one_easy easy;
|
||||
/* This is the amount of entries in the linked list above. */
|
||||
int num_easy;
|
||||
|
||||
/* this is a linked list of posted messages */
|
||||
struct Curl_message *msgs;
|
||||
/* amount of messages in the queue */
|
||||
int num_msgs;
|
||||
|
||||
};
|
||||
|
||||
|
||||
CURLM *curl_multi_init(void)
|
||||
{
|
||||
struct Curl_multi *multi;
|
||||
|
||||
multi = (void *)malloc(sizeof(struct Curl_multi));
|
||||
|
||||
if(multi) {
|
||||
memset(multi, 0, sizeof(struct Curl_multi));
|
||||
multi->type = CURL_MULTI_HANDLE;
|
||||
}
|
||||
|
||||
return (CURLM *) multi;
|
||||
}
|
||||
|
||||
CURLMcode curl_multi_add_handle(CURLM *multi_handle,
|
||||
CURL *easy_handle)
|
||||
{
|
||||
struct Curl_multi *multi=(struct Curl_multi *)multi_handle;
|
||||
struct Curl_one_easy *easy;
|
||||
|
||||
/* First, make some basic checks that the CURLM handle is a good handle */
|
||||
if(!GOOD_MULTI_HANDLE(multi))
|
||||
return CURLM_BAD_HANDLE;
|
||||
|
||||
/* Verify that we got a somewhat good easy handle too */
|
||||
if(!GOOD_EASY_HANDLE(easy_handle))
|
||||
return CURLM_BAD_EASY_HANDLE;
|
||||
|
||||
/* Now, time to add an easy handle to the multi stack */
|
||||
easy = (struct Curl_one_easy *)malloc(sizeof(struct Curl_one_easy));
|
||||
if(!easy)
|
||||
return CURLM_OUT_OF_MEMORY;
|
||||
|
||||
/* clean it all first (just to be sure) */
|
||||
memset(easy, 0, sizeof(struct Curl_one_easy));
|
||||
|
||||
/* set the easy handle */
|
||||
easy->easy_handle = easy_handle;
|
||||
easy->state = CURLM_STATE_INIT;
|
||||
|
||||
/* We add this new entry first in the list. We make our 'next' point to the
|
||||
previous next and our 'prev' point back to the 'first' struct */
|
||||
easy->next = multi->easy.next;
|
||||
easy->prev = &multi->easy;
|
||||
|
||||
/* make 'easy' the first node in the chain */
|
||||
multi->easy.next = easy;
|
||||
|
||||
/* if there was a next node, make sure its 'prev' pointer links back to
|
||||
the new node */
|
||||
if(easy->next)
|
||||
easy->next->prev = easy;
|
||||
|
||||
/* increase the node-counter */
|
||||
multi->num_easy++;
|
||||
|
||||
return CURLM_OK;
|
||||
}
|
||||
|
||||
CURLMcode curl_multi_remove_handle(CURLM *multi_handle,
|
||||
CURL *curl_handle)
|
||||
{
|
||||
struct Curl_multi *multi=(struct Curl_multi *)multi_handle;
|
||||
struct Curl_one_easy *easy;
|
||||
|
||||
/* First, make some basic checks that the CURLM handle is a good handle */
|
||||
if(!GOOD_MULTI_HANDLE(multi))
|
||||
return CURLM_BAD_HANDLE;
|
||||
|
||||
/* Verify that we got a somewhat good easy handle too */
|
||||
if(!GOOD_EASY_HANDLE(curl_handle))
|
||||
return CURLM_BAD_EASY_HANDLE;
|
||||
|
||||
/* scan through the list and remove the 'curl_handle' */
|
||||
easy = multi->easy.next;
|
||||
while(easy) {
|
||||
if(easy->easy_handle == curl_handle)
|
||||
break;
|
||||
easy=easy->next;
|
||||
}
|
||||
if(easy) {
|
||||
/* If the 'state' is not INIT or COMPLETED, we might need to do something
|
||||
nice to put the easy_handle in a good known state when this returns. */
|
||||
|
||||
/* make the previous node point to our next */
|
||||
if(easy->prev)
|
||||
easy->prev->next = easy->next;
|
||||
/* make our next point to our previous node */
|
||||
if(easy->next)
|
||||
easy->next->prev = easy->prev;
|
||||
|
||||
/* NOTE NOTE NOTE
|
||||
We do not touch the easy handle here! */
|
||||
free(easy);
|
||||
|
||||
multi->num_easy--; /* one less to care about now */
|
||||
|
||||
return CURLM_OK;
|
||||
}
|
||||
else
|
||||
return CURLM_BAD_EASY_HANDLE; /* twasn't found */
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
/* Scan through all the easy handles to get the file descriptors set.
|
||||
Some easy handles may not have connected to the remote host yet,
|
||||
and then we must make sure that is done. */
|
||||
struct Curl_multi *multi=(struct Curl_multi *)multi_handle;
|
||||
struct Curl_one_easy *easy;
|
||||
|
||||
if(!GOOD_MULTI_HANDLE(multi))
|
||||
return CURLM_BAD_HANDLE;
|
||||
|
||||
easy=multi->easy.next;
|
||||
while(easy) {
|
||||
switch(easy->state) {
|
||||
case CURLM_STATE_INIT:
|
||||
case CURLM_STATE_CONNECT:
|
||||
case CURLM_STATE_DO:
|
||||
case CURLM_STATE_DONE:
|
||||
/* we want curl_multi_perform() to get called, but we don't have any
|
||||
file descriptors to set */
|
||||
break;
|
||||
case CURLM_STATE_PERFORM:
|
||||
/* This should have a set of file descriptors for us to set. */
|
||||
/* after the transfer is done, go DONE */
|
||||
break;
|
||||
}
|
||||
easy = easy->next; /* check next handle */
|
||||
}
|
||||
|
||||
return CURLM_OK;
|
||||
}
|
||||
|
||||
CURLMcode curl_multi_perform(CURLM *multi_handle, int *running_handles)
|
||||
{
|
||||
struct Curl_multi *multi=(struct Curl_multi *)multi_handle;
|
||||
struct Curl_one_easy *easy;
|
||||
bool done;
|
||||
CURLMcode result=CURLM_OK;
|
||||
|
||||
if(!GOOD_MULTI_HANDLE(multi))
|
||||
return CURLM_BAD_HANDLE;
|
||||
|
||||
easy=multi->easy.next;
|
||||
while(easy) {
|
||||
|
||||
switch(easy->state) {
|
||||
case CURLM_STATE_INIT:
|
||||
/* init this transfer. */
|
||||
easy->result=Curl_pretransfer(easy->easy_handle);
|
||||
if(CURLE_OK == easy->result) {
|
||||
/* after init, go CONNECT */
|
||||
easy->state = CURLM_STATE_CONNECT;
|
||||
result = CURLM_CALL_MULTI_PERFORM;
|
||||
}
|
||||
break;
|
||||
case CURLM_STATE_CONNECT:
|
||||
/* connect */
|
||||
easy->result = Curl_connect(easy->easy_handle);
|
||||
/* after connect, go DO */
|
||||
if(CURLE_OK == easy->result) {
|
||||
easy->state = CURLM_STATE_DO;
|
||||
result = CURLM_CALL_MULTI_PERFORM;
|
||||
}
|
||||
break;
|
||||
case CURLM_STATE_DO:
|
||||
/* Do the fetch or put request */
|
||||
easy->result = Curl_do(easy->easy_handle);
|
||||
/* after do, go PERFORM */
|
||||
if(CURLE_OK == easy->result) {
|
||||
easy->state = CURLM_STATE_PERFORM;
|
||||
}
|
||||
break;
|
||||
case CURLM_STATE_PERFORM:
|
||||
/* read/write data if it is ready to do so */
|
||||
easy->result = Curl_readwrite(easy->easy_handle, &done);
|
||||
/* hm, when we follow redirects, we may need to go back to the CONNECT
|
||||
state */
|
||||
/* after the transfer is done, go DONE */
|
||||
if(TRUE == done) {
|
||||
/* call this even if the readwrite function returned error */
|
||||
easy->result = Curl_posttransfer(easy->easy_handle);
|
||||
easy->state = CURLM_STATE_DONE;
|
||||
}
|
||||
break;
|
||||
case CURLM_STATE_DONE:
|
||||
/* post-transfer command */
|
||||
easy->result = Curl_done(easy->easy_handle);
|
||||
/* after we have DONE what we're supposed to do, go COMPLETED */
|
||||
if(CURLE_OK == easy->result)
|
||||
easy->state = CURLM_STATE_COMPLETED;
|
||||
break;
|
||||
case CURLM_STATE_COMPLETED:
|
||||
/* this is a completed transfer, it is likely to still be connected */
|
||||
|
||||
/* This node should be delinked from the list now and we should post
|
||||
an information message that we are complete. */
|
||||
break;
|
||||
}
|
||||
if((CURLM_STATE_COMPLETED != easy->state) &&
|
||||
(CURLE_OK != easy->result)) {
|
||||
/*
|
||||
* If an error was returned, and we aren't in completed now,
|
||||
* then we go to completed and consider this transfer aborted.
|
||||
*/
|
||||
easy->state = CURLM_STATE_COMPLETED;
|
||||
}
|
||||
|
||||
easy = easy->next; /* operate on next handle */
|
||||
}
|
||||
return CURLM_OK;
|
||||
}
|
||||
|
||||
CURLMcode curl_multi_cleanup(CURLM *multi_handle)
|
||||
{
|
||||
struct Curl_multi *multi=(struct Curl_multi *)multi_handle;
|
||||
if(GOOD_MULTI_HANDLE(multi)) {
|
||||
multi->type = 0; /* not good anymore */
|
||||
|
||||
/* remove all easy handles */
|
||||
|
||||
free(multi);
|
||||
|
||||
return CURLM_OK;
|
||||
}
|
||||
else
|
||||
return CURLM_BAD_HANDLE;
|
||||
}
|
||||
|
||||
CURLMsg *curl_multi_info_read(CURLM *multi_handle, int *msgs_in_queue);
|
||||
|
184
lib/multi.h
Normal file
184
lib/multi.h
Normal file
@@ -0,0 +1,184 @@
|
||||
#ifndef __CURL_MULTI_H
|
||||
#define __CURL_MULTI_H
|
||||
/*****************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
* / __| | | | |_) | |
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 2001, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
*
|
||||
* In order to be useful for every potential user, curl and libcurl are
|
||||
* dual-licensed under the MPL and the MIT/X-derivate licenses.
|
||||
*
|
||||
* You may opt to use, copy, modify, merge, publish, distribute and/or sell
|
||||
* copies of the Software, and permit persons to whom the Software is
|
||||
* furnished to do so, under the terms of the MPL or the MIT/X-derivate
|
||||
* licenses. You may pick one of these licenses.
|
||||
*
|
||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||
* KIND, either express or implied.
|
||||
*
|
||||
* $Id$
|
||||
*****************************************************************************/
|
||||
/*
|
||||
This is meant to be the "external" header file. Don't give away any
|
||||
internals here!
|
||||
|
||||
This document presents a mixture of ideas from at least:
|
||||
- Daniel Stenberg
|
||||
- Steve Dekorte
|
||||
- Sterling Hughes
|
||||
- Ben Greear
|
||||
|
||||
-------------------------------------------
|
||||
GOALS
|
||||
|
||||
o Enable a "pull" interface. The application that uses libcurl decides where
|
||||
and when to ask libcurl to get/send data.
|
||||
|
||||
o Enable multiple simultaneous transfers in the same thread without making it
|
||||
complicated for the application.
|
||||
|
||||
o Enable the application to select() on its own file descriptors and curl's
|
||||
file descriptors simultaneous easily.
|
||||
|
||||
Example source using this interface: http://curl.haxx.se/dev/multi-app.c
|
||||
|
||||
*/
|
||||
#ifdef HAVE_SYS_SOCKET_H
|
||||
#include <sys/socket.h>
|
||||
#endif
|
||||
#include <curl/types.h>
|
||||
|
||||
typedef void CURLM;
|
||||
|
||||
typedef enum {
|
||||
CURLM_CALL_MULTI_PERFORM=-1, /* please call curl_multi_perform() soon */
|
||||
CURLM_OK,
|
||||
CURLM_BAD_HANDLE, /* the passed-in handle is not a valid CURLM handle */
|
||||
CURLM_BAD_EASY_HANDLE, /* an easy handle was not good/valid */
|
||||
CURLM_OUT_OF_MEMORY, /* if you ever get this, you're in deep sh*t */
|
||||
CURLM_LAST
|
||||
} CURLMcode;
|
||||
|
||||
typedef enum {
|
||||
CURLMSG_NONE, /* first, not used */
|
||||
CURLMSG_DONE, /* This easy handle has completed. 'whatever' points to
|
||||
the CURLcode of the transfer */
|
||||
CURLMSG_LAST /* last, not used */
|
||||
} CURLMSG;
|
||||
|
||||
struct CURLMsg {
|
||||
CURLMSG msg; /* what this message means */
|
||||
CURL *easy_handle; /* the handle it concerns */
|
||||
union {
|
||||
void *whatever; /* message-specific data */
|
||||
CURLcode result; /* return code for transfer */
|
||||
} data;
|
||||
};
|
||||
typedef struct CURLMsg CURLMsg;
|
||||
|
||||
/*
|
||||
* Name: curl_multi_init()
|
||||
*
|
||||
* Desc: inititalize multi-style curl usage
|
||||
* Returns: a new CURLM handle to use in all 'curl_multi' functions.
|
||||
*/
|
||||
CURLM *curl_multi_init(void);
|
||||
|
||||
/*
|
||||
* Name: curl_multi_add_handle()
|
||||
*
|
||||
* Desc: add a standard curl handle to the multi stack
|
||||
* Returns: CURLMcode type, general multi error code.
|
||||
*/
|
||||
CURLMcode curl_multi_add_handle(CURLM *multi_handle,
|
||||
CURL *curl_handle);
|
||||
|
||||
/*
|
||||
* Name: curl_multi_remove_handle()
|
||||
*
|
||||
* Desc: removes a curl handle from the multi stack again
|
||||
* Returns: CURLMcode type, general multi error code.
|
||||
*/
|
||||
CURLMcode curl_multi_remove_handle(CURLM *multi_handle,
|
||||
CURL *curl_handle);
|
||||
|
||||
/*
|
||||
* Name: curl_multi_fdset()
|
||||
*
|
||||
* Desc: Ask curl for its fd_set sets. The app can use these to select() or
|
||||
* poll() on. We want curl_multi_perform() called as soon as one of
|
||||
* them are ready.
|
||||
* Returns: CURLMcode type, general multi error code.
|
||||
*/
|
||||
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);
|
||||
|
||||
/*
|
||||
* Name: curl_multi_perform()
|
||||
*
|
||||
* Desc: When the app thinks there's data available for curl it calls this
|
||||
* function to read/write whatever there is right now. This returns
|
||||
* as soon as the reads and writes are done. This function does not
|
||||
* require that there actually is data available for reading or that
|
||||
* data can be written, it can be called just in case. It returns
|
||||
* the number of handles that still transfer data in the second
|
||||
* argument's integer-pointer.
|
||||
*
|
||||
* Returns: CURLMcode type, general multi 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
|
||||
* returns OK.
|
||||
*/
|
||||
CURLMcode curl_multi_perform(CURLM *multi_handle,
|
||||
int *running_handles);
|
||||
|
||||
/*
|
||||
* Name: curl_multi_cleanup()
|
||||
*
|
||||
* Desc: Cleans up and removes a whole multi stack. It does not free or
|
||||
* touch any individual easy handles in any way. We need to define
|
||||
* in what state those handles will be if this function is called
|
||||
* in the middle of a transfer.
|
||||
* Returns: CURLMcode type, general multi error code.
|
||||
*/
|
||||
CURLMcode curl_multi_cleanup(CURLM *multi_handle);
|
||||
|
||||
/*
|
||||
* Name: curl_multi_info_read()
|
||||
*
|
||||
* Desc: Ask the multi handle if there's any messages/informationals from
|
||||
* the individual transfers. Messages include informationals such as
|
||||
* 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 data the returned pointer points to will not survive calling
|
||||
* curl_multi_cleanup().
|
||||
*
|
||||
* The 'CURLMsg' struct is meant to be very simple and only contain
|
||||
* very basic informations. If more involved information is wanted,
|
||||
* we will provide the particular "transfer handle" in that struct
|
||||
* and that should/could/would be used in subsequent
|
||||
* curl_easy_getinfo() calls (or similar). The point being that we
|
||||
* must never expose complex structs to applications, as then we'll
|
||||
* undoubtably get backwards compatibility problems in the future.
|
||||
*
|
||||
* Returns: 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.
|
||||
*/
|
||||
CURLMsg *curl_multi_info_read(CURLM *multi_handle,
|
||||
int *msgs_in_queue);
|
||||
|
||||
#endif
|
@@ -111,23 +111,25 @@ void Curl_pgrsTime(struct SessionHandle *data, timerid timer)
|
||||
/* mistake filter */
|
||||
break;
|
||||
case TIMER_STARTSINGLE:
|
||||
/* This is set at the start of a single fetch, there may be several
|
||||
fetches within an operation, why we add all other times relative
|
||||
to this one */
|
||||
/* This is set at the start of a single fetch */
|
||||
data->progress.t_startsingle = Curl_tvnow();
|
||||
break;
|
||||
|
||||
case TIMER_NAMELOOKUP:
|
||||
data->progress.t_nslookup +=
|
||||
(double)Curl_tvdiff(Curl_tvnow(), data->progress.t_startsingle)/1000;
|
||||
data->progress.t_nslookup =
|
||||
(double)Curl_tvdiff(Curl_tvnow(), data->progress.t_startsingle)/1000.0;
|
||||
break;
|
||||
case TIMER_CONNECT:
|
||||
data->progress.t_connect +=
|
||||
(double)Curl_tvdiff(Curl_tvnow(), data->progress.t_startsingle)/1000;
|
||||
data->progress.t_connect =
|
||||
(double)Curl_tvdiff(Curl_tvnow(), data->progress.t_startsingle)/1000.0;
|
||||
break;
|
||||
case TIMER_PRETRANSFER:
|
||||
data->progress.t_pretransfer +=
|
||||
(double)Curl_tvdiff(Curl_tvnow(), data->progress.t_startsingle)/1000;
|
||||
data->progress.t_pretransfer =
|
||||
(double)Curl_tvdiff(Curl_tvnow(), data->progress.t_startsingle)/1000.0;
|
||||
break;
|
||||
case TIMER_STARTTRANSFER:
|
||||
data->progress.t_starttransfer =
|
||||
(double)Curl_tvdiff(Curl_tvnow(), data->progress.t_startsingle)/1000.0;
|
||||
break;
|
||||
case TIMER_POSTRANSFER:
|
||||
/* this is the normal end-of-transfer thing */
|
||||
@@ -227,7 +229,7 @@ int Curl_pgrsUpdate(struct connectdata *conn)
|
||||
/* The exact time spent so far (from the start) */
|
||||
timespent = (double)Curl_tvdiff (now, data->progress.start)/1000;
|
||||
|
||||
data->progress.timespent = (long)timespent;
|
||||
data->progress.timespent = timespent;
|
||||
|
||||
/* The average download speed this far */
|
||||
data->progress.dlspeed =
|
||||
@@ -275,6 +277,8 @@ int Curl_pgrsUpdate(struct connectdata *conn)
|
||||
/* Figure out the exact time for the time span */
|
||||
span_ms = Curl_tvdiff(now,
|
||||
data->progress.speeder_time[checkindex]);
|
||||
if(0 == span_ms)
|
||||
span_ms=1; /* at least one millisecond MUST have passed */
|
||||
|
||||
/* Calculate the average speed the last 'countindex' seconds */
|
||||
data->progress.current_speed =
|
||||
|
@@ -31,6 +31,7 @@ typedef enum {
|
||||
TIMER_NAMELOOKUP,
|
||||
TIMER_CONNECT,
|
||||
TIMER_PRETRANSFER,
|
||||
TIMER_STARTTRANSFER,
|
||||
TIMER_POSTRANSFER,
|
||||
TIMER_STARTSINGLE,
|
||||
TIMER_LAST /* must be last */
|
||||
|
@@ -362,11 +362,11 @@ Curl_sec_vfprintf(struct connectdata *conn, FILE *f, const char *fmt, va_list ap
|
||||
conn);
|
||||
free(buf);
|
||||
if(len < 0) {
|
||||
failf(conn->data, "Failed to encode command.\n");
|
||||
failf(conn->data, "Failed to encode command.");
|
||||
return -1;
|
||||
}
|
||||
if(Curl_base64_encode(enc, len, &buf) < 0){
|
||||
failf(conn->data, "Out of memory base64-encoding.\n");
|
||||
failf(conn->data, "Out of memory base64-encoding.");
|
||||
return -1;
|
||||
}
|
||||
if(conn->command_prot == prot_safe)
|
||||
@@ -421,7 +421,7 @@ sec_prot_internal(struct connectdata *conn, int level)
|
||||
return -1;
|
||||
|
||||
if(conn->data->state.buffer[0] != '2'){
|
||||
failf(conn->data, "Failed to set protection buffer size.\n");
|
||||
failf(conn->data, "Failed to set protection buffer size.");
|
||||
return -1;
|
||||
}
|
||||
conn->buffer_size = s;
|
||||
@@ -441,7 +441,7 @@ sec_prot_internal(struct connectdata *conn, int level)
|
||||
return -1;
|
||||
|
||||
if(conn->data->state.buffer[0] != '2'){
|
||||
failf(conn->data, "Failed to set protection level.\n");
|
||||
failf(conn->data, "Failed to set protection level.");
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
12
lib/sendf.c
12
lib/sendf.c
@@ -26,6 +26,13 @@
|
||||
#include <stdio.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdlib.h>
|
||||
#ifdef HAVE_SYS_TYPES_H
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_SYS_SOCKET_H
|
||||
#include <sys/socket.h> /* required for send() & recv() prototypes */
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_UNISTD_H
|
||||
#include <unistd.h>
|
||||
@@ -133,8 +140,9 @@ void Curl_infof(struct SessionHandle *data, const char *fmt, ...)
|
||||
}
|
||||
}
|
||||
|
||||
/* Curl_failf() is for messages stating why we failed, the LAST one will be
|
||||
returned for the user (if requested) */
|
||||
/* Curl_failf() is for messages stating why we failed.
|
||||
* The message SHALL NOT include any LF or CR.
|
||||
*/
|
||||
|
||||
void Curl_failf(struct SessionHandle *data, const char *fmt, ...)
|
||||
{
|
||||
|
18
lib/setup.h
18
lib/setup.h
@@ -34,20 +34,26 @@
|
||||
#ifdef HAVE_CONFIG_H
|
||||
|
||||
#ifdef VMS
|
||||
#include "config-vms.h"
|
||||
#include "../config-vms.h"
|
||||
#else
|
||||
#include "config.h" /* the configure script results */
|
||||
#include "../config.h" /* the configure script results */
|
||||
#endif
|
||||
|
||||
#else
|
||||
#ifdef WIN32
|
||||
/* include the hand-modified win32 adjusted config.h! */
|
||||
/* hand-modified win32 config.h! */
|
||||
#include "../config-win32.h"
|
||||
#endif
|
||||
#ifdef macintosh
|
||||
/* hand-modified MacOS config.h! */
|
||||
#include "../config-mac.h"
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
#ifndef __cplusplus /* (rabe) */
|
||||
typedef char bool;
|
||||
#define typedef_bool
|
||||
#endif /* (rabe) */
|
||||
|
||||
#ifdef NEED_REENTRANT
|
||||
@@ -110,13 +116,13 @@ defined(HAVE_LIBSSL) && defined(HAVE_LIBCRYPTO)
|
||||
#define sclose(x) closesocket(x)
|
||||
#define sread(x,y,z) recv(x,y,z,0)
|
||||
#define swrite(x,y,z) (size_t)send(x,y,z,0)
|
||||
#define myalarm(x) /* win32 is a silly system */
|
||||
#undef HAVE_ALARM
|
||||
#else
|
||||
/* gcc-for-win is still good :) */
|
||||
#define sclose(x) close(x)
|
||||
#define sread(x,y,z) recv(x,y,z,0)
|
||||
#define swrite(x,y,z) send(x,y,z,0)
|
||||
#define myalarm(x) alarm(x)
|
||||
#define HAVE_ALARM
|
||||
#endif
|
||||
|
||||
#define PATH_CHAR ";"
|
||||
@@ -127,7 +133,7 @@ defined(HAVE_LIBSSL) && defined(HAVE_LIBCRYPTO)
|
||||
#define sclose(x) close(x)
|
||||
#define sread(x,y,z) recv(x,y,z,0)
|
||||
#define swrite(x,y,z) send(x,y,z,0)
|
||||
#define myalarm(x) alarm(x)
|
||||
#define HAVE_ALARM
|
||||
|
||||
#define PATH_CHAR ":"
|
||||
#define DIR_CHAR "/"
|
||||
|
157
lib/ssluse.c
157
lib/ssluse.c
@@ -5,7 +5,7 @@
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 2000, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
* Copyright (C) 2001, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
*
|
||||
* In order to be useful for every potential user, curl and libcurl are
|
||||
* dual-licensed under the MPL and the MIT/X-derivate licenses.
|
||||
@@ -22,11 +22,12 @@
|
||||
*****************************************************************************/
|
||||
|
||||
/*
|
||||
* The original SSL code was written by
|
||||
* The original SSL code for curl was written by
|
||||
* Linas Vepstas <linas@linas.org> and Sampo Kellomaki <sampo@iki.fi>
|
||||
*/
|
||||
|
||||
#include "setup.h"
|
||||
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
@@ -171,37 +172,59 @@ int random_the_seed(struct connectdata *conn)
|
||||
return nread;
|
||||
}
|
||||
|
||||
#ifndef SSL_FILETYPE_ENGINE
|
||||
#define SSL_FILETYPE_ENGINE 42
|
||||
#endif
|
||||
static int do_file_type(const char *type)
|
||||
{
|
||||
if (!type || !type[0])
|
||||
return SSL_FILETYPE_PEM;
|
||||
if (curl_strequal(type, "PEM"))
|
||||
return SSL_FILETYPE_PEM;
|
||||
if (curl_strequal(type, "DER"))
|
||||
return SSL_FILETYPE_ASN1;
|
||||
if (curl_strequal(type, "ENG"))
|
||||
return SSL_FILETYPE_ENGINE;
|
||||
return -1;
|
||||
}
|
||||
|
||||
static
|
||||
int cert_stuff(struct connectdata *conn,
|
||||
char *cert_file,
|
||||
char *key_file)
|
||||
const char *cert_type,
|
||||
char *key_file,
|
||||
const char *key_type)
|
||||
{
|
||||
struct SessionHandle *data = conn->data;
|
||||
int file_type;
|
||||
|
||||
if (cert_file != NULL) {
|
||||
SSL *ssl;
|
||||
X509 *x509;
|
||||
|
||||
if(data->set.cert_passwd) {
|
||||
if(data->set.key_passwd) {
|
||||
#ifndef HAVE_USERDATA_IN_PWD_CALLBACK
|
||||
/*
|
||||
* If password has been given, we store that in the global
|
||||
* area (*shudder*) for a while:
|
||||
*/
|
||||
strcpy(global_passwd, data->set.cert_passwd);
|
||||
strcpy(global_passwd, data->set.key_passwd);
|
||||
#else
|
||||
/*
|
||||
* We set the password in the callback userdata
|
||||
*/
|
||||
SSL_CTX_set_default_passwd_cb_userdata(conn->ssl.ctx, data->set.cert_passwd);
|
||||
SSL_CTX_set_default_passwd_cb_userdata(conn->ssl.ctx,
|
||||
data->set.key_passwd);
|
||||
#endif
|
||||
/* Set passwd callback: */
|
||||
SSL_CTX_set_default_passwd_cb(conn->ssl.ctx, passwd_callback);
|
||||
}
|
||||
|
||||
#if 0
|
||||
if (SSL_CTX_use_certificate_file(conn->ssl.ctx,
|
||||
cert_file,
|
||||
SSL_FILETYPE_PEM) != 1) {
|
||||
failf(data, "unable to set certificate file (wrong password?)\n");
|
||||
failf(data, "unable to set certificate file (wrong password?)");
|
||||
return(0);
|
||||
}
|
||||
if (key_file == NULL)
|
||||
@@ -210,9 +233,86 @@ int cert_stuff(struct connectdata *conn,
|
||||
if (SSL_CTX_use_PrivateKey_file(conn->ssl.ctx,
|
||||
key_file,
|
||||
SSL_FILETYPE_PEM) != 1) {
|
||||
failf(data, "unable to set public key file\n");
|
||||
failf(data, "unable to set public key file");
|
||||
return(0);
|
||||
}
|
||||
#else
|
||||
/* The '#ifdef 0' section above was removed on 17-dec-2001 */
|
||||
|
||||
file_type = do_file_type(cert_type);
|
||||
|
||||
switch(file_type) {
|
||||
case SSL_FILETYPE_PEM:
|
||||
case SSL_FILETYPE_ASN1:
|
||||
if (SSL_CTX_use_certificate_file(conn->ssl.ctx,
|
||||
cert_file,
|
||||
file_type) != 1) {
|
||||
failf(data, "unable to set certificate file (wrong password?)");
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
case SSL_FILETYPE_ENGINE:
|
||||
failf(data, "file type ENG for certificate not implemented");
|
||||
return 0;
|
||||
|
||||
default:
|
||||
failf(data, "not supported file type '%s' for certificate", cert_type);
|
||||
return 0;
|
||||
}
|
||||
|
||||
file_type = do_file_type(key_type);
|
||||
|
||||
switch(file_type) {
|
||||
case SSL_FILETYPE_PEM:
|
||||
if (key_file == NULL)
|
||||
/* cert & key can only be in PEM case in the same file */
|
||||
key_file=cert_file;
|
||||
case SSL_FILETYPE_ASN1:
|
||||
if (SSL_CTX_use_PrivateKey_file(conn->ssl.ctx,
|
||||
key_file,
|
||||
file_type) != 1) {
|
||||
failf(data, "unable to set private key file\n");
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
case SSL_FILETYPE_ENGINE:
|
||||
#ifdef HAVE_OPENSSL_ENGINE_H
|
||||
{ /* XXXX still needs some work */
|
||||
EVP_PKEY *priv_key = NULL;
|
||||
if (conn && conn->data && conn->data->engine) {
|
||||
if (!key_file || !key_file[0]) {
|
||||
failf(data, "no key set to load from crypto engine\n");
|
||||
return 0;
|
||||
}
|
||||
priv_key = ENGINE_load_private_key(conn->data->engine,key_file,
|
||||
data->set.key_passwd);
|
||||
if (!priv_key) {
|
||||
failf(data, "failed to load private key from crypto engine\n");
|
||||
return 0;
|
||||
}
|
||||
if (SSL_CTX_use_PrivateKey(conn->ssl.ctx, priv_key) != 1) {
|
||||
failf(data, "unable to set private key\n");
|
||||
EVP_PKEY_free(priv_key);
|
||||
return 0;
|
||||
}
|
||||
EVP_PKEY_free(priv_key); /* we don't need the handle any more... */
|
||||
}
|
||||
else {
|
||||
failf(data, "crypto engine not set, can't load private key\n");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
#else
|
||||
failf(data, "file type ENG for private key not supported\n");
|
||||
return 0;
|
||||
#endif
|
||||
break;
|
||||
default:
|
||||
failf(data, "not supported file type for private key\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
ssl=SSL_new(conn->ssl.ctx);
|
||||
x509=SSL_get_certificate(ssl);
|
||||
@@ -229,7 +329,7 @@ int cert_stuff(struct connectdata *conn,
|
||||
/* Now we know that a key and cert have been set against
|
||||
* the SSL context */
|
||||
if (!SSL_CTX_check_private_key(conn->ssl.ctx)) {
|
||||
failf(data, "Private key does not match the certificate public key\n");
|
||||
failf(data, "Private key does not match the certificate public key");
|
||||
return(0);
|
||||
}
|
||||
#ifndef HAVE_USERDATA_IN_PWD_CALLBACK
|
||||
@@ -269,6 +369,10 @@ void Curl_SSL_init(void)
|
||||
|
||||
init_ssl++; /* never again */
|
||||
|
||||
#ifdef HAVE_ENGINE_LOAD_BUILTIN_ENGINES
|
||||
ENGINE_load_builtin_engines();
|
||||
#endif
|
||||
|
||||
/* Lets get nice error messages */
|
||||
SSL_load_error_strings();
|
||||
|
||||
@@ -292,6 +396,12 @@ void Curl_SSL_cleanup(void)
|
||||
/* EVP_cleanup() removes all ciphers and digests from the
|
||||
table. */
|
||||
EVP_cleanup();
|
||||
|
||||
#ifdef HAVE_ENGINE_cleanup
|
||||
ENGINE_cleanup();
|
||||
#endif
|
||||
|
||||
init_ssl=0; /* not inited any more */
|
||||
}
|
||||
#else
|
||||
/* SSL disabled, do nothing */
|
||||
@@ -426,6 +536,13 @@ int Curl_SSL_Close_All(struct SessionHandle *data)
|
||||
/* free the cache data */
|
||||
free(data->state.session);
|
||||
}
|
||||
#ifdef HAVE_OPENSSL_ENGINE_H
|
||||
if (data->engine)
|
||||
{
|
||||
ENGINE_free(data->engine);
|
||||
data->engine = NULL;
|
||||
}
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -541,14 +658,20 @@ Curl_SSLConnect(struct connectdata *conn)
|
||||
/* Make funny stuff to get random input */
|
||||
random_the_seed(conn);
|
||||
|
||||
/* check to see if we've been told to use an explicit SSL/TLS version */
|
||||
switch(data->set.ssl.version) {
|
||||
default:
|
||||
case CURL_SSLVERSION_DEFAULT:
|
||||
/* we try to figure out version */
|
||||
req_method = SSLv23_client_method();
|
||||
break;
|
||||
case 2:
|
||||
case CURL_SSLVERSION_TLSv1:
|
||||
req_method = TLSv1_client_method();
|
||||
break;
|
||||
case CURL_SSLVERSION_SSLv2:
|
||||
req_method = SSLv2_client_method();
|
||||
break;
|
||||
case 3:
|
||||
case CURL_SSLVERSION_SSLv3:
|
||||
req_method = SSLv3_client_method();
|
||||
break;
|
||||
}
|
||||
@@ -561,7 +684,11 @@ Curl_SSLConnect(struct connectdata *conn)
|
||||
}
|
||||
|
||||
if(data->set.cert) {
|
||||
if (!cert_stuff(conn, data->set.cert, data->set.cert)) {
|
||||
if (!cert_stuff(conn,
|
||||
data->set.cert,
|
||||
data->set.cert_type,
|
||||
data->set.key,
|
||||
data->set.key_type)) {
|
||||
/* failf() is already done in cert_stuff() */
|
||||
return CURLE_SSL_CONNECT_ERROR;
|
||||
}
|
||||
@@ -570,7 +697,7 @@ Curl_SSLConnect(struct connectdata *conn)
|
||||
if(data->set.ssl.cipher_list) {
|
||||
if (!SSL_CTX_set_cipher_list(conn->ssl.ctx,
|
||||
data->set.ssl.cipher_list)) {
|
||||
failf(data, "failed setting cipher list\n");
|
||||
failf(data, "failed setting cipher list");
|
||||
return CURLE_SSL_CONNECT_ERROR;
|
||||
}
|
||||
}
|
||||
@@ -583,7 +710,7 @@ Curl_SSLConnect(struct connectdata *conn)
|
||||
if (!SSL_CTX_load_verify_locations(conn->ssl.ctx,
|
||||
data->set.ssl.CAfile,
|
||||
data->set.ssl.CApath)) {
|
||||
failf(data,"error setting cerficate verify locations\n");
|
||||
failf(data,"error setting cerficate verify locations");
|
||||
return CURLE_SSL_CONNECT_ERROR;
|
||||
}
|
||||
}
|
||||
@@ -705,7 +832,7 @@ Curl_SSLConnect(struct connectdata *conn)
|
||||
if(data->set.ssl.verifypeer) {
|
||||
data->set.ssl.certverifyresult=SSL_get_verify_result(conn->ssl.handle);
|
||||
if (data->set.ssl.certverifyresult != X509_V_OK) {
|
||||
failf(data, "SSL certificate verify result: %d\n",
|
||||
failf(data, "SSL certificate verify result: %d",
|
||||
data->set.ssl.certverifyresult);
|
||||
retcode = CURLE_SSL_PEER_CERTIFICATE;
|
||||
}
|
||||
|
@@ -24,6 +24,7 @@
|
||||
#include "setup.h"
|
||||
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
|
||||
int curl_strequal(const char *first, const char *second)
|
||||
{
|
||||
@@ -62,6 +63,9 @@ int curl_strnequal(const char *first, const char *second, size_t max)
|
||||
first++;
|
||||
second++;
|
||||
}
|
||||
if(0 == max)
|
||||
return 1; /* they are equal this far */
|
||||
|
||||
return toupper(*first) == toupper(*second);
|
||||
#endif
|
||||
}
|
||||
|
@@ -1142,7 +1142,7 @@ CURLcode Curl_telnet(struct connectdata *conn)
|
||||
#else
|
||||
FD_ZERO (&readfd); /* clear it */
|
||||
FD_SET (sockfd, &readfd);
|
||||
FD_SET (1, &readfd);
|
||||
FD_SET (0, &readfd);
|
||||
|
||||
keepfd = readfd;
|
||||
|
||||
@@ -1156,13 +1156,13 @@ CURLcode Curl_telnet(struct connectdata *conn)
|
||||
case 0: /* timeout */
|
||||
break;
|
||||
default: /* read! */
|
||||
if(FD_ISSET(1, &readfd)) { /* read from stdin */
|
||||
if(FD_ISSET(0, &readfd)) { /* read from stdin */
|
||||
unsigned char outbuf[2];
|
||||
int out_count = 0;
|
||||
size_t bytes_written;
|
||||
char *buffer = buf;
|
||||
|
||||
nread = read(1, buf, 255);
|
||||
nread = read(0, buf, 255);
|
||||
|
||||
while(nread--) {
|
||||
outbuf[0] = *buffer++;
|
||||
|
@@ -69,10 +69,10 @@ struct timeval Curl_tvnow (void)
|
||||
* Make sure that the first argument is the more recent time, as otherwise
|
||||
* we'll get a weird negative time-diff back...
|
||||
*/
|
||||
long Curl_tvdiff (struct timeval t1, struct timeval t2)
|
||||
long Curl_tvdiff (struct timeval newer, struct timeval older)
|
||||
{
|
||||
return (t1.tv_sec*1000 + t1.tv_usec/1000)-
|
||||
(t2.tv_sec*1000 + t2.tv_usec/1000);
|
||||
return (newer.tv_sec-older.tv_sec)*1000+
|
||||
(499+newer.tv_usec-older.tv_usec)/1000;
|
||||
}
|
||||
|
||||
long Curl_tvlong (struct timeval t1)
|
||||
|
@@ -42,7 +42,7 @@ struct timeval {
|
||||
#endif
|
||||
#endif
|
||||
|
||||
struct timeval Curl_tvnow ();
|
||||
struct timeval Curl_tvnow (void);
|
||||
|
||||
/* the diff is from now on returned in number of milliseconds! */
|
||||
long Curl_tvdiff (struct timeval t1, struct timeval t2);
|
||||
|
@@ -305,6 +305,8 @@ Transfer(struct connectdata *c_conn)
|
||||
}
|
||||
break;
|
||||
default:
|
||||
if ((bytecount == 0) && (writebytecount == 0))
|
||||
Curl_pgrsTime(data, TIMER_STARTTRANSFER);
|
||||
if((keepon & KEEP_READ) && FD_ISSET(conn->sockfd, &readfd)) {
|
||||
/* read! */
|
||||
urg = Curl_read(conn, conn->sockfd, buf, BUFSIZE -1, &nread);
|
||||
@@ -900,6 +902,10 @@ CURLcode Curl_perform(struct SessionHandle *data)
|
||||
struct connectdata *conn=NULL;
|
||||
bool port=TRUE; /* allow data->set.use_port to set port to use */
|
||||
char *newurl = NULL; /* possibly a new URL to follow to! */
|
||||
#ifdef HAVE_SIGNAL
|
||||
/* storage for the previous bag^H^H^HSIGPIPE signal handler :-) */
|
||||
void (*prev_signal)(int sig);
|
||||
#endif
|
||||
|
||||
if(!data->change.url)
|
||||
/* we can't do anything wihout URL */
|
||||
@@ -916,10 +922,23 @@ CURLcode Curl_perform(struct SessionHandle *data)
|
||||
data->state.this_is_a_follow = FALSE; /* reset this */
|
||||
data->state.errorbuf = FALSE; /* no error has occurred */
|
||||
|
||||
Curl_initinfo(data); /* reset session-specific information "variables" */
|
||||
#if defined(HAVE_SIGNAL) && defined(SIGPIPE)
|
||||
/*************************************************************
|
||||
* Tell signal handler to ignore SIGPIPE
|
||||
*************************************************************/
|
||||
prev_signal = signal(SIGPIPE, SIG_IGN);
|
||||
#endif
|
||||
|
||||
Curl_initinfo(data); /* reset session-specific information "variables" */
|
||||
Curl_pgrsStartNow(data);
|
||||
|
||||
/*
|
||||
* It is important that there is NO 'return' from this function any any
|
||||
* other place than falling down the bottom! This is because we have cleanup
|
||||
* stuff that must be done before we get back, and that is only performed
|
||||
* after this do-while loop.
|
||||
*/
|
||||
|
||||
do {
|
||||
Curl_pgrsTime(data, TIMER_STARTSINGLE);
|
||||
res = Curl_connect(data, &conn, port);
|
||||
@@ -1035,8 +1054,10 @@ CURLcode Curl_perform(struct SessionHandle *data)
|
||||
point to read-only data */
|
||||
char *url_clone=strdup(data->change.url);
|
||||
|
||||
if(!url_clone)
|
||||
return CURLE_OUT_OF_MEMORY;
|
||||
if(!url_clone) {
|
||||
res = CURLE_OUT_OF_MEMORY;
|
||||
break; /* skip out of this loop NOW */
|
||||
}
|
||||
|
||||
/* protsep points to the start of the host name */
|
||||
protsep=strstr(url_clone, "//");
|
||||
@@ -1070,8 +1091,10 @@ CURLcode Curl_perform(struct SessionHandle *data)
|
||||
1 + /* possible slash */
|
||||
strlen(newurl) + 1/* zero byte */);
|
||||
|
||||
if(!newest)
|
||||
return CURLE_OUT_OF_MEMORY;
|
||||
if(!newest) {
|
||||
res = CURLE_OUT_OF_MEMORY;
|
||||
break; /* go go go out from this loop */
|
||||
}
|
||||
sprintf(newest, "%s%s%s", url_clone, ('/' == newurl[0])?"":"/",
|
||||
newurl);
|
||||
free(newurl);
|
||||
@@ -1159,9 +1182,10 @@ CURLcode Curl_perform(struct SessionHandle *data)
|
||||
if(newurl)
|
||||
free(newurl);
|
||||
|
||||
/* make absolutely sure the alarm is switched off! */
|
||||
if(data->set.timeout || data->set.connecttimeout)
|
||||
myalarm(0);
|
||||
#if defined(HAVE_SIGNAL) && defined(SIGPIPE)
|
||||
/* restore the signal handler for SIGPIPE before we get back */
|
||||
signal(SIGPIPE, prev_signal);
|
||||
#endif
|
||||
|
||||
return res;
|
||||
}
|
||||
|
247
lib/url.c
247
lib/url.c
@@ -72,7 +72,6 @@
|
||||
#include <inet.h>
|
||||
#endif
|
||||
|
||||
|
||||
#ifndef HAVE_SELECT
|
||||
#error "We can't compile without select() support!"
|
||||
#endif
|
||||
@@ -144,13 +143,23 @@ RETSIGTYPE alarmfunc(int signal)
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* This is the internal function curl_easy_cleanup() calls. This should
|
||||
* cleanup and free all resources associated with this sessionhandle.
|
||||
*
|
||||
* NOTE: if we ever add something that attempts to write to a socket or
|
||||
* similar here, we must ignore SIGPIPE first. It is currently only done
|
||||
* when curl_easy_perform() is invoked.
|
||||
*/
|
||||
|
||||
CURLcode Curl_close(struct SessionHandle *data)
|
||||
{
|
||||
/* Loop through all open connections and kill them one by one */
|
||||
while(-1 != ConnectionKillOne(data));
|
||||
|
||||
#ifdef USE_SSLEAY
|
||||
/* Close down all open info open SSL and sessions */
|
||||
/* Close down all open SSL info and sessions */
|
||||
Curl_SSL_Close_All(data);
|
||||
#endif
|
||||
|
||||
@@ -200,10 +209,6 @@ CURLcode Curl_open(struct SessionHandle **curl)
|
||||
{
|
||||
/* We don't yet support specifying the URL at this point */
|
||||
struct SessionHandle *data;
|
||||
#ifdef HAVE_SIGACTION
|
||||
struct sigaction sigact;
|
||||
#endif
|
||||
|
||||
/* Very simple start-up: alloc the struct, init it with zeroes and return */
|
||||
data = (struct SessionHandle *)malloc(sizeof(struct SessionHandle));
|
||||
if(!data)
|
||||
@@ -240,6 +245,7 @@ CURLcode Curl_open(struct SessionHandle **curl)
|
||||
data->state.current_speed = -1; /* init to negative == impossible */
|
||||
|
||||
data->set.httpreq = HTTPREQ_GET; /* Default HTTP request */
|
||||
data->set.ftp_use_epsv = TRUE; /* FTP defaults to EPSV operations */
|
||||
|
||||
/* make libcurl quiet by default: */
|
||||
data->set.hide_progress = TRUE; /* CURLOPT_NOPROGRESS changes these */
|
||||
@@ -263,31 +269,6 @@ CURLcode Curl_open(struct SessionHandle **curl)
|
||||
|
||||
*curl = data;
|
||||
|
||||
/*************************************************************
|
||||
* Set signal handler to catch SIGALRM
|
||||
*************************************************************/
|
||||
#ifdef HAVE_SIGACTION
|
||||
sigaction(SIGALRM, NULL, &sigact);
|
||||
sigact.sa_handler = alarmfunc;
|
||||
#ifdef SA_RESTART
|
||||
/* HPUX doesn't have SA_RESTART but defaults to that behaviour! */
|
||||
sigact.sa_flags &= ~SA_RESTART;
|
||||
#endif
|
||||
sigaction(SIGALRM, &sigact, NULL);
|
||||
#else
|
||||
/* no sigaction(), revert to the much lamer signal() */
|
||||
#ifdef HAVE_SIGNAL
|
||||
signal(SIGALRM, alarmfunc);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/*************************************************************
|
||||
* Tell signal handler to ignore SIGPIPE
|
||||
*************************************************************/
|
||||
#if defined(HAVE_SIGNAL) && defined(SIGPIPE)
|
||||
(void) signal(SIGPIPE, SIG_IGN);
|
||||
#endif
|
||||
|
||||
return CURLE_OK;
|
||||
}
|
||||
|
||||
@@ -543,6 +524,11 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option, ...)
|
||||
data->set.ftpport = va_arg(param, char *);
|
||||
data->set.ftp_use_port = data->set.ftpport?1:0;
|
||||
break;
|
||||
|
||||
case CURLOPT_FTP_USE_EPSV:
|
||||
data->set.ftp_use_epsv = va_arg(param, long)?TRUE:FALSE;
|
||||
break;
|
||||
|
||||
case CURLOPT_HTTPHEADER:
|
||||
/*
|
||||
* Set a list with HTTP headers to use (or replace internals with)
|
||||
@@ -570,8 +556,10 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option, ...)
|
||||
/*
|
||||
* Set to force us do HTTP GET
|
||||
*/
|
||||
if(va_arg(param, long))
|
||||
if(va_arg(param, long)) {
|
||||
data->set.httpreq = HTTPREQ_GET;
|
||||
data->set.upload = FALSE; /* switch off upload */
|
||||
}
|
||||
break;
|
||||
|
||||
case CURLOPT_INFILE:
|
||||
@@ -802,11 +790,75 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option, ...)
|
||||
*/
|
||||
data->set.cert = va_arg(param, char *);
|
||||
break;
|
||||
case CURLOPT_SSLCERTPASSWD:
|
||||
case CURLOPT_SSLCERTTYPE:
|
||||
/*
|
||||
* String that holds the SSL certificate password.
|
||||
* String that holds file type of the SSL certificate to use
|
||||
*/
|
||||
data->set.cert_passwd = va_arg(param, char *);
|
||||
data->set.cert_type = va_arg(param, char *);
|
||||
break;
|
||||
case CURLOPT_SSLKEY:
|
||||
/*
|
||||
* String that holds file name of the SSL certificate to use
|
||||
*/
|
||||
data->set.key = va_arg(param, char *);
|
||||
break;
|
||||
case CURLOPT_SSLKEYTYPE:
|
||||
/*
|
||||
* String that holds file type of the SSL certificate to use
|
||||
*/
|
||||
data->set.key_type = va_arg(param, char *);
|
||||
break;
|
||||
case CURLOPT_SSLKEYPASSWD:
|
||||
/*
|
||||
* String that holds the SSL private key password.
|
||||
*/
|
||||
data->set.key_passwd = va_arg(param, char *);
|
||||
break;
|
||||
case CURLOPT_SSLENGINE:
|
||||
/*
|
||||
* String that holds the SSL crypto engine.
|
||||
*/
|
||||
#ifdef HAVE_OPENSSL_ENGINE_H
|
||||
{
|
||||
const char *cpTemp = va_arg(param, char *);
|
||||
ENGINE *e;
|
||||
if (cpTemp && cpTemp[0]) {
|
||||
e = ENGINE_by_id(cpTemp);
|
||||
if (e) {
|
||||
if (data->engine) {
|
||||
ENGINE_free(data->engine);
|
||||
}
|
||||
data->engine = e;
|
||||
}
|
||||
else {
|
||||
failf(data, "SSL Engine '%s' not found", cpTemp);
|
||||
return CURLE_SSL_ENGINE_NOTFOUND;
|
||||
}
|
||||
}
|
||||
}
|
||||
#else
|
||||
return CURLE_SSL_ENGINE_NOTFOUND;
|
||||
#endif
|
||||
break;
|
||||
case CURLOPT_SSLENGINE_DEFAULT:
|
||||
/*
|
||||
* flag to set engine as default.
|
||||
*/
|
||||
#ifdef HAVE_OPENSSL_ENGINE_H
|
||||
if (data->engine) {
|
||||
if (ENGINE_set_default(data->engine, ENGINE_METHOD_ALL) > 0) {
|
||||
#ifdef DEBUG
|
||||
fprintf(stderr,"set default crypto engine\n");
|
||||
#endif
|
||||
}
|
||||
else {
|
||||
#ifdef DEBUG
|
||||
failf(data, "set default crypto engine failed");
|
||||
#endif
|
||||
return CURLE_SSL_ENGINE_SETFAILED;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
case CURLOPT_CRLF:
|
||||
/*
|
||||
@@ -957,9 +1009,9 @@ static bool SocketIsDead(int sock)
|
||||
}
|
||||
|
||||
/*
|
||||
* Given one filled in connection struct, this function should detect if there
|
||||
* already is one that have all the significant details exactly the same and
|
||||
* thus should be used instead.
|
||||
* Given one filled in connection struct (named needle), this function should
|
||||
* detect if there already is one that have all the significant details
|
||||
* exactly the same and thus should be used instead.
|
||||
*/
|
||||
static bool
|
||||
ConnectionExists(struct SessionHandle *data,
|
||||
@@ -978,8 +1030,14 @@ ConnectionExists(struct SessionHandle *data,
|
||||
if(!check)
|
||||
/* NULL pointer means not filled-in entry */
|
||||
continue;
|
||||
if(!needle->bits.httpproxy) {
|
||||
/* The requested connection does not use a HTTP proxy */
|
||||
if(!needle->bits.httpproxy || needle->protocol&PROT_SSL) {
|
||||
/* The requested connection does not use a HTTP proxy or it
|
||||
uses SSL. */
|
||||
|
||||
if(!(needle->protocol&PROT_SSL) && check->bits.httpproxy)
|
||||
/* we don't do SSL but the cached connection has a proxy,
|
||||
then don't match this */
|
||||
continue;
|
||||
|
||||
if(strequal(needle->protostr, check->protostr) &&
|
||||
strequal(needle->name, check->name) &&
|
||||
@@ -1164,12 +1222,24 @@ static CURLcode CreateConnection(struct SessionHandle *data,
|
||||
{
|
||||
char *tmp;
|
||||
char *buf;
|
||||
CURLcode result;
|
||||
CURLcode result=CURLE_OK;
|
||||
char resumerange[40]="";
|
||||
struct connectdata *conn;
|
||||
struct connectdata *conn_temp;
|
||||
char endbracket;
|
||||
int urllen;
|
||||
#ifdef HAVE_ALARM
|
||||
unsigned int prev_alarm;
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_SIGACTION
|
||||
struct sigaction keep_sigact; /* store the old struct here */
|
||||
bool keep_copysig; /* did copy it? */
|
||||
#else
|
||||
#ifdef HAVE_SIGNAL
|
||||
void *keep_sigact; /* store the old handler here */
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/*************************************************************
|
||||
* Check input data
|
||||
@@ -1496,6 +1566,7 @@ static CURLcode CreateConnection(struct SessionHandle *data,
|
||||
/* we have a proxy here to set */
|
||||
data->change.proxy = proxy;
|
||||
data->change.proxy_alloc=TRUE; /* this needs to be freed later */
|
||||
conn->bits.httpproxy = TRUE;
|
||||
}
|
||||
} /* if (!nope) - it wasn't specified non-proxy */
|
||||
} /* NO_PROXY wasn't specified or '*' */
|
||||
@@ -1551,14 +1622,14 @@ static CURLcode CreateConnection(struct SessionHandle *data,
|
||||
conn->protocol |= PROT_HTTP;
|
||||
conn->curl_do = Curl_http;
|
||||
conn->curl_done = Curl_http_done;
|
||||
conn->curl_connect = Curl_http_connect;
|
||||
}
|
||||
else if (strequal(conn->protostr, "HTTPS")) {
|
||||
#ifdef USE_SSLEAY
|
||||
|
||||
conn->port = (data->set.use_port && allow_port)?data->set.use_port:PORT_HTTPS;
|
||||
conn->remote_port = PORT_HTTPS;
|
||||
conn->protocol |= PROT_HTTP;
|
||||
conn->protocol |= PROT_HTTPS;
|
||||
conn->protocol |= PROT_HTTP|PROT_HTTPS|PROT_SSL;
|
||||
|
||||
conn->curl_do = Curl_http;
|
||||
conn->curl_done = Curl_http_done;
|
||||
@@ -1589,7 +1660,7 @@ static CURLcode CreateConnection(struct SessionHandle *data,
|
||||
|
||||
if(strequal(conn->protostr, "FTPS")) {
|
||||
#ifdef USE_SSLEAY
|
||||
conn->protocol |= PROT_FTPS;
|
||||
conn->protocol |= PROT_FTPS|PROT_SSL;
|
||||
#else
|
||||
failf(data, LIBCURL_NAME
|
||||
" was built with SSL disabled, ftps: not supported!");
|
||||
@@ -1937,17 +2008,45 @@ static CURLcode CreateConnection(struct SessionHandle *data,
|
||||
* Set timeout if that is being used
|
||||
*************************************************************/
|
||||
if(data->set.timeout || data->set.connecttimeout) {
|
||||
/*************************************************************
|
||||
* Set signal handler to catch SIGALRM
|
||||
* Store the old value to be able to set it back later!
|
||||
*************************************************************/
|
||||
|
||||
#ifdef HAVE_SIGACTION
|
||||
struct sigaction sigact;
|
||||
sigaction(SIGALRM, NULL, &sigact);
|
||||
keep_sigact = sigact;
|
||||
keep_copysig = TRUE; /* yes, we have a copy */
|
||||
sigact.sa_handler = alarmfunc;
|
||||
#ifdef SA_RESTART
|
||||
/* HPUX doesn't have SA_RESTART but defaults to that behaviour! */
|
||||
sigact.sa_flags &= ~SA_RESTART;
|
||||
#endif
|
||||
/* now set the new struct */
|
||||
sigaction(SIGALRM, &sigact, NULL);
|
||||
#else
|
||||
/* no sigaction(), revert to the much lamer signal() */
|
||||
#ifdef HAVE_SIGNAL
|
||||
keep_sigact = signal(SIGALRM, alarmfunc);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* We set the timeout on the name resolving phase first, separately from
|
||||
* the download/upload part to allow a maximum time on everything. This is
|
||||
* a signal-based timeout, why it won't work and shouldn't be used in
|
||||
* multi-threaded environments. */
|
||||
|
||||
/* myalarm() makes a signal get sent when the timeout fires off, and that
|
||||
#ifdef HAVE_ALARM
|
||||
/* alarm() makes a signal get sent when the timeout fires off, and that
|
||||
will abort system calls */
|
||||
if(data->set.connecttimeout)
|
||||
myalarm(data->set.connecttimeout);
|
||||
else
|
||||
myalarm(data->set.timeout);
|
||||
prev_alarm = alarm(data->set.connecttimeout?
|
||||
data->set.connecttimeout:
|
||||
data->set.timeout);
|
||||
/* We can expect the conn->created time to be "now", as that was just
|
||||
recently set in the beginning of this function and nothing slow
|
||||
has been done since then until now. */
|
||||
#endif
|
||||
}
|
||||
|
||||
/*************************************************************
|
||||
@@ -1966,7 +2065,8 @@ static CURLcode CreateConnection(struct SessionHandle *data,
|
||||
}
|
||||
if(!conn->hostaddr) {
|
||||
failf(data, "Couldn't resolve host '%s'", conn->name);
|
||||
return CURLE_COULDNT_RESOLVE_HOST;
|
||||
result = CURLE_COULDNT_RESOLVE_HOST;
|
||||
/* don't return yet, we need to clean up the timeout first */
|
||||
}
|
||||
}
|
||||
else if(!conn->hostaddr) {
|
||||
@@ -1980,13 +2080,52 @@ static CURLcode CreateConnection(struct SessionHandle *data,
|
||||
|
||||
if(!conn->hostaddr) {
|
||||
failf(data, "Couldn't resolve proxy '%s'", conn->proxyhost);
|
||||
return CURLE_COULDNT_RESOLVE_PROXY;
|
||||
result = CURLE_COULDNT_RESOLVE_PROXY;
|
||||
/* don't return yet, we need to clean up the timeout first */
|
||||
}
|
||||
}
|
||||
Curl_pgrsTime(data, TIMER_NAMELOOKUP);
|
||||
if(data->set.timeout || data->set.connecttimeout)
|
||||
/* switch off signal-based timeouts */
|
||||
myalarm(0);
|
||||
#ifdef HAVE_ALARM
|
||||
if(data->set.timeout || data->set.connecttimeout) {
|
||||
#ifdef HAVE_SIGACTION
|
||||
if(keep_copysig) {
|
||||
/* we got a struct as it looked before, now put that one back nice
|
||||
and clean */
|
||||
sigaction(SIGALRM, &keep_sigact, NULL); /* put it back */
|
||||
}
|
||||
#else
|
||||
#ifdef HAVE_SIGNAL
|
||||
/* restore the previous SIGALRM handler */
|
||||
signal(SIGALRM, keep_sigact);
|
||||
#endif
|
||||
#endif
|
||||
/* switch back the alarm() to either zero or to what it was before minus
|
||||
the time we spent until now! */
|
||||
if(prev_alarm) {
|
||||
/* there was an alarm() set before us, now put it back */
|
||||
long elapsed_ms = Curl_tvdiff(Curl_tvnow(), conn->created);
|
||||
long alarm_set;
|
||||
|
||||
/* the alarm period is counted in even number of seconds */
|
||||
alarm_set = prev_alarm - elapsed_ms/1000;
|
||||
|
||||
if(alarm_set<=0) {
|
||||
/* if it turned negative, we should fire off a SIGALRM here, but we
|
||||
won't, and zero would be to switch it off so we never set it to
|
||||
less than 1! */
|
||||
alarm(1);
|
||||
result = CURLE_OPERATION_TIMEOUTED;
|
||||
failf(data, "Previous alarm fired off!");
|
||||
}
|
||||
else
|
||||
alarm(alarm_set);
|
||||
}
|
||||
else
|
||||
alarm(0); /* just shut it off */
|
||||
}
|
||||
#endif
|
||||
if(result)
|
||||
return result;
|
||||
|
||||
/*************************************************************
|
||||
* Proxy authentication
|
||||
|
@@ -58,6 +58,9 @@
|
||||
#include "openssl/pem.h"
|
||||
#include "openssl/ssl.h"
|
||||
#include "openssl/err.h"
|
||||
#ifdef HAVE_OPENSSL_ENGINE_H
|
||||
#include <openssl/engine.h>
|
||||
#endif
|
||||
#else
|
||||
#include "rsa.h"
|
||||
#include "crypto.h"
|
||||
@@ -111,6 +114,9 @@ enum protection_level {
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_OPENSSL_ENGINE_H
|
||||
typedef void ENGINE;
|
||||
#endif
|
||||
/* struct for data related to SSL and SSL connections */
|
||||
struct ssl_connect_data {
|
||||
bool use; /* use ssl encrypted communications TRUE/FALSE */
|
||||
@@ -175,6 +181,9 @@ struct FTP {
|
||||
char *file; /* decoded file */
|
||||
|
||||
char *entrypath; /* the PWD reply when we logged on */
|
||||
|
||||
char *cache; /* data cache between getresponse()-calls */
|
||||
size_t cache_size; /* size of cache in bytes */
|
||||
};
|
||||
|
||||
/****************************************************************************
|
||||
@@ -223,6 +232,7 @@ struct connectdata {
|
||||
#define PROT_LDAP (1<<7)
|
||||
#define PROT_FILE (1<<8)
|
||||
#define PROT_FTPS (1<<9)
|
||||
#define PROT_SSL (1<<10) /* protocol requires SSL */
|
||||
|
||||
Curl_addrinfo *hostaddr; /* IP-protocol independent host info pointer list */
|
||||
char *hostent_buf; /* pointer to allocated memory for name info */
|
||||
@@ -246,7 +256,7 @@ struct connectdata {
|
||||
|
||||
char *range; /* range, if used. See README for detailed specification on
|
||||
this syntax. */
|
||||
int resume_from; /* continue [ftp] transfer from here */
|
||||
ssize_t resume_from; /* continue [ftp] transfer from here */
|
||||
|
||||
char *proxyhost; /* name of the http proxy host */
|
||||
|
||||
@@ -374,7 +384,7 @@ struct Progress {
|
||||
int width; /* screen width at download start */
|
||||
int flags; /* see progress.h */
|
||||
|
||||
long timespent;
|
||||
double timespent;
|
||||
|
||||
double dlspeed;
|
||||
double ulspeed;
|
||||
@@ -382,6 +392,7 @@ struct Progress {
|
||||
double t_nslookup;
|
||||
double t_connect;
|
||||
double t_pretransfer;
|
||||
double t_starttransfer;
|
||||
|
||||
struct timeval start;
|
||||
struct timeval t_startsingle;
|
||||
@@ -520,8 +531,12 @@ struct UserDefined {
|
||||
char *cookie; /* HTTP cookie string to send */
|
||||
struct curl_slist *headers; /* linked list of extra headers */
|
||||
struct HttpPost *httppost; /* linked list of POST data */
|
||||
char *cert; /* PEM-formatted certificate */
|
||||
char *cert_passwd; /* plain text certificate password */
|
||||
char *cert; /* certificate */
|
||||
char *cert_type; /* format for certificate (default: PEM) */
|
||||
char *key; /* private key */
|
||||
char *key_type; /* format for private key (default: PEM) */
|
||||
char *key_passwd; /* plain text private key password */
|
||||
char *crypto_engine; /* name of the crypto engine to use */
|
||||
char *cookiejar; /* dump all cookies to this file */
|
||||
bool crlf; /* convert crlf on ftp upload(?) */
|
||||
struct curl_slist *quote; /* before the transfer */
|
||||
@@ -554,7 +569,10 @@ struct UserDefined {
|
||||
bool hide_progress;
|
||||
bool http_fail_on_error;
|
||||
bool http_follow_location;
|
||||
bool http_include_header;
|
||||
|
||||
bool include_header;
|
||||
#define http_include_header include_header /* former name */
|
||||
|
||||
bool http_set_referer;
|
||||
bool http_auto_referer; /* set "correct" referer when following location: */
|
||||
bool no_body;
|
||||
@@ -566,6 +584,7 @@ struct UserDefined {
|
||||
bool reuse_forbid; /* forbidden to be reused, close after use */
|
||||
bool reuse_fresh; /* do not re-use an existing connection */
|
||||
bool expect100header; /* TRUE if we added Expect: 100-continue */
|
||||
bool ftp_use_epsv; /* if EPSV is to be attempted or not */
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -588,6 +607,9 @@ struct SessionHandle {
|
||||
struct UrlState state; /* struct for fields used for state info and
|
||||
other dynamic purposes */
|
||||
struct PureInfo info; /* stats, reports and info data */
|
||||
#ifdef USE_SSLEAY
|
||||
ENGINE* engine;
|
||||
#endif /* USE_SSLEAY */
|
||||
};
|
||||
|
||||
#define LIBCURL_NAME "libcurl"
|
||||
|
@@ -15,20 +15,21 @@ EXTRA_DIST = README
|
||||
CYGBUILD = 1
|
||||
|
||||
# Cygwin tarball build dir (fully-qualified name, gets deleted when done)
|
||||
cygwintmp = $(CURDIR)/cygwinbin-builddir
|
||||
cygwintmp = $(CURDIR)/tmp_binbuild
|
||||
|
||||
cygwinbin:
|
||||
rm -rf $(cygwintmp)
|
||||
$(MAKE) -C $(top_builddir) install prefix=$(cygwintmp)/usr
|
||||
$(MAKE) -C $(top_builddir) install-strip prefix=$(cygwintmp)/usr
|
||||
$(STRIP) $(cygwintmp)/usr/bin/cygcurl-?.dll
|
||||
$(mkinstalldirs) $(cygwintmp)/usr/doc/Cygwin \
|
||||
$(cygwintmp)/usr/doc/$(PACKAGE)-$(VERSION)
|
||||
cd $(top_srcdir); \
|
||||
cp packages/Win32/cygwin/README \
|
||||
cp $(srcdir)/README \
|
||||
$(cygwintmp)/usr/doc/Cygwin/$(PACKAGE)-$(VERSION)-$(CYGBUILD).README
|
||||
cd $(top_srcdir) ; \
|
||||
cp CHANGES LEGAL MPL-1.1.txt README docs/FAQ docs/FEATURES docs/TODO \
|
||||
cd $(top_srcdir) ; cp CHANGES LEGAL MPL-1.1.txt MITX.txt README \
|
||||
docs/FAQ docs/FEATURES docs/TODO \
|
||||
$(cygwintmp)/usr/doc/$(PACKAGE)-$(VERSION)
|
||||
cd $(cygwintmp) ; \
|
||||
tar cjf $(PACKAGE)-$(VERSION)-$(CYGBUILD).tar.bz2 usr
|
||||
mv $(cygwintmp)/$(PACKAGE)-$(VERSION)-$(CYGBUILD).tar.bz2 . \
|
||||
&& rm -rf $(cygwintmp)
|
||||
|
||||
|
@@ -1,35 +1,34 @@
|
||||
Curl is a tool for transferring files with URL syntax, supporting FTP, FTPS,
|
||||
HTTP, HTTPS, GOPHER, TELNET, DICT, FILE and LDAP. Curl supports HTTPS
|
||||
certificates, HTTP POST, HTTP PUT, FTP uploading, kerberos, HTTP form based
|
||||
upload, proxies, cookies, user+password authentication, file transfer resume,
|
||||
Curl is a tool for transferring files with URL syntax, supporting
|
||||
FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE and LDAP.
|
||||
Curl supports HTTPS certificates, HTTP POST, HTTP PUT,
|
||||
FTP uploading, kerberos, HTTP form based upload, proxies,
|
||||
cookies, user+password authentication, file transfer resume,
|
||||
http proxy tunneling and a busload of other useful tricks.
|
||||
|
||||
See /usr/doc/curl-<version>/FEATURES for more info.
|
||||
|
||||
cURL (as of 7.9.1) builds 100% cleanly OOTB.
|
||||
|
||||
The Cygwin specific source files (README and a Makefile for
|
||||
building binary tarballs) are not in a CYGWIN-PATCHES directory.
|
||||
They are at: <srctop>/packages/Win32/cygwin/
|
||||
|
||||
|
||||
Direct Dependencies:
|
||||
OpenSSL 0.9.6b
|
||||
Dependencies:
|
||||
- Cygwin
|
||||
- OpenSSL 0.9.6b-2+ (*)
|
||||
(*) cURL can be built without SSL support: ./configure --without-ssl
|
||||
|
||||
|
||||
Canonical Homepage:
|
||||
Canonical Homepage and Downloads:
|
||||
http://curl.haxx.se/
|
||||
|
||||
|
||||
Canonical Download:
|
||||
http://curl.haxx.se/download.html
|
||||
|
||||
|
||||
Build Instructions:
|
||||
Download the source, move it to a location of your choosing, and then:
|
||||
Cygwin specific source files (a .README template and a Makefile
|
||||
for building binary tarballs) are maintained in the upstream
|
||||
CVS at: <srctop>/packages/Win32/cygwin/
|
||||
|
||||
|
||||
Build Instructions (as distributed via cygwin's setup.exe):
|
||||
(NOTE: as of curl 7.9.1, compiles/tests 100% cleanly OOTB under cygwin)
|
||||
|
||||
Download the source, unpack it to a location of your choosing, and then:
|
||||
|
||||
$ tar xjf curl-<ver>-X-src.tar.bz2
|
||||
$ cd curl-<ver>-X
|
||||
$ ./configure --prefix=/usr
|
||||
$ make
|
||||
$ make test # optional, requires perl
|
||||
@@ -42,19 +41,45 @@ Build Instructions:
|
||||
|
||||
|
||||
Packaging Instructions:
|
||||
To create a new binary tarball for cygwin's setup.exe, the first step is to
|
||||
do a clean build (./configure and make). The 'make install' step is optional.
|
||||
Then do:
|
||||
---BINARY---
|
||||
Compile cleanly (./configure + make). Then:
|
||||
|
||||
$ cd curl-<ver>-X
|
||||
$ make cygwinbin CYGBUILD=X
|
||||
$ make cygwinbin CYGBUILD=n
|
||||
|
||||
where "X" is the cygwin release number (e.g. the "-1" in curl-7.9.3-1).
|
||||
If you leave off "CYGBUILD=X", X defaults to 1.
|
||||
where n is the cygwin release number (e.g. the "1" in curl-7.9-1).
|
||||
If you leave off "CYGBUILD=n", n defaults to 1.
|
||||
|
||||
Assuming everything worked properly, you'll find your cygwin
|
||||
binary tarball in the curl-<ver>-X/packages/Win32/cygwin/ directory.
|
||||
Assuming everything worked properly, you'll find your binary tarball
|
||||
in the packages/Win32/cygwin/ sub-directory.
|
||||
|
||||
---SOURCE---
|
||||
1. unpack the pristine source into an otherwise empty directory
|
||||
2. rename the source dir to add the "-$(REL)" suffix, e.g.:
|
||||
$ mv curl-7.9 curl-7.9-1
|
||||
3. add a CYGWIN-PATCHES directory, and add this readme to it
|
||||
$ cd curl-7.9-$(REL); mkdir CYGWIN-PATCHES
|
||||
$ cp packages/Win32/cygwin/README CYGWIN-PATCHES/curl-7.9-$(REL).README
|
||||
4. if applicable, document any changes in the README file
|
||||
5. create a patch which, when applied (patch -p1 < curl-7.9-$(REL).patch)
|
||||
will remove any patches you've applied:
|
||||
$ cd ..
|
||||
$ diff -Nrup (patched-src-dir) (pristine-src-dir) > curl-7.9-$(REL).patch
|
||||
and then move it into the CYGWIN-PATCHES directory
|
||||
6. repack
|
||||
|
||||
---SETUP.HINT---
|
||||
sdesc: "a client that groks URLs"
|
||||
ldesc: "Curl is a tool for transferring files with URL syntax,
|
||||
supporting FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE
|
||||
and LDAP. Curl supports HTTPS certificates, HTTP POST, HTTP PUT,
|
||||
FTP uploading, kerberos, HTTP form based upload, proxies,
|
||||
cookies, user+password authentication, file transfer resume,
|
||||
http proxy tunneling and a busload of other useful tricks."
|
||||
category: Web Libs
|
||||
requires: cygwin openssl
|
||||
|
||||
|
||||
Cygwin port maintained by:
|
||||
Kevin Roth <kproth at bigfoot dot com>
|
||||
Questions about cURL should be directed to curl@contactor.se.
|
||||
Questions about its cygwin package should be directed to cygwin@cygwin.com.
|
||||
|
10
perl/README
10
perl/README
@@ -10,8 +10,14 @@ Perl
|
||||
elegantly used from within it. You can either invoke external curl command
|
||||
line or use the curl interface.
|
||||
|
||||
Georg Horn's Perl interface to curl is available in the Curl_easy/
|
||||
subdirectory. Using the Curl::easy module is just straightforward and
|
||||
The latest release of Curl_easy, a Perl interface to curl is available from
|
||||
|
||||
http://curl.haxx.se/libcurl/perl/
|
||||
|
||||
(Georg Horn's original version of Curl_easy, supporting curl versions
|
||||
before 7.7 is still available from: http://www.koblenz-net.de/~horn/export/ )
|
||||
|
||||
Using the Curl::easy module is just straightforward and
|
||||
works much like using libcurl in a C programm, so please refer to the
|
||||
documentation of libcurl. Have a look at test.pl to get an idea of how
|
||||
to start.
|
||||
|
@@ -12,6 +12,7 @@ bin_PROGRAMS = curl #memtest
|
||||
|
||||
noinst_HEADERS = setup.h \
|
||||
config-win32.h \
|
||||
config-mac.h \
|
||||
urlglob.h \
|
||||
version.h \
|
||||
writeout.h
|
||||
@@ -26,8 +27,12 @@ BUILT_SOURCES = hugehelp.c
|
||||
CLEANFILES = hugehelp.c
|
||||
NROFF=@NROFF@
|
||||
|
||||
EXTRA_DIST = mkhelp.pl config-win32.h curlmsg.msg\
|
||||
Makefile.vc6 Makefile.b32 Makefile.m32 config.h.in
|
||||
EXTRA_DIST = mkhelp.pl curlmsg.msg \
|
||||
Makefile.vc6 Makefile.b32 Makefile.m32 config.h.in \
|
||||
macos/curl.mcp.xml.sit.hqx \
|
||||
macos/MACINSTALL.TXT \
|
||||
macos/src/curl_GUSIConfig.cpp \
|
||||
macos/src/macos_main.cpp
|
||||
|
||||
AUTOMAKE_OPTIONS = foreign no-dependencies
|
||||
|
||||
|
12
src/config-mac.h
Normal file
12
src/config-mac.h
Normal file
@@ -0,0 +1,12 @@
|
||||
#define HAVE_UNISTD_H 1
|
||||
#define HAVE_FCNTL_H 1
|
||||
#define HAVE_UTIME_H 1
|
||||
#define HAVE_SYS_UTIME_H 1
|
||||
|
||||
#define HAVE_SETVBUF 1
|
||||
#define HAVE_UTIME 1
|
||||
|
||||
#define main(x,y) curl_main(x,y)
|
||||
|
||||
/* we provide our own strdup prototype */
|
||||
char *strdup(char *s1);
|
1
src/macos/MACINSTALL.TXT
Normal file
1
src/macos/MACINSTALL.TXT
Normal file
@@ -0,0 +1 @@
|
||||
MACOS (not MACOS X)
|
1
src/macos/curl.mcp.xml.sit.hqx
Normal file
1
src/macos/curl.mcp.xml.sit.hqx
Normal file
File diff suppressed because one or more lines are too long
1
src/macos/src/curl_GUSIConfig.cpp
Normal file
1
src/macos/src/curl_GUSIConfig.cpp
Normal file
@@ -0,0 +1 @@
|
||||
/**************** BEGIN GUSI CONFIGURATION ****************************
|
1
src/macos/src/macos_main.cpp
Normal file
1
src/macos/src/macos_main.cpp
Normal file
@@ -0,0 +1 @@
|
||||
/* =========================================================================
|
115
src/main.c
115
src/main.c
@@ -77,7 +77,9 @@
|
||||
#define DEFAULT_MAXREDIRS 50L
|
||||
|
||||
#ifndef __cplusplus /* (rabe) */
|
||||
#ifndef typedef_bool
|
||||
typedef char bool;
|
||||
#endif
|
||||
#endif /* (rabe) */
|
||||
|
||||
#define CURL_PROGRESS_STATS 0 /* default progress display */
|
||||
@@ -313,10 +315,16 @@ static void help(void)
|
||||
" -d/--data <data> HTTP POST data (H)\n"
|
||||
" --data-ascii <data> HTTP POST ASCII data (H)\n"
|
||||
" --data-binary <data> HTTP POST binary data (H)\n"
|
||||
" --disable-epsv Prevents curl from using EPSV (F)\n"
|
||||
" -D/--dump-header <file> Write the headers to this file\n"
|
||||
" --egd-file <file> EGD socket path for random data (SSL)\n"
|
||||
" -e/--referer Referer page (H)");
|
||||
puts(" -E/--cert <cert[:passwd]> Specifies your certificate file and password (HTTPS)\n"
|
||||
" --cert-type <type> Specifies your certificate file type (DER/PEM/ENG) (HTTPS)\n"
|
||||
" --key <key> Specifies your private key file (HTTPS)\n"
|
||||
" --key-type <type> Specifies your private key file type (DER/PEM/ENG) (HTTPS)\n"
|
||||
" --pass <pass> Specifies your passphrase for the private key (HTTPS)");
|
||||
puts(" --engine <eng> Specifies the crypto engine to use (HTTPS)\n"
|
||||
" --cacert <file> CA certifciate to verify peer against (SSL)\n"
|
||||
" --ciphers <list> What SSL ciphers to use (SSL)\n"
|
||||
" --connect-timeout <seconds> Maximum time allowed for connection\n"
|
||||
@@ -364,6 +372,7 @@ static void help(void)
|
||||
" -z/--time-cond <time> Includes a time condition to the server (H)\n"
|
||||
" -Z/--max-redirs <num> Set maximum number of redirections allowed (H)\n"
|
||||
" -0/--http1.0 Force usage of HTTP 1.0 (H)\n"
|
||||
" -1/--tlsv1 Force usage of TLSv1 (H)\n"
|
||||
" -2/--sslv2 Force usage of SSLv2 (H)\n"
|
||||
" -3/--sslv3 Force usage of SSLv3 (H)");
|
||||
puts(" -#/--progress-bar Display transfer progress as a progress bar\n"
|
||||
@@ -386,6 +395,7 @@ struct Configurable {
|
||||
char *cookiefile; /* read from this file */
|
||||
bool use_resume;
|
||||
bool resume_from_current;
|
||||
bool disable_epsv;
|
||||
int resume_from;
|
||||
char *postfields;
|
||||
long postfieldsize;
|
||||
@@ -417,8 +427,12 @@ struct Configurable {
|
||||
|
||||
char *cipher_list;
|
||||
char *cert;
|
||||
char *cert_type;
|
||||
char *cacert;
|
||||
char *cert_passwd;
|
||||
char *key;
|
||||
char *key_type;
|
||||
char *key_passwd;
|
||||
char *engine;
|
||||
bool crlf;
|
||||
char *customrequest;
|
||||
char *krb4level;
|
||||
@@ -861,8 +875,10 @@ static ParameterError getparameter(char *flag, /* f or -long-flag */
|
||||
{"5b", "egd-file", TRUE},
|
||||
{"5c", "connect-timeout", TRUE},
|
||||
{"5d", "ciphers", TRUE},
|
||||
{"5e", "disable-epsv", FALSE},
|
||||
|
||||
{"0", "http1.0", FALSE},
|
||||
{"1", "tlsv1", FALSE},
|
||||
{"2", "sslv2", FALSE},
|
||||
{"3", "sslv3", FALSE},
|
||||
{"a", "append", FALSE},
|
||||
@@ -879,6 +895,11 @@ static ParameterError getparameter(char *flag, /* f or -long-flag */
|
||||
{"e", "referer", TRUE},
|
||||
{"E", "cert", TRUE},
|
||||
{"Ea", "cacert", TRUE},
|
||||
{"Eb","cert-type", TRUE},
|
||||
{"Ec","key", TRUE},
|
||||
{"Ed","key-type", TRUE},
|
||||
{"Ee","pass", TRUE},
|
||||
{"Ef","engine", TRUE},
|
||||
{"f", "fail", FALSE},
|
||||
{"F", "form", TRUE},
|
||||
{"g", "globoff", FALSE},
|
||||
@@ -1026,6 +1047,9 @@ static ParameterError getparameter(char *flag, /* f or -long-flag */
|
||||
case 'd': /* ciphers */
|
||||
GetStr(&config->cipher_list, nextarg);
|
||||
break;
|
||||
case 'e': /* --disable-epsv */
|
||||
config->disable_epsv ^= TRUE;
|
||||
break;
|
||||
default: /* the URL! */
|
||||
{
|
||||
struct getout *url;
|
||||
@@ -1060,13 +1084,17 @@ static ParameterError getparameter(char *flag, /* f or -long-flag */
|
||||
/* HTTP version 1.0 */
|
||||
config->httpversion = CURL_HTTP_VERSION_1_0;
|
||||
break;
|
||||
case '1':
|
||||
/* TLS version 1 */
|
||||
config->ssl_version = CURL_SSLVERSION_TLSv1;
|
||||
break;
|
||||
case '2':
|
||||
/* SSL version 2 */
|
||||
config->ssl_version = 2;
|
||||
config->ssl_version = CURL_SSLVERSION_SSLv2;
|
||||
break;
|
||||
case '3':
|
||||
/* SSL version 2 */
|
||||
config->ssl_version = 3;
|
||||
/* SSL version 3 */
|
||||
config->ssl_version = CURL_SSLVERSION_SSLv3;
|
||||
break;
|
||||
case 'a':
|
||||
/* This makes the FTP sessions use APPE instead of STOR */
|
||||
@@ -1168,11 +1196,28 @@ static ParameterError getparameter(char *flag, /* f or -long-flag */
|
||||
}
|
||||
break;
|
||||
case 'E':
|
||||
if(subletter == 'a') {
|
||||
switch(subletter) {
|
||||
case 'a': /* CA info PEM file */
|
||||
/* CA info PEM file */
|
||||
GetStr(&config->cacert, nextarg);
|
||||
}
|
||||
else {
|
||||
break;
|
||||
case 'b': /* cert file type */
|
||||
GetStr(&config->cert_type, nextarg);
|
||||
break;
|
||||
case 'c': /* private key file */
|
||||
GetStr(&config->key, nextarg);
|
||||
break;
|
||||
case 'd': /* private key file type */
|
||||
GetStr(&config->key_type, nextarg);
|
||||
break;
|
||||
case 'e': /* private key passphrase */
|
||||
GetStr(&config->key_passwd, nextarg);
|
||||
break;
|
||||
case 'f': /* crypto engine */
|
||||
GetStr(&config->engine, nextarg);
|
||||
break;
|
||||
default: /* certificate file */
|
||||
{
|
||||
char *ptr = strchr(nextarg, ':');
|
||||
/* Since we live in a world of weirdness and confusion, the win32
|
||||
dudes can use : when using drive letters and thus
|
||||
@@ -1194,10 +1239,11 @@ static ParameterError getparameter(char *flag, /* f or -long-flag */
|
||||
/* we have a password too */
|
||||
*ptr=0;
|
||||
ptr++;
|
||||
GetStr(&config->cert_passwd, ptr);
|
||||
GetStr(&config->key_passwd, ptr);
|
||||
}
|
||||
GetStr(&config->cert, nextarg);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 'f':
|
||||
/* fail hard on errors */
|
||||
@@ -1233,10 +1279,23 @@ static ParameterError getparameter(char *flag, /* f or -long-flag */
|
||||
config->conf ^= CONF_HEADER; /* include the HTTP header as well */
|
||||
break;
|
||||
case 'I':
|
||||
config->conf ^= CONF_HEADER; /* include the HTTP header in the output */
|
||||
config->conf ^= CONF_NOBODY; /* don't fetch the body at all */
|
||||
/*
|
||||
* This is a bit tricky. We either SET both bits, or we clear both
|
||||
* bits. Let's not make any other outcomes from this.
|
||||
*/
|
||||
if((CONF_HEADER|CONF_NOBODY) !=
|
||||
(config->conf&(CONF_HEADER|CONF_NOBODY)) ) {
|
||||
/* one of them weren't set, set both */
|
||||
config->conf |= (CONF_HEADER|CONF_NOBODY);
|
||||
if(SetHTTPrequest(HTTPREQ_HEAD, &config->httpreq))
|
||||
return PARAM_BAD_USE;
|
||||
}
|
||||
else {
|
||||
/* both were set, clear both */
|
||||
config->conf &= ~(CONF_HEADER|CONF_NOBODY);
|
||||
if(SetHTTPrequest(HTTPREQ_GET, &config->httpreq))
|
||||
return PARAM_BAD_USE;
|
||||
}
|
||||
break;
|
||||
case 'K':
|
||||
res = parseconfig(nextarg, config);
|
||||
@@ -1452,7 +1511,7 @@ static ParameterError getparameter(char *flag, /* f or -long-flag */
|
||||
}
|
||||
hit = -1;
|
||||
|
||||
} while(!singleopt && *++parse && !*usedarg);
|
||||
} while(!longopt && !singleopt && *++parse && !*usedarg);
|
||||
|
||||
return PARAM_OK;
|
||||
}
|
||||
@@ -1833,6 +1892,8 @@ operate(struct Configurable *config, int argc, char *argv[])
|
||||
int res = 0;
|
||||
int i;
|
||||
|
||||
errorbuffer[0]=0; /* prevent junk from being output */
|
||||
|
||||
#ifdef MALLOCDEBUG
|
||||
/* this sends all memory debug messages to a logfile named memdump */
|
||||
curl_memdebug("memdump");
|
||||
@@ -2077,17 +2138,29 @@ operate(struct Configurable *config, int argc, char *argv[])
|
||||
to be able to do so, we have to create a new URL in another
|
||||
buffer.*/
|
||||
|
||||
urlbuffer=(char *)malloc(strlen(url) + strlen(config->infile) + 3);
|
||||
/* We only want the part of the local path that is on the right
|
||||
side of the rightmost slash and backslash. */
|
||||
char *filep = strrchr(config->infile, '/');
|
||||
char *file2 = strrchr(filep?filep:config->infile, '\\');
|
||||
|
||||
if(file2)
|
||||
filep = file2+1;
|
||||
else if(filep)
|
||||
filep++;
|
||||
else
|
||||
filep = config->infile;
|
||||
|
||||
urlbuffer=(char *)malloc(strlen(url) + strlen(filep) + 3);
|
||||
if(!urlbuffer) {
|
||||
helpf("out of memory\n");
|
||||
return CURLE_OUT_OF_MEMORY;
|
||||
}
|
||||
if(ptr)
|
||||
/* there is a trailing slash on the URL */
|
||||
sprintf(urlbuffer, "%s%s", url, config->infile);
|
||||
sprintf(urlbuffer, "%s%s", url, filep);
|
||||
else
|
||||
/* thers is no trailing slash on the URL */
|
||||
sprintf(urlbuffer, "%s/%s", url, config->infile);
|
||||
sprintf(urlbuffer, "%s/%s", url, filep);
|
||||
|
||||
url = urlbuffer; /* use our new URL instead! */
|
||||
}
|
||||
@@ -2188,6 +2261,8 @@ operate(struct Configurable *config, int argc, char *argv[])
|
||||
}
|
||||
#endif
|
||||
|
||||
curl_easy_setopt(curl, CURLOPT_SSLENGINE, config->engine);
|
||||
curl_easy_setopt(curl, CURLOPT_SSLENGINE_DEFAULT, 1);
|
||||
|
||||
curl_easy_setopt(curl, CURLOPT_FILE, (FILE *)&outs); /* where to store */
|
||||
/* what call to write: */
|
||||
@@ -2235,7 +2310,10 @@ operate(struct Configurable *config, int argc, char *argv[])
|
||||
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, config->headers);
|
||||
curl_easy_setopt(curl, CURLOPT_HTTPPOST, config->httppost);
|
||||
curl_easy_setopt(curl, CURLOPT_SSLCERT, config->cert);
|
||||
curl_easy_setopt(curl, CURLOPT_SSLCERTPASSWD, config->cert_passwd);
|
||||
curl_easy_setopt(curl, CURLOPT_SSLCERTTYPE, config->cert_type);
|
||||
curl_easy_setopt(curl, CURLOPT_SSLKEY, config->key);
|
||||
curl_easy_setopt(curl, CURLOPT_SSLKEYTYPE, config->key_type);
|
||||
curl_easy_setopt(curl, CURLOPT_SSLKEYPASSWD, config->key_passwd);
|
||||
|
||||
if(config->cacert) {
|
||||
curl_easy_setopt(curl, CURLOPT_CAINFO, config->cacert);
|
||||
@@ -2298,6 +2376,11 @@ operate(struct Configurable *config, int argc, char *argv[])
|
||||
if(config->httpversion)
|
||||
curl_easy_setopt(curl, CURLOPT_HTTP_VERSION, config->httpversion);
|
||||
|
||||
/* new in libcurl 7.9.2: */
|
||||
if(config->disable_epsv)
|
||||
/* disable it */
|
||||
curl_easy_setopt(curl, CURLOPT_FTP_USE_EPSV, FALSE);
|
||||
|
||||
res = curl_easy_perform(curl);
|
||||
|
||||
if(config->writeout) {
|
||||
@@ -2316,8 +2399,6 @@ operate(struct Configurable *config, int argc, char *argv[])
|
||||
if(config->headerfile && !headerfilep && heads.stream)
|
||||
fclose(heads.stream);
|
||||
|
||||
if(urlbuffer)
|
||||
free(urlbuffer);
|
||||
if (outfile && !strequal(outfile, "-") && outs.stream)
|
||||
fclose(outs.stream);
|
||||
|
||||
|
10
src/setup.h
10
src/setup.h
@@ -1,5 +1,5 @@
|
||||
#ifndef __SETUP_H
|
||||
#define __SETUP_H
|
||||
#ifndef __CLIENT_SETUP_H
|
||||
#define __CLIENT_SETUP_H
|
||||
/*****************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
@@ -7,7 +7,7 @@
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 2000, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
* Copyright (C) 2001, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
*
|
||||
* In order to be useful for every potential user, curl and libcurl are
|
||||
* dual-licensed under the MPL and the MIT/X-derivate licenses.
|
||||
@@ -38,6 +38,10 @@
|
||||
/* include the hand-modified win32 adjusted config.h! */
|
||||
#include "config-win32.h"
|
||||
#endif
|
||||
#ifdef macintosh
|
||||
/* this is not the same as Mac OS X */
|
||||
#include "config-mac.h"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef OS
|
||||
|
@@ -5,7 +5,7 @@
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 2000, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
* Copyright (C) 2001, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
*
|
||||
* In order to be useful for every potential user, curl and libcurl are
|
||||
* dual-licensed under the MPL and the MIT/X-derivate licenses.
|
||||
@@ -21,6 +21,9 @@
|
||||
* $Id$
|
||||
*****************************************************************************/
|
||||
|
||||
/* client-local setup.h */
|
||||
#include "setup.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
@@ -1,3 +1,3 @@
|
||||
#define CURL_NAME "curl"
|
||||
#define CURL_VERSION "7.9.1"
|
||||
#define CURL_VERSION "7.9.2"
|
||||
#define CURL_ID CURL_NAME " " CURL_VERSION " (" OS ") "
|
||||
|
@@ -37,6 +37,7 @@ typedef enum {
|
||||
VAR_NAMELOOKUP_TIME,
|
||||
VAR_CONNECT_TIME,
|
||||
VAR_PRETRANSFER_TIME,
|
||||
VAR_STARTTRANSFER_TIME,
|
||||
VAR_SIZE_DOWNLOAD,
|
||||
VAR_SIZE_UPLOAD,
|
||||
VAR_SPEED_DOWNLOAD,
|
||||
@@ -61,6 +62,7 @@ static struct variable replacements[]={
|
||||
{"time_namelookup", VAR_NAMELOOKUP_TIME},
|
||||
{"time_connect", VAR_CONNECT_TIME},
|
||||
{"time_pretransfer", VAR_PRETRANSFER_TIME},
|
||||
{"time_starttransfer", VAR_STARTTRANSFER_TIME},
|
||||
{"size_header", VAR_HEADER_SIZE},
|
||||
{"size_request", VAR_REQUEST_SIZE},
|
||||
{"size_download", VAR_SIZE_DOWNLOAD},
|
||||
@@ -138,6 +140,11 @@ void ourWriteOut(CURL *curl, char *writeinfo)
|
||||
curl_easy_getinfo(curl, CURLINFO_PRETRANSFER_TIME, &doubleinfo))
|
||||
fprintf(stream, "%.3f", doubleinfo);
|
||||
break;
|
||||
case VAR_STARTTRANSFER_TIME:
|
||||
if(CURLE_OK ==
|
||||
curl_easy_getinfo(curl, CURLINFO_STARTTRANSFER_TIME, &doubleinfo))
|
||||
fprintf(stream, "%.3f", doubleinfo);
|
||||
break;
|
||||
case VAR_SIZE_UPLOAD:
|
||||
if(CURLE_OK ==
|
||||
curl_easy_getinfo(curl, CURLINFO_SIZE_UPLOAD, &doubleinfo))
|
||||
|
@@ -5,14 +5,13 @@ test:
|
||||
[ -f test1 ] || ln -s $(srcdir)/test* .
|
||||
|
||||
EXTRA_DIST = \
|
||||
test1 test106 test113 test120 test15 test201 test3 test44 \
|
||||
test10 test107 test114 test121 test16 test202 test300 test5 \
|
||||
test100 test108 test115 test122 test17 test21 test301 test6 \
|
||||
test101 test109 test116 test123 test18 test22 test302 test7 \
|
||||
test102 test11 test117 test124 test19 test23 test33 test8 \
|
||||
test103 test110 test118 test125 test2 test24 test4 test9 \
|
||||
test104 test111 test119 test13 test20 test25 test400 test47 \
|
||||
test105 test112 test12 test14 test200 test26 test43 test46 \
|
||||
test34 test36 test37 test27 test28 test29 test303 test126 test400 \
|
||||
test401 test30
|
||||
|
||||
test1 test108 test117 test127 test20 test27 test34 test46 \
|
||||
test10 test109 test118 test13 test200 test28 test36 test47 \
|
||||
test100 test11 test119 test14 test201 test29 test37 test5 \
|
||||
test101 test110 test12 test15 test202 test3 test4 test6 \
|
||||
test102 test111 test120 test16 test21 test30 test400 test7 \
|
||||
test103 test112 test121 test17 test22 test300 test401 test8 \
|
||||
test104 test113 test122 test18 test23 test301 test402 test9 \
|
||||
test105 test114 test123 test19 test24 test302 test43 \
|
||||
test106 test115 test124 test190 test25 test303 test44 \
|
||||
test107 test116 test125 test2 test26 test33 test45 test126
|
||||
|
@@ -37,7 +37,7 @@ filter off really nothing
|
||||
USER anonymous
|
||||
PASS curl_by_daniel@haxx.se
|
||||
PWD
|
||||
PASV
|
||||
EPSV
|
||||
TYPE A
|
||||
LIST
|
||||
</protocol>
|
||||
|
@@ -19,6 +19,10 @@ FTP RETR PASV
|
||||
ftp://%HOSTIP:%FTPPORT/102
|
||||
</command>
|
||||
</test>
|
||||
<file name="log/ftpserver.cmd">
|
||||
REPLY EPSV 500 no such command
|
||||
</file>
|
||||
|
||||
|
||||
# Verify data after the test has been "shot"
|
||||
<verify>
|
||||
@@ -26,8 +30,10 @@ ftp://%HOSTIP:%FTPPORT/102
|
||||
USER anonymous
|
||||
PASS curl_by_daniel@haxx.se
|
||||
PWD
|
||||
EPSV
|
||||
PASV
|
||||
TYPE I
|
||||
SIZE 102
|
||||
RETR 102
|
||||
</protocol>
|
||||
</verify>
|
||||
|
@@ -34,6 +34,7 @@ PWD
|
||||
CWD a/path
|
||||
PORT 127,0,0,1,246,33
|
||||
TYPE I
|
||||
SIZE 103
|
||||
RETR 103
|
||||
</protocol>
|
||||
</verify>
|
||||
|
@@ -18,6 +18,10 @@ FTP user+password in URL and ASCII transfer
|
||||
<command>
|
||||
ftp://userdude:passfellow@%HOSTIP:%FTPPORT/103 --use-ascii
|
||||
</command>
|
||||
<file name="log/ftpserver.cmd">
|
||||
REPLY EPSV 500 no such command
|
||||
REPLY SIZE 500 no such command
|
||||
</file>
|
||||
</test>
|
||||
|
||||
# Verify data after the test has been "shot"
|
||||
@@ -26,8 +30,10 @@ ftp://userdude:passfellow@%HOSTIP:%FTPPORT/103 --use-ascii
|
||||
USER userdude
|
||||
PASS passfellow
|
||||
PWD
|
||||
EPSV
|
||||
PASV
|
||||
TYPE A
|
||||
SIZE 103
|
||||
RETR 103
|
||||
</protocol>
|
||||
</verify>
|
||||
|
@@ -27,8 +27,9 @@ USER anonymous
|
||||
PASS curl_by_daniel@haxx.se
|
||||
PWD
|
||||
CWD /path with spaces/and things2
|
||||
PASV
|
||||
EPSV
|
||||
TYPE A
|
||||
SIZE 106
|
||||
RETR 106
|
||||
</protocol>
|
||||
</verify>
|
||||
|
@@ -31,7 +31,7 @@ works
|
||||
USER anonymous
|
||||
PASS curl_by_daniel@haxx.se
|
||||
PWD
|
||||
PASV
|
||||
EPSV
|
||||
TYPE I
|
||||
STOR 107
|
||||
</protocol>
|
||||
|
@@ -26,7 +26,7 @@ Moooooooooooo
|
||||
USER anonymous
|
||||
PASS curl_by_daniel@haxx.se
|
||||
PWD
|
||||
PASV
|
||||
EPSV
|
||||
TYPE I
|
||||
APPE 109
|
||||
</protocol>
|
||||
|
@@ -17,6 +17,9 @@ FTP download resume with set limit
|
||||
<command>
|
||||
ftp://%HOSTIP:%FTPPORT/110 -C 20
|
||||
</command>
|
||||
<file name="log/ftpserver.cmd">
|
||||
REPLY EPSV 500 no such command
|
||||
</file>
|
||||
</test>
|
||||
|
||||
# Verify data after the test has been "shot"
|
||||
@@ -27,6 +30,7 @@ ftp://%HOSTIP:%FTPPORT/110 -C 20
|
||||
USER anonymous
|
||||
PASS curl_by_daniel@haxx.se
|
||||
PWD
|
||||
EPSV
|
||||
PASV
|
||||
TYPE I
|
||||
SIZE 110
|
||||
|
@@ -26,7 +26,7 @@ ftp://%HOSTIP:%FTPPORT/111 -C 2000
|
||||
USER anonymous
|
||||
PASS curl_by_daniel@haxx.se
|
||||
PWD
|
||||
PASV
|
||||
EPSV
|
||||
TYPE I
|
||||
SIZE 111
|
||||
</protocol>
|
||||
|
@@ -25,7 +25,7 @@ worx?
|
||||
USER anonymous
|
||||
PASS curl_by_daniel@haxx.se
|
||||
PWD
|
||||
PASV
|
||||
EPSV
|
||||
TYPE I
|
||||
APPE 112
|
||||
</protocol>
|
||||
|
@@ -12,6 +12,7 @@ ftp://%HOSTIP:%FTPPORT/115
|
||||
</command>
|
||||
<file name="log/ftpserver.cmd">
|
||||
REPLY PASV 314 bluah you f00l!
|
||||
REPLY EPSV 314 bluah you f00l!
|
||||
</file>
|
||||
</test>
|
||||
|
||||
@@ -24,6 +25,7 @@ REPLY PASV 314 bluah you f00l!
|
||||
USER anonymous
|
||||
PASS curl_by_daniel@haxx.se
|
||||
PWD
|
||||
EPSV
|
||||
PASV
|
||||
</protocol>
|
||||
</verify>
|
||||
|
@@ -11,6 +11,7 @@ FTP download, failed TYPE
|
||||
ftp://%HOSTIP:%FTPPORT/117
|
||||
</command>
|
||||
<file name="log/ftpserver.cmd">
|
||||
REPLY EPSV 314 bluah you f00l!
|
||||
REPLY TYPE 314 bluah you f00l!
|
||||
</file>
|
||||
</test>
|
||||
@@ -24,6 +25,7 @@ REPLY TYPE 314 bluah you f00l!
|
||||
USER anonymous
|
||||
PASS curl_by_daniel@haxx.se
|
||||
PWD
|
||||
EPSV
|
||||
PASV
|
||||
TYPE I
|
||||
</protocol>
|
||||
|
@@ -12,6 +12,7 @@ ftp://%HOSTIP:%FTPPORT/118
|
||||
</command>
|
||||
<file name="log/ftpserver.cmd">
|
||||
REPLY RETR 314 bluah you f00l!
|
||||
REPLY EPSV 314 bluah you f00l!
|
||||
</file>
|
||||
</test>
|
||||
|
||||
@@ -24,8 +25,10 @@ REPLY RETR 314 bluah you f00l!
|
||||
USER anonymous
|
||||
PASS curl_by_daniel@haxx.se
|
||||
PWD
|
||||
EPSV
|
||||
PASV
|
||||
TYPE I
|
||||
SIZE 118
|
||||
RETR 118
|
||||
</protocol>
|
||||
</verify>
|
||||
|
@@ -30,6 +30,7 @@ USER anonymous
|
||||
PASS curl_by_daniel@haxx.se
|
||||
PWD
|
||||
TYPE I
|
||||
SIZE 119
|
||||
RETR 119
|
||||
</protocol>
|
||||
</verify>
|
||||
|
@@ -18,6 +18,9 @@ ftp download with post-quote delete operation
|
||||
<command>
|
||||
ftp://%HOSTIP:%FTPPORT/120 -Q "-DELE file"
|
||||
</command>
|
||||
<file name="log/ftpserver.cmd">
|
||||
REPLY EPSV 314 bluah you f00l!
|
||||
</file>
|
||||
</test>
|
||||
|
||||
# Verify data after the test has been "shot"
|
||||
@@ -26,8 +29,10 @@ ftp://%HOSTIP:%FTPPORT/120 -Q "-DELE file"
|
||||
USER anonymous
|
||||
PASS curl_by_daniel@haxx.se
|
||||
PWD
|
||||
EPSV
|
||||
PASV
|
||||
TYPE I
|
||||
SIZE 120
|
||||
RETR 120
|
||||
DELE file
|
||||
</protocol>
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user