Compare commits
346 Commits
curl-7_10_
...
curl-7_10_
Author | SHA1 | Date | |
---|---|---|---|
![]() |
95a4b8db68 | ||
![]() |
663c1898a3 | ||
![]() |
465de793e8 | ||
![]() |
de9b76cef0 | ||
![]() |
1747a8d3d9 | ||
![]() |
1094e79749 | ||
![]() |
22569681bc | ||
![]() |
e615d117a0 | ||
![]() |
a51258b6bb | ||
![]() |
8894bd07b6 | ||
![]() |
ec45a9e825 | ||
![]() |
871358a6e5 | ||
![]() |
2e2e0fba60 | ||
![]() |
4a5139e3f4 | ||
![]() |
8f85933d7c | ||
![]() |
246f3a63f6 | ||
![]() |
e99eff4eb0 | ||
![]() |
c0197f19cf | ||
![]() |
3994d67eea | ||
![]() |
9ead79c9d4 | ||
![]() |
9371aed46c | ||
![]() |
940707ad66 | ||
![]() |
e6c267fb4c | ||
![]() |
93538fccd6 | ||
![]() |
83a7fad308 | ||
![]() |
3c7e33388e | ||
![]() |
7b0f35edb6 | ||
![]() |
94a157d0b0 | ||
![]() |
ca04620253 | ||
![]() |
073ef0b36a | ||
![]() |
c41c05d4f4 | ||
![]() |
f1ea54e07a | ||
![]() |
a139ce901a | ||
![]() |
7431957113 | ||
![]() |
1752d80915 | ||
![]() |
aa7420e109 | ||
![]() |
a290d4b9db | ||
![]() |
19a4314e7f | ||
![]() |
d166e85e0a | ||
![]() |
f213e857ab | ||
![]() |
eb6130baa7 | ||
![]() |
f69ea2c68a | ||
![]() |
078441d477 | ||
![]() |
95f6b15a67 | ||
![]() |
ee29dbdb8f | ||
![]() |
15f3f4c93f | ||
![]() |
6932e94e0e | ||
![]() |
3ef06d7efe | ||
![]() |
fb012b48e9 | ||
![]() |
bc77bf217f | ||
![]() |
37d1e9351e | ||
![]() |
4494c0dee0 | ||
![]() |
26afc604ac | ||
![]() |
9aefcada19 | ||
![]() |
69fc363760 | ||
![]() |
bea02ddebe | ||
![]() |
3fb257c39c | ||
![]() |
7c96c5a39b | ||
![]() |
efd836d971 | ||
![]() |
836aaa1647 | ||
![]() |
bf2b3dbf3e | ||
![]() |
b4fa2ff995 | ||
![]() |
2f9cabc30b | ||
![]() |
63593f5597 | ||
![]() |
c0acaa5d2c | ||
![]() |
2e46f8d0a6 | ||
![]() |
51da6aaa07 | ||
![]() |
c8b79e36db | ||
![]() |
208374bcc9 | ||
![]() |
7f0a6e7203 | ||
![]() |
54ebb9cfd4 | ||
![]() |
49e9c1495b | ||
![]() |
a84b0fbd52 | ||
![]() |
c95814c04d | ||
![]() |
9f8123f1b8 | ||
![]() |
8b23db4f4d | ||
![]() |
d77cc13374 | ||
![]() |
9a12db1aa2 | ||
![]() |
eb54d34bec | ||
![]() |
4b1203d4c9 | ||
![]() |
183a9c6244 | ||
![]() |
1f2294d585 | ||
![]() |
0b839c4f77 | ||
![]() |
1d4fd1fcae | ||
![]() |
b1d8d72c16 | ||
![]() |
bafb68b844 | ||
![]() |
21873b52e9 | ||
![]() |
0aa8b82871 | ||
![]() |
f9781afafd | ||
![]() |
fece361a55 | ||
![]() |
7b51b2f128 | ||
![]() |
22d88fb28e | ||
![]() |
f7c5b28e76 | ||
![]() |
5760f2a307 | ||
![]() |
ee46efb5a5 | ||
![]() |
eb6ffebfc7 | ||
![]() |
c06c44f286 | ||
![]() |
019c4088cf | ||
![]() |
0b0a88b78d | ||
![]() |
028e9cc56f | ||
![]() |
e0d8615ece | ||
![]() |
c8ecbda40b | ||
![]() |
2324c10d43 | ||
![]() |
89cfa76291 | ||
![]() |
072070a22c | ||
![]() |
3c3ad134ea | ||
![]() |
a4ffcfd4d5 | ||
![]() |
136670c58a | ||
![]() |
28169725fa | ||
![]() |
5b13106f54 | ||
![]() |
1a2db0dfb1 | ||
![]() |
696f95bb0a | ||
![]() |
acec588fe3 | ||
![]() |
6ed0da8e98 | ||
![]() |
7fd91d70bd | ||
![]() |
61788a0389 | ||
![]() |
0821447b5b | ||
![]() |
3cba274ba6 | ||
![]() |
df7bbcfd21 | ||
![]() |
021d406f0c | ||
![]() |
294569c502 | ||
![]() |
bfd00ac2ed | ||
![]() |
735a4714f4 | ||
![]() |
827fd47198 | ||
![]() |
e26b917661 | ||
![]() |
92872a2a3c | ||
![]() |
16ddb09cb4 | ||
![]() |
d37031f14e | ||
![]() |
b4e84ca7d2 | ||
![]() |
47970b9e6f | ||
![]() |
f65f120d50 | ||
![]() |
df00ec3c82 | ||
![]() |
ad6fca28f9 | ||
![]() |
fd33923496 | ||
![]() |
a55649dc82 | ||
![]() |
9558f229db | ||
![]() |
7917bfb1c9 | ||
![]() |
25f611ca42 | ||
![]() |
e6eb49e7e0 | ||
![]() |
9a075f53dc | ||
![]() |
4b3f800c03 | ||
![]() |
82bc76b243 | ||
![]() |
18b9b04907 | ||
![]() |
87f1f08b36 | ||
![]() |
7d7ebbe9f7 | ||
![]() |
5111ce782f | ||
![]() |
20b0e563ce | ||
![]() |
8b6cf239a3 | ||
![]() |
bcc285cffd | ||
![]() |
d5ba030942 | ||
![]() |
803f43592a | ||
![]() |
904b9ccaa3 | ||
![]() |
89721ff04a | ||
![]() |
6164823921 | ||
![]() |
f8b3c47f99 | ||
![]() |
56dd2da962 | ||
![]() |
68bb74d172 | ||
![]() |
bf5e12c8e0 | ||
![]() |
de11f5e53a | ||
![]() |
b125e8e23a | ||
![]() |
b28b616eb2 | ||
![]() |
4534ca238d | ||
![]() |
cee0e94294 | ||
![]() |
8319ea7078 | ||
![]() |
5334a58f9b | ||
![]() |
2616bdc4cd | ||
![]() |
c149b3f797 | ||
![]() |
d349eb3d43 | ||
![]() |
9b43ade1c0 | ||
![]() |
ad05d0a8d9 | ||
![]() |
e6bfbe9683 | ||
![]() |
c871efca4b | ||
![]() |
12c72b419c | ||
![]() |
a15b7691ca | ||
![]() |
01618d323b | ||
![]() |
bb6d0e37e3 | ||
![]() |
24a6100897 | ||
![]() |
0251563c98 | ||
![]() |
72673a351b | ||
![]() |
96b7131844 | ||
![]() |
dcc2f16416 | ||
![]() |
c2b8a04000 | ||
![]() |
d65587b06c | ||
![]() |
1ab0134522 | ||
![]() |
afffce80f0 | ||
![]() |
70b80b0160 | ||
![]() |
64067a04b5 | ||
![]() |
38cf0268c0 | ||
![]() |
2d2034703f | ||
![]() |
571ceeff90 | ||
![]() |
34c4ba4321 | ||
![]() |
babb372eb9 | ||
![]() |
5b9b82c1cd | ||
![]() |
075c534270 | ||
![]() |
f317f8b149 | ||
![]() |
f8d552dde5 | ||
![]() |
606f72bb13 | ||
![]() |
327e6a2b4f | ||
![]() |
be8f6c7f5c | ||
![]() |
073448e0ea | ||
![]() |
f136f435b5 | ||
![]() |
ebea6b487b | ||
![]() |
e5b7dc56e6 | ||
![]() |
c2d8025a0a | ||
![]() |
853e240e1d | ||
![]() |
8755a6d1ac | ||
![]() |
9f723061cb | ||
![]() |
652683fc04 | ||
![]() |
83a463891d | ||
![]() |
957b618fdc | ||
![]() |
ebe5191b63 | ||
![]() |
c426234df7 | ||
![]() |
8c3a10392e | ||
![]() |
d0e44946e9 | ||
![]() |
46a593d968 | ||
![]() |
eb0cc34951 | ||
![]() |
1c7dfda4bc | ||
![]() |
3c0e4a2fa1 | ||
![]() |
c753072ae1 | ||
![]() |
243942a7aa | ||
![]() |
8d5ac8b43c | ||
![]() |
17962b3d2e | ||
![]() |
f70acd5979 | ||
![]() |
ffe5c46224 | ||
![]() |
3242ea5f66 | ||
![]() |
39a282bffc | ||
![]() |
29583004ce | ||
![]() |
0a1a185874 | ||
![]() |
8f809e2a93 | ||
![]() |
f216059b49 | ||
![]() |
9121b1f41d | ||
![]() |
60e015d0c1 | ||
![]() |
7e049fca61 | ||
![]() |
0f0e4de6a4 | ||
![]() |
bc1102922b | ||
![]() |
a3d3642a30 | ||
![]() |
248eb47329 | ||
![]() |
52ebf50607 | ||
![]() |
d34a4b126e | ||
![]() |
de96719a45 | ||
![]() |
9876ed09fe | ||
![]() |
17cbbe3dc5 | ||
![]() |
b995af17eb | ||
![]() |
6589579850 | ||
![]() |
5ddc260fc2 | ||
![]() |
db5c9cd4c0 | ||
![]() |
9b6d010aef | ||
![]() |
065b87e949 | ||
![]() |
a6206a3aef | ||
![]() |
30639ed72b | ||
![]() |
9d02a39e13 | ||
![]() |
fc0af0d4d1 | ||
![]() |
a683416081 | ||
![]() |
9faf57ee8d | ||
![]() |
44b9ccb7e2 | ||
![]() |
de003d9cf8 | ||
![]() |
8a2a523c70 | ||
![]() |
c3dfe50aaf | ||
![]() |
9659d862c7 | ||
![]() |
69ab4cd391 | ||
![]() |
498f3985b3 | ||
![]() |
977175d4fd | ||
![]() |
3ddc7b9390 | ||
![]() |
10e9bf623f | ||
![]() |
48a5c64e94 | ||
![]() |
140606ccd5 | ||
![]() |
f56d006f93 | ||
![]() |
beb13a1d3e | ||
![]() |
fa47138327 | ||
![]() |
9421d4510a | ||
![]() |
ff8abfca85 | ||
![]() |
5c858965b8 | ||
![]() |
e3f83cb17a | ||
![]() |
de6008e01a | ||
![]() |
6417e696df | ||
![]() |
5d28f3781b | ||
![]() |
10026bb62e | ||
![]() |
21c16f923c | ||
![]() |
32cef52f0d | ||
![]() |
e7dd7c54ff | ||
![]() |
b0b50bd12a | ||
![]() |
f2c6057490 | ||
![]() |
169b2eeb94 | ||
![]() |
f81d027f60 | ||
![]() |
872eeb7339 | ||
![]() |
7f67a28c2a | ||
![]() |
30a46e1135 | ||
![]() |
3a01478ce8 | ||
![]() |
53d71fab60 | ||
![]() |
be891f112c | ||
![]() |
89934239d7 | ||
![]() |
8986037fdd | ||
![]() |
a7c72b7abf | ||
![]() |
409ac80710 | ||
![]() |
fc7bebdf55 | ||
![]() |
ca52549557 | ||
![]() |
8948a65654 | ||
![]() |
b4e33cfcc7 | ||
![]() |
86742e8334 | ||
![]() |
173b35eaf8 | ||
![]() |
2b054e5309 | ||
![]() |
a302ff1605 | ||
![]() |
f7bb4e6138 | ||
![]() |
5c5489916b | ||
![]() |
5627cf7167 | ||
![]() |
c05dae4a68 | ||
![]() |
57e61e3743 | ||
![]() |
a6c395c156 | ||
![]() |
543e0b1e0f | ||
![]() |
64b0ff875f | ||
![]() |
a034208a00 | ||
![]() |
5f1251586b | ||
![]() |
6f6cffdc32 | ||
![]() |
21a98ef264 | ||
![]() |
aa90436435 | ||
![]() |
61225052f9 | ||
![]() |
dee3163d95 | ||
![]() |
8b0668b99e | ||
![]() |
8471a82c85 | ||
![]() |
ed4dff63b9 | ||
![]() |
838e776542 | ||
![]() |
39c12790bc | ||
![]() |
126e6d6645 | ||
![]() |
5796a1b282 | ||
![]() |
90982529fc | ||
![]() |
aba51d6b60 | ||
![]() |
49bc4567bb | ||
![]() |
2ac52705c6 | ||
![]() |
d0eb56dd97 | ||
![]() |
b9c60df04b | ||
![]() |
8c236e4dfa | ||
![]() |
154a59f21f | ||
![]() |
9689e1c548 | ||
![]() |
5a83976c99 | ||
![]() |
b5276a9a69 | ||
![]() |
30377baa5e | ||
![]() |
aa8b7dd336 | ||
![]() |
f26a338a54 | ||
![]() |
c4383f1d99 | ||
![]() |
4527995e66 | ||
![]() |
b0fbb98f41 | ||
![]() |
63667dfd96 | ||
![]() |
77c388c928 | ||
![]() |
a69b814ded | ||
![]() |
c51ada766d | ||
![]() |
ef2709f97c |
473
CHANGES
473
CHANGES
@@ -6,6 +6,477 @@
|
|||||||
|
|
||||||
Changelog
|
Changelog
|
||||||
|
|
||||||
|
Version 7.10.5 (19 May 2003)
|
||||||
|
|
||||||
|
Daniel (15 May)
|
||||||
|
- Changed the order for the in_addr_t testing, as 'unsigned long' seems to be
|
||||||
|
a very common type inet_addr() returns.
|
||||||
|
|
||||||
|
Daniel (14 May)
|
||||||
|
- George Comninos provided a fix that calls the progress meter when waiting
|
||||||
|
for FTP command responses take >1 second. It'll make applications more
|
||||||
|
"responsive" even when dealing with very slow ftp servers.
|
||||||
|
|
||||||
|
Daniel (12 May)
|
||||||
|
- George Comninos pointed out that libcurl uploads had two quirks:
|
||||||
|
o when using FTP PORT command, it used blocking sockets!
|
||||||
|
o it could loop a long time without doing progress meter updates
|
||||||
|
Both items are fixed now.
|
||||||
|
|
||||||
|
Daniel (9 May)
|
||||||
|
- Dan Fandrich changed CURLOPT_ENCODING to select all supported encodings if
|
||||||
|
set to "". This frees the application from having to know which encodings
|
||||||
|
the library supports.
|
||||||
|
|
||||||
|
- Dan Fandrich pointed out we had three unnecessary files in CVS that is
|
||||||
|
generated with libtoolize, so they're now removed and libtoolize is invoked
|
||||||
|
accordingly in the buildconf script.
|
||||||
|
|
||||||
|
- Avery Fay found out that the CURLOPT_INTERFACE way of first checking if the
|
||||||
|
given name is a network interface gave a real performance penalty on Linux,
|
||||||
|
so now we more appropriately first check if it is an IP number and if so
|
||||||
|
we don't check for a network interface with that name.
|
||||||
|
|
||||||
|
- CURLOPT_FTP_USE_EPRT added. Set this to FALSE to disable libcurl's attempts
|
||||||
|
to use EPRT and LPRT before the traditional PORT command. The command line
|
||||||
|
tool sets this option with '--disable-eprt'.
|
||||||
|
|
||||||
|
Version 7.10.5-pre2 (6 May 2003)
|
||||||
|
|
||||||
|
Daniel (6 May)
|
||||||
|
- Kevin Delafield reported another case where we didn't correctly check for
|
||||||
|
EAGAIN but only EWOULDBLOCK, which caused badness on HPUX.
|
||||||
|
|
||||||
|
Daniel (4 May)
|
||||||
|
- Ben Greear noticed that the check for 'writable argv' exited the configure
|
||||||
|
script when run for cross-compiling, which wasn't nice. Now it'll default to
|
||||||
|
no and output a warning about the fact that it was not checked for.
|
||||||
|
|
||||||
|
Daniel (2 May)
|
||||||
|
- Added test case 62 and fixed some more on the cookie sending with a custom
|
||||||
|
Host: header set.
|
||||||
|
|
||||||
|
Daniel (1 May)
|
||||||
|
- Andy Cedilnik fixed a few compiler warnings.
|
||||||
|
|
||||||
|
- Made the "SSL read error: 5" error message more verbose, by adding code that
|
||||||
|
queries the OpenSSL library to fill in the error buffer.
|
||||||
|
|
||||||
|
Daniel (30 Apr)
|
||||||
|
- Added sys/select.h include in the curl/multi.h file, after having been
|
||||||
|
reminded about this by Rich Gray.
|
||||||
|
|
||||||
|
- I made each test set its own server requirements, thus abandoning the
|
||||||
|
previous system where the test number implied what server(s) to use for a
|
||||||
|
specific test.
|
||||||
|
|
||||||
|
- David Balazic made curl more RFC1738-compliant for FTP URLs, by fixing so
|
||||||
|
that libcurl now uses one CWD command for each path part. A bunch of test
|
||||||
|
cases were fixed to work accordingly.
|
||||||
|
|
||||||
|
- Cookie fixes:
|
||||||
|
|
||||||
|
A. Save domains in jars like Mozilla does. It means all domains set in
|
||||||
|
Set-Cookie: headers are dot-prefixed.
|
||||||
|
B. Save and use the 'tailmatch' field in the Mozilla/Netscape cookie jars
|
||||||
|
(the second column).
|
||||||
|
C. Reject cookies using illegal domains in the Set-Cookie: line. Concerns
|
||||||
|
both domains with too few dots or domains that are outside the currently
|
||||||
|
operating server host's domain.
|
||||||
|
D. Set the path part by default to the one used in the request, if none was
|
||||||
|
set in the Set-Cookie line.
|
||||||
|
|
||||||
|
To make item C really good, I also made libcurl notice custom Host: headers
|
||||||
|
and extract the host name set in there and use that as the host name for the
|
||||||
|
site we're getting the cookies from. This allows user to specify a site's
|
||||||
|
IP-address, but still be able to receive and send its cookies properly if
|
||||||
|
you provide a valid Host: name for the site.
|
||||||
|
|
||||||
|
Daniel (29 Apr)
|
||||||
|
- Peter Kovacs provided a patch that makes the CURLINFO_CONNECT_TIME work fine
|
||||||
|
when using the multi interface (too).
|
||||||
|
|
||||||
|
Version 7.10.5-pre1 (23 Apr 2003)
|
||||||
|
|
||||||
|
Daniel (23 Apr)
|
||||||
|
- Upgraded to libtool 1.5.
|
||||||
|
|
||||||
|
Daniel (22 Apr)
|
||||||
|
- Peter Sylvester pointed out that curl_easy_setopt() will always (wrongly)
|
||||||
|
return CURLE_OK no matter what happens.
|
||||||
|
|
||||||
|
- Dan Fandrich fixed some gzip decompression bugs and flaws.
|
||||||
|
|
||||||
|
Daniel (16 Apr)
|
||||||
|
- Fixed minor typo in man page, reported in the Debian bug tracker.
|
||||||
|
|
||||||
|
Daniel (15 Apr)
|
||||||
|
- Fixed some FTP tests in the test suite that failed on my Solaris host, due
|
||||||
|
to the config.h not being included before the system headers. When done that
|
||||||
|
way, it did get a mixed sense of if big files are supported or not and then
|
||||||
|
stat() and fstat() (as used in test case 505) got confused and failed to
|
||||||
|
return a proper file size.
|
||||||
|
|
||||||
|
- Formposting a file using a .html suffix is now properly set to Content-Type: text/html.
|
||||||
|
|
||||||
|
Daniel (14 Apr)
|
||||||
|
- Fixed the SSL error handling to return proper SSL error messages again, they
|
||||||
|
broke in 7.10.4. I also attempt to track down CA cert problems and then
|
||||||
|
return the CURLE_SSL_CACERT error code.
|
||||||
|
|
||||||
|
- The curl tool now intercepts the CURLE_SSL_CACERT error code and displays
|
||||||
|
a fairly big and explanatory error message. Kevin Roth helped me out with
|
||||||
|
the wording.
|
||||||
|
|
||||||
|
Daniel (11 Apr)
|
||||||
|
- Nic Hines provided a second patch for gzip decompression, and fixed a bug
|
||||||
|
when deflate or gzip contents were downloaded using chunked encoding.
|
||||||
|
|
||||||
|
- Dan Fandrich made libcurl support automatic decompression of gzip contents
|
||||||
|
(as an addition to the previous deflate support).
|
||||||
|
|
||||||
|
- I made the CWD command during FTP session consider all 2xy codes to be OK
|
||||||
|
responses.
|
||||||
|
|
||||||
|
Daniel (10 Apr)
|
||||||
|
- Vlad Krupin fixed a URL parsing issue. URLs that were not using a slash
|
||||||
|
after the host name, but still had "?" and parameters appended, as in
|
||||||
|
"http://hostname.com?foobar=moo", were not properly parsed by libcurl.
|
||||||
|
|
||||||
|
Daniel (9 Apr)
|
||||||
|
- Made CURLOPT_TIMECONDITION work for FTP transfers, using the same syntax as
|
||||||
|
for HTTP. This then made -z work for ftp transfers too. Added test case 139
|
||||||
|
and 140 for verifying this.
|
||||||
|
|
||||||
|
- Getting the file date of an ftp file used the wrong time zone when
|
||||||
|
displayed. It is supposedly always GMT. Added test case 141 for this.
|
||||||
|
|
||||||
|
- Made the test suite's FTP server support MDTM.
|
||||||
|
|
||||||
|
- The default DEBUGFUNCTION, as enabled with CURLOPT_VERBOSE now outputs
|
||||||
|
CURLINFO_HEADER_IN data as well. The most notable effect from this is that
|
||||||
|
using curl -v, you get to see the incoming "headers" as well. This is
|
||||||
|
perhaps most useful when doing ftp.
|
||||||
|
|
||||||
|
Daniel (8 Apr)
|
||||||
|
- James Bursa fixed a flaw in the Content-Type extraction code, which missed
|
||||||
|
the first letter if no space followed the colon.
|
||||||
|
|
||||||
|
- Magnus Nilsson pointed out that share.c was missing in the MSVC project
|
||||||
|
file.
|
||||||
|
|
||||||
|
Daniel (6 Apr)
|
||||||
|
- Ryan Weaver provided a patch that makes the CA cert bundle not get installed
|
||||||
|
anymore when 'configure --without-ssl' has been used.
|
||||||
|
|
||||||
|
Daniel (4 Apr)
|
||||||
|
- Martijn Broenland found another cases where a server application didn't
|
||||||
|
like the boundary string used by curl when foing a multi-part/formpost. We
|
||||||
|
modified the boundary string to look like the one IE uses, as this is
|
||||||
|
probably gonna make curl work with more applications.
|
||||||
|
|
||||||
|
Daniel (3 Apr)
|
||||||
|
- Kevin Roth reported that a bunch of tests fails on cygwin. One set fails
|
||||||
|
when using perl 5.8 (and they run fine with perl 5.6), and another set
|
||||||
|
failed because of an artifact in the test suite's FTP server that I
|
||||||
|
corrected. It turned out the FTP server code was still having a file opened
|
||||||
|
while the main test script removed it and invoked the HTTP server that
|
||||||
|
attempted to create the same file name of the file the FTP server kept open.
|
||||||
|
This operation works fine on unix, but not on cygwin.
|
||||||
|
|
||||||
|
Version 7.10.4 (2 Apr 2003)
|
||||||
|
|
||||||
|
Daniel (1 Apr)
|
||||||
|
- Added test case 505 to exercise FTP upload with rename done with libcurl,
|
||||||
|
and for that I had to extend the test suite's FTP server to deal with the
|
||||||
|
RNFR and RNTO commands.
|
||||||
|
|
||||||
|
Daniel (31 Mar)
|
||||||
|
- Even more SSL config check modifications after Richard's testing.
|
||||||
|
|
||||||
|
Version 7.10.4-pre6 (31 Mar 2003)
|
||||||
|
|
||||||
|
Daniel (31 Mar)
|
||||||
|
- More fixes for the SSL session ID cache checks when SSL configs are changed
|
||||||
|
between connections. Based on tests and talks with Richard Bramante.
|
||||||
|
|
||||||
|
- Guillaume Cottenceau provided a patch that added CURLOPT_UNRESTRICTED_AUTH.
|
||||||
|
When enabled, it will prevent libcurl from limiting to which host it sends
|
||||||
|
user+password to when following locations. By default, libcurl only sends
|
||||||
|
name and password to the original host used in the first URL, but with this
|
||||||
|
option set it will send the auth info to all hosts it follows location
|
||||||
|
headers to. The new tool command line option for this is named
|
||||||
|
"--location-trusted".
|
||||||
|
|
||||||
|
- Frankie Fong reported a problem with libcurl if you re-used an easy handle
|
||||||
|
with a proxy, and you first made a https:// connction to a host and then
|
||||||
|
switched to a http:// one to the same host. libcurl would then wrongly re-use
|
||||||
|
the same connection for it and fail to get the second URL properly
|
||||||
|
|
||||||
|
Daniel (29 Mar)
|
||||||
|
- Dan Shearer's fix that makes curl complain if invoked with nothing but "curl
|
||||||
|
-O" was applied.
|
||||||
|
|
||||||
|
Daniel (26 Mar)
|
||||||
|
- Bryan Kemp was friendly enough to lend me an account on his Redhat 9 box and
|
||||||
|
I could fix the configure problems on redhat 8.1 and 9 in no time thanks to
|
||||||
|
this. Thanks a bunch Bryan!
|
||||||
|
|
||||||
|
Daniel (25 Mar)
|
||||||
|
- Renamed configure.in to configure.ac
|
||||||
|
|
||||||
|
Version 7.10.4-pre5 (25 Mar 2003)
|
||||||
|
|
||||||
|
Daniel (25 Mar)
|
||||||
|
- Richard Bramante provided a fix for a handle re-use problem seen when you
|
||||||
|
change options on an SSL-enabled connection between requests. Previously,
|
||||||
|
changing peer verification or host verification and similar things was not
|
||||||
|
taken into account when a connection were checked for re-use and thus
|
||||||
|
enabling stricter check between requests on a re-used connection made no
|
||||||
|
difference and the connection would thus be used erroneously.
|
||||||
|
|
||||||
|
Daniel (24 Mar)
|
||||||
|
- G<>tz Babin-Ebell pointed out that the ca-bundle.crt file contained a
|
||||||
|
certificate from Trustcenter that was a demo certificate only that was never
|
||||||
|
indended to be part of a CA bundle.
|
||||||
|
|
||||||
|
Daniel (21 Mar)
|
||||||
|
- Life is a mystery. Within a time period of 17 hours, Tim Pope and Michael
|
||||||
|
Churchill filed one bug report each, both identifying problems with a second
|
||||||
|
transfer when doing persistant transfers re-using a connection. Tim's one is
|
||||||
|
#706624, labeled "Multiple uploads per handle fail" and Michael's #707003
|
||||||
|
"Does not send Authorization: header when reusing connection". I could track
|
||||||
|
both down to the same piece of logic and it turned out libcurl was not using
|
||||||
|
new settings properly when re-using an existing connection. This concerned
|
||||||
|
both uploading and downloading and involved exactly those pieces these two
|
||||||
|
reports identified. This code has been this faulty since the day I
|
||||||
|
introduced persistant connection support in libcurl, more than 2 years ago.
|
||||||
|
|
||||||
|
Daniel (20 Mar 2003)
|
||||||
|
- Five year anniversary. Today five years ago, the first ever curl release saw
|
||||||
|
the light of day.
|
||||||
|
|
||||||
|
Daniel (17 Mar)
|
||||||
|
- Andy Cedilnik corrected flaws in some libcurl example-usage sources.
|
||||||
|
|
||||||
|
Daniel (16 Mar)
|
||||||
|
- Juan F. Codagnone reported that the fix from March 2nd was incomplete.
|
||||||
|
|
||||||
|
- Added code to the configure.in to check for select() argument types. I've
|
||||||
|
not made any code use the results just yet though.
|
||||||
|
|
||||||
|
Daniel (15 Mar)
|
||||||
|
- Gisle Vanem provided two patches to build better on Windows.
|
||||||
|
|
||||||
|
- Adjusted the test suite code to better make sure that the server(s) required
|
||||||
|
for a specific test is properly started before the test case is attempted.
|
||||||
|
Many tests now run a lot faster than before.
|
||||||
|
|
||||||
|
Daniel (14 Mar)
|
||||||
|
- Another configure.in adjustment made the configure detect functions properly
|
||||||
|
on HPUX now.
|
||||||
|
|
||||||
|
Daniel (13 Mar)
|
||||||
|
- Philippe Raoult fixed pre4-compile quirks for FreeBSD.
|
||||||
|
|
||||||
|
Version 7.10.4-pre4 (13 Mar 2003)
|
||||||
|
|
||||||
|
Daniel (13 Mar)
|
||||||
|
- Added a backup-check for functions that aren't found by AC_CHECK_FUNCS()
|
||||||
|
as I believe some checks on HPUX need this. At least some of the info given
|
||||||
|
to us by Rick Jones seemed to indicate this.
|
||||||
|
|
||||||
|
Daniel (12 Mar)
|
||||||
|
- Thomas Tonino found out that if you used the curl tool to do PUT operations
|
||||||
|
as in 'curl www.foo.com/dir/ -T file' and the file name included for example
|
||||||
|
space or other characters that don't belong in URLs, curl did not properly
|
||||||
|
URL encode them before using them in the URL.
|
||||||
|
|
||||||
|
- Added an option to configure called --enable-libgcc that simply adds -lgcc
|
||||||
|
to the LIBS variable, as this seems to be a common problem.
|
||||||
|
|
||||||
|
- I modified the configure.in file, so that the headers are now checked in an
|
||||||
|
order of "viality". We must also make sure to use the "default headers"
|
||||||
|
parameter to AC_CHECK_HEADERS() so that headers are checked with the proper
|
||||||
|
prerequisites included (i.e all the major and generally important header
|
||||||
|
files are included there by default). This might be what we need for various
|
||||||
|
Sun, HP, AIX and Tru64 systems to behave good again on the header check
|
||||||
|
front.
|
||||||
|
|
||||||
|
- Rick Jones pointed out a few compiler warnings on HP-UX that I addressed.
|
||||||
|
|
||||||
|
- I made the configure --help output nicer by using AC_HELP_STRING() a lot
|
||||||
|
more.
|
||||||
|
|
||||||
|
Daniel (11 Mar)
|
||||||
|
- Christophe Demory fixed the socket sending code to work better on HP-UX
|
||||||
|
when sending data to a socket that would block. It then returns EAGAIN, not
|
||||||
|
EWOULDBLOCK.
|
||||||
|
|
||||||
|
- Richard Gorton improved the seeding function for systems without a good
|
||||||
|
and reliable random source.
|
||||||
|
|
||||||
|
- Richard Gorton fixed a few warnings that popped up when you built curl
|
||||||
|
using the Sun compiler on a 64bit SPARC platform.
|
||||||
|
|
||||||
|
- Martin C. Martin fixed a case where a connect failure using the multi
|
||||||
|
interface didn't produce a human readable error string.
|
||||||
|
|
||||||
|
Daniel (10 Mar)
|
||||||
|
- Reverted ltmain.sh back to libtool 1.4.2 status again, as the 1.4.3 version
|
||||||
|
broke the build on numerous platforms. It seems that libtool 1.4.3 puts some
|
||||||
|
requirements on what versions of the other tools (autoconf + automake) that
|
||||||
|
I am not familiar with and thus I couldn't fulfill at this point.
|
||||||
|
|
||||||
|
Yes, this is more than mildly frustrating.
|
||||||
|
|
||||||
|
Daniel (7 Mar)
|
||||||
|
- Run libtoolize version 1.4.3.
|
||||||
|
|
||||||
|
Version 7.10.4-pre3 (4 Mar 2003)
|
||||||
|
|
||||||
|
Daniel (3 Mar)
|
||||||
|
- Added share.obj to the VC6 and Borland libcurl makefiles.
|
||||||
|
|
||||||
|
- Troels Walsted Hansen found and investigated a problem with libcurl on AIX,
|
||||||
|
presumably only on 4.3 or later. gethostbyname_r() is not returning data
|
||||||
|
that is possible to "keep" and cache the way libcurl does. But instead these
|
||||||
|
versions of AIX uses a gethostbyname() that works thread-safely we can
|
||||||
|
instead use the ordinary gethostbyname() and our pack_hostent() approach to
|
||||||
|
achieve what we want. The configure script now attempts to detect AIX 4.3 or
|
||||||
|
later to adjust for this.
|
||||||
|
|
||||||
|
Daniel (2 Mar)
|
||||||
|
- Juan F. Codagnone found a problem introduced in 7.10.3 when you first did a
|
||||||
|
POST and then back to a GET using the same easy handle.
|
||||||
|
|
||||||
|
Daniel (28 Feb)
|
||||||
|
- Removed the strequal and strnequal defines from curl/curl.h header. They
|
||||||
|
were never meant for the public header anyway. Philippe Raoult brought it
|
||||||
|
up.
|
||||||
|
|
||||||
|
- James Bursa fixed the RISC OS build.
|
||||||
|
|
||||||
|
Daniel (27 Feb)
|
||||||
|
- Avery Fay pointed out the very misleading curl_multi_info_read man page, and
|
||||||
|
I updated it to become more accurate.
|
||||||
|
|
||||||
|
- Salvatore Sorrentino found a problem with FTP downloading that turned out to
|
||||||
|
be his FTP server returning size zero (0 bytes) when SIZE was used on a file
|
||||||
|
while being in BINARY mode. We now make a second check for the actual size
|
||||||
|
by scanning the RETR reply anyway, even if the SIZE command returned 0.
|
||||||
|
|
||||||
|
Daniel (26 Feb)
|
||||||
|
- Kyle Sallee reported a case where he would do a transfer that didn't update
|
||||||
|
the progress meter properly. It turned out to be a case where libcurl would
|
||||||
|
loop a little too eagerly in the tranfer loop, which isn't really good for
|
||||||
|
the APIs, especially not the multi API.
|
||||||
|
|
||||||
|
Version 7.10.4-pre2 (24 Feb 2003)
|
||||||
|
|
||||||
|
Daniel (24 Feb)
|
||||||
|
- Kjetil Jacobsen found out that setting CURLOPT_MAXCONNECTS to a value higher
|
||||||
|
than 5 could cause a segfault.
|
||||||
|
|
||||||
|
- I believe I fixed the 'Expect: 100-continue' behavior that has been broken
|
||||||
|
for a while (I think since my change dated Dec 10 2002). When this header is
|
||||||
|
used, libcurl should wait for a HTTP 100 (or timeout) before sending the
|
||||||
|
post/put data.
|
||||||
|
|
||||||
|
Daniel (14 Feb)
|
||||||
|
- Matthew Clarke provided some info what to modify to make curl build
|
||||||
|
flawlessly on AIX 3.2.5.
|
||||||
|
|
||||||
|
- Martin C. Martin found and fixed a problem in the multi interface when
|
||||||
|
running on Windows and trying to connect to a port without a listener.
|
||||||
|
|
||||||
|
Daniel (13 Feb)
|
||||||
|
- Christopher R. Palmer fixed Curl_base64_encode() to deal with zeroes in the
|
||||||
|
data to encode.
|
||||||
|
|
||||||
|
Daniel (4 Feb)
|
||||||
|
- Jean-Philippe added the first code that enables the 'share' system. This
|
||||||
|
should now enable sharing of DNS data between two curl easy handles.
|
||||||
|
|
||||||
|
- Incorporated Nico Baggus' fixes to again compile flawlessly on VMS.
|
||||||
|
|
||||||
|
- James Bursa corrected a bad comment in the public include file curl/multi.h
|
||||||
|
|
||||||
|
- Peter Forret reported one of those error:00000000 cases in libcurl again
|
||||||
|
when connecting to a HTTPS site, and this time I did discover some oddities
|
||||||
|
in how curl reports SSL errors back. It could miss showing the actual error.
|
||||||
|
|
||||||
|
Version 7.10.4-pre1 (3 Feb 2003)
|
||||||
|
|
||||||
|
Daniel (3 Feb)
|
||||||
|
- Removed things in the docs saying capath doesn't work on Windows, as Julian
|
||||||
|
Noble told us it works fine.
|
||||||
|
|
||||||
|
Daniel (31 Jan)
|
||||||
|
- Kevin Roth fixed the zlib build stuff in the Mingw32 makefile.
|
||||||
|
|
||||||
|
Daniel (30 Jan)
|
||||||
|
- Kevin Roth found out that curl on Windows always checked for the CA cert
|
||||||
|
bundle using the environment variable and the path scan, even though
|
||||||
|
-k/--insecure was used.
|
||||||
|
|
||||||
|
- Hamish Mackenzie pointed out that curl only did strict host name verifying
|
||||||
|
if capath or cainfo was used. Now it'll always do it unless -k / --insecure
|
||||||
|
is used!
|
||||||
|
|
||||||
|
- Pavel Cenek pointed out that the Content-Type extraction was done wrongly
|
||||||
|
as the full string was not fetched. Added test case 57 to verify that curl
|
||||||
|
does it right now.
|
||||||
|
|
||||||
|
Daniel (29 Jan)
|
||||||
|
- Jamie Wilkinson provided a patch that now makes curl attempt to clear out
|
||||||
|
"sensitive" command line arguments so that they don't appear in ps outputs
|
||||||
|
(only on platforms that allow writing to argv[]).
|
||||||
|
|
||||||
|
- John McGowan found out that the DEBUGFUNCTION could be called with bad
|
||||||
|
arguments and thus cause the --trace outputs to go wrong.
|
||||||
|
|
||||||
|
- Removed all the emacs local variables from all files. Mats Lidell provided
|
||||||
|
the new sample.emacs file (for a sample of what to include in your .emacs)
|
||||||
|
and the curl-style.el that sets a better c-style for editing curl sources.
|
||||||
|
|
||||||
|
- Dave Halbakken found a problem with FTP downloads that could accidently
|
||||||
|
return CURLE_PARTIAL_FILE when curl_easy_perform() was called with NOBODY
|
||||||
|
set TRUE.
|
||||||
|
|
||||||
|
Daniel (27 Jan)
|
||||||
|
- The fopen.c example was flawed as Nick Humfrey noticed, and I fixed it to
|
||||||
|
work again.
|
||||||
|
|
||||||
|
Daniel (24 Jan)
|
||||||
|
- Bertrand Demiddelaer found and fixed a memory leak (the content-type string)
|
||||||
|
when following locations.
|
||||||
|
|
||||||
|
Daniel (22 Jan 2003)
|
||||||
|
- Ian Wilkes and Legoff Vincent both independently provided fixes for making
|
||||||
|
curl/multi.h work properly when compiled with a C++ compiler.
|
||||||
|
|
||||||
|
Daniel (20 Jan 2003)
|
||||||
|
- Fixed 'buildconf' to check version number of the required tools before
|
||||||
|
they're actually used.
|
||||||
|
|
||||||
|
- Wrote 'testcurl.sh', a script targeted for automatic and distributed curl
|
||||||
|
tests on various platforms.
|
||||||
|
|
||||||
|
- David Thiel pointed out that the .netrc file was not being dealt with
|
||||||
|
properly anymore. I broke this in the password prompting "fix".
|
||||||
|
|
||||||
|
- Markus F.X.J. Oberhumer patched libcurl to allocate the scratch buffer only
|
||||||
|
on demand and thus we save 32KB in each curl handle that don't use that
|
||||||
|
buffer. This need appeared when some people started using thousands of
|
||||||
|
simultaneous curl handles... :-)
|
||||||
|
|
||||||
|
Daniel (16 Jan 2003)
|
||||||
|
- Markus Oberhumer fixed curl-config --cflags when the includedir was not
|
||||||
|
/usr/include.
|
||||||
|
|
||||||
|
- Markus Oberhumer fixed CURLINFO_PRIVATE to properly return NULL if it was
|
||||||
|
set to NULL!
|
||||||
|
|
||||||
Version 7.10.3 (14 Jan 2003)
|
Version 7.10.3 (14 Jan 2003)
|
||||||
|
|
||||||
@@ -1586,4 +2057,4 @@ Daniel (2 January 2002)
|
|||||||
changes done on dec-20 made test case 104 cease to work (in both branches).
|
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
|
- Philip Gladstone pointed out a few portability problems in the source code
|
||||||
that didn't compile on 64-bit sparcs using Sun's native
|
that didn't compile on 64-bit sparcs using Sun's native compiler.
|
||||||
|
2
COPYING
2
COPYING
@@ -1,6 +1,6 @@
|
|||||||
COPYRIGHT AND PERMISSION NOTICE
|
COPYRIGHT AND PERMISSION NOTICE
|
||||||
|
|
||||||
Copyright (c) 1996 - 2002, Daniel Stenberg, <daniel@haxx.se>.
|
Copyright (c) 1996 - 2003, Daniel Stenberg, <daniel@haxx.se>.
|
||||||
|
|
||||||
All rights reserved.
|
All rights reserved.
|
||||||
|
|
||||||
|
28
CVS-INFO
28
CVS-INFO
@@ -15,7 +15,8 @@ Compile and build instructions follow below.
|
|||||||
CHANGES.0 contains ancient changes.
|
CHANGES.0 contains ancient changes.
|
||||||
CHANGES.$year contains changes for the particular year.
|
CHANGES.$year contains changes for the particular year.
|
||||||
|
|
||||||
memanalyze.pl is for analyzing the output generated by curl if -DMALLOCDEBUG
|
tests/memanalyze.pl
|
||||||
|
is for analyzing the output generated by curl if -DMALLOCDEBUG
|
||||||
is used when compiling
|
is used when compiling
|
||||||
|
|
||||||
buildconf builds the makefiles and configure stuff
|
buildconf builds the makefiles and configure stuff
|
||||||
@@ -39,17 +40,24 @@ REQUIREMENTS
|
|||||||
|
|
||||||
You need the following software installed:
|
You need the following software installed:
|
||||||
|
|
||||||
o autoconf 2.50 (or later)
|
o autoconf 2.57 (or later)
|
||||||
o automake 1.5 (or later)
|
o automake 1.7 (or later)
|
||||||
o libtool 1.4 (or later)
|
o libtool 1.4.2 (or later)
|
||||||
o GNU m4 (required by autoconf)
|
o GNU m4 (required by autoconf)
|
||||||
|
|
||||||
o nroff + perl (if you don't have nroff and perl and you for some reason
|
o nroff + perl
|
||||||
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
|
If you don't have nroff and perl and you for some reason don't want to
|
||||||
file. This will of course give you an older version of the file that isn't
|
install them, you can rename the source file src/hugehelp.c.cvs to
|
||||||
up-to-date. That file was checked in once and won't be updated very
|
src/hugehelp.c and avoid having to generate this file. This will of course
|
||||||
regularly.)
|
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.
|
||||||
|
|
||||||
|
o yacc/bison
|
||||||
|
|
||||||
|
If you don't have yacc or bison, you must rename the lib/getdate.c.cvs file
|
||||||
|
to lib/getdate.c to be able to build libcurl. yacc/bison is normally used
|
||||||
|
to generate the lib/getdate.c file from the lib/getdate.y source file.
|
||||||
|
|
||||||
MAC OS X
|
MAC OS X
|
||||||
|
|
||||||
|
25
LEGAL
25
LEGAL
@@ -1,25 +0,0 @@
|
|||||||
Copyright (C) 1998-2002, 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.
|
|
||||||
|
|
||||||
In order to be useful for every potential user, the 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. The files MITX.txt and MPL-1.1.txt contain the
|
|
||||||
license texts.
|
|
||||||
|
|
||||||
As a courtesy to the open-source and free software community, we ask you to
|
|
||||||
dual-license any modifications that you make as well, under the terms of this
|
|
||||||
document.
|
|
||||||
|
|
||||||
Please remember to always keep the licensing information included in
|
|
||||||
individual source files up-to-date, so as to avoid misleading anyone as to
|
|
||||||
the status of these files.
|
|
||||||
|
|
||||||
I will use a submission policy according to which I will only enter
|
|
||||||
contributions into the CVS tree if the contributor agrees to both licenses
|
|
||||||
and this dual-license approach.
|
|
@@ -5,7 +5,7 @@
|
|||||||
AUTOMAKE_OPTIONS = foreign
|
AUTOMAKE_OPTIONS = foreign
|
||||||
|
|
||||||
EXTRA_DIST = CHANGES COPYING maketgz SSLCERTS reconf Makefile.dist \
|
EXTRA_DIST = CHANGES COPYING maketgz SSLCERTS reconf Makefile.dist \
|
||||||
curl-config.in build_vms.com curl-mode.el
|
curl-config.in build_vms.com curl-style.el sample.emacs testcurl.sh
|
||||||
|
|
||||||
bin_SCRIPTS = curl-config
|
bin_SCRIPTS = curl-config
|
||||||
|
|
||||||
@@ -13,6 +13,7 @@ SUBDIRS = docs lib src include tests packages
|
|||||||
|
|
||||||
# create a root makefile in the distribution:
|
# create a root makefile in the distribution:
|
||||||
dist-hook:
|
dist-hook:
|
||||||
|
rm -rf $(top_builddir)/tests/log
|
||||||
cp $(srcdir)/Makefile.dist $(distdir)/Makefile
|
cp $(srcdir)/Makefile.dist $(distdir)/Makefile
|
||||||
|
|
||||||
html:
|
html:
|
||||||
@@ -26,6 +27,9 @@ check: test
|
|||||||
test:
|
test:
|
||||||
@(cd tests; $(MAKE) quiet-test)
|
@(cd tests; $(MAKE) quiet-test)
|
||||||
|
|
||||||
|
test-full:
|
||||||
|
@(cd tests; $(MAKE) full-test)
|
||||||
|
|
||||||
#
|
#
|
||||||
# Build source and binary rpms. For rpm-3.0 and above, the ~/.rpmmacros
|
# Build source and binary rpms. For rpm-3.0 and above, the ~/.rpmmacros
|
||||||
# must contain the following line:
|
# must contain the following line:
|
||||||
|
27
README
27
README
@@ -11,19 +11,30 @@ README
|
|||||||
MANUAL document. Find out how to install Curl by reading the INSTALL
|
MANUAL document. Find out how to install Curl by reading the INSTALL
|
||||||
document.
|
document.
|
||||||
|
|
||||||
libcurl is a library that Curl is using to do its job. It is readily
|
libcurl is the library curl is using to do its job. It is readily
|
||||||
available to be used by your software. Read the libcurl.3 man page to
|
available to be used by your software. Read the libcurl.3 man page to
|
||||||
find out how!
|
learn how!
|
||||||
|
|
||||||
You find answers to the most frequent questions we get in the FAQ document.
|
You find answers to the most frequent questions we get in the FAQ document.
|
||||||
|
|
||||||
Study the LEGAL file for distribution terms and similar.
|
Study the COPYING file for distribution terms and similar.
|
||||||
|
|
||||||
|
CONTACT
|
||||||
|
|
||||||
|
If you have problems, questions, ideas or suggestions, please contact us
|
||||||
|
by posting to a suitable mailing list. See http://curl.haxx.se/mail/
|
||||||
|
|
||||||
|
Many major contributors to the project are listed in the THANKS document.
|
||||||
|
|
||||||
|
WEB SITE
|
||||||
|
|
||||||
Visit the curl web site or mirrors for the latest news:
|
Visit the curl web site or mirrors for the latest news:
|
||||||
|
|
||||||
http://curl.haxx.se/
|
Sweden -- http://curl.haxx.se/
|
||||||
http://curl.sf.net/
|
US -- http://curl.sf.net/
|
||||||
http://curl.planetmirror.com/
|
Australia -- http://curl.planetmirror.com/
|
||||||
|
|
||||||
|
DOWNLOAD
|
||||||
|
|
||||||
The official download mirror sites are:
|
The official download mirror sites are:
|
||||||
|
|
||||||
@@ -34,6 +45,8 @@ README
|
|||||||
US -- http://curl.sourceforge.net/download/
|
US -- http://curl.sourceforge.net/download/
|
||||||
Hongkong -- http://www.execve.net/curl/
|
Hongkong -- http://www.execve.net/curl/
|
||||||
|
|
||||||
|
CVS
|
||||||
|
|
||||||
To download the very latest source off the CVS server do this:
|
To download the very latest source off the CVS server do this:
|
||||||
|
|
||||||
cvs -d :pserver:anonymous@cvs.curl.sourceforge.net:/cvsroot/curl login
|
cvs -d :pserver:anonymous@cvs.curl.sourceforge.net:/cvsroot/curl login
|
||||||
@@ -48,6 +61,8 @@ README
|
|||||||
|
|
||||||
(you're off the hook!)
|
(you're off the hook!)
|
||||||
|
|
||||||
|
NOTICE
|
||||||
|
|
||||||
Curl contains pieces of source code that is Copyright (c) 1998, 1999
|
Curl contains pieces of source code that is Copyright (c) 1998, 1999
|
||||||
Kungliga Tekniska H<>gskolan. This notice is included here to comply with the
|
Kungliga Tekniska H<>gskolan. This notice is included here to comply with the
|
||||||
distribution terms.
|
distribution terms.
|
||||||
|
20
SSLCERTS
20
SSLCERTS
@@ -6,9 +6,9 @@ default. This is done by installing a default CA cert bundle on 'make install'
|
|||||||
(or similar), that CA bundle package is used by default on operations against
|
(or similar), that CA bundle package is used by default on operations against
|
||||||
SSL servers.
|
SSL servers.
|
||||||
|
|
||||||
Alas, if you communicate with HTTPS servers using certifcates that are signed
|
Alas, if you communicate with HTTPS servers using certificates that are signed
|
||||||
by CAs present in the bundle, you will not notice any changed behavior and you
|
by CAs present in the bundle, you will not notice any changed behavior and you
|
||||||
will seeminglessly get a higher security level on your SSL connections since
|
will seamlessly get a higher security level on your SSL connections since you
|
||||||
can be sure that the remote server really is the one it claims to be.
|
can be sure that the remote server really is the one it claims to be.
|
||||||
|
|
||||||
If the remote server uses a self-signed certificate, or if you don't install
|
If the remote server uses a self-signed certificate, or if you don't install
|
||||||
@@ -26,10 +26,14 @@ included in the bundle, then you need to do one of the following:
|
|||||||
|
|
||||||
With the curl command tool: --cacert [file]
|
With the curl command tool: --cacert [file]
|
||||||
|
|
||||||
This upgrade procedure has been deemed The Right Thing even though it adds
|
Neglecting to use one of the above menthods when dealing with a server using a
|
||||||
this extra trouble for some users, since it adds security to a majority of the
|
certficate that isn't signed by one of the certficates in the installed CA
|
||||||
SSL connections that previously weren't really secure.
|
cert bundle, will cause SSL to report an error ("certificate verify failed")
|
||||||
|
during the handshake and SSL will then refuse further communication with that
|
||||||
|
server.
|
||||||
|
|
||||||
It turned out many people were using previous versions of curl/libcurl without
|
This procedure has been deemed The Right Thing even though it adds this extra
|
||||||
realizing the need for the CA cert options to get truly secure SSL
|
trouble for some users, since it adds security to a majority of the SSL
|
||||||
connections.
|
connections that previously weren't really secure. It turned out many people
|
||||||
|
were using previous versions of curl/libcurl without realizing the need for
|
||||||
|
the CA cert options to get truly secure SSL connections.
|
||||||
|
90
acconfig.h
90
acconfig.h
@@ -1,90 +0,0 @@
|
|||||||
/* Name of this package! */
|
|
||||||
#undef PACKAGE
|
|
||||||
|
|
||||||
/* Version number of this archive. */
|
|
||||||
#undef VERSION
|
|
||||||
|
|
||||||
/* Define if you have the getpass function. */
|
|
||||||
#undef HAVE_GETPASS
|
|
||||||
|
|
||||||
/* Define cpu-machine-OS */
|
|
||||||
#undef OS
|
|
||||||
|
|
||||||
/* Define if you have the gethostbyaddr_r() function with 5 arguments */
|
|
||||||
#undef HAVE_GETHOSTBYADDR_R_5
|
|
||||||
|
|
||||||
/* Define if you have the gethostbyaddr_r() function with 7 arguments */
|
|
||||||
#undef HAVE_GETHOSTBYADDR_R_7
|
|
||||||
|
|
||||||
/* Define if you have the gethostbyaddr_r() function with 8 arguments */
|
|
||||||
#undef HAVE_GETHOSTBYADDR_R_8
|
|
||||||
|
|
||||||
/* Define if you have the gethostbyname_r() function with 3 arguments */
|
|
||||||
#undef HAVE_GETHOSTBYNAME_R_3
|
|
||||||
|
|
||||||
/* Define if you have the gethostbyname_r() function with 5 arguments */
|
|
||||||
#undef HAVE_GETHOSTBYNAME_R_5
|
|
||||||
|
|
||||||
/* Define if you have the gethostbyname_r() function with 6 arguments */
|
|
||||||
#undef HAVE_GETHOSTBYNAME_R_6
|
|
||||||
|
|
||||||
/* Define if you have the inet_ntoa_r function declared. */
|
|
||||||
#undef HAVE_INET_NTOA_R_DECL
|
|
||||||
|
|
||||||
/* Define if you need the _REENTRANT define for some functions */
|
|
||||||
#undef NEED_REENTRANT
|
|
||||||
|
|
||||||
/* Define if you have the Kerberos4 libraries (including -ldes) */
|
|
||||||
#undef KRB4
|
|
||||||
|
|
||||||
/* Define if you want to enable IPv6 support */
|
|
||||||
#undef ENABLE_IPV6
|
|
||||||
|
|
||||||
/* Define this to 'int' if ssize_t is not an available typedefed type */
|
|
||||||
#undef ssize_t
|
|
||||||
|
|
||||||
/* Define this to 'int' if socklen_t is not an available typedefed type */
|
|
||||||
#undef socklen_t
|
|
||||||
|
|
||||||
/* Define this as a suitable file to read random data from */
|
|
||||||
#undef RANDOM_FILE
|
|
||||||
|
|
||||||
/* Define this to your Entropy Gathering Daemon socket pathname */
|
|
||||||
#undef EGD_SOCKET
|
|
||||||
|
|
||||||
/* Define if you have a working OpenSSL installation */
|
|
||||||
#undef OPENSSL_ENABLED
|
|
||||||
|
|
||||||
/* Define the one correct non-blocking socket method below */
|
|
||||||
#undef HAVE_FIONBIO
|
|
||||||
#undef HAVE_IOCTLSOCKET
|
|
||||||
#undef HAVE_IOCTLSOCKET_CASE
|
|
||||||
#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
|
|
||||||
|
|
||||||
/* Define to disable DICT */
|
|
||||||
#undef CURL_DISABLE_DICT
|
|
||||||
|
|
||||||
/* Define to disable FILE */
|
|
||||||
#undef CURL_DISABLE_FILE
|
|
||||||
|
|
||||||
/* Define to disable FTP */
|
|
||||||
#undef CURL_DISABLE_FTP
|
|
||||||
|
|
||||||
/* Define to disable GOPHER */
|
|
||||||
#undef CURL_DISABLE_GOPHER
|
|
||||||
|
|
||||||
/* Define to disable HTTP */
|
|
||||||
#undef CURL_DISABLE_HTTP
|
|
||||||
|
|
||||||
/* Define to disable LDAP */
|
|
||||||
#undef CURL_DISABLE_LDAP
|
|
||||||
|
|
||||||
/* Define to disable TELNET */
|
|
||||||
#undef CURL_DISABLE_TELNET
|
|
||||||
|
|
||||||
/* Define if you have zlib present */
|
|
||||||
#undef HAVE_LIBZ
|
|
40
acinclude.m4
40
acinclude.m4
@@ -38,7 +38,7 @@ AC_DEFUN(CURL_CHECK_NONBLOCKING_SOCKET,
|
|||||||
],[
|
],[
|
||||||
dnl the O_NONBLOCK test was fine
|
dnl the O_NONBLOCK test was fine
|
||||||
nonblock="O_NONBLOCK"
|
nonblock="O_NONBLOCK"
|
||||||
AC_DEFINE(HAVE_O_NONBLOCK)
|
AC_DEFINE(HAVE_O_NONBLOCK, 1, [use O_NONBLOCK for non-blocking sockets])
|
||||||
],[
|
],[
|
||||||
dnl the code was bad, try a different program now, test 2
|
dnl the code was bad, try a different program now, test 2
|
||||||
|
|
||||||
@@ -52,7 +52,7 @@ dnl the code was bad, try a different program now, test 2
|
|||||||
],[
|
],[
|
||||||
dnl FIONBIO test was good
|
dnl FIONBIO test was good
|
||||||
nonblock="FIONBIO"
|
nonblock="FIONBIO"
|
||||||
AC_DEFINE(HAVE_FIONBIO)
|
AC_DEFINE(HAVE_FIONBIO, 1, [use FIONBIO for non-blocking sockets])
|
||||||
],[
|
],[
|
||||||
dnl FIONBIO test was also bad
|
dnl FIONBIO test was also bad
|
||||||
dnl the code was bad, try a different program now, test 3
|
dnl the code was bad, try a different program now, test 3
|
||||||
@@ -66,7 +66,7 @@ dnl the code was bad, try a different program now, test 3
|
|||||||
],[
|
],[
|
||||||
dnl ioctlsocket test was good
|
dnl ioctlsocket test was good
|
||||||
nonblock="ioctlsocket"
|
nonblock="ioctlsocket"
|
||||||
AC_DEFINE(HAVE_IOCTLSOCKET)
|
AC_DEFINE(HAVE_IOCTLSOCKET, 1, [use ioctlsocket() for non-blocking sockets])
|
||||||
],[
|
],[
|
||||||
dnl ioctlsocket didnt compile!
|
dnl ioctlsocket didnt compile!
|
||||||
|
|
||||||
@@ -79,11 +79,11 @@ dnl ioctlsocket didnt compile!
|
|||||||
],[
|
],[
|
||||||
dnl ioctlsocket test was good
|
dnl ioctlsocket test was good
|
||||||
nonblock="IoctlSocket"
|
nonblock="IoctlSocket"
|
||||||
AC_DEFINE(HAVE_IOCTLSOCKET_CASE)
|
AC_DEFINE(HAVE_IOCTLSOCKET_CASE, 1, [use Ioctlsocket() for non-blocking sockets])
|
||||||
],[
|
],[
|
||||||
dnl ioctlsocket didnt compile!
|
dnl ioctlsocket didnt compile!
|
||||||
nonblock="nada"
|
nonblock="nada"
|
||||||
AC_DEFINE(HAVE_DISABLED_NONBLOCKING)
|
AC_DEFINE(HAVE_DISABLED_NONBLOCKING, 1, [disabled non-blocking sockets])
|
||||||
])
|
])
|
||||||
dnl end of forth test
|
dnl end of forth test
|
||||||
|
|
||||||
@@ -152,10 +152,8 @@ AC_DEFUN([TYPE_IN_ADDR_T],
|
|||||||
AC_MSG_CHECKING([for in_addr_t equivalent])
|
AC_MSG_CHECKING([for in_addr_t equivalent])
|
||||||
AC_CACHE_VAL([curl_cv_in_addr_t_equiv],
|
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=
|
curl_cv_in_addr_t_equiv=
|
||||||
for t in int size_t unsigned long "unsigned long"; do
|
for t in "unsigned long" int size_t unsigned long; do
|
||||||
AC_TRY_COMPILE([
|
AC_TRY_COMPILE([
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
@@ -272,15 +270,15 @@ AC_DEFUN(CURL_CHECK_INET_NTOA_R,
|
|||||||
AC_MSG_CHECKING(whether inet_ntoa_r is declared)
|
AC_MSG_CHECKING(whether inet_ntoa_r is declared)
|
||||||
AC_EGREP_CPP(inet_ntoa_r,[
|
AC_EGREP_CPP(inet_ntoa_r,[
|
||||||
#include <arpa/inet.h>],[
|
#include <arpa/inet.h>],[
|
||||||
AC_DEFINE(HAVE_INET_NTOA_R_DECL)
|
AC_DEFINE(HAVE_INET_NTOA_R_DECL, 1, [inet_ntoa_r() is declared])
|
||||||
AC_MSG_RESULT(yes)],[
|
AC_MSG_RESULT(yes)],[
|
||||||
AC_MSG_RESULT(no)
|
AC_MSG_RESULT(no)
|
||||||
AC_MSG_CHECKING(whether inet_ntoa_r with -D_REENTRANT is declared)
|
AC_MSG_CHECKING(whether inet_ntoa_r with -D_REENTRANT is declared)
|
||||||
AC_EGREP_CPP(inet_ntoa_r,[
|
AC_EGREP_CPP(inet_ntoa_r,[
|
||||||
#define _REENTRANT
|
#define _REENTRANT
|
||||||
#include <arpa/inet.h>],[
|
#include <arpa/inet.h>],[
|
||||||
AC_DEFINE(HAVE_INET_NTOA_R_DECL)
|
AC_DEFINE(HAVE_INET_NTOA_R_DECL, 1, [inet_ntoa_r() is declared])
|
||||||
AC_DEFINE(NEED_REENTRANT)
|
AC_DEFINE(NEED_REENTRANT, 1, [need REENTRANT defined])
|
||||||
AC_MSG_RESULT(yes)],
|
AC_MSG_RESULT(yes)],
|
||||||
AC_MSG_RESULT(no))])])
|
AC_MSG_RESULT(no))])])
|
||||||
])
|
])
|
||||||
@@ -302,7 +300,7 @@ struct hostent_data hdata;
|
|||||||
int rc;
|
int rc;
|
||||||
rc = gethostbyaddr_r(address, length, type, &h, &hdata);],[
|
rc = gethostbyaddr_r(address, length, type, &h, &hdata);],[
|
||||||
AC_MSG_RESULT(yes)
|
AC_MSG_RESULT(yes)
|
||||||
AC_DEFINE(HAVE_GETHOSTBYADDR_R_5)
|
AC_DEFINE(HAVE_GETHOSTBYADDR_R_5, 1, [gethostbyaddr_r() takes 5 args])
|
||||||
ac_cv_gethostbyaddr_args=5],[
|
ac_cv_gethostbyaddr_args=5],[
|
||||||
AC_MSG_RESULT(no)
|
AC_MSG_RESULT(no)
|
||||||
AC_MSG_CHECKING(if gethostbyaddr_r with -D_REENTRANT takes 5 arguments)
|
AC_MSG_CHECKING(if gethostbyaddr_r with -D_REENTRANT takes 5 arguments)
|
||||||
@@ -318,8 +316,8 @@ struct hostent_data hdata;
|
|||||||
int rc;
|
int rc;
|
||||||
rc = gethostbyaddr_r(address, length, type, &h, &hdata);],[
|
rc = gethostbyaddr_r(address, length, type, &h, &hdata);],[
|
||||||
AC_MSG_RESULT(yes)
|
AC_MSG_RESULT(yes)
|
||||||
AC_DEFINE(HAVE_GETHOSTBYADDR_R_5)
|
AC_DEFINE(HAVE_GETHOSTBYADDR_R_5, 1, [gethostbyaddr_r() takes 5 args])
|
||||||
AC_DEFINE(NEED_REENTRANT)
|
AC_DEFINE(NEED_REENTRANT, 1, [need REENTRANT])
|
||||||
ac_cv_gethostbyaddr_args=5],[
|
ac_cv_gethostbyaddr_args=5],[
|
||||||
AC_MSG_RESULT(no)
|
AC_MSG_RESULT(no)
|
||||||
AC_MSG_CHECKING(if gethostbyaddr_r takes 7 arguments)
|
AC_MSG_CHECKING(if gethostbyaddr_r takes 7 arguments)
|
||||||
@@ -337,7 +335,7 @@ struct hostent * hp;
|
|||||||
hp = gethostbyaddr_r(address, length, type, &h,
|
hp = gethostbyaddr_r(address, length, type, &h,
|
||||||
buffer, 8192, &h_errnop);],[
|
buffer, 8192, &h_errnop);],[
|
||||||
AC_MSG_RESULT(yes)
|
AC_MSG_RESULT(yes)
|
||||||
AC_DEFINE(HAVE_GETHOSTBYADDR_R_7)
|
AC_DEFINE(HAVE_GETHOSTBYADDR_R_7, 1, [gethostbyaddr_r() takes 7 args] )
|
||||||
ac_cv_gethostbyaddr_args=7],[
|
ac_cv_gethostbyaddr_args=7],[
|
||||||
AC_MSG_RESULT(no)
|
AC_MSG_RESULT(no)
|
||||||
AC_MSG_CHECKING(if gethostbyaddr_r takes 8 arguments)
|
AC_MSG_CHECKING(if gethostbyaddr_r takes 8 arguments)
|
||||||
@@ -356,7 +354,7 @@ int rc;
|
|||||||
rc = gethostbyaddr_r(address, length, type, &h,
|
rc = gethostbyaddr_r(address, length, type, &h,
|
||||||
buffer, 8192, &hp, &h_errnop);],[
|
buffer, 8192, &hp, &h_errnop);],[
|
||||||
AC_MSG_RESULT(yes)
|
AC_MSG_RESULT(yes)
|
||||||
AC_DEFINE(HAVE_GETHOSTBYADDR_R_8)
|
AC_DEFINE(HAVE_GETHOSTBYADDR_R_8, 1, [gethostbyaddr_r() takes 8 args])
|
||||||
ac_cv_gethostbyaddr_args=8],[
|
ac_cv_gethostbyaddr_args=8],[
|
||||||
AC_MSG_RESULT(no)
|
AC_MSG_RESULT(no)
|
||||||
have_missing_r_funcs="$have_missing_r_funcs gethostbyaddr_r"])])])])])
|
have_missing_r_funcs="$have_missing_r_funcs gethostbyaddr_r"])])])])])
|
||||||
@@ -380,7 +378,7 @@ gethostbyname_r(const char *, struct hostent *, struct hostent_data *);],[
|
|||||||
struct hostent_data data;
|
struct hostent_data data;
|
||||||
gethostbyname_r(NULL, NULL, NULL);],[
|
gethostbyname_r(NULL, NULL, NULL);],[
|
||||||
AC_MSG_RESULT(yes)
|
AC_MSG_RESULT(yes)
|
||||||
AC_DEFINE(HAVE_GETHOSTBYNAME_R_3)
|
AC_DEFINE(HAVE_GETHOSTBYNAME_R_3, 1, [gethostbyname_r() takes 3 args])
|
||||||
ac_cv_gethostbyname_args=3],[
|
ac_cv_gethostbyname_args=3],[
|
||||||
AC_MSG_RESULT(no)
|
AC_MSG_RESULT(no)
|
||||||
AC_MSG_CHECKING([if gethostbyname_r with -D_REENTRANT takes 3 arguments])
|
AC_MSG_CHECKING([if gethostbyname_r with -D_REENTRANT takes 3 arguments])
|
||||||
@@ -398,8 +396,8 @@ gethostbyname_r(const char *,struct hostent *, struct hostent_data *);],[
|
|||||||
struct hostent_data data;
|
struct hostent_data data;
|
||||||
gethostbyname_r(NULL, NULL, NULL);],[
|
gethostbyname_r(NULL, NULL, NULL);],[
|
||||||
AC_MSG_RESULT(yes)
|
AC_MSG_RESULT(yes)
|
||||||
AC_DEFINE(HAVE_GETHOSTBYNAME_R_3)
|
AC_DEFINE(HAVE_GETHOSTBYNAME_R_3, 1, [gethostbyname_r() takes 3 args])
|
||||||
AC_DEFINE(NEED_REENTRANT)
|
AC_DEFINE(NEED_REENTRANT, 1, [needs REENTRANT])
|
||||||
ac_cv_gethostbyname_args=3],[
|
ac_cv_gethostbyname_args=3],[
|
||||||
AC_MSG_RESULT(no)
|
AC_MSG_RESULT(no)
|
||||||
AC_MSG_CHECKING([if gethostbyname_r takes 5 arguments])
|
AC_MSG_CHECKING([if gethostbyname_r takes 5 arguments])
|
||||||
@@ -413,7 +411,7 @@ struct hostent *
|
|||||||
gethostbyname_r(const char *, struct hostent *, char *, int, int *);],[
|
gethostbyname_r(const char *, struct hostent *, char *, int, int *);],[
|
||||||
gethostbyname_r(NULL, NULL, NULL, 0, NULL);],[
|
gethostbyname_r(NULL, NULL, NULL, 0, NULL);],[
|
||||||
AC_MSG_RESULT(yes)
|
AC_MSG_RESULT(yes)
|
||||||
AC_DEFINE(HAVE_GETHOSTBYNAME_R_5)
|
AC_DEFINE(HAVE_GETHOSTBYNAME_R_5, 1, [gethostbyname_r() takes 5 args])
|
||||||
ac_cv_gethostbyname_args=5],[
|
ac_cv_gethostbyname_args=5],[
|
||||||
AC_MSG_RESULT(no)
|
AC_MSG_RESULT(no)
|
||||||
AC_MSG_CHECKING([if gethostbyname_r takes 6 arguments])
|
AC_MSG_CHECKING([if gethostbyname_r takes 6 arguments])
|
||||||
@@ -428,7 +426,7 @@ gethostbyname_r(const char *, struct hostent *, char *, size_t,
|
|||||||
struct hostent **, int *);],[
|
struct hostent **, int *);],[
|
||||||
gethostbyname_r(NULL, NULL, NULL, 0, NULL, NULL);],[
|
gethostbyname_r(NULL, NULL, NULL, 0, NULL, NULL);],[
|
||||||
AC_MSG_RESULT(yes)
|
AC_MSG_RESULT(yes)
|
||||||
AC_DEFINE(HAVE_GETHOSTBYNAME_R_6)
|
AC_DEFINE(HAVE_GETHOSTBYNAME_R_6, 1, [gethostbyname_r() takes 6 args])
|
||||||
ac_cv_gethostbyname_args=6],[
|
ac_cv_gethostbyname_args=6],[
|
||||||
AC_MSG_RESULT(no)
|
AC_MSG_RESULT(no)
|
||||||
have_missing_r_funcs="$have_missing_r_funcs gethostbyname_r"],
|
have_missing_r_funcs="$have_missing_r_funcs gethostbyname_r"],
|
||||||
|
@@ -6,7 +6,7 @@ $ loc = f$environment("PROCEDURE")
|
|||||||
$ def = f$parse("X.X;1",loc) - "X.X;1"
|
$ def = f$parse("X.X;1",loc) - "X.X;1"
|
||||||
$
|
$
|
||||||
$ set def 'def'
|
$ set def 'def'
|
||||||
$ cc_qual = "/define=HAVE_CONFIG_H=1/include=(""../include/"",""../"",""../../openssl-0_9_6c/include/"")"
|
$ cc_qual = "/define=HAVE_CONFIG_H=1/include=(""../include/"",""../"",""../../openssl-0_9_7/include/"")"
|
||||||
$ if p1 .eqs. "LISTING" then cc_qual = cc_qual + "/LIST/MACHINE"
|
$ if p1 .eqs. "LISTING" then cc_qual = cc_qual + "/LIST/MACHINE"
|
||||||
$ if p1 .eqs. "DEBUG" then cc_qual = cc_qual + "/LIST/MACHINE/DEBUG"
|
$ if p1 .eqs. "DEBUG" then cc_qual = cc_qual + "/LIST/MACHINE/DEBUG"
|
||||||
$ msg_qual = ""
|
$ msg_qual = ""
|
||||||
@@ -14,8 +14,8 @@ $ call build "[.lib]" "*.c"
|
|||||||
$ call build "[.src]" "*.c"
|
$ call build "[.src]" "*.c"
|
||||||
$ call build "[.src]" "*.msg"
|
$ call build "[.src]" "*.msg"
|
||||||
$ link /exe=curl.exe [.src]curl/lib/include=main,[.lib]curl/lib, -
|
$ link /exe=curl.exe [.src]curl/lib/include=main,[.lib]curl/lib, -
|
||||||
[-.openssl-0_9_6c.axp.exe.ssl]libssl/lib, -
|
[-.openssl-0_9_7.axp.exe.ssl]libssl/lib, -
|
||||||
[-.openssl-0_9_6c.axp.exe.crypto]libcrypto/lib
|
[-.openssl-0_9_7.axp.exe.crypto]libcrypto/lib
|
||||||
$
|
$
|
||||||
$
|
$
|
||||||
$ goto Common_Exit
|
$ goto Common_Exit
|
||||||
|
126
buildconf
126
buildconf
@@ -5,7 +5,125 @@ die(){
|
|||||||
exit
|
exit
|
||||||
}
|
}
|
||||||
|
|
||||||
aclocal || die "The command 'aclocal' failed"
|
#--------------------------------------------------------------------------
|
||||||
autoheader || die "The command 'autoheader' failed"
|
# autoconf 2.57 or newer
|
||||||
autoconf || die "The command 'autoconf' failed"
|
#
|
||||||
automake -a || die "The command 'automake $MAKEFILES' failed"
|
need_autoconf="2.57"
|
||||||
|
ac_version=`${AUTOCONF:-autoconf} --version 2>/dev/null|head -1| sed -e 's/^[^0-9]*//' -e 's/[a-z]* *$//'`
|
||||||
|
if test -z "$ac_version"; then
|
||||||
|
echo "buildconf: autoconf not found."
|
||||||
|
echo " You need autoconf version $need_autoconf or newer installed."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
IFS=.; set $ac_version; IFS=' '
|
||||||
|
if test "$1" = "2" -a "$2" -lt "57" || test "$1" -lt "2"; then
|
||||||
|
echo "buildconf: autoconf version $ac_version found."
|
||||||
|
echo " You need autoconf version $need_autoconf or newer installed."
|
||||||
|
echo " If you have a sufficient autoconf installed, but it"
|
||||||
|
echo " is not named 'autoconf', then try setting the"
|
||||||
|
echo " AUTOCONF environment variable."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "buildconf: autoconf version $ac_version (ok)"
|
||||||
|
|
||||||
|
#--------------------------------------------------------------------------
|
||||||
|
# autoheader 2.50 or newer
|
||||||
|
#
|
||||||
|
ah_version=`${AUTOHEADER:-autoheader} --version 2>/dev/null|head -1| sed -e 's/^[^0-9]*//' -e 's/[a-z]* *$//'`
|
||||||
|
if test -z "$ah_version"; then
|
||||||
|
echo "buildconf: autoheader not found."
|
||||||
|
echo " You need autoheader version 2.50 or newer installed."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
IFS=.; set $ah_version; IFS=' '
|
||||||
|
if test "$1" = "2" -a "$2" -lt "50" || test "$1" -lt "2"; then
|
||||||
|
echo "buildconf: autoheader version $ah_version found."
|
||||||
|
echo " You need autoheader version 2.50 or newer installed."
|
||||||
|
echo " If you have a sufficient autoheader installed, but it"
|
||||||
|
echo " is not named 'autoheader', then try setting the"
|
||||||
|
echo " AUTOHEADER environment variable."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "buildconf: autoheader version $ah_version (ok)"
|
||||||
|
|
||||||
|
#--------------------------------------------------------------------------
|
||||||
|
# automake 1.7 or newer
|
||||||
|
#
|
||||||
|
need_automake="1.7"
|
||||||
|
am_version=`${AUTOMAKE:-automake} --version 2>/dev/null|head -1| sed -e 's/^.* \([0-9]\)/\1/' -e 's/[a-z]* *$//'`
|
||||||
|
if test -z "$am_version"; then
|
||||||
|
echo "buildconf: automake not found."
|
||||||
|
echo " You need automake version $need_automake or newer installed."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
IFS=.; set $am_version; IFS=' '
|
||||||
|
if test "$1" = "1" -a "$2" -lt "7" || test "$1" -lt "1"; then
|
||||||
|
echo "buildconf: automake version $am_version found."
|
||||||
|
echo " You need automake version $need_automake or newer installed."
|
||||||
|
echo " If you have a sufficient automake installed, but it"
|
||||||
|
echo " is not named 'autommake', then try setting the"
|
||||||
|
echo " AUTOMAKE environment variable."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "buildconf: automake version $am_version (ok)"
|
||||||
|
|
||||||
|
|
||||||
|
#--------------------------------------------------------------------------
|
||||||
|
# libtool check
|
||||||
|
#
|
||||||
|
LIBTOOL_WANTED_MAJOR=1
|
||||||
|
LIBTOOL_WANTED_MINOR=4
|
||||||
|
LIBTOOL_WANTED_PATCH=2
|
||||||
|
LIBTOOL_WANTED_VERSION=1.4.2
|
||||||
|
|
||||||
|
libtool=`which glibtool 2>/dev/null`
|
||||||
|
if test ! -x "$libtool"; then
|
||||||
|
libtool=`which libtool`
|
||||||
|
fi
|
||||||
|
#lt_pversion=`${LIBTOOL:-$libtool} --version 2>/dev/null|head -1| sed -e 's/^.* \([0-9]\)/\1/' -e 's/[a-z]* *$//'`
|
||||||
|
lt_pversion=`$libtool --version 2>/dev/null|head -1|sed -e 's/^[^0-9]*//g' -e 's/[- ].*//'`
|
||||||
|
if test -z "$lt_pversion"; then
|
||||||
|
echo "buildconf: libtool not found."
|
||||||
|
echo " You need libtool version $LIBTOOL_WANTED_VERSION or newer installed"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
lt_version=`echo $lt_pversion` #|sed -e 's/\([a-z]*\)$/.\1/'`
|
||||||
|
IFS=.; set $lt_version; IFS=' '
|
||||||
|
lt_status="good"
|
||||||
|
if test "$1" = "$LIBTOOL_WANTED_MAJOR"; then
|
||||||
|
if test "$2" -lt "$LIBTOOL_WANTED_MINOR"; then
|
||||||
|
lt_status="bad"
|
||||||
|
elif test ! -z "$LIBTOOL_WANTED_PATCH"; then
|
||||||
|
if test -n "$3"; then
|
||||||
|
if test "$3" -lt "$LIBTOOL_WANTED_PATCH"; then
|
||||||
|
lt_status="bad"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
if test $lt_status != "good"; then
|
||||||
|
echo "buildconf: libtool version $lt_pversion found."
|
||||||
|
echo " You need libtool version $LIBTOOL_WANTED_VERSION or newer installed"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "buildconf: libtool version $lt_version (ok)"
|
||||||
|
|
||||||
|
# ------------------------------------------------------------
|
||||||
|
|
||||||
|
# run the correct scripts now
|
||||||
|
|
||||||
|
echo "buildconf: running libtoolize"
|
||||||
|
${LIBTOOLIZE:-libtoolize} --copy --automake || die "The command '${LIBTOOLIZE:-libtoolize} --copy --automake' failed"
|
||||||
|
echo "buildconf: running aclocal"
|
||||||
|
${ACLOCAL:-aclocal} || die "The command '${AUTOHEADER:-aclocal}' failed"
|
||||||
|
echo "buildconf: running autoheader"
|
||||||
|
${AUTOHEADER:-autoheader} || die "The command '${AUTOHEADER:-autoheader}' failed"
|
||||||
|
echo "buildconf: running autoconf"
|
||||||
|
${AUTOCONF:-autoconf} || die "The command '${AUTOCONF:-autoconf}' failed"
|
||||||
|
echo "buildconf: running automake"
|
||||||
|
${AUTOMAKE:-automake} -a || die "The command '${AUTOMAKE:-automake} -a' failed"
|
||||||
|
exit 0
|
||||||
|
1317
config.guess
vendored
1317
config.guess
vendored
File diff suppressed because it is too large
Load Diff
1411
config.sub
vendored
1411
config.sub
vendored
File diff suppressed because it is too large
Load Diff
@@ -5,19 +5,30 @@ dnl Ensure that this file is processed with autoconf 2.50 or newer
|
|||||||
dnl Don't even think about removing this check!
|
dnl Don't even think about removing this check!
|
||||||
AC_PREREQ(2.50)
|
AC_PREREQ(2.50)
|
||||||
|
|
||||||
dnl First some basic init macros
|
dnl We don't know the version number "staticly" so we use a dash here
|
||||||
AC_INIT
|
AC_INIT(curl, [-], [curl-bug@haxx.se])
|
||||||
|
|
||||||
|
dnl configure script copyright
|
||||||
|
AC_COPYRIGHT([Copyright (c) 1998 - 2003 Daniel Stenberg, <daniel@haxx.se>
|
||||||
|
This configure script may be copied, distributed and modified under the
|
||||||
|
terms of the curl license; see COPYING for more details])
|
||||||
|
|
||||||
AC_CONFIG_SRCDIR([lib/urldata.h])
|
AC_CONFIG_SRCDIR([lib/urldata.h])
|
||||||
AM_CONFIG_HEADER(lib/config.h src/config.h tests/server/config.h lib/ca-bundle.h)
|
AM_CONFIG_HEADER(lib/config.h src/config.h tests/server/config.h lib/ca-bundle.h)
|
||||||
AM_MAINTAINER_MODE
|
AM_MAINTAINER_MODE
|
||||||
|
|
||||||
|
AC_PATH_PROG( SED, sed, , $PATH:/usr/bin:/usr/local/bin)
|
||||||
|
AC_SUBST(SED)
|
||||||
|
|
||||||
dnl figure out the libcurl version
|
dnl figure out the libcurl version
|
||||||
VERSION=`sed -ne 's/^#define LIBCURL_VERSION "\(.*\)"/\1/p' ${srcdir}/include/curl/curl.h`
|
VERSION=`$SED -ne 's/^#define LIBCURL_VERSION "\(.*\)"/\1/p' ${srcdir}/include/curl/curl.h`
|
||||||
AM_INIT_AUTOMAKE(curl,$VERSION)
|
AM_INIT_AUTOMAKE(curl,$VERSION)
|
||||||
|
AC_MSG_CHECKING([curl version])
|
||||||
|
AC_MSG_RESULT($VERSION)
|
||||||
|
|
||||||
dnl
|
dnl
|
||||||
dnl we extract the numerical version for curl-config only
|
dnl we extract the numerical version for curl-config only
|
||||||
VERSIONNUM=`sed -ne 's/^#define LIBCURL_VERSION_NUM 0x\(.*\)/\1/p' ${srcdir}/include/curl/curl.h`
|
VERSIONNUM=`$SED -ne 's/^#define LIBCURL_VERSION_NUM 0x\(.*\)/\1/p' ${srcdir}/include/curl/curl.h`
|
||||||
AC_SUBST(VERSIONNUM)
|
AC_SUBST(VERSIONNUM)
|
||||||
|
|
||||||
dnl Solaris pkgadd support definitions
|
dnl Solaris pkgadd support definitions
|
||||||
@@ -72,8 +83,8 @@ dnl switch off particular protocols
|
|||||||
dnl
|
dnl
|
||||||
AC_MSG_CHECKING([whether to support http])
|
AC_MSG_CHECKING([whether to support http])
|
||||||
AC_ARG_ENABLE(http,
|
AC_ARG_ENABLE(http,
|
||||||
[ --enable-http Enable HTTP support
|
AC_HELP_STRING([--enable-http],[Enable HTTP support])
|
||||||
--disable-http Disable HTTP support],
|
AC_HELP_STRING([--disable-http],[Disable HTTP support]),
|
||||||
[ case "$enableval" in
|
[ case "$enableval" in
|
||||||
no)
|
no)
|
||||||
AC_MSG_RESULT(no)
|
AC_MSG_RESULT(no)
|
||||||
@@ -90,8 +101,8 @@ AC_ARG_ENABLE(http,
|
|||||||
)
|
)
|
||||||
AC_MSG_CHECKING([whether to support ftp])
|
AC_MSG_CHECKING([whether to support ftp])
|
||||||
AC_ARG_ENABLE(ftp,
|
AC_ARG_ENABLE(ftp,
|
||||||
[ --enable-ftp Enable FTP support
|
AC_HELP_STRING([--enable-ftp],[Enable FTP support])
|
||||||
--disable-ftp Disable FTP support],
|
AC_HELP_STRING([--disable-ftp],[Disable FTP support]),
|
||||||
[ case "$enableval" in
|
[ case "$enableval" in
|
||||||
no)
|
no)
|
||||||
AC_MSG_RESULT(no)
|
AC_MSG_RESULT(no)
|
||||||
@@ -105,8 +116,8 @@ AC_ARG_ENABLE(ftp,
|
|||||||
)
|
)
|
||||||
AC_MSG_CHECKING([whether to support gopher])
|
AC_MSG_CHECKING([whether to support gopher])
|
||||||
AC_ARG_ENABLE(gopher,
|
AC_ARG_ENABLE(gopher,
|
||||||
[ --enable-gopher Enable GOPHER support
|
AC_HELP_STRING([--enable-gopher],[Enable GOPHER support])
|
||||||
--disable-gopher Disable GOPHER support],
|
AC_HELP_STRING([--disable-gopher],[Disable GOPHER support]),
|
||||||
[ case "$enableval" in
|
[ case "$enableval" in
|
||||||
no)
|
no)
|
||||||
AC_MSG_RESULT(no)
|
AC_MSG_RESULT(no)
|
||||||
@@ -120,8 +131,8 @@ AC_ARG_ENABLE(gopher,
|
|||||||
)
|
)
|
||||||
AC_MSG_CHECKING([whether to support file])
|
AC_MSG_CHECKING([whether to support file])
|
||||||
AC_ARG_ENABLE(file,
|
AC_ARG_ENABLE(file,
|
||||||
[ --enable-file Enable FILE support
|
AC_HELP_STRING([--enable-file],[Enable FILE support])
|
||||||
--disable-file Disable FILE support],
|
AC_HELP_STRING([--disable-file],[Disable FILE support]),
|
||||||
[ case "$enableval" in
|
[ case "$enableval" in
|
||||||
no)
|
no)
|
||||||
AC_MSG_RESULT(no)
|
AC_MSG_RESULT(no)
|
||||||
@@ -135,8 +146,8 @@ AC_ARG_ENABLE(file,
|
|||||||
)
|
)
|
||||||
AC_MSG_CHECKING([whether to support ldap])
|
AC_MSG_CHECKING([whether to support ldap])
|
||||||
AC_ARG_ENABLE(ldap,
|
AC_ARG_ENABLE(ldap,
|
||||||
[ --enable-ldap Enable LDAP support
|
AC_HELP_STRING([--enable-ldap],[Enable LDAP support])
|
||||||
--disable-ldap Disable LDAP support],
|
AC_HELP_STRING([--disable-ldap],[Disable LDAP support]),
|
||||||
[ case "$enableval" in
|
[ case "$enableval" in
|
||||||
no)
|
no)
|
||||||
AC_MSG_RESULT(no)
|
AC_MSG_RESULT(no)
|
||||||
@@ -150,12 +161,12 @@ AC_ARG_ENABLE(ldap,
|
|||||||
)
|
)
|
||||||
AC_MSG_CHECKING([whether to support dict])
|
AC_MSG_CHECKING([whether to support dict])
|
||||||
AC_ARG_ENABLE(dict,
|
AC_ARG_ENABLE(dict,
|
||||||
[ --enable-dict Enable DICT support
|
AC_HELP_STRING([--enable-dict],[Enable DICT support])
|
||||||
--disable-dict Disable DICT support],
|
AC_HELP_STRING([--disable-dict],[Disable DICT support]),
|
||||||
[ case "$enableval" in
|
[ case "$enableval" in
|
||||||
no)
|
no)
|
||||||
AC_MSG_RESULT(no)
|
AC_MSG_RESULT(no)
|
||||||
AC_DEFINE(CURL_DISABLE_DICT, 1 [to disable DICT])
|
AC_DEFINE(CURL_DISABLE_DICT, 1, [to disable DICT])
|
||||||
AC_SUBST(CURL_DISABLE_DICT)
|
AC_SUBST(CURL_DISABLE_DICT)
|
||||||
;;
|
;;
|
||||||
*) AC_MSG_RESULT(yes)
|
*) AC_MSG_RESULT(yes)
|
||||||
@@ -165,8 +176,8 @@ AC_ARG_ENABLE(dict,
|
|||||||
)
|
)
|
||||||
AC_MSG_CHECKING([whether to support telnet])
|
AC_MSG_CHECKING([whether to support telnet])
|
||||||
AC_ARG_ENABLE(telnet,
|
AC_ARG_ENABLE(telnet,
|
||||||
[ --enable-telnet Enable TELNET support
|
AC_HELP_STRING([--enable-telnet],[Enable TELNET support])
|
||||||
--disable-telnet Disable TELNET support],
|
AC_HELP_STRING([--disable-telnet],[Disable TELNET support]),
|
||||||
[ case "$enableval" in
|
[ case "$enableval" in
|
||||||
no)
|
no)
|
||||||
AC_MSG_RESULT(no)
|
AC_MSG_RESULT(no)
|
||||||
@@ -186,8 +197,8 @@ dnl **********************************************************************
|
|||||||
|
|
||||||
AC_MSG_CHECKING([whether to enable ipv6])
|
AC_MSG_CHECKING([whether to enable ipv6])
|
||||||
AC_ARG_ENABLE(ipv6,
|
AC_ARG_ENABLE(ipv6,
|
||||||
[ --enable-ipv6 Enable ipv6 (with ipv4) support
|
AC_HELP_STRING([--enable-ipv6],[Enable ipv6 (with ipv4) support])
|
||||||
--disable-ipv6 Disable ipv6 support],
|
AC_HELP_STRING([--disable-ipv6],[Disable ipv6 support]),
|
||||||
[ case "$enableval" in
|
[ case "$enableval" in
|
||||||
no)
|
no)
|
||||||
AC_MSG_RESULT(no)
|
AC_MSG_RESULT(no)
|
||||||
@@ -271,12 +282,26 @@ AC_CHECK_FUNC(connect, , [ AC_CHECK_LIB(socket, connect) ])
|
|||||||
dnl dl lib?
|
dnl dl lib?
|
||||||
AC_CHECK_FUNC(dlclose, , [ AC_CHECK_LIB(dl, dlopen) ])
|
AC_CHECK_FUNC(dlclose, , [ AC_CHECK_LIB(dl, dlopen) ])
|
||||||
|
|
||||||
|
AC_MSG_CHECKING([whether to use libgcc])
|
||||||
|
AC_ARG_ENABLE(libgcc,
|
||||||
|
AC_HELP_STRING([--enable-libgcc],[use libgcc when linking]),
|
||||||
|
[ case "$enableval" in
|
||||||
|
yes)
|
||||||
|
LIBS="$LIBS -lgcc"
|
||||||
|
AC_MSG_RESULT(yes)
|
||||||
|
;;
|
||||||
|
*) AC_MSG_RESULT(no)
|
||||||
|
;;
|
||||||
|
esac ],
|
||||||
|
AC_MSG_RESULT(no)
|
||||||
|
)
|
||||||
|
|
||||||
dnl **********************************************************************
|
dnl **********************************************************************
|
||||||
dnl Check how non-blocking sockets are set
|
dnl Check how non-blocking sockets are set
|
||||||
dnl **********************************************************************
|
dnl **********************************************************************
|
||||||
AC_ARG_ENABLE(nonblocking,
|
AC_ARG_ENABLE(nonblocking,
|
||||||
[ --enable-nonblocking Makes the script detect how to do it
|
AC_HELP_STRING([--enable-nonblocking],[Enable detecting how to do it])
|
||||||
--disable-nonblocking Makes the script disable non-blocking sockets],
|
AC_HELP_STRING([--disable-nonblocking],[Disable non-blocking socket detection]),
|
||||||
[
|
[
|
||||||
if test "$enableval" = "no" ; then
|
if test "$enableval" = "no" ; then
|
||||||
AC_MSG_WARN([non-blocking sockets disabled])
|
AC_MSG_WARN([non-blocking sockets disabled])
|
||||||
@@ -295,7 +320,8 @@ dnl Check for the random seed preferences
|
|||||||
dnl **********************************************************************
|
dnl **********************************************************************
|
||||||
|
|
||||||
AC_ARG_WITH(egd-socket,
|
AC_ARG_WITH(egd-socket,
|
||||||
[ --with-egd-socket=FILE Entropy Gathering Daemon socket pathname],
|
AC_HELP_STRING([--with-egd-socket=FILE],
|
||||||
|
[Entropy Gathering Daemon socket pathname]),
|
||||||
[ EGD_SOCKET="$withval" ]
|
[ EGD_SOCKET="$withval" ]
|
||||||
)
|
)
|
||||||
if test -n "$EGD_SOCKET" ; then
|
if test -n "$EGD_SOCKET" ; then
|
||||||
@@ -305,7 +331,7 @@ fi
|
|||||||
|
|
||||||
dnl Check for user-specified random device
|
dnl Check for user-specified random device
|
||||||
AC_ARG_WITH(random,
|
AC_ARG_WITH(random,
|
||||||
[ --with-random=FILE read randomness from FILE (default=/dev/urandom)],
|
AC_HELP_STRING([--with-random=FILE],[read randomness from FILE (default=/dev/urandom)]),
|
||||||
[ RANDOM_FILE="$withval" ],
|
[ RANDOM_FILE="$withval" ],
|
||||||
[
|
[
|
||||||
dnl Check for random device
|
dnl Check for random device
|
||||||
@@ -318,19 +344,38 @@ if test -n "$RANDOM_FILE" ; then
|
|||||||
[a suitable file to read random data from])
|
[a suitable file to read random data from])
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
dnl **********************************************************************
|
||||||
|
dnl Check if the operating system allows programs to write to their own argv[]
|
||||||
|
dnl **********************************************************************
|
||||||
|
|
||||||
|
AC_MSG_CHECKING([if argv can be written to])
|
||||||
|
AC_RUN_IFELSE([[
|
||||||
|
int main(int argc, char ** argv) {
|
||||||
|
argv[0][0] = ' ';
|
||||||
|
return (argv[0][0] == ' ')?0:1;
|
||||||
|
}
|
||||||
|
]],
|
||||||
|
AC_DEFINE(HAVE_WRITABLE_ARGV, 1, [Define this symbol if your OS supports changing the contents of argv])
|
||||||
|
AC_MSG_RESULT(yes),
|
||||||
|
AC_MSG_RESULT(no),
|
||||||
|
AC_MSG_RESULT(no)
|
||||||
|
AC_MSG_WARN([the previous check could not be made default was used])
|
||||||
|
)
|
||||||
|
|
||||||
dnl **********************************************************************
|
dnl **********************************************************************
|
||||||
dnl Check for the presence of Kerberos4 libraries and headers
|
dnl Check for the presence of Kerberos4 libraries and headers
|
||||||
dnl **********************************************************************
|
dnl **********************************************************************
|
||||||
|
|
||||||
AC_ARG_WITH(krb4-includes,
|
AC_ARG_WITH(krb4-includes,
|
||||||
[ --with-krb4-includes[=DIR] Specify location of kerberos4 headers],[
|
AC_HELP_STRING([--with-krb4-includes=DIR],
|
||||||
|
[Specify location of kerberos4 headers]),[
|
||||||
CPPFLAGS="$CPPFLAGS -I$withval"
|
CPPFLAGS="$CPPFLAGS -I$withval"
|
||||||
KRB4INC="$withval"
|
KRB4INC="$withval"
|
||||||
want_krb4=yes
|
want_krb4=yes
|
||||||
])
|
])
|
||||||
|
|
||||||
AC_ARG_WITH(krb4-libs,
|
AC_ARG_WITH(krb4-libs,
|
||||||
[ --with-krb4-libs[=DIR] Specify location of kerberos4 libs],[
|
AC_HELP_STRING([--with-krb4-libs=DIR],[Specify location of kerberos4 libs]),[
|
||||||
LDFLAGS="$LDFLAGS -L$withval"
|
LDFLAGS="$LDFLAGS -L$withval"
|
||||||
KRB4LIB="$withval"
|
KRB4LIB="$withval"
|
||||||
want_krb4=yes
|
want_krb4=yes
|
||||||
@@ -339,7 +384,7 @@ AC_ARG_WITH(krb4-libs,
|
|||||||
|
|
||||||
OPT_KRB4=off
|
OPT_KRB4=off
|
||||||
AC_ARG_WITH(krb4,dnl
|
AC_ARG_WITH(krb4,dnl
|
||||||
[ --with-krb4[=DIR] where to look for Kerberos4],[
|
AC_HELP_STRING([--with-krb4=DIR],[where to look for Kerberos4]),[
|
||||||
OPT_KRB4="$withval"
|
OPT_KRB4="$withval"
|
||||||
if test X"$OPT_KRB4" != Xyes
|
if test X"$OPT_KRB4" != Xyes
|
||||||
then
|
then
|
||||||
@@ -409,6 +454,31 @@ else
|
|||||||
AC_MSG_RESULT(no)
|
AC_MSG_RESULT(no)
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
dnl Detect the pkg-config tool, as it may have extra info about the
|
||||||
|
dnl openssl installation we can use. I *believe* this is what we are
|
||||||
|
dnl expected to do on really recent Redhat Linux hosts.
|
||||||
|
AC_PATH_PROG( PKGCONFIG, pkg-config, no, $PATH:/usr/bin:/usr/local/bin)
|
||||||
|
if test "$PKGCONFIG" != "no" ; then
|
||||||
|
AC_MSG_CHECKING([for OpenSSL options using pkg-config])
|
||||||
|
|
||||||
|
$PKGCONFIG --exists openssl
|
||||||
|
SSL_EXISTS=$?
|
||||||
|
|
||||||
|
if test "$SSL_EXISTS" -eq "0"; then
|
||||||
|
SSL_LIBS=`$PKGCONFIG --libs-only-l openssl 2>/dev/null`
|
||||||
|
SSL_LDFLAGS=`$PKGCONFIG --libs-only-L openssl 2>/dev/null`
|
||||||
|
SSL_CPPFLAGS=`$PKGCONFIG --cflags-only-I openssl 2>/dev/null`
|
||||||
|
|
||||||
|
LIBS="$LIBS $SSL_LIBS"
|
||||||
|
CPPFLAGS="$CPPFLAGS $SSL_CPPFLAGS"
|
||||||
|
LDFLAGS="$LDFLAGS $SSL_LDFLAGS"
|
||||||
|
|
||||||
|
AC_MSG_RESULT([yes])
|
||||||
|
else
|
||||||
|
AC_MSG_RESULT([no])
|
||||||
|
fi
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
dnl **********************************************************************
|
dnl **********************************************************************
|
||||||
dnl Check for the presence of SSL libraries and headers
|
dnl Check for the presence of SSL libraries and headers
|
||||||
@@ -417,7 +487,7 @@ dnl **********************************************************************
|
|||||||
dnl Default to compiler & linker defaults for SSL files & libraries.
|
dnl Default to compiler & linker defaults for SSL files & libraries.
|
||||||
OPT_SSL=off
|
OPT_SSL=off
|
||||||
AC_ARG_WITH(ssl,dnl
|
AC_ARG_WITH(ssl,dnl
|
||||||
AC_HELP_STRING([--with-ssl=PATH], [where to look for SSL, PATH points to the SSL installation (default: /usr/local/ssl)])
|
AC_HELP_STRING([--with-ssl=PATH],[where to look for SSL, PATH points to the SSL installation (default: /usr/local/ssl)])
|
||||||
AC_HELP_STRING([--without-ssl], [disable SSL]),
|
AC_HELP_STRING([--without-ssl], [disable SSL]),
|
||||||
OPT_SSL=$withval)
|
OPT_SSL=$withval)
|
||||||
|
|
||||||
@@ -525,9 +595,9 @@ _cppflags=$CPPFLAGS
|
|||||||
_ldflags=$LDFLAGS
|
_ldflags=$LDFLAGS
|
||||||
OPT_ZLIB="/usr/local"
|
OPT_ZLIB="/usr/local"
|
||||||
AC_ARG_WITH(zlib,
|
AC_ARG_WITH(zlib,
|
||||||
AC_HELP_STRING([--with-zlib=PATH], [search for zlib in PATH])
|
AC_HELP_STRING([--with-zlib=PATH],[search for zlib in PATH])
|
||||||
AC_HELP_STRING([--without-zlib], [disable use of zlib]),
|
AC_HELP_STRING([--without-zlib],[disable use of zlib]),
|
||||||
[OPT_ZLIB="$withval"])
|
[OPT_ZLIB="$withval"])
|
||||||
|
|
||||||
case "$OPT_ZLIB" in
|
case "$OPT_ZLIB" in
|
||||||
no)
|
no)
|
||||||
@@ -559,14 +629,30 @@ esac
|
|||||||
|
|
||||||
dnl Default is to try the thread-safe versions of a few functions
|
dnl Default is to try the thread-safe versions of a few functions
|
||||||
OPT_THREAD=on
|
OPT_THREAD=on
|
||||||
|
|
||||||
|
dnl detect AIX 4.3 or later
|
||||||
|
dnl see full docs on this reasoning in the lib/hostip.c source file
|
||||||
|
AC_MSG_CHECKING([AIX 4.3 or later])
|
||||||
|
AC_PREPROC_IFELSE([
|
||||||
|
#if defined(_AIX) && defined(_AIX43)
|
||||||
|
printf("just fine");
|
||||||
|
#else
|
||||||
|
#error "this is not AIX 4.3 or later"
|
||||||
|
#endif
|
||||||
|
],
|
||||||
|
[ AC_MSG_RESULT([yes])
|
||||||
|
OPT_THREAD=off ],
|
||||||
|
[ AC_MSG_RESULT([no]) ]
|
||||||
|
)
|
||||||
|
|
||||||
AC_ARG_ENABLE(thread,dnl
|
AC_ARG_ENABLE(thread,dnl
|
||||||
[ --disable-thread tell configure to not look for thread-safe functions],
|
AC_HELP_STRING([--disable-thread],[don't look for thread-safe functions]),
|
||||||
OPT_THREAD=off
|
OPT_THREAD=off
|
||||||
|
AC_MSG_WARN(libcurl will not get built using thread-safe functions)
|
||||||
)
|
)
|
||||||
|
|
||||||
if test X"$OPT_THREAD" = Xoff
|
if test X"$OPT_THREAD" = Xoff
|
||||||
then
|
then
|
||||||
AC_MSG_WARN(libcurl will not get built using thread-safe functions)
|
|
||||||
AC_DEFINE(DISABLED_THREADSAFE, 1, \
|
AC_DEFINE(DISABLED_THREADSAFE, 1, \
|
||||||
Set to explicitly specify we don't want to use thread-safe functions)
|
Set to explicitly specify we don't want to use thread-safe functions)
|
||||||
else
|
else
|
||||||
@@ -593,21 +679,23 @@ dnl **********************************************************************
|
|||||||
|
|
||||||
dnl Checks for header files.
|
dnl Checks for header files.
|
||||||
AC_HEADER_STDC
|
AC_HEADER_STDC
|
||||||
AC_CHECK_HEADERS( \
|
|
||||||
|
dnl First check for the very most basic headers. Then we can use these
|
||||||
|
dnl ones as default-headers when checking for the rest!
|
||||||
|
AC_CHECK_HEADERS(
|
||||||
|
sys/types.h \
|
||||||
|
sys/time.h \
|
||||||
|
sys/select.h \
|
||||||
|
sys/socket.h \
|
||||||
unistd.h \
|
unistd.h \
|
||||||
malloc.h \
|
malloc.h \
|
||||||
stdlib.h \
|
stdlib.h \
|
||||||
arpa/inet.h \
|
arpa/inet.h \
|
||||||
net/if.h \
|
net/if.h \
|
||||||
netinet/in.h \
|
netinet/in.h \
|
||||||
netinet/if_ether.h \
|
|
||||||
netdb.h \
|
netdb.h \
|
||||||
sys/select.h \
|
|
||||||
sys/socket.h \
|
|
||||||
sys/sockio.h \
|
sys/sockio.h \
|
||||||
sys/stat.h \
|
sys/stat.h \
|
||||||
sys/types.h \
|
|
||||||
sys/time.h \
|
|
||||||
sys/param.h \
|
sys/param.h \
|
||||||
termios.h \
|
termios.h \
|
||||||
termio.h \
|
termio.h \
|
||||||
@@ -622,7 +710,26 @@ AC_CHECK_HEADERS( \
|
|||||||
utime.h \
|
utime.h \
|
||||||
sys/utime.h \
|
sys/utime.h \
|
||||||
sys/poll.h \
|
sys/poll.h \
|
||||||
setjmp.h
|
setjmp.h,
|
||||||
|
dnl to do if not found
|
||||||
|
[],
|
||||||
|
dnl to do if found
|
||||||
|
[],
|
||||||
|
dnl default includes
|
||||||
|
[
|
||||||
|
#ifdef HAVE_SYS_TYPES_H
|
||||||
|
#include <sys/types.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_SYS_TIME_H
|
||||||
|
#include <sys/time.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_SYS_SELECT_H
|
||||||
|
#include <sys/select.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_SYS_SOCKET_H
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#endif
|
||||||
|
]
|
||||||
)
|
)
|
||||||
|
|
||||||
dnl Checks for typedefs, structures, and compiler characteristics.
|
dnl Checks for typedefs, structures, and compiler characteristics.
|
||||||
@@ -643,6 +750,8 @@ AC_CHECK_TYPE(ssize_t, int)
|
|||||||
TYPE_SOCKLEN_T
|
TYPE_SOCKLEN_T
|
||||||
TYPE_IN_ADDR_T
|
TYPE_IN_ADDR_T
|
||||||
|
|
||||||
|
AC_FUNC_SELECT_ARGTYPES
|
||||||
|
|
||||||
dnl Checks for library functions.
|
dnl Checks for library functions.
|
||||||
dnl AC_PROG_GCC_TRADITIONAL
|
dnl AC_PROG_GCC_TRADITIONAL
|
||||||
AC_TYPE_SIGNAL
|
AC_TYPE_SIGNAL
|
||||||
@@ -675,7 +784,21 @@ AC_CHECK_FUNCS( socket \
|
|||||||
dlopen \
|
dlopen \
|
||||||
utime \
|
utime \
|
||||||
sigsetjmp \
|
sigsetjmp \
|
||||||
poll
|
poll,
|
||||||
|
dnl if found
|
||||||
|
[],
|
||||||
|
dnl if not found, $ac_func is the name we check for
|
||||||
|
func="$ac_func"
|
||||||
|
AC_MSG_CHECKING([deeper for $func])
|
||||||
|
AC_TRY_LINK( [],
|
||||||
|
[ $func ();],
|
||||||
|
AC_MSG_RESULT(yes!)
|
||||||
|
eval "ac_cv_func_$func=yes"
|
||||||
|
def=`echo "HAVE_$func" | tr 'a-z' 'A-Z'`
|
||||||
|
AC_DEFINE_UNQUOTED($def, 1, [If you have $func]),
|
||||||
|
AC_MSG_RESULT(but still no)
|
||||||
|
)
|
||||||
|
|
||||||
)
|
)
|
||||||
|
|
||||||
dnl sigsetjmp() might be a macro and no function so if it isn't found already
|
dnl sigsetjmp() might be a macro and no function so if it isn't found already
|
||||||
@@ -691,15 +814,6 @@ if test "$ac_cv_func_sigsetjmp" != "yes"; then
|
|||||||
)
|
)
|
||||||
fi
|
fi
|
||||||
|
|
||||||
dnl removed 'getpass' check on October 26, 2000
|
|
||||||
|
|
||||||
if test "$ac_cv_func_select" != "yes"; then
|
|
||||||
AC_MSG_ERROR(Can't work without an existing select() function)
|
|
||||||
fi
|
|
||||||
if test "$ac_cv_func_socket" != "yes"; then
|
|
||||||
AC_MSG_ERROR(Can't work without an existing socket() function)
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_PATH_PROG( PERL, perl, ,
|
AC_PATH_PROG( PERL, perl, ,
|
||||||
$PATH:/usr/local/bin/perl:/usr/bin/:/usr/local/bin )
|
$PATH:/usr/local/bin/perl:/usr/bin/:/usr/local/bin )
|
||||||
AC_SUBST(PERL)
|
AC_SUBST(PERL)
|
||||||
@@ -708,7 +822,6 @@ AC_PATH_PROGS( NROFF, gnroff nroff, ,
|
|||||||
$PATH:/usr/bin/:/usr/local/bin )
|
$PATH:/usr/bin/:/usr/local/bin )
|
||||||
AC_SUBST(NROFF)
|
AC_SUBST(NROFF)
|
||||||
|
|
||||||
|
|
||||||
AC_MSG_CHECKING([CA cert bundle install path])
|
AC_MSG_CHECKING([CA cert bundle install path])
|
||||||
|
|
||||||
AC_ARG_WITH(ca-bundle,
|
AC_ARG_WITH(ca-bundle,
|
||||||
@@ -723,6 +836,11 @@ AC_HELP_STRING([--without-ca-bundle], [Don't install the CA bundle]),
|
|||||||
fi
|
fi
|
||||||
] )
|
] )
|
||||||
|
|
||||||
|
if test X"$OPT_SSL" = Xno
|
||||||
|
then
|
||||||
|
ca="no"
|
||||||
|
fi
|
||||||
|
|
||||||
if test "x$ca" = "xno"; then
|
if test "x$ca" = "xno"; then
|
||||||
dnl let's not keep "no" as path name, blank it instead
|
dnl let's not keep "no" as path name, blank it instead
|
||||||
ca=""
|
ca=""
|
||||||
@@ -745,8 +863,8 @@ dnl lame option to switch on debug options
|
|||||||
dnl
|
dnl
|
||||||
AC_MSG_CHECKING([whether to enable debug options])
|
AC_MSG_CHECKING([whether to enable debug options])
|
||||||
AC_ARG_ENABLE(debug,
|
AC_ARG_ENABLE(debug,
|
||||||
[ --enable-debug Enable pedantic debug options
|
AC_HELP_STRING([--enable-debug],[Enable pedantic debug options])
|
||||||
--disable-debug Disable debug options],
|
AC_HELP_STRING([--disable-debug],[Disable debug options]),
|
||||||
[ case "$enableval" in
|
[ case "$enableval" in
|
||||||
no)
|
no)
|
||||||
AC_MSG_RESULT(no)
|
AC_MSG_RESULT(no)
|
||||||
@@ -756,7 +874,7 @@ AC_ARG_ENABLE(debug,
|
|||||||
CPPFLAGS="$CPPFLAGS -DMALLOCDEBUG"
|
CPPFLAGS="$CPPFLAGS -DMALLOCDEBUG"
|
||||||
CFLAGS="$CFLAGS -g"
|
CFLAGS="$CFLAGS -g"
|
||||||
if test "$GCC" = "yes"; then
|
if test "$GCC" = "yes"; then
|
||||||
CFLAGS="$CFLAGS -W -Wall -Wwrite-strings -pedantic -Wundef -Wpointer-arith -Wcast-align -Wnested-externs"
|
CFLAGS="$CFLAGS -W -Wall -Wwrite-strings -pedantic -Wundef -Wpointer-arith -Wnested-externs"
|
||||||
fi
|
fi
|
||||||
dnl strip off optimizer flags
|
dnl strip off optimizer flags
|
||||||
NEWFLAGS=""
|
NEWFLAGS=""
|
@@ -107,8 +107,11 @@ while test $# -gt 0; do
|
|||||||
;;
|
;;
|
||||||
|
|
||||||
--cflags)
|
--cflags)
|
||||||
#echo -I@includedir@
|
if test "X@includedir@" = "X/usr/include"; then
|
||||||
echo ""
|
echo ""
|
||||||
|
else
|
||||||
|
echo "-I@includedir@"
|
||||||
|
fi
|
||||||
;;
|
;;
|
||||||
|
|
||||||
--libs)
|
--libs)
|
||||||
|
21
curl-mode.el
21
curl-mode.el
@@ -1,21 +0,0 @@
|
|||||||
;;;; Emacs Lisp help for writing curl code. ;;;;
|
|
||||||
|
|
||||||
;;; In C files, put something like this to load this file automatically:
|
|
||||||
;;
|
|
||||||
;; /* -----------------------------------------------------------------
|
|
||||||
;; * local variables:
|
|
||||||
;; * eval: (load-file "../curl-mode.el")
|
|
||||||
;; * end:
|
|
||||||
;; */
|
|
||||||
;;
|
|
||||||
;; (note: make sure to get the path right in the argument to load-file).
|
|
||||||
|
|
||||||
|
|
||||||
;;; The curl hacker's C conventions
|
|
||||||
|
|
||||||
;;; we use intent-level 2
|
|
||||||
(setq c-basic-offset 2)
|
|
||||||
;;; never ever use tabs to indent!
|
|
||||||
(setq indent-tabs-mode nil)
|
|
||||||
;;; I like this, stolen from Subversion! ;-)
|
|
||||||
(setq angry-mob-with-torches-and-pitchforks t)
|
|
50
curl-style.el
Normal file
50
curl-style.el
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
;;;; Emacs Lisp help for writing curl code. ;;;;
|
||||||
|
;;;; $Id$
|
||||||
|
|
||||||
|
;;; The curl hacker's C conventions.
|
||||||
|
|
||||||
|
;;; After loading this file and added the mode-hook you can in C
|
||||||
|
;;; files, put something like this to use the curl style
|
||||||
|
;;; automatically:
|
||||||
|
;;
|
||||||
|
;; /* -----------------------------------------------------------------
|
||||||
|
;; * local variables:
|
||||||
|
;; * eval: (set c-file-style "curl")
|
||||||
|
;; * end:
|
||||||
|
;; */
|
||||||
|
;;
|
||||||
|
|
||||||
|
(defconst curl-c-style
|
||||||
|
'((c-basic-offset . 2)
|
||||||
|
(c-comment-only-line-offset . 0)
|
||||||
|
(c-hanging-braces-alist . ((substatement-open before after)))
|
||||||
|
(c-offsets-alist . ((topmost-intro . 0)
|
||||||
|
(topmost-intro-cont . 0)
|
||||||
|
(substatement . +)
|
||||||
|
(substatement-open . 0)
|
||||||
|
(statement-case-intro . +)
|
||||||
|
(statement-case-open . 0)
|
||||||
|
(case-label . 0)
|
||||||
|
))
|
||||||
|
)
|
||||||
|
"Curl C Programming Style")
|
||||||
|
|
||||||
|
;; Customizations for all of c-mode, c++-mode, and objc-mode
|
||||||
|
(defun curl-c-mode-common-hook ()
|
||||||
|
"Curl C mode hook"
|
||||||
|
;; add curl style and set it for the current buffer
|
||||||
|
(c-add-style "curl" curl-c-style t)
|
||||||
|
(setq tab-width 8
|
||||||
|
indent-tabs-mode nil ; Use spaces. Not tabs.
|
||||||
|
comment-column 40
|
||||||
|
c-font-lock-extra-types (append '("bool" "CURL" "CURLcode" "ssize_t" "size_t" "socklen_t" "fd_set"))
|
||||||
|
)
|
||||||
|
;; keybindings for C, C++, and Objective-C. We can put these in
|
||||||
|
;; c-mode-base-map because of inheritance ...
|
||||||
|
(define-key c-mode-base-map "\M-q" 'c-fill-paragraph)
|
||||||
|
(setq c-recognize-knr-p nil)
|
||||||
|
)
|
||||||
|
|
||||||
|
;; Set this is in your .emacs if you want to use the c-mode-hook as
|
||||||
|
;; defined here right out of the box.
|
||||||
|
; (add-hook 'c-mode-common-hook 'curl-c-mode-common-hook)
|
11
docs/BUGS
11
docs/BUGS
@@ -8,7 +8,7 @@ $Id$
|
|||||||
BUGS
|
BUGS
|
||||||
|
|
||||||
Curl and libcurl have grown substantially since the beginning. At the time
|
Curl and libcurl have grown substantially since the beginning. At the time
|
||||||
of writing (end of April 2002), there are 32000 lines of source code, and by
|
of writing (end of March 2003), there are 35000 lines of source code, and by
|
||||||
the time you read this it has probably grown even more.
|
the time you read this it has probably grown even more.
|
||||||
|
|
||||||
Of course there are lots of bugs left. And lots of misfeatures.
|
Of course there are lots of bugs left. And lots of misfeatures.
|
||||||
@@ -19,18 +19,21 @@ BUGS
|
|||||||
WHERE TO REPORT
|
WHERE TO REPORT
|
||||||
|
|
||||||
If you can't fix a bug yourself and submit a fix for it, try to report an as
|
If you can't fix a bug yourself and submit a fix for it, try to report an as
|
||||||
detailed report as possible to the curl mailing list to allow one of us to
|
detailed report as possible to a curl mailing list to allow one of us to
|
||||||
have a go at a solution. You should also post your bug/problem at curl's bug
|
have a go at a solution. You should also post your bug/problem at curl's bug
|
||||||
tracking system over at
|
tracking system over at
|
||||||
|
|
||||||
http://sourceforge.net/bugs/?group_id=976
|
http://sourceforge.net/bugs/?group_id=976
|
||||||
|
|
||||||
(but please read the section below first before doing that)
|
(but please read the sections below first before doing that)
|
||||||
|
|
||||||
|
If you feel you need to ask around first, find a suitable mailing list and
|
||||||
|
post there. The lists are available on http://curl.haxx.se/mail/
|
||||||
|
|
||||||
WHAT TO REPORT
|
WHAT TO REPORT
|
||||||
|
|
||||||
When reporting a bug, you should include information that will help us
|
When reporting a bug, you should include information that will help us
|
||||||
understand what's wrong what you expected to happen and how to repeat the
|
understand what's wrong, what you expected to happen and how to repeat the
|
||||||
bad behavior. You therefore need to tell us:
|
bad behavior. You therefore need to tell us:
|
||||||
|
|
||||||
- your operating system's name and version number (uname -a under a unix
|
- your operating system's name and version number (uname -a under a unix
|
||||||
|
@@ -145,5 +145,15 @@ How To Make a Patch
|
|||||||
|
|
||||||
diff -ur curl-original-dir curl-modfied-sources-dir > my-fixes.diff
|
diff -ur curl-original-dir curl-modfied-sources-dir > my-fixes.diff
|
||||||
|
|
||||||
GNU diff exists for virtually all platforms, including all kinds of unixes
|
The GNU diff and GNU patch tools exist for virtually all platforms, including
|
||||||
and Windows.
|
all kinds of unixes and Windows:
|
||||||
|
|
||||||
|
For unix-like operating systems:
|
||||||
|
|
||||||
|
http://www.fsf.org/software/patch/patch.html
|
||||||
|
http://www.gnu.org/directory/diffutils.html
|
||||||
|
|
||||||
|
For Windows:
|
||||||
|
|
||||||
|
http://gnuwin32.sourceforge.net/packages/patch.htm
|
||||||
|
http://gnuwin32.sourceforge.net/packages/diffutils.htm
|
||||||
|
92
docs/FAQ
92
docs/FAQ
@@ -1,4 +1,4 @@
|
|||||||
Updated: January 13, 2003 (http://curl.haxx.se/docs/faq.html)
|
Updated: May 9, 2003 (http://curl.haxx.se/docs/faq.html)
|
||||||
_ _ ____ _
|
_ _ ____ _
|
||||||
___| | | | _ \| |
|
___| | | | _ \| |
|
||||||
/ __| | | | |_) | |
|
/ __| | | | |_) | |
|
||||||
@@ -97,6 +97,12 @@ FAQ
|
|||||||
We spell it cURL or just curl. We pronounce it with an initial k sound:
|
We spell it cURL or just curl. We pronounce it with an initial k sound:
|
||||||
[kurl].
|
[kurl].
|
||||||
|
|
||||||
|
NOTE: there are numerous sub-projects and related projects that also use the
|
||||||
|
word curl in the project names in various combinations, but you should take
|
||||||
|
notice that this FAQ is directed at the command-line tool named curl (and
|
||||||
|
libcurl the library), and may therefore not be valid for other curl
|
||||||
|
projects.
|
||||||
|
|
||||||
1.2 What is libcurl?
|
1.2 What is libcurl?
|
||||||
|
|
||||||
libcurl is a reliable and portable library which provides you with an easy
|
libcurl is a reliable and portable library which provides you with an easy
|
||||||
@@ -132,11 +138,9 @@ FAQ
|
|||||||
better. We do however believe in a few rules when it comes to the future of
|
better. We do however believe in a few rules when it comes to the future of
|
||||||
curl:
|
curl:
|
||||||
|
|
||||||
* Curl is to remain a command line tool. If you want GUIs or fancy scripting
|
* Curl -- the command line tool -- is to remain a non-graphical command line
|
||||||
capabilities, you're free to write another tool that uses libcurl and that
|
tool. If you want GUIs or fancy scripting capabilities, you should look
|
||||||
offers this. There's no point in having a single tool that does every
|
for another tool that uses libcurl.
|
||||||
imaginable thing. That's also one of the great advantages of having the
|
|
||||||
core of curl as a library.
|
|
||||||
|
|
||||||
* We do not add things to curl that other small and available tools already
|
* We do not add things to curl that other small and available tools already
|
||||||
do very fine at the side. Curl's output is fine to pipe into another
|
do very fine at the side. Curl's output is fine to pipe into another
|
||||||
@@ -175,20 +179,21 @@ FAQ
|
|||||||
Project cURL is entirely free and open. No person gets paid for developing
|
Project cURL is entirely free and open. No person gets paid for developing
|
||||||
curl. We do this voluntarily on our spare time.
|
curl. We do this voluntarily on our spare time.
|
||||||
|
|
||||||
We get some help from companies. Contactor Data hosts the curl web site and
|
We get some help from companies. Contactor Data hosts the curl web site,
|
||||||
the main mailing list, Haxx owns the curl web site's domain and
|
Haxx owns the curl web site's domain and sourceforge.net hosts several
|
||||||
sourceforge.net hosts several project tools we take advantage from like the
|
project services we take advantage from, like the bug tracker, mailing lists
|
||||||
bug tracker, mailing lists and more.
|
and more.
|
||||||
|
|
||||||
If you want to support our project with a donation or similar, one way of
|
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
|
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
|
sites, such as amazon.com or thinkgeek.com. Another way would be to sponsor
|
||||||
us through a banner-program or even better: by helping us coding,
|
us through a banner-program or even better: by helping us coding,
|
||||||
documenting, testing etc.
|
documenting, testing etc. You're welcome to send us a buck using paypal, as
|
||||||
|
described here: http://curl.haxx.se/donation.html
|
||||||
|
|
||||||
1.7 What about CURL from curl.com?
|
1.7 What about CURL from curl.com?
|
||||||
|
|
||||||
During the summer 2001, curl.com has been busy advertising their client-side
|
During the summer 2001, curl.com was busy advertising their client-side
|
||||||
programming language for the web, named CURL.
|
programming language for the web, named CURL.
|
||||||
|
|
||||||
We are in no way associated with curl.com or their CURL programming
|
We are in no way associated with curl.com or their CURL programming
|
||||||
@@ -203,17 +208,17 @@ FAQ
|
|||||||
|
|
||||||
1.8 I have a problem who do I mail?
|
1.8 I have a problem who do I mail?
|
||||||
|
|
||||||
Please do not attempt to mail any single individual unless you really need
|
Please do not mail any single individual unless you really need to. Keep
|
||||||
to. Keep curl-related questions on a suitable mailing list. All available
|
curl-related questions on a suitable mailing list. All available mailing
|
||||||
mailing lists are listed in the MANUAL document and online at
|
lists are listed in the MANUAL document and online at
|
||||||
http://curl.haxx.se/mail/
|
http://curl.haxx.se/mail/
|
||||||
|
|
||||||
Keeping curl-related questions and discussions on mailing lists allows others
|
Keeping curl-related questions and discussions on mailing lists allows
|
||||||
to join in and help, to share their ideas, contribute their suggestions and
|
others to join in and help, to share their ideas, contribute their
|
||||||
spread their wisdom. Keeping discussions on public mailing lists also allows
|
suggestions and spread their wisdom. Keeping discussions on public mailing
|
||||||
for others to learn from this (both current and future users thanks to the
|
lists also allows for others to learn from this (both current and future
|
||||||
web based archives of the mailing lists), thus saving us from having to
|
users thanks to the web based archives of the mailing lists), thus saving us
|
||||||
repeat ourselves even more. Thanks for respecting this.
|
from having to repeat ourselves even more. Thanks for respecting this.
|
||||||
|
|
||||||
|
|
||||||
2. Install Related Problems
|
2. Install Related Problems
|
||||||
@@ -368,9 +373,10 @@ FAQ
|
|||||||
|
|
||||||
http://curl.haxx.se/libcurl/
|
http://curl.haxx.se/libcurl/
|
||||||
|
|
||||||
In December 2001, there are interfaces available for the following
|
In February 2003, there are interfaces available for the following
|
||||||
languages: C/C++, Cocoa, Dylan, Java, Perl, PHP, Python, Rexx, Ruby, Scheme
|
languages: Basic, C, C++, Cocoa, Dylan, Euphoria, Java, Lua, Object-Pascal,
|
||||||
and Tcl. By the time you read this, additional ones may have appeared!
|
Pascal, Perl, PHP, PostgreSQL, 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?
|
3.10 What about SOAP, WebDAV, XML-RPC or similar protocols over HTTP?
|
||||||
|
|
||||||
@@ -379,8 +385,8 @@ FAQ
|
|||||||
XML-RPC are all such ones. You can use -X to set custom requests and -H to
|
XML-RPC are all such ones. You can use -X to set custom requests and -H to
|
||||||
set custom headers (or replace internally generated ones).
|
set custom headers (or replace internally generated ones).
|
||||||
|
|
||||||
Using libcurl or PHP's curl modules is just as fine and you'd just use the
|
Using libcurl is of course just as fine and you'd just use the proper
|
||||||
proper library options to do the same.
|
library options to do the same.
|
||||||
|
|
||||||
3.11 How do I POST with a different Content-Type?
|
3.11 How do I POST with a different Content-Type?
|
||||||
|
|
||||||
@@ -494,8 +500,7 @@ FAQ
|
|||||||
curl '{curl,www}.haxx.se'
|
curl '{curl,www}.haxx.se'
|
||||||
|
|
||||||
To be able to use those letters as actual parts of the URL (without using
|
To be able to use those letters as actual parts of the URL (without using
|
||||||
them for the curl URL "globbing" system), use the -g/--globoff option (curl
|
them for the curl URL "globbing" system), use the -g/--globoff option:
|
||||||
7.6 and later):
|
|
||||||
|
|
||||||
curl -g 'www.site.com/weirdname[].html'
|
curl -g 'www.site.com/weirdname[].html'
|
||||||
|
|
||||||
@@ -630,7 +635,7 @@ FAQ
|
|||||||
this check.
|
this check.
|
||||||
|
|
||||||
Details are also in the SSLCERTS file in the release archives, found online
|
Details are also in the SSLCERTS file in the release archives, found online
|
||||||
here: http://curl.haxx.se/lxr/source/SSLCERTS
|
here: http://curl.haxx.se/docs/sslcerts.html
|
||||||
|
|
||||||
5. libcurl Issues
|
5. libcurl Issues
|
||||||
|
|
||||||
@@ -682,20 +687,15 @@ FAQ
|
|||||||
|
|
||||||
5.3 How do I fetch multiple files with libcurl?
|
5.3 How do I fetch multiple files with libcurl?
|
||||||
|
|
||||||
Starting with version 7.7, curl and libcurl will have excellent support for
|
libcurl has excellent support for transferring multiple files. You should
|
||||||
transferring multiple files. You should just repeatedly set new URLs with
|
just repeatedly set new URLs with curl_easy_setopt() and then transfer it
|
||||||
curl_easy_setopt() and then transfer it with curl_easy_perform(). The handle
|
with curl_easy_perform(). The handle you get from curl_easy_init() is not
|
||||||
you get from curl_easy_init() is not only reusable starting with libcurl
|
only reusable, but you're even encouraged to reuse it if you can, as that
|
||||||
7.7, but also you're encouraged to reuse it if you can, as that will enable
|
will enable libcurl to use persistent connections.
|
||||||
libcurl to use persistent connections.
|
|
||||||
|
|
||||||
For libcurl prior to 7.7, there was no multiple file support. The only
|
|
||||||
available way to do multiple requests was to init/perform/cleanup for each
|
|
||||||
transfer.
|
|
||||||
|
|
||||||
5.4 Does libcurl do Winsock initialization on win32 systems?
|
5.4 Does libcurl do Winsock initialization on win32 systems?
|
||||||
|
|
||||||
Yes (since 7.8.1) if told to in the curl_global_init() call.
|
Yes, if told to in the curl_global_init() call.
|
||||||
|
|
||||||
5.5 Does CURLOPT_FILE and CURLOPT_INFILE work on win32 ?
|
5.5 Does CURLOPT_FILE and CURLOPT_INFILE work on win32 ?
|
||||||
|
|
||||||
@@ -709,13 +709,11 @@ FAQ
|
|||||||
|
|
||||||
5.6 What about Keep-Alive or persistent connections?
|
5.6 What about Keep-Alive or persistent connections?
|
||||||
|
|
||||||
Starting with version 7.7, curl and libcurl will have excellent support for
|
curl and libcurl have excellent support for persistent connections when
|
||||||
persistent connections when transferring several files from the same server.
|
transferring several files from the same server. Curl will attempt to reuse
|
||||||
Curl will attempt to reuse connections for all URLs specified on the same
|
connections for all URLs specified on the same command line/config file, and
|
||||||
command line/config file, and libcurl will reuse connections for all
|
libcurl will reuse connections for all transfers that are made using the
|
||||||
transfers that are made using the same libcurl handle.
|
same libcurl handle.
|
||||||
|
|
||||||
Previous versions had no persistent connection support.
|
|
||||||
|
|
||||||
5.7 Link errors when building libcurl on Windows!
|
5.7 Link errors when building libcurl on Windows!
|
||||||
|
|
||||||
|
11
docs/HISTORY
11
docs/HISTORY
@@ -54,7 +54,7 @@ OpenSSL took over where SSLeay was abandoned.
|
|||||||
May 1999, first Debian package.
|
May 1999, first Debian package.
|
||||||
|
|
||||||
August 1999, LDAP:// and FILE:// support added. The curl web site gets 1300
|
August 1999, LDAP:// and FILE:// support added. The curl web site gets 1300
|
||||||
visits daily.
|
visits weekly.
|
||||||
|
|
||||||
Released curl 6.0 in September. 15000 lines of code.
|
Released curl 6.0 in September. 15000 lines of code.
|
||||||
|
|
||||||
@@ -67,7 +67,7 @@ the easy interface and turned out to be the beginning of actually getting
|
|||||||
other software and programs to get based on and powered by libcurl. Almost
|
other software and programs to get based on and powered by libcurl. Almost
|
||||||
20000 lines of code.
|
20000 lines of code.
|
||||||
|
|
||||||
August 2000, the curl web site gets 4000 visits daily.
|
August 2000, the curl web site gets 4000 visits weekly.
|
||||||
|
|
||||||
The PHP guys adopted libcurl already the same month, when the first ever third
|
The PHP guys adopted libcurl already the same month, when the first ever third
|
||||||
party libcurl binding showed up. CURL has been a supported module in PHP since
|
party libcurl binding showed up. CURL has been a supported module in PHP since
|
||||||
@@ -92,7 +92,7 @@ code.
|
|||||||
|
|
||||||
August 2001. curl is bundled in Mac OS X, 10.1. It was already becoming more
|
August 2001. curl is bundled in Mac OS X, 10.1. It was already becoming more
|
||||||
and more of a standard utility of Linux distributions and a regular in the BSD
|
and more of a standard utility of Linux distributions and a regular in the BSD
|
||||||
ports collections. The curl web site gets 8000 visits daily. Curl Corporation
|
ports collections. The curl web site gets 8000 visits weekly. Curl Corporation
|
||||||
contacted Daniel to discuss "the name issue". After Daniel's reply, they have
|
contacted Daniel to discuss "the name issue". After Daniel's reply, they have
|
||||||
never since got in touch again.
|
never since got in touch again.
|
||||||
|
|
||||||
@@ -100,7 +100,7 @@ September 2001, libcurl 7.9 introduces cookie jar and curl_formadd(). During
|
|||||||
the forthcoming 7.9.x releases, we introduced the multi interface slowly and
|
the forthcoming 7.9.x releases, we introduced the multi interface slowly and
|
||||||
without much whistles.
|
without much whistles.
|
||||||
|
|
||||||
June 2002, the curl web site gets 13000 visits daily. curl and libcurl is
|
June 2002, the curl web site gets 13000 visits weekly. curl and libcurl is
|
||||||
35000 lines of code. Reported successful compiles on more than 40 combinations
|
35000 lines of code. Reported successful compiles on more than 40 combinations
|
||||||
of CPUs and operating systems.
|
of CPUs and operating systems.
|
||||||
|
|
||||||
@@ -111,3 +111,6 @@ distributions and otherwise retrieved as part of other software.
|
|||||||
|
|
||||||
September 2002, with the release of curl 7.10 it is released under the MIT
|
September 2002, with the release of curl 7.10 it is released under the MIT
|
||||||
license only.
|
license only.
|
||||||
|
|
||||||
|
February 2003, the curl site averages at 20000 visits weekly. At any given
|
||||||
|
moment, there's an average of 3 people browsing the curl.haxx.se site.
|
||||||
|
25
docs/HOWTO-RELEASE
Normal file
25
docs/HOWTO-RELEASE
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
Steps To Perform When Building a Public Release
|
||||||
|
|
||||||
|
* "make distcheck"
|
||||||
|
|
||||||
|
* ./maketgz
|
||||||
|
then upload the 3 curl packages maketgz created
|
||||||
|
|
||||||
|
* update these files:
|
||||||
|
www/_download.html
|
||||||
|
www/_changes.html
|
||||||
|
www/_newslog.html
|
||||||
|
www/Makefile
|
||||||
|
|
||||||
|
* commit the web changes
|
||||||
|
|
||||||
|
* 'cvs commit'
|
||||||
|
|
||||||
|
* 'cvs tag'
|
||||||
|
|
||||||
|
* write the release announcement, including:
|
||||||
|
- changes / bugfixes
|
||||||
|
- other curl-related news
|
||||||
|
- contributors
|
||||||
|
|
||||||
|
* mail release-announcement to curl-announce and curl-users
|
20
docs/INSTALL
20
docs/INSTALL
@@ -31,6 +31,10 @@ UNIX
|
|||||||
If you have checked out the sources from the CVS repository, read the
|
If you have checked out the sources from the CVS repository, read the
|
||||||
CVS-INFO on how to proceed.
|
CVS-INFO on how to proceed.
|
||||||
|
|
||||||
|
Get a full listing of all available configure options by invoking it like:
|
||||||
|
|
||||||
|
./configure --help
|
||||||
|
|
||||||
If you want to install curl in a different file hierarchy than /usr/local,
|
If you want to install curl in a different file hierarchy than /usr/local,
|
||||||
you need to specify that already when running configure:
|
you need to specify that already when running configure:
|
||||||
|
|
||||||
@@ -400,6 +404,17 @@ CROSS COMPILE
|
|||||||
The '--prefix' parameter specifies where cURL will be installed. If
|
The '--prefix' parameter specifies where cURL will be installed. If
|
||||||
'configure' completes successfully, do 'make' and 'make install' as usual.
|
'configure' completes successfully, do 'make' and 'make install' as usual.
|
||||||
|
|
||||||
|
RISC OS
|
||||||
|
=======
|
||||||
|
The library can be cross-compiled using gccsdk as follows:
|
||||||
|
|
||||||
|
CC=riscos-gcc AR=riscos-ar RANLIB='riscos-ar -s' ./configure \
|
||||||
|
--host=arm-riscos-aof --without-random --disable-shared
|
||||||
|
make
|
||||||
|
|
||||||
|
where riscos-gcc and riscos-ar are links to the gccsdk tools.
|
||||||
|
You can then link your program with curl/lib/.libs/libcurl.a
|
||||||
|
|
||||||
PORTS
|
PORTS
|
||||||
=====
|
=====
|
||||||
This is a probably incomplete list of known hardware and operating systems
|
This is a probably incomplete list of known hardware and operating systems
|
||||||
@@ -419,7 +434,7 @@ PORTS
|
|||||||
- MIPS IRIX 6.2, 6.5
|
- MIPS IRIX 6.2, 6.5
|
||||||
- MIPS Linux
|
- MIPS Linux
|
||||||
- Pocket PC/Win CE 3.0
|
- Pocket PC/Win CE 3.0
|
||||||
- Power AIX 4.2, 4.3.1, 4.3.2, 5.1
|
- Power AIX 3.2.5, 4.2, 4.3.1, 4.3.2, 5.1
|
||||||
- PowerPC Darwin 1.0
|
- PowerPC Darwin 1.0
|
||||||
- PowerPC Linux
|
- PowerPC Linux
|
||||||
- PowerPC Mac OS 9
|
- PowerPC Mac OS 9
|
||||||
@@ -443,11 +458,14 @@ PORTS
|
|||||||
- i386 Solaris 2.7
|
- i386 Solaris 2.7
|
||||||
- i386 Windows 95, 98, ME, NT, 2000
|
- i386 Windows 95, 98, ME, NT, 2000
|
||||||
- i386 QNX 6
|
- i386 QNX 6
|
||||||
|
- i486 ncr-sysv4.3.03 (NCR MP-RAS)
|
||||||
- ia64 Linux 2.3.99
|
- ia64 Linux 2.3.99
|
||||||
- m68k AmigaOS 3
|
- m68k AmigaOS 3
|
||||||
- m68k Linux
|
- m68k Linux
|
||||||
- m68k OpenBSD
|
- m68k OpenBSD
|
||||||
|
- m88k dg-dgux5.4R3.00
|
||||||
- s390 Linux
|
- s390 Linux
|
||||||
|
- XScale/PXA250 Linux 2.4
|
||||||
|
|
||||||
OpenSSL
|
OpenSSL
|
||||||
=======
|
=======
|
||||||
|
@@ -3,6 +3,9 @@ join in and help us correct one or more of these! Also be sure to check the
|
|||||||
changelog of the current development status, as one or more of these problems
|
changelog of the current development status, as one or more of these problems
|
||||||
may have been fixed since this was written!
|
may have been fixed since this was written!
|
||||||
|
|
||||||
|
* IPv6 support on AIX 4.3.3 doesn't work due to a missing sockaddr_storage
|
||||||
|
struct. It has been reported to work on AIX 5.1 though.
|
||||||
|
|
||||||
* Running 'make test' on Mac OS X gives 4 errors. This seems to be related
|
* Running 'make test' on Mac OS X gives 4 errors. This seems to be related
|
||||||
to some kind of libtool problem:
|
to some kind of libtool problem:
|
||||||
http://curl.haxx.se/mail/archive-2002-03/0029.html and
|
http://curl.haxx.se/mail/archive-2002-03/0029.html and
|
||||||
@@ -15,6 +18,8 @@ may have been fixed since this was written!
|
|||||||
* configure --disable-http is not fully supported. All other protocols seem
|
* configure --disable-http is not fully supported. All other protocols seem
|
||||||
to work to disable.
|
to work to disable.
|
||||||
|
|
||||||
|
* The -m parameter does not work when using telnet with curl on Windows.
|
||||||
|
|
||||||
* If a HTTP server responds to a HEAD request and includes a body (thus
|
* If a HTTP server responds to a HEAD request and includes a body (thus
|
||||||
violating the RFC2616), curl won't wait to read the response but just stop
|
violating the RFC2616), curl won't wait to read the response but just stop
|
||||||
reading and return back. If a second request (let's assume a GET) is then
|
reading and return back. If a second request (let's assume a GET) is then
|
||||||
|
35
docs/MANUAL
35
docs/MANUAL
@@ -166,13 +166,21 @@ UPLOADING
|
|||||||
|
|
||||||
VERBOSE / DEBUG
|
VERBOSE / DEBUG
|
||||||
|
|
||||||
If curl fails where it isn't supposed to, if the servers don't let you
|
If curl fails where it isn't supposed to, if the servers don't let you in,
|
||||||
in, if you can't understand the responses: use the -v flag to get VERBOSE
|
if you can't understand the responses: use the -v flag to get verbose
|
||||||
fetching. Curl will output lots of info and all data it sends and
|
fetching. Curl will output lots of info and what it sends and receives in
|
||||||
receives in order to let the user see all client-server interaction.
|
order to let the user see all client-server interaction (but it won't show
|
||||||
|
you the actual data).
|
||||||
|
|
||||||
curl -v ftp://ftp.upload.com/
|
curl -v ftp://ftp.upload.com/
|
||||||
|
|
||||||
|
To get even more details and information on what curl does, try using the
|
||||||
|
--trace or --trace-ascii options with a given file name to log to, like
|
||||||
|
this:
|
||||||
|
|
||||||
|
curl --trace trace.txt www.haxx.se
|
||||||
|
|
||||||
|
|
||||||
DETAILED INFORMATION
|
DETAILED INFORMATION
|
||||||
|
|
||||||
Different protocols provide different ways of getting detailed information
|
Different protocols provide different ways of getting detailed information
|
||||||
@@ -350,6 +358,13 @@ COOKIES
|
|||||||
|
|
||||||
curl -b headers www.example.com
|
curl -b headers www.example.com
|
||||||
|
|
||||||
|
While saving headers to a file is a working way to store cookies, it is
|
||||||
|
however error-prone and not the prefered way to do this. Instead, make curl
|
||||||
|
save the incoming cookies using the well-known netscape cookie format like
|
||||||
|
this:
|
||||||
|
|
||||||
|
curl -c cookies.txt www.example.com
|
||||||
|
|
||||||
Note that by specifying -b you enable the "cookie awareness" and with -L
|
Note that by specifying -b you enable the "cookie awareness" and with -L
|
||||||
you can make curl follow a location: (which often is used in combination
|
you can make curl follow a location: (which often is used in combination
|
||||||
with cookies). So that if a site sends cookies and a location, you can
|
with cookies). So that if a site sends cookies and a location, you can
|
||||||
@@ -364,6 +379,10 @@ COOKIES
|
|||||||
stored cookies which match the request as it follows the location. The
|
stored cookies which match the request as it follows the location. The
|
||||||
file "empty.txt" may be a non-existant file.
|
file "empty.txt" may be a non-existant file.
|
||||||
|
|
||||||
|
Alas, to both read and write cookies from a netscape cookie file, you can
|
||||||
|
set both -b and -c to use the same file:
|
||||||
|
|
||||||
|
curl -b cookies.txt -c cookies.txt www.example.com
|
||||||
|
|
||||||
PROGRESS METER
|
PROGRESS METER
|
||||||
|
|
||||||
@@ -413,7 +432,8 @@ SPEED LIMIT
|
|||||||
|
|
||||||
Forcing curl not to transfer data faster than a given rate is also possible,
|
Forcing curl not to transfer data faster than a given rate is also possible,
|
||||||
which might be useful if you're using a limited bandwidth connection and you
|
which might be useful if you're using a limited bandwidth connection and you
|
||||||
don't want your transfer to use all of it.
|
don't want your transfer to use all of it (sometimes referred to as
|
||||||
|
"bandwith throttle").
|
||||||
|
|
||||||
Make curl transfer data no faster than 10 kilobytes per second:
|
Make curl transfer data no faster than 10 kilobytes per second:
|
||||||
|
|
||||||
@@ -427,6 +447,11 @@ SPEED LIMIT
|
|||||||
|
|
||||||
curl -T upload --limit-rate 1M ftp://uploadshereplease.com
|
curl -T upload --limit-rate 1M ftp://uploadshereplease.com
|
||||||
|
|
||||||
|
When using the --limit-rate option, the transfer rate is regulated on a
|
||||||
|
per-second basis, which will cause the total transfer speed to become lower
|
||||||
|
than the given number. Sometimes of course substantially lower, if your
|
||||||
|
transfer stalls during periods.
|
||||||
|
|
||||||
CONFIG FILE
|
CONFIG FILE
|
||||||
|
|
||||||
Curl automatically tries to read the .curlrc file (or _curlrc file on win32
|
Curl automatically tries to read the .curlrc file (or _curlrc file on win32
|
||||||
|
@@ -10,7 +10,8 @@ man_MANS = \
|
|||||||
|
|
||||||
HTMLPAGES = \
|
HTMLPAGES = \
|
||||||
curl.html \
|
curl.html \
|
||||||
curl-config.html
|
curl-config.html \
|
||||||
|
index.html
|
||||||
|
|
||||||
PDFPAGES = \
|
PDFPAGES = \
|
||||||
curl.pdf \
|
curl.pdf \
|
||||||
|
@@ -82,3 +82,11 @@ that have contributed with non-trivial parts:
|
|||||||
- Andreas Damm <andreas-sourceforge@radab.org>
|
- Andreas Damm <andreas-sourceforge@radab.org>
|
||||||
- Jacky Lam <sylam@emsoftltd.com>
|
- Jacky Lam <sylam@emsoftltd.com>
|
||||||
- James Gallagher <jgallagher@gso.uri.edu>
|
- James Gallagher <jgallagher@gso.uri.edu>
|
||||||
|
- Kjetil Jacobsen <kjetilja@cs.uit.no>
|
||||||
|
- Markus F.X.J. Oberhumer <markus@oberhumer.com>
|
||||||
|
- Miklos Nemeth <mnemeth@kfkisystems.com>
|
||||||
|
- Kevin Roth <kproth@users.sourceforge.net>
|
||||||
|
- Ralph Mitchell <rmitchell@eds.com>
|
||||||
|
- Dan Fandrich <dan@coneharvesters.com>
|
||||||
|
- Jean-Philippe Barrette-LaPierre <jpb@rrette.com>
|
||||||
|
- Richard Bramante <RBramante@on.com>
|
||||||
|
50
docs/TODO
50
docs/TODO
@@ -24,9 +24,9 @@ TODO
|
|||||||
less copy of data and thus a faster operation.
|
less copy of data and thus a faster operation.
|
||||||
[http://curl.haxx.se/dev/no_copy_callbacks.txt]
|
[http://curl.haxx.se/dev/no_copy_callbacks.txt]
|
||||||
|
|
||||||
* Add asynchronous name resolving (http://daniel.haxx.se/resolver/). This
|
* Add asynchronous name resolving (http://libdenise.sf.net/). This should be
|
||||||
should be made to work on most of the supported platforms, or otherwise it
|
made to work on most of the supported platforms, or otherwise it isn't
|
||||||
isn't really interesting.
|
really interesting.
|
||||||
|
|
||||||
* Data sharing. Tell which easy handles within a multi handle that should
|
* Data sharing. Tell which easy handles within a multi handle that should
|
||||||
share cookies, connection cache, dns cache, ssl session cache. Full
|
share cookies, connection cache, dns cache, ssl session cache. Full
|
||||||
@@ -57,12 +57,15 @@ TODO
|
|||||||
LIBCURL - multi interface
|
LIBCURL - multi interface
|
||||||
|
|
||||||
* Make sure we don't ever loop because of non-blocking sockets return
|
* Make sure we don't ever loop because of non-blocking sockets return
|
||||||
EWOULDBLOCK or similar. This FTP command sending etc.
|
EWOULDBLOCK or similar. This FTP command sending, the SSL connection etc.
|
||||||
|
|
||||||
* Make uploads treated better. We need a way to tell libcurl we have data to
|
* Make transfers treated more carefully. We need a way to tell libcurl we
|
||||||
write, as the current system expects us to upload data each time the socket
|
have data to write, as the current system expects us to upload data each
|
||||||
is writable and there is no way to say that we want to upload data soon
|
time the socket is writable and there is no way to say that we want to
|
||||||
just not right now, without that aborting the upload.
|
upload data soon just not right now, without that aborting the upload. The
|
||||||
|
opposite situation should be possible as well, that we tell libcurl we're
|
||||||
|
ready to accept read data. Today libcurl feeds the data as soon as it is
|
||||||
|
available for reading, no matter what.
|
||||||
|
|
||||||
DOCUMENTATION
|
DOCUMENTATION
|
||||||
|
|
||||||
@@ -70,6 +73,9 @@ TODO
|
|||||||
|
|
||||||
FTP
|
FTP
|
||||||
|
|
||||||
|
* Make CURLOPT_FTPPORT support an additional port number on the IP/if/name,
|
||||||
|
like "blabla:[port]" or possibly even "blabla:[portfirst]-[portsecond]".
|
||||||
|
|
||||||
* FTP ASCII upload does not follow RFC959 section 3.1.1.1: "The sender
|
* FTP ASCII upload does not follow RFC959 section 3.1.1.1: "The sender
|
||||||
converts the data from an internal character representation to the standard
|
converts the data from an internal character representation to the standard
|
||||||
8-bit NVT-ASCII representation (see the Telnet specification). The
|
8-bit NVT-ASCII representation (see the Telnet specification). The
|
||||||
@@ -81,20 +87,24 @@ TODO
|
|||||||
|
|
||||||
* An option to only download remote FTP files if they're newer than the local
|
* An option to only download remote FTP files if they're newer than the local
|
||||||
one is a good idea, and it would fit right into the same syntax as the
|
one is a good idea, and it would fit right into the same syntax as the
|
||||||
already working http dito works. It of course requires that 'MDTM' works,
|
already working http dito works (-z). It of course requires that 'MDTM'
|
||||||
and it isn't a standard FTP command.
|
works, and it isn't a standard FTP command.
|
||||||
|
|
||||||
* Add FTPS support with SSL for the data connection too. This should be made
|
* Add FTPS support with SSL for the data connection too. This should be made
|
||||||
according to the specs written in draft-murray-auth-ftp-ssl-08.txt,
|
according to the specs written in draft-murray-auth-ftp-ssl-08.txt,
|
||||||
"Securing FTP with TLS"
|
"Securing FTP with TLS"
|
||||||
|
|
||||||
|
* --disable-epsv exists, but for active connections we have no --disable-eprt
|
||||||
|
(or even --disable-lprt).
|
||||||
|
|
||||||
HTTP
|
HTTP
|
||||||
|
|
||||||
* Pass a list of host name to libcurl to which we allow the user name and
|
* If the "body" of the POST is < MSS it really aught to be sent along with
|
||||||
password to get sent to. Currently, it only get sent to the host name that
|
the headers. More generally, if the last chunk of the POST body is < MSS,
|
||||||
the first URL uses (to prevent others from being able to read it), but this
|
it should be sent with the previous chunk (which may be the POST headers).
|
||||||
also prevents the authentication info from getting sent when following
|
So long as any one send is larger than MSS (or there is only one send when
|
||||||
locations to legitimate other host names.
|
< MSS :), the Nagle Algorithm will not be a problem on any stack where
|
||||||
|
Nagle is implemented correctly. (pointed out by Rick Jones)
|
||||||
|
|
||||||
* Authentication: NTLM. Support for that MS crap called NTLM
|
* Authentication: NTLM. Support for that MS crap called NTLM
|
||||||
authentication. MS proxies and servers sometime require that. Since that
|
authentication. MS proxies and servers sometime require that. Since that
|
||||||
@@ -199,6 +209,9 @@ TODO
|
|||||||
|
|
||||||
TEST SUITE
|
TEST SUITE
|
||||||
|
|
||||||
|
* If perl wasn't found by the configure script, don't attempt to run the
|
||||||
|
tests but explain something nice why it doesn't.
|
||||||
|
|
||||||
* Extend the test suite to include more protocols. The telnet could just do
|
* Extend the test suite to include more protocols. The telnet could just do
|
||||||
ftp or http operations (for which we have test servers).
|
ftp or http operations (for which we have test servers).
|
||||||
|
|
||||||
@@ -206,3 +219,10 @@ TODO
|
|||||||
fork()s and it should become even more portable.
|
fork()s and it should become even more portable.
|
||||||
|
|
||||||
* Introduce a test suite that tests libcurl better and more explicitly.
|
* Introduce a test suite that tests libcurl better and more explicitly.
|
||||||
|
|
||||||
|
NEXT MAJOR RELEASE
|
||||||
|
|
||||||
|
* curl_easy_cleanup() returns void, but curl_multi_cleanup() returns a
|
||||||
|
CURLMcode. These should be changed to be the same.
|
||||||
|
|
||||||
|
* curl_formparse() should be removed
|
||||||
|
55
docs/curl.1
55
docs/curl.1
@@ -2,7 +2,7 @@
|
|||||||
.\" nroff -man curl.1
|
.\" nroff -man curl.1
|
||||||
.\" Written by Daniel Stenberg
|
.\" Written by Daniel Stenberg
|
||||||
.\"
|
.\"
|
||||||
.TH curl 1 "11 Sep 2002" "Curl 7.10" "Curl Manual"
|
.TH curl 1 "14 Feb 2003" "Curl 7.10.3" "Curl Manual"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
curl \- transfer a URL
|
curl \- transfer a URL
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
@@ -96,6 +96,10 @@ must be using valid ciphers. Read up on SSL cipher list details on this URL:
|
|||||||
.I http://www.openssl.org/docs/apps/ciphers.html (Option added in curl 7.9)
|
.I http://www.openssl.org/docs/apps/ciphers.html (Option added in curl 7.9)
|
||||||
|
|
||||||
If this option is used several times, the last one will override the others.
|
If this option is used several times, the last one will override the others.
|
||||||
|
.IP "--compressed"
|
||||||
|
(HTTP) Request a compressed response using the deflate or gzip
|
||||||
|
algorithms and return the uncompressed document. If this option is used
|
||||||
|
and the server sends an unsupported encoding, Curl will report an error.
|
||||||
.IP "--connect-timeout <seconds>"
|
.IP "--connect-timeout <seconds>"
|
||||||
Maximum time in seconds that you allow the connection to the server to take.
|
Maximum time in seconds that you allow the connection to the server to take.
|
||||||
This only limits the connection phase, once curl has connected this option is
|
This only limits the connection phase, once curl has connected this option is
|
||||||
@@ -110,6 +114,12 @@ no file will be written. The file will be written using the Netscape cookie
|
|||||||
file format. If you set the file name to a single dash, "-", the cookies will
|
file format. If you set the file name to a single dash, "-", the cookies will
|
||||||
be written to stdout. (Option added in curl 7.9)
|
be written to stdout. (Option added in curl 7.9)
|
||||||
|
|
||||||
|
.B NOTE
|
||||||
|
If the cookie jar can't be created or written to, the whole curl operation
|
||||||
|
won't fail or even report an error clearly. Using -v will get a warning
|
||||||
|
displayed, but that is the only visible feedback you get about this possibly
|
||||||
|
lethal situation.
|
||||||
|
|
||||||
If this option is used several times, the last specfied file name will be
|
If this option is used several times, the last specfied file name will be
|
||||||
used.
|
used.
|
||||||
.IP "-C/--continue-at <offset>"
|
.IP "-C/--continue-at <offset>"
|
||||||
@@ -122,7 +132,7 @@ 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.
|
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.
|
If this option is used several times, the last one will be used.
|
||||||
.IP "---create-dirs"
|
.IP "--create-dirs"
|
||||||
When used in conjunction with the -o option, curl will create the necessary
|
When used in conjunction with the -o option, curl will create the necessary
|
||||||
local directory hierarchy as needed.
|
local directory hierarchy as needed.
|
||||||
.IP "--crlf"
|
.IP "--crlf"
|
||||||
@@ -217,14 +227,21 @@ If this option is used several times, the last one will be used.
|
|||||||
peer. The file may contain multiple CA certificates. The certificate(s) must
|
peer. The file may contain multiple CA certificates. The certificate(s) must
|
||||||
be in PEM format.
|
be in PEM format.
|
||||||
|
|
||||||
|
curl recognizes the environment variable named 'CURL_CA_BUNDLE' if that is
|
||||||
|
set, and uses the given path as a path to a CA cert bundle. This option
|
||||||
|
overrides that variable.
|
||||||
|
|
||||||
|
The windows version of curl will automatically look for a CA certs file named
|
||||||
|
\'curl-ca-bundle.crt\', either in the same directory as curl.exe, or in the
|
||||||
|
Current Working Directory, or in any folder along your PATH.
|
||||||
|
|
||||||
If this option is used several times, the last one will be used.
|
If this option is used several times, the last one will be used.
|
||||||
.IP "--capath <CA certificate directory>"
|
.IP "--capath <CA certificate directory>"
|
||||||
(HTTPS) Tells curl to use the specified certificate directory to verify the
|
(HTTPS) Tells curl to use the specified certificate directory to verify the
|
||||||
peer. The certificates must be in PEM format, and the directory must have been
|
peer. The certificates must be in PEM format, and the directory must have been
|
||||||
processed using the c_rehash utility supplied with openssl. Certificate directories
|
processed using the c_rehash utility supplied with openssl. Using --capath can
|
||||||
are not supported under Windows (because c_rehash uses symbolink links to
|
allow curl to make https connections much more efficiently than using --cacert
|
||||||
create them). Using --capath can allow curl to make https connections much
|
if the --cacert file contains many CA certificates.
|
||||||
more efficiently than using --cacert if the --cacert file contains many CA certificates.
|
|
||||||
|
|
||||||
If this option is used several times, the last one will be used.
|
If this option is used several times, the last one will be used.
|
||||||
.IP "-f/--fail"
|
.IP "-f/--fail"
|
||||||
@@ -249,12 +266,18 @@ Example, to send your password file to the server, where
|
|||||||
\&'password' is the name of the form-field to which /etc/passwd will be the
|
\&'password' is the name of the form-field to which /etc/passwd will be the
|
||||||
input:
|
input:
|
||||||
|
|
||||||
.B curl
|
\fBcurl\fP -F password=@/etc/passwd www.mypasswords.com
|
||||||
-F password=@/etc/passwd www.mypasswords.com
|
|
||||||
|
|
||||||
To read the file's content from stdin insted of a file, use - where the file
|
To read the file's content from stdin insted of a file, use - where the file
|
||||||
name should've been. This goes for both @ and < constructs.
|
name should've been. This goes for both @ and < constructs.
|
||||||
|
|
||||||
|
You can also tell curl what Content-Type to use for the file upload part, by
|
||||||
|
using 'type=', in a manner similar to:
|
||||||
|
|
||||||
|
\fBcurl\fP -F "web=@index.html;type=text/html" url.com
|
||||||
|
|
||||||
|
See further examples and details in the MANUAL.
|
||||||
|
|
||||||
This option can be used multiple times.
|
This option can be used multiple times.
|
||||||
.IP "-g/--globoff"
|
.IP "-g/--globoff"
|
||||||
This option switches off the "URL globbing parser". When you set this option,
|
This option switches off the "URL globbing parser". When you set this option,
|
||||||
@@ -347,8 +370,8 @@ url = "http://curl.haxx.se/docs/"
|
|||||||
This option can be used multiple times.
|
This option can be used multiple times.
|
||||||
.IP "--limit-rate <speed>"
|
.IP "--limit-rate <speed>"
|
||||||
Specify the maximum transfer rate you want curl to use. This feature is useful
|
Specify the maximum transfer rate you want curl to use. This feature is useful
|
||||||
if you have a limited pipe and you'd prefer you have your transfer not use
|
if you have a limited pipe and you'd like your transfer not use your entire
|
||||||
your entire bandwidth.
|
bandwidth.
|
||||||
|
|
||||||
The given speed is measured in bytes/second, unless a suffix is
|
The given speed is measured in bytes/second, unless a suffix is
|
||||||
appended. Appending 'k' or 'K' will count the number as kilobytes, 'm' or M'
|
appended. Appending 'k' or 'K' will count the number as kilobytes, 'm' or M'
|
||||||
@@ -586,9 +609,9 @@ read for untrained humans.
|
|||||||
If this option is used several times, the last one will be used. (Added in
|
If this option is used several times, the last one will be used. (Added in
|
||||||
curl 7.9.7)
|
curl 7.9.7)
|
||||||
.IP "-u/--user <user:password>"
|
.IP "-u/--user <user:password>"
|
||||||
Specify user and password to use when fetching. See README.curl for detailed
|
Specify user and password to use when fetching. Read the MANUAL for detailed
|
||||||
examples of how to use this. If no password is specified, curl will
|
examples of how to use this. If no password is specified, curl will ask for it
|
||||||
ask for it interactively.
|
interactively.
|
||||||
|
|
||||||
If this option is used several times, the last one will be used.
|
If this option is used several times, the last one will be used.
|
||||||
.IP "-U/--proxy-user <user:password>"
|
.IP "-U/--proxy-user <user:password>"
|
||||||
@@ -614,6 +637,9 @@ info provided by curl.
|
|||||||
Note that if you want to see HTTP headers in the output, \fI-i/--include\fP
|
Note that if you want to see HTTP headers in the output, \fI-i/--include\fP
|
||||||
might be option you're looking for.
|
might be option you're looking for.
|
||||||
|
|
||||||
|
If you think this option still doesn't give you enough details, consider using
|
||||||
|
\fI--trace\fP or \fI--trace-ascii\fP instead.
|
||||||
|
|
||||||
If this option is used twice, the second will again disable verbose.
|
If this option is used twice, the second will again disable verbose.
|
||||||
.IP "-V/--version"
|
.IP "-V/--version"
|
||||||
Displays the full version of curl, libcurl and other 3rd party libraries
|
Displays the full version of curl, libcurl and other 3rd party libraries
|
||||||
@@ -834,7 +860,8 @@ FTP write error. The transfer was reported bad by the server.
|
|||||||
.IP 21
|
.IP 21
|
||||||
FTP quote error. A quote command returned error from the server.
|
FTP quote error. A quote command returned error from the server.
|
||||||
.IP 22
|
.IP 22
|
||||||
HTTP not found. The requested page was not found. This return code only
|
HTTP page not retrieved. The requested url was not found or returned another
|
||||||
|
error with the HTTP error code being 400 or above. This return code only
|
||||||
appears if --fail is used.
|
appears if --fail is used.
|
||||||
.IP 23
|
.IP 23
|
||||||
Write error. Curl couldn't write data to a local filesystem or similar.
|
Write error. Curl couldn't write data to a local filesystem or similar.
|
||||||
|
@@ -22,10 +22,13 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
#include <curl/curl.h>
|
#include <curl/curl.h>
|
||||||
#include <curl/types.h>
|
|
||||||
#include <curl/easy.h>
|
#if (LIBCURL_VERSION_NUM < 0x070907)
|
||||||
|
#error "too old libcurl version, get the latest!"
|
||||||
|
#endif
|
||||||
|
|
||||||
struct data {
|
struct data {
|
||||||
int type;
|
int type;
|
||||||
@@ -34,8 +37,8 @@ struct data {
|
|||||||
FILE *file;
|
FILE *file;
|
||||||
} handle;
|
} handle;
|
||||||
|
|
||||||
/* TODO: We should perhaps document the biggest possible buffer chunk we can
|
/* This is the documented biggest possible buffer chunk we can get from
|
||||||
get from libcurl in one single callback... */
|
libcurl in one single callback! */
|
||||||
char buffer[CURL_MAX_WRITE_SIZE];
|
char buffer[CURL_MAX_WRITE_SIZE];
|
||||||
|
|
||||||
char *readptr; /* read from here */
|
char *readptr; /* read from here */
|
||||||
@@ -62,6 +65,8 @@ size_t write_callback(char *buffer,
|
|||||||
url->readptr += size;
|
url->readptr += size;
|
||||||
url->bytes += size;
|
url->bytes += size;
|
||||||
|
|
||||||
|
fprintf(stderr, "callback %d size bytes\n", size);
|
||||||
|
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -72,6 +77,7 @@ URL_FILE *url_fopen(char *url, char *operation)
|
|||||||
|
|
||||||
URL_FILE *file;
|
URL_FILE *file;
|
||||||
int still_running;
|
int still_running;
|
||||||
|
(void)operation;
|
||||||
|
|
||||||
file = (URL_FILE *)malloc(sizeof(URL_FILE));
|
file = (URL_FILE *)malloc(sizeof(URL_FILE));
|
||||||
if(!file)
|
if(!file)
|
||||||
@@ -134,47 +140,51 @@ size_t url_fread(void *ptr, size_t size, size_t nmemb, URL_FILE *file)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(!still_running) {
|
if(!still_running) {
|
||||||
printf("NO MORE RUNNING AROUND!\n");
|
printf("DONE RUNNING AROUND!\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
FD_ZERO(&fdread);
|
do {
|
||||||
FD_ZERO(&fdwrite);
|
|
||||||
FD_ZERO(&fdexcep);
|
|
||||||
|
|
||||||
/* set a suitable timeout to fail on */
|
FD_ZERO(&fdread);
|
||||||
timeout.tv_sec = 500; /* 5 minutes */
|
FD_ZERO(&fdwrite);
|
||||||
timeout.tv_usec = 0;
|
FD_ZERO(&fdexcep);
|
||||||
|
|
||||||
/* get file descriptors from the transfers */
|
/* set a suitable timeout to fail on */
|
||||||
curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd);
|
timeout.tv_sec = 500; /* 5 minutes */
|
||||||
|
timeout.tv_usec = 0;
|
||||||
|
|
||||||
rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
|
/* get file descriptors from the transfers */
|
||||||
|
curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd);
|
||||||
|
|
||||||
switch(rc) {
|
rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
|
||||||
case -1:
|
|
||||||
/* select error */
|
|
||||||
break;
|
|
||||||
case 0:
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
/* timeout or readable/writable sockets */
|
|
||||||
do {
|
|
||||||
file->m = curl_multi_perform(multi_handle, &still_running);
|
|
||||||
|
|
||||||
if(file->bytes)
|
switch(rc) {
|
||||||
/* we have received data, return that now */
|
case -1:
|
||||||
break;
|
/* select error */
|
||||||
|
break;
|
||||||
|
case 0:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
/* timeout or readable/writable sockets */
|
||||||
|
printf("select() returned %d!\n", rc);
|
||||||
|
do {
|
||||||
|
file->m = curl_multi_perform(multi_handle, &still_running);
|
||||||
|
|
||||||
} while(CURLM_CALL_MULTI_PERFORM == file->m);
|
if(file->bytes)
|
||||||
|
/* we have received data, return that now */
|
||||||
|
break;
|
||||||
|
|
||||||
|
} while(CURLM_CALL_MULTI_PERFORM == file->m);
|
||||||
|
|
||||||
|
|
||||||
if(!still_running)
|
if(!still_running)
|
||||||
printf("NO MORE RUNNING AROUND!\n");
|
printf("DONE RUNNING AROUND!\n");
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
} while(still_running && (file->bytes <= 0));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
printf("(fread) Skip network read\n");
|
printf("(fread) Skip network read\n");
|
||||||
@@ -204,7 +214,10 @@ int main(int argc, char *argv[])
|
|||||||
int nread;
|
int nread;
|
||||||
char buffer[256];
|
char buffer[256];
|
||||||
|
|
||||||
handle = url_fopen("http://www.haxx.se", "r");
|
(void)argc;
|
||||||
|
(void)argv;
|
||||||
|
|
||||||
|
handle = url_fopen("http://curl.haxx.se/", "r");
|
||||||
|
|
||||||
if(!handle) {
|
if(!handle) {
|
||||||
printf("couldn't url_fopen()\n");
|
printf("couldn't url_fopen()\n");
|
||||||
|
@@ -11,6 +11,9 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
#include <curl/curl.h>
|
#include <curl/curl.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This example shows an FTP upload, with a rename of the file just after
|
* This example shows an FTP upload, with a rename of the file just after
|
||||||
|
@@ -74,6 +74,10 @@ int main(int argc, char **argv)
|
|||||||
* bytes big and contains the remote file.
|
* bytes big and contains the remote file.
|
||||||
*
|
*
|
||||||
* Do something nice with it!
|
* Do something nice with it!
|
||||||
|
*
|
||||||
|
* You should be aware of the fact that at this point we might have an
|
||||||
|
* allocated data block, and nothing has yet deallocated that data. So when
|
||||||
|
* you're done with it, you should free() it as a nice application.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@@ -21,7 +21,7 @@
|
|||||||
|
|
||||||
size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream)
|
size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream)
|
||||||
{
|
{
|
||||||
written = fwrite(ptr, size, nmemb, (FILE *)stream);
|
int written = fwrite(ptr, size, nmemb, (FILE *)stream);
|
||||||
return written;
|
return written;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -78,7 +78,8 @@ uploaded.
|
|||||||
.TP
|
.TP
|
||||||
.B CURLINFO_SIZE_DOWNLOAD
|
.B CURLINFO_SIZE_DOWNLOAD
|
||||||
Pass a pointer to a double to receive the total amount of bytes that were
|
Pass a pointer to a double to receive the total amount of bytes that were
|
||||||
downloaded.
|
downloaded. The amount is only for the latest transfer and will be reset again
|
||||||
|
for each new transfer.
|
||||||
.TP
|
.TP
|
||||||
.B CURLINFO_SPEED_DOWNLOAD
|
.B CURLINFO_SPEED_DOWNLOAD
|
||||||
Pass a pointer to a double to receive the average download speed that curl
|
Pass a pointer to a double to receive the average download speed that curl
|
||||||
|
@@ -315,8 +315,16 @@ user.
|
|||||||
.TP
|
.TP
|
||||||
.B CURLOPT_USERPWD
|
.B CURLOPT_USERPWD
|
||||||
Pass a char * as parameter, which should be [user name]:[password] to use for
|
Pass a char * as parameter, which should be [user name]:[password] to use for
|
||||||
the connection. If the password is left out, you will be prompted for it.
|
the connection. If both the colon and password is left out, you will be
|
||||||
\fICURLOPT_PASSWDFUNCTION\fP can be used to set your own prompt function.
|
prompted for it while using a colon with no password will make libcurl use an
|
||||||
|
empty password. \fICURLOPT_PASSWDFUNCTION\fP can be used to set your own
|
||||||
|
prompt function.
|
||||||
|
|
||||||
|
When using HTTP and CURLOPT_FOLLOWLOCATION, libcurl might perform several
|
||||||
|
requests to possibly different hosts. libcurl will only send this user and
|
||||||
|
password information to hosts using the initial host name, so if libcurl
|
||||||
|
follows locations to other hosts it will not send the user and password to
|
||||||
|
those. This is enforced to prevent accidental information leakage.
|
||||||
.TP
|
.TP
|
||||||
.B CURLOPT_PROXYUSERPWD
|
.B CURLOPT_PROXYUSERPWD
|
||||||
Pass a char * as parameter, which should be [user name]:[password] to use for
|
Pass a char * as parameter, which should be [user name]:[password] to use for
|
||||||
@@ -327,10 +335,18 @@ prompt function.
|
|||||||
.SH HTTP OPTIONS
|
.SH HTTP OPTIONS
|
||||||
.TP 0.4i
|
.TP 0.4i
|
||||||
.B CURLOPT_ENCODING
|
.B CURLOPT_ENCODING
|
||||||
Two encodings are supported \fIdentity\fP, which does nothing, and
|
Sets the contents of the Accept-Encoding: header sent in an HTTP
|
||||||
\fIdeflate\fP to request the server to compress its reponse using the
|
request, and enables decoding of a response when a Content-Encoding:
|
||||||
zlib algorithm. This is not an order, the server may or may not do it.
|
header is received. Three encodings are supported: \fIidentity\fP,
|
||||||
See the special file lib/README.encoding for details.
|
which does nothing, \fIdeflate\fP which requests the server to
|
||||||
|
compress its response using the zlib algorithm, and \fIgzip\fP which
|
||||||
|
requests the gzip algorithm. If a zero-length string is set, then an
|
||||||
|
Accept-Encoding: header containing all supported encodings is sent.
|
||||||
|
|
||||||
|
This is a request, not an order; the server may or may not do it. This
|
||||||
|
option must be set (to any non-NULL value) or else any unsolicited
|
||||||
|
encoding done by the server is ignored. See the special file
|
||||||
|
lib/README.encoding for details.
|
||||||
.TP
|
.TP
|
||||||
.B CURLOPT_FOLLOWLOCATION
|
.B CURLOPT_FOLLOWLOCATION
|
||||||
A non-zero parameter tells the library to follow any Location: header that the
|
A non-zero parameter tells the library to follow any Location: header that the
|
||||||
@@ -341,6 +357,11 @@ new location and follow new Location: headers all the way until no more such
|
|||||||
headers are returned. \fICURLOPT_MAXREDIRS\fP can be used to limit the number
|
headers are returned. \fICURLOPT_MAXREDIRS\fP can be used to limit the number
|
||||||
of redirects libcurl will follow.
|
of redirects libcurl will follow.
|
||||||
.TP
|
.TP
|
||||||
|
.B CURLOPT_UNRESTRICTED_AUTH
|
||||||
|
A non-zero parameter tells the library it can continue to send authentication
|
||||||
|
(user+password) when following locations, even when hostname changed. Note
|
||||||
|
that this is meaningful only when setting \fICURLOPT_FOLLOWLOCATION\fP.
|
||||||
|
.TP
|
||||||
.B CURLOPT_MAXREDIRS
|
.B CURLOPT_MAXREDIRS
|
||||||
Pass a long. The set number will be the redirection limit. If that many
|
Pass a long. The set number will be the redirection limit. If that many
|
||||||
redirections have been followed, the next redirect will cause an error
|
redirections have been followed, the next redirect will cause an error
|
||||||
@@ -361,9 +382,14 @@ will imply this option.
|
|||||||
.TP
|
.TP
|
||||||
.B CURLOPT_POSTFIELDS
|
.B CURLOPT_POSTFIELDS
|
||||||
Pass a char * as parameter, which should be the full data to post in a HTTP
|
Pass a char * as parameter, which should be the full data to post in a HTTP
|
||||||
post operation. This is a normal application/x-www-form-urlencoded kind, which
|
post operation. You need to make sure that the data is formatted the way you
|
||||||
is the most commonly used one by HTML forms. See also the CURLOPT_POST. Since
|
want the server to receive it. libcurl will not convert or encode it for
|
||||||
7.8, using CURLOPT_POSTFIELDS implies CURLOPT_POST.
|
you. Most web servers will assume this data to be url-encoded. Take note.
|
||||||
|
|
||||||
|
This POST is a normal application/x-www-form-urlencoded kind (and libcurl will
|
||||||
|
set that Content-Type by default when this option is used), which is the most
|
||||||
|
commonly used one by HTML forms. See also the CURLOPT_POST. Using
|
||||||
|
CURLOPT_POSTFIELDS implies CURLOPT_POST.
|
||||||
|
|
||||||
\fBNote:\fP to make multipart/formdata posts (aka rfc1867-posts), check out
|
\fBNote:\fP to make multipart/formdata posts (aka rfc1867-posts), check out
|
||||||
the \fICURLOPT_HTTPPOST\fP option.
|
the \fICURLOPT_HTTPPOST\fP option.
|
||||||
@@ -460,6 +486,13 @@ is called. If no cookies are known, no file will be created. Specify "-" to
|
|||||||
instead have the cookies written to stdout. Using this option also enables
|
instead have the cookies written to stdout. Using this option also enables
|
||||||
cookies for this session, so if you for example follow a location it will make
|
cookies for this session, so if you for example follow a location it will make
|
||||||
matching cookies get sent accordingly. (Added in 7.9)
|
matching cookies get sent accordingly. (Added in 7.9)
|
||||||
|
|
||||||
|
.B NOTE
|
||||||
|
If the cookie jar file can't be created or written to (when the
|
||||||
|
curl_easy_cleanup() is called), libcurl will not and cannot report an error
|
||||||
|
for this. Using CURLOPT_VERBOSE or CURLOPT_DEBUGFUNCTION will get a warning to
|
||||||
|
display, but that is the only visible feedback you get about this possibly
|
||||||
|
lethal situation.
|
||||||
.TP
|
.TP
|
||||||
.B CURLOPT_TIMECONDITION
|
.B CURLOPT_TIMECONDITION
|
||||||
Pass a long as parameter. This defines how the CURLOPT_TIMEVALUE time value is
|
Pass a long as parameter. This defines how the CURLOPT_TIMEVALUE time value is
|
||||||
@@ -502,6 +535,9 @@ tells the remote server to connect to our specified IP address. The string may
|
|||||||
be a plain IP address, a host name, an network interface name (under Unix) or
|
be a plain IP address, a host name, an network interface name (under Unix) or
|
||||||
just a '-' letter to let the library use your systems default IP
|
just a '-' letter to let the library use your systems default IP
|
||||||
address. Default FTP operations are passive, and thus won't use PORT.
|
address. Default FTP operations are passive, and thus won't use PORT.
|
||||||
|
|
||||||
|
You disable PORT again and go back to using the passive version by setting
|
||||||
|
this option to NULL.
|
||||||
.TP
|
.TP
|
||||||
.B CURLOPT_QUOTE
|
.B CURLOPT_QUOTE
|
||||||
Pass a pointer to a linked list of FTP commands to pass to the server prior to
|
Pass a pointer to a linked list of FTP commands to pass to the server prior to
|
||||||
@@ -539,6 +575,13 @@ and symbolic links.
|
|||||||
A non-zero parameter tells the library to append to the remote file instead of
|
A non-zero parameter tells the library to append to the remote file instead of
|
||||||
overwrite it. This is only useful when uploading to a ftp site.
|
overwrite it. This is only useful when uploading to a ftp site.
|
||||||
.TP
|
.TP
|
||||||
|
.B CURLOPT_FTP_USE_EPRT
|
||||||
|
Pass a long. If the value is non-zero, it tells curl to use the EPRT (and
|
||||||
|
LPRT) command when doing active FTP downloads (which is enabled by
|
||||||
|
CURLOPT_FTPPORT). Using EPRT means that it will first attempt to use EPRT and
|
||||||
|
then LPRT before using PORT, but if you pass FALSE (zero) to this option, it
|
||||||
|
will not try using EPRT or LPRT, only plain PORT. (Added in 7.10.5)
|
||||||
|
.TP
|
||||||
.B CURLOPT_FTP_USE_EPSV
|
.B CURLOPT_FTP_USE_EPSV
|
||||||
Pass a long. If the value is non-zero, it tells curl to use the EPSV command
|
Pass a long. If the value is non-zero, it tells curl to use the EPSV command
|
||||||
when doing passive FTP downloads (which it always does by default). Using EPSV
|
when doing passive FTP downloads (which it always does by default). Using EPSV
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
.\" $Id$
|
.\" $Id$
|
||||||
.\"
|
.\"
|
||||||
.TH curl_multi_info_read 3 "1 March 2002" "libcurl 7.9.5" "libcurl Manual"
|
.TH curl_multi_info_read 3 "27 Feb 2002" "libcurl 7.10.3" "libcurl Manual"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
curl_multi_info_read - read multi stack informationals
|
curl_multi_info_read - read multi stack informationals
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
@@ -10,15 +10,15 @@ CURLMsg *curl_multi_info_read( CURLM *multi_handle,
|
|||||||
int *msgs_in_queue);
|
int *msgs_in_queue);
|
||||||
.ad
|
.ad
|
||||||
.SH DESCRIPTION
|
.SH DESCRIPTION
|
||||||
Ask the multi handle if there's any messages/informationals from the
|
Ask the multi handle if there are any messages/informationals from the
|
||||||
individual transfers. Messages include informationals such as an error code
|
individual transfers. Messages may include informationals such as an error
|
||||||
from the transfer or just the fact that a transfer is completed. More details
|
code from the transfer or just the fact that a transfer is completed. More
|
||||||
on these should be written down as well.
|
details on these should be written down as well.
|
||||||
|
|
||||||
Repeated calls to this function will return a new struct each time, until a
|
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
|
NULL is returned as a signal that there is no more to get at this point. The
|
||||||
get at this point. The integer pointed to with \fImsgs_in_queue\fP will
|
integer pointed to with \fImsgs_in_queue\fP will contain the number of
|
||||||
contain the number of remaining messages after this function was called.
|
remaining messages after this function was called.
|
||||||
|
|
||||||
The data the returned pointer points to will not survive calling
|
The data the returned pointer points to will not survive calling
|
||||||
curl_multi_cleanup().
|
curl_multi_cleanup().
|
||||||
@@ -26,10 +26,19 @@ curl_multi_cleanup().
|
|||||||
The 'CURLMsg' struct is very simple and only contain very basic informations.
|
The 'CURLMsg' struct is very simple and only contain very basic informations.
|
||||||
If more involved information is wanted, the particular "easy handle" in
|
If more involved information is wanted, the particular "easy handle" in
|
||||||
present in that struct and can thus be used in subsequent regular
|
present in that struct and can thus be used in subsequent regular
|
||||||
curl_easy_getinfo() calls (or similar).
|
curl_easy_getinfo() calls (or similar):
|
||||||
|
|
||||||
|
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;
|
||||||
|
};
|
||||||
.SH "RETURN VALUE"
|
.SH "RETURN VALUE"
|
||||||
A pointer to a filled-in struct, or NULL if it failed or ran out of
|
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
|
structs. It also writes the number of messages left in the queue (after this
|
||||||
read) in the integer the second argument points to.
|
read) in the integer the second argument points to.
|
||||||
.SH "SEE ALSO"
|
.SH "SEE ALSO"
|
||||||
.BR curl_multi_cleanup "(3)," curl_multi_init "(3)," curl_multi_perform "(3)"
|
.BR curl_multi_cleanup "(3), " curl_multi_init "(3), " curl_multi_perform "(3)"
|
||||||
|
@@ -14,6 +14,9 @@ specified easy handle be removed from this multi handle's control.
|
|||||||
|
|
||||||
When the easy handle has been removed from a multi stack, it is again
|
When the easy handle has been removed from a multi stack, it is again
|
||||||
perfectly legal to invoke \fIcurl_easy_perform()\fP on this easy handle.
|
perfectly legal to invoke \fIcurl_easy_perform()\fP on this easy handle.
|
||||||
|
|
||||||
|
Removing a handle while being used, will effectively halt all transfers in
|
||||||
|
progress.
|
||||||
.SH RETURN VALUE
|
.SH RETURN VALUE
|
||||||
CURLMcode type, general libcurl multi interface error code.
|
CURLMcode type, general libcurl multi interface error code.
|
||||||
.SH "SEE ALSO"
|
.SH "SEE ALSO"
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
.\" nroff -man [file]
|
.\" nroff -man [file]
|
||||||
.\" $Id$
|
.\" $Id$
|
||||||
.\"
|
.\"
|
||||||
.TH curl_slist_append 3 "5 March 2001" "libcurl 7.0" "libcurl Manual"
|
.TH curl_slist_append 3 "21 Feb 2003" "libcurl 7.10.4" "libcurl Manual"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
curl_slist_append - add a string to an slist
|
curl_slist_append - add a string to an slist
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
@@ -13,17 +13,26 @@ curl_slist_append - add a string to an slist
|
|||||||
.ad
|
.ad
|
||||||
.SH DESCRIPTION
|
.SH DESCRIPTION
|
||||||
curl_slist_append() appends a specified string to a linked list of
|
curl_slist_append() appends a specified string to a linked list of
|
||||||
strings. The existing
|
strings. The existing \fIlist\fP should be passed as the first argument while
|
||||||
.I list
|
the new list is returned from this function. The specified \fIstring\fP has
|
||||||
should be passed as the first argument while the new list is returned from
|
been appended when this function returns.
|
||||||
this function. The specified
|
|
||||||
.I string
|
The list should be freed again (after usage) with \fBcurl_slist_free_all()\fP.
|
||||||
has been appended when this function returns.
|
|
||||||
.SH RETURN VALUE
|
.SH RETURN VALUE
|
||||||
A null pointer is returned if anything went wrong, otherwise the new list
|
A null pointer is returned if anything went wrong, otherwise the new list
|
||||||
pointer is returned.
|
pointer is returned.
|
||||||
|
.SH EXAMPLE
|
||||||
|
CURL handle;
|
||||||
|
curl_slist *slist=NULL;
|
||||||
|
|
||||||
|
slist = curl_slist_append(slist, "pragma:");
|
||||||
|
curl_easy_setopt(handle, CURLOPT_HTTPHEADER, slist);
|
||||||
|
|
||||||
|
curl_easy_perform(handle);
|
||||||
|
|
||||||
|
curl_slist_free_all(slist); /* free the list again */
|
||||||
.SH "SEE ALSO"
|
.SH "SEE ALSO"
|
||||||
.BR curl_slist_free_all "(3), "
|
.BR curl_slist_free_all "(3), "
|
||||||
.SH BUGS
|
.SH BUGS
|
||||||
Surely there are some, you tell me!
|
None.
|
||||||
|
|
||||||
|
@@ -7,7 +7,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2003, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -619,6 +619,16 @@ typedef enum {
|
|||||||
/* Set aliases for HTTP 200 in the HTTP Response header */
|
/* Set aliases for HTTP 200 in the HTTP Response header */
|
||||||
CINIT(HTTP200ALIASES, OBJECTPOINT, 104),
|
CINIT(HTTP200ALIASES, OBJECTPOINT, 104),
|
||||||
|
|
||||||
|
/* Continue to send authentication (user+password) when following locations,
|
||||||
|
even when hostname changed. This can potentionally send off the name
|
||||||
|
and password to whatever host the server decides. */
|
||||||
|
CINIT(UNRESTRICTED_AUTH, LONG, 105),
|
||||||
|
|
||||||
|
/* Specificly switch on or off the FTP engine's use of the EPRT command ( it
|
||||||
|
also disables the LPRT attempt). By default, those ones will always be
|
||||||
|
attempted before the good old traditional PORT command. */
|
||||||
|
CINIT(FTP_USE_EPRT, LONG, 106),
|
||||||
|
|
||||||
CURLOPT_LASTENTRY /* the last unused */
|
CURLOPT_LASTENTRY /* the last unused */
|
||||||
} CURLoption;
|
} CURLoption;
|
||||||
|
|
||||||
@@ -696,8 +706,6 @@ typedef enum {
|
|||||||
*/
|
*/
|
||||||
extern int (curl_strequal)(const char *s1, const char *s2);
|
extern int (curl_strequal)(const char *s1, const char *s2);
|
||||||
extern int (curl_strnequal)(const char *s1, const char *s2, size_t n);
|
extern int (curl_strnequal)(const char *s1, const char *s2, size_t n);
|
||||||
#define strequal(a,b) curl_strequal(a,b)
|
|
||||||
#define strnequal(a,b,c) curl_strnequal(a,b,c)
|
|
||||||
|
|
||||||
/* DEPRECATED function to build formdata */
|
/* DEPRECATED function to build formdata */
|
||||||
int curl_formparse(char *, struct curl_httppost **,
|
int curl_formparse(char *, struct curl_httppost **,
|
||||||
@@ -811,8 +819,8 @@ CURLcode curl_global_init(long flags);
|
|||||||
void curl_global_cleanup(void);
|
void curl_global_cleanup(void);
|
||||||
|
|
||||||
/* This is the version number */
|
/* This is the version number */
|
||||||
#define LIBCURL_VERSION "7.10.3"
|
#define LIBCURL_VERSION "7.10.5"
|
||||||
#define LIBCURL_VERSION_NUM 0x070a03
|
#define LIBCURL_VERSION_NUM 0x070a05
|
||||||
|
|
||||||
/* linked-list structure for the CURLOPT_QUOTE option (and other) */
|
/* linked-list structure for the CURLOPT_QUOTE option (and other) */
|
||||||
struct curl_slist {
|
struct curl_slist {
|
||||||
@@ -902,10 +910,15 @@ typedef enum {
|
|||||||
/* Different data locks for a single share */
|
/* Different data locks for a single share */
|
||||||
typedef enum {
|
typedef enum {
|
||||||
CURL_LOCK_DATA_NONE = 0,
|
CURL_LOCK_DATA_NONE = 0,
|
||||||
CURL_LOCK_DATA_COOKIE = 1,
|
/* CURL_LOCK_DATA_SHARE is used internaly to say that
|
||||||
CURL_LOCK_DATA_DNS = 2,
|
* the locking is just made to change the internal state of the share
|
||||||
CURL_LOCK_DATA_SSL_SESSION = 3,
|
* itself.
|
||||||
CURL_LOCK_DATA_CONNECT = 4,
|
*/
|
||||||
|
CURL_LOCK_DATA_SHARE,
|
||||||
|
CURL_LOCK_DATA_COOKIE,
|
||||||
|
CURL_LOCK_DATA_DNS,
|
||||||
|
CURL_LOCK_DATA_SSL_SESSION,
|
||||||
|
CURL_LOCK_DATA_CONNECT,
|
||||||
CURL_LOCK_DATA_LAST
|
CURL_LOCK_DATA_LAST
|
||||||
} curl_lock_data;
|
} curl_lock_data;
|
||||||
|
|
||||||
|
@@ -7,7 +7,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2003, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
|
@@ -1,54 +1,25 @@
|
|||||||
/*************************************************************************
|
/***************************************************************************
|
||||||
|
* _ _ ____ _
|
||||||
|
* Project ___| | | | _ \| |
|
||||||
|
* / __| | | | |_) | |
|
||||||
|
* | (__| |_| | _ <| |___
|
||||||
|
* \___|\___/|_| \_\_____|
|
||||||
|
*
|
||||||
|
* Copyright (C) 1998 - 2003, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
|
*
|
||||||
|
* This software is licensed as described in the file COPYING, which
|
||||||
|
* you should have received as part of this distribution. The terms
|
||||||
|
* are also available at http://curl.haxx.se/docs/copyright.html.
|
||||||
|
*
|
||||||
|
* 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 COPYING file.
|
||||||
|
*
|
||||||
|
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||||
|
* KIND, either express or implied.
|
||||||
*
|
*
|
||||||
* $Id$
|
* $Id$
|
||||||
*
|
***************************************************************************/
|
||||||
* Permission to use, copy, modify, and distribute this software for any
|
|
||||||
* purpose with or without fee is hereby granted, provided that the above
|
|
||||||
* copyright notice and this permission notice appear in all copies.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
|
|
||||||
* WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
|
|
||||||
* MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE AUTHORS AND
|
|
||||||
* CONTRIBUTORS ACCEPT NO RESPONSIBILITY IN ANY CONCEIVABLE MANNER.
|
|
||||||
*
|
|
||||||
*************************************************************************
|
|
||||||
*
|
|
||||||
* Preliminary documentation
|
|
||||||
*
|
|
||||||
* printf conversions:
|
|
||||||
*
|
|
||||||
* conversion ::= '%%' | '%' [position] ( number | float | string )
|
|
||||||
* position ::= digits '$'
|
|
||||||
* number ::= [number-flags] ( 'd' | 'i' | 'o' | 'x' | 'X' | 'u')
|
|
||||||
* number-flags ::= 'h' | 'l' | 'L' ...
|
|
||||||
* float ::= [float-flags] ( 'f' | 'e' | 'E' | 'g' | 'G' )
|
|
||||||
* string ::= [string-flags] 's'
|
|
||||||
* string-flags ::= padding | '#'
|
|
||||||
* digits ::= (digit)+
|
|
||||||
* digit ::= 0-9
|
|
||||||
*
|
|
||||||
* c
|
|
||||||
* p
|
|
||||||
* n
|
|
||||||
*
|
|
||||||
* qualifiers
|
|
||||||
*
|
|
||||||
* - : left adjustment
|
|
||||||
* + : show sign
|
|
||||||
* SPACE : padding
|
|
||||||
* # : alterative
|
|
||||||
* . : precision
|
|
||||||
* * : width
|
|
||||||
* 0 : padding / size
|
|
||||||
* 1-9 : size
|
|
||||||
* h : short
|
|
||||||
* l : long
|
|
||||||
* ll : longlong
|
|
||||||
* L : long double
|
|
||||||
* Z : long / longlong
|
|
||||||
* q : longlong
|
|
||||||
*
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
#ifndef H_MPRINTF
|
#ifndef H_MPRINTF
|
||||||
#define H_MPRINTF
|
#define H_MPRINTF
|
||||||
|
@@ -7,7 +7,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2003, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -44,19 +44,23 @@
|
|||||||
o Enable the application to select() on its own file descriptors and curl's
|
o Enable the application to select() on its own file descriptors and curl's
|
||||||
file descriptors simultaneous easily.
|
file descriptors simultaneous easily.
|
||||||
|
|
||||||
Example sources using this interface is here: ../multi/
|
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#if defined(WIN32) && !defined(__GNUC__) || defined(__MINGW32__)
|
#if defined(WIN32) && !defined(__GNUC__) || defined(__MINGW32__)
|
||||||
#include <winsock.h>
|
#include <winsock.h>
|
||||||
#else
|
#else
|
||||||
|
#include <sys/select.h>
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
|
#include <sys/types.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "curl.h"
|
#include "curl.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
typedef void CURLM;
|
typedef void CURLM;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
@@ -71,7 +75,7 @@ typedef enum {
|
|||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
CURLMSG_NONE, /* first, not used */
|
CURLMSG_NONE, /* first, not used */
|
||||||
CURLMSG_DONE, /* This easy handle has completed. 'whatever' points to
|
CURLMSG_DONE, /* This easy handle has completed. 'result' contains
|
||||||
the CURLcode of the transfer */
|
the CURLcode of the transfer */
|
||||||
CURLMSG_LAST /* last, not used */
|
CURLMSG_LAST /* last, not used */
|
||||||
} CURLMSG;
|
} CURLMSG;
|
||||||
@@ -187,4 +191,8 @@ CURLMcode curl_multi_cleanup(CURLM *multi_handle);
|
|||||||
CURLMsg *curl_multi_info_read(CURLM *multi_handle,
|
CURLMsg *curl_multi_info_read(CURLM *multi_handle,
|
||||||
int *msgs_in_queue);
|
int *msgs_in_queue);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
} /* end of extern "C" */
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@@ -7,7 +7,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2003, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
|
@@ -7,7 +7,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2003, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
|
@@ -7,3 +7,4 @@ Makefile
|
|||||||
config.h
|
config.h
|
||||||
stamp-*
|
stamp-*
|
||||||
ca-bundle.h
|
ca-bundle.h
|
||||||
|
getdate.c
|
||||||
|
@@ -66,7 +66,7 @@ getpass.c netrc.c telnet.h getinfo.c getinfo.h transfer.c strequal.c \
|
|||||||
strequal.h easy.c security.h security.c krb4.c krb4.h memdebug.c \
|
strequal.h easy.c security.h security.c krb4.c krb4.h memdebug.c \
|
||||||
memdebug.h inet_ntoa_r.h http_chunks.c http_chunks.h strtok.c strtok.h \
|
memdebug.h inet_ntoa_r.h http_chunks.c http_chunks.h strtok.c strtok.h \
|
||||||
connect.c connect.h llist.c llist.h hash.c hash.h multi.c \
|
connect.c connect.h llist.c llist.h hash.c hash.h multi.c \
|
||||||
content_encoding.c content_encoding.h share.h
|
content_encoding.c content_encoding.h share.c share.h
|
||||||
|
|
||||||
noinst_HEADERS = setup.h transfer.h
|
noinst_HEADERS = setup.h transfer.h
|
||||||
|
|
||||||
|
@@ -61,6 +61,7 @@ SOURCES = \
|
|||||||
strtok.c \
|
strtok.c \
|
||||||
connect.c \
|
connect.c \
|
||||||
hash.c \
|
hash.c \
|
||||||
|
share.c \
|
||||||
llist.c \
|
llist.c \
|
||||||
multi.c \
|
multi.c \
|
||||||
content_encoding.c
|
content_encoding.c
|
||||||
|
@@ -30,6 +30,7 @@
|
|||||||
+strtok.obj &
|
+strtok.obj &
|
||||||
+connect.obj &
|
+connect.obj &
|
||||||
+hash.obj &
|
+hash.obj &
|
||||||
|
+share.obj &
|
||||||
+llist.obj &
|
+llist.obj &
|
||||||
+multi.obj &
|
+multi.obj &
|
||||||
+content_encoding.obj
|
+content_encoding.obj
|
||||||
|
@@ -12,8 +12,8 @@ AR = ar
|
|||||||
RM = rm -f
|
RM = rm -f
|
||||||
RANLIB = ranlib
|
RANLIB = ranlib
|
||||||
STRIP = strip -g
|
STRIP = strip -g
|
||||||
OPENSSL_PATH = ../../openssl-0.9.6g
|
OPENSSL_PATH = ../../openssl-0.9.7a
|
||||||
ZLIB_PATH = ../../zlib-1.1.3
|
ZLIB_PATH = ../../zlib-1.1.4
|
||||||
|
|
||||||
########################################################
|
########################################################
|
||||||
## Nothing more to do below this line!
|
## Nothing more to do below this line!
|
||||||
@@ -22,12 +22,12 @@ INCLUDES = -I. -I.. -I../include -I../src
|
|||||||
CFLAGS = -g -O2 -DMINGW32
|
CFLAGS = -g -O2 -DMINGW32
|
||||||
ifdef SSL
|
ifdef SSL
|
||||||
INCLUDES += -I"$(OPENSSL_PATH)/outinc" -I"$(OPENSSL_PATH)/outinc/openssl"
|
INCLUDES += -I"$(OPENSSL_PATH)/outinc" -I"$(OPENSSL_PATH)/outinc/openssl"
|
||||||
CFLAGS += -DUSE_SSLEAY
|
CFLAGS += -DUSE_SSLEAY -DHAVE_OPENSSL_ENGINE_H
|
||||||
DLL_LIBS = -L$(OPENSSL_PATH)/out -leay32 -lssl32 -lRSAglue
|
DLL_LIBS = -L$(OPENSSL_PATH)/out -leay32 -lssl32
|
||||||
endif
|
endif
|
||||||
ifdef ZLIB
|
ifdef ZLIB
|
||||||
INCLUDES += -I"$(ZLIB_PATH)"
|
INCLUDES += -I"$(ZLIB_PATH)"
|
||||||
CFLAGS += -DHAVE_ZLIB
|
CFLAGS += -DHAVE_LIBZ -DHAVE_ZLIB_H
|
||||||
DLL_LIBS += -L$(ZLIB_PATH) -lz
|
DLL_LIBS += -L$(ZLIB_PATH) -lz
|
||||||
endif
|
endif
|
||||||
COMPILE = $(CC) $(INCLUDES) $(CFLAGS)
|
COMPILE = $(CC) $(INCLUDES) $(CFLAGS)
|
||||||
@@ -42,7 +42,7 @@ libcurl_a_SOURCES = arpa_telnet.h file.c getpass.h netrc.h timeval.c base64.c \
|
|||||||
ldap.h ssluse.h escape.c getenv.h mprintf.c telnet.c escape.h getpass.c netrc.c \
|
ldap.h ssluse.h escape.c getenv.h mprintf.c telnet.c escape.h getpass.c netrc.c \
|
||||||
telnet.h getinfo.c strequal.c strequal.h easy.c security.h \
|
telnet.h getinfo.c strequal.c strequal.h easy.c security.h \
|
||||||
security.c krb4.h krb4.c memdebug.h memdebug.c inet_ntoa_r.h http_chunks.h http_chunks.c \
|
security.c krb4.h krb4.c memdebug.h memdebug.c inet_ntoa_r.h http_chunks.h http_chunks.c \
|
||||||
strtok.c connect.c hash.c llist.c multi.c \
|
strtok.c connect.c hash.c llist.c multi.c share.c share.h\
|
||||||
content_encoding.h content_encoding.c
|
content_encoding.h content_encoding.c
|
||||||
|
|
||||||
libcurl_a_OBJECTS = file.o timeval.o base64.o hostip.o progress.o \
|
libcurl_a_OBJECTS = file.o timeval.o base64.o hostip.o progress.o \
|
||||||
@@ -50,7 +50,7 @@ libcurl_a_OBJECTS = file.o timeval.o base64.o hostip.o progress.o \
|
|||||||
speedcheck.o getdate.o transfer.o ldap.o ssluse.o version.o \
|
speedcheck.o getdate.o transfer.o ldap.o ssluse.o version.o \
|
||||||
getenv.o escape.o mprintf.o telnet.o getpass.o netrc.o getinfo.o \
|
getenv.o escape.o mprintf.o telnet.o getpass.o netrc.o getinfo.o \
|
||||||
strequal.o easy.o security.o krb4.o memdebug.o http_chunks.o \
|
strequal.o easy.o security.o krb4.o memdebug.o http_chunks.o \
|
||||||
strtok.o connect.o hash.o llist.o multi.o \
|
strtok.o connect.o hash.o llist.o multi.o share.o \
|
||||||
content_encoding.o
|
content_encoding.o
|
||||||
|
|
||||||
LIBRARIES = $(libcurl_a_LIBRARIES)
|
LIBRARIES = $(libcurl_a_LIBRARIES)
|
||||||
|
@@ -33,7 +33,7 @@
|
|||||||
LIB_NAME = libcurl
|
LIB_NAME = libcurl
|
||||||
LIB_NAME_DEBUG = libcurld
|
LIB_NAME_DEBUG = libcurld
|
||||||
!IFNDEF OPENSSL_PATH
|
!IFNDEF OPENSSL_PATH
|
||||||
OPENSSL_PATH = ../../openssl-0.9.6
|
OPENSSL_PATH = ../../openssl-0.9.7a
|
||||||
!ENDIF
|
!ENDIF
|
||||||
|
|
||||||
#############################################################
|
#############################################################
|
||||||
@@ -48,7 +48,8 @@ LNKDLL = link.exe /DLL /def:libcurl.def
|
|||||||
LNKLIB = link.exe -lib
|
LNKLIB = link.exe -lib
|
||||||
LFLAGS = /nologo
|
LFLAGS = /nologo
|
||||||
LINKLIBS = ws2_32.lib winmm.lib
|
LINKLIBS = ws2_32.lib winmm.lib
|
||||||
SSLLIBS = libeay32.lib ssleay32.lib RSAglue.lib
|
SSLLIBS = libeay32.lib ssleay32.lib
|
||||||
|
# RSAglue.lib was formerly needed in the SSLLIBS
|
||||||
CFGSET = FALSE
|
CFGSET = FALSE
|
||||||
|
|
||||||
######################
|
######################
|
||||||
@@ -200,6 +201,7 @@ X_OBJS= \
|
|||||||
$(DIROBJ)\connect.obj \
|
$(DIROBJ)\connect.obj \
|
||||||
$(DIROBJ)\hash.obj \
|
$(DIROBJ)\hash.obj \
|
||||||
$(DIROBJ)\llist.obj \
|
$(DIROBJ)\llist.obj \
|
||||||
|
$(DIROBJ)\share.obj \
|
||||||
$(DIROBJ)\multi.obj
|
$(DIROBJ)\multi.obj
|
||||||
|
|
||||||
all : $(TARGET)
|
all : $(TARGET)
|
||||||
|
@@ -5,15 +5,15 @@
|
|||||||
|
|
||||||
HTTP/1.1 [RFC 2616] specifies that a client may request that a server encode
|
HTTP/1.1 [RFC 2616] specifies that a client may request that a server encode
|
||||||
its response. This is usually used to compress a response using one of a set
|
its response. This is usually used to compress a response using one of a set
|
||||||
of commonly available compression techniques. These schemes are `deflate'
|
of commonly available compression techniques. These schemes are `deflate' (the
|
||||||
(the zlib algorithm), `gzip' and `compress' [sec 3.5, RFC 2616]. A client
|
zlib algorithm), `gzip' and `compress' [sec 3.5, RFC 2616]. A client requests
|
||||||
requests that the sever perform an encoding by including an Accept-Encoding
|
that the sever perform an encoding by including an Accept-Encoding header in
|
||||||
header in the request document. The value of the header should be one of the
|
the request document. The value of the header should be one of the recognized
|
||||||
recognized tokens `deflate', ... (there's a way to register new
|
tokens `deflate', ... (there's a way to register new schemes/tokens, see sec
|
||||||
schemes/tokens, see sec 3.5 of the spec). A server MAY honor the client's
|
3.5 of the spec). A server MAY honor the client's encoding request. When a
|
||||||
encoding request. When a response is encoded, the server includes a
|
response is encoded, the server includes a Content-Encoding header in the
|
||||||
Content-Encoding header in the response. The value of the Content-Encoding
|
response. The value of the Content-Encoding header indicates which scheme was
|
||||||
header indicates which scheme was used to encode the data.
|
used to encode the data.
|
||||||
|
|
||||||
A client may tell a server that it can understand several different encoding
|
A client may tell a server that it can understand several different encoding
|
||||||
schemes. In this case the server may choose any one of those and use it to
|
schemes. In this case the server may choose any one of those and use it to
|
||||||
@@ -24,11 +24,10 @@ information on the Accept-Encoding header.
|
|||||||
|
|
||||||
* Current support for content encoding:
|
* Current support for content encoding:
|
||||||
|
|
||||||
I added support for the 'deflate' content encoding to both libcurl and curl.
|
Support for the 'deflate' and 'gzip' content encoding are supported by
|
||||||
Both regular and chunked transfers should work although I've tested only the
|
libcurl. Both regular and chunked transfers should work fine. The library
|
||||||
former. The library zlib is required for this feature. Places where I
|
zlib is required for this feature. 'deflate' support was added by James
|
||||||
modified the source code are commented and typically include my initials and
|
Gallagher, and support for the 'gzip' encoding was added by Dan Fandrich.
|
||||||
the date (e.g., 08/29/02 jhrg).
|
|
||||||
|
|
||||||
* The libcurl interface:
|
* The libcurl interface:
|
||||||
|
|
||||||
@@ -39,11 +38,18 @@ To cause libcurl to request a content encoding use:
|
|||||||
where <string> is the intended value of the Accept-Encoding header.
|
where <string> is the intended value of the Accept-Encoding header.
|
||||||
|
|
||||||
Currently, libcurl only understands how to process responses that use the
|
Currently, libcurl only understands how to process responses that use the
|
||||||
`deflate' Content-Encoding, so the only value for CURLOPT_ENCODING that will
|
"deflate" or "gzip" Content-Encoding, so the only values for CURLOPT_ENCODING
|
||||||
work (besides "identity," which does nothing) is "deflate." If a response is
|
that will work (besides "identity," which does nothing) are "deflate" and
|
||||||
encoded using either the `gzip' or `compress' methods, libcurl will return an
|
"gzip" If a response is encoded using the "compress" or methods, libcurl will
|
||||||
error indicating that the response could not be decoded. If <string> is null
|
return an error indicating that the response could not be decoded. If
|
||||||
or empty no Accept-Encoding header is generated.
|
<string> is NULL no Accept-Encoding header is generated. If <string> is a
|
||||||
|
zero-length string, then an Accept-Encoding header containing all supported
|
||||||
|
encodings will be generated.
|
||||||
|
|
||||||
|
The CURLOPT_ENCODING must be set to any non-NULL value for content to be
|
||||||
|
automatically decoded. If it is not set and the server still sends encoded
|
||||||
|
content (despite not having been asked), the data is returned in its raw form
|
||||||
|
and the Content-Encoding type is not checked.
|
||||||
|
|
||||||
* The curl interface:
|
* The curl interface:
|
||||||
|
|
||||||
@@ -51,3 +57,4 @@ Use the --compressed option with curl to cause it to ask servers to compress
|
|||||||
responses using deflate.
|
responses using deflate.
|
||||||
|
|
||||||
James Gallagher <jgallagher@gso.uri.edu>
|
James Gallagher <jgallagher@gso.uri.edu>
|
||||||
|
Dan Fandrich <dan@coneharvesters.com>
|
||||||
|
@@ -7,7 +7,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2003, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -26,15 +26,15 @@
|
|||||||
/*
|
/*
|
||||||
* Telnet option defines. Add more here if in need.
|
* Telnet option defines. Add more here if in need.
|
||||||
*/
|
*/
|
||||||
#define TELOPT_BINARY 0 /* binary 8bit data */
|
#define CURL_TELOPT_BINARY 0 /* binary 8bit data */
|
||||||
#define TELOPT_SGA 3 /* Supress Go Ahead */
|
#define CURL_TELOPT_SGA 3 /* Supress Go Ahead */
|
||||||
#define TELOPT_EXOPL 255 /* EXtended OPtions List */
|
#define CURL_TELOPT_EXOPL 255 /* EXtended OPtions List */
|
||||||
#define TELOPT_TTYPE 24 /* Terminal TYPE */
|
#define CURL_TELOPT_TTYPE 24 /* Terminal TYPE */
|
||||||
#define TELOPT_XDISPLOC 35 /* X DISPlay LOCation */
|
#define CURL_TELOPT_XDISPLOC 35 /* X DISPlay LOCation */
|
||||||
|
|
||||||
#define TELOPT_NEW_ENVIRON 39 /* NEW ENVIRONment variables */
|
#define CURL_TELOPT_NEW_ENVIRON 39 /* NEW ENVIRONment variables */
|
||||||
#define NEW_ENV_VAR 0
|
#define CURL_NEW_ENV_VAR 0
|
||||||
#define NEW_ENV_VALUE 1
|
#define CURL_NEW_ENV_VALUE 1
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The telnet options represented as strings
|
* The telnet options represented as strings
|
||||||
@@ -53,27 +53,27 @@ static const char *telnetoptions[]=
|
|||||||
"OLD-ENVIRON", "AUTHENTICATION", "ENCRYPT", "NEW-ENVIRON"
|
"OLD-ENVIRON", "AUTHENTICATION", "ENCRYPT", "NEW-ENVIRON"
|
||||||
};
|
};
|
||||||
|
|
||||||
#define TELOPT_MAXIMUM TELOPT_NEW_ENVIRON
|
#define CURL_TELOPT_MAXIMUM CURL_TELOPT_NEW_ENVIRON
|
||||||
|
|
||||||
#define TELOPT_OK(x) ((x) <= TELOPT_MAXIMUM)
|
#define CURL_TELOPT_OK(x) ((x) <= CURL_TELOPT_MAXIMUM)
|
||||||
#define TELOPT(x) telnetoptions[x]
|
#define CURL_TELOPT(x) telnetoptions[x]
|
||||||
|
|
||||||
#define NTELOPTS 40
|
#define CURL_NTELOPTS 40
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* First some defines
|
* First some defines
|
||||||
*/
|
*/
|
||||||
#define xEOF 236 /* End Of File */
|
#define CURL_xEOF 236 /* End Of File */
|
||||||
#define SE 240 /* Sub negotiation End */
|
#define CURL_SE 240 /* Sub negotiation End */
|
||||||
#define NOP 241 /* No OPeration */
|
#define CURL_NOP 241 /* No OPeration */
|
||||||
#define DM 242 /* Data Mark */
|
#define CURL_DM 242 /* Data Mark */
|
||||||
#define GA 249 /* Go Ahead, reverse the line */
|
#define CURL_GA 249 /* Go Ahead, reverse the line */
|
||||||
#define SB 250 /* SuBnegotiation */
|
#define CURL_SB 250 /* SuBnegotiation */
|
||||||
#define WILL 251 /* Our side WILL use this option */
|
#define CURL_WILL 251 /* Our side WILL use this option */
|
||||||
#define WONT 252 /* Our side WON'T use this option */
|
#define CURL_WONT 252 /* Our side WON'T use this option */
|
||||||
#define DO 253 /* DO use this option! */
|
#define CURL_DO 253 /* DO use this option! */
|
||||||
#define DONT 254 /* DON'T use this option! */
|
#define CURL_DONT 254 /* DON'T use this option! */
|
||||||
#define IAC 255 /* Interpret As Command */
|
#define CURL_IAC 255 /* Interpret As Command */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Then those numbers represented as strings:
|
* Then those numbers represented as strings:
|
||||||
@@ -86,16 +86,16 @@ static const char *telnetcmds[]=
|
|||||||
"WILL", "WONT", "DO", "DONT", "IAC"
|
"WILL", "WONT", "DO", "DONT", "IAC"
|
||||||
};
|
};
|
||||||
|
|
||||||
#define TELCMD_MINIMUM xEOF /* the first one */
|
#define CURL_TELCMD_MINIMUM CURL_xEOF /* the first one */
|
||||||
#define TELCMD_MAXIMUM IAC /* surprise, 255 is the last one! ;-) */
|
#define CURL_TELCMD_MAXIMUM CURL_IAC /* surprise, 255 is the last one! ;-) */
|
||||||
|
|
||||||
#define TELQUAL_IS 0
|
#define CURL_TELQUAL_IS 0
|
||||||
#define TELQUAL_SEND 1
|
#define CURL_TELQUAL_SEND 1
|
||||||
#define TELQUAL_INFO 2
|
#define CURL_TELQUAL_INFO 2
|
||||||
#define TELQUAL_NAME 3
|
#define CURL_TELQUAL_NAME 3
|
||||||
|
|
||||||
#define TELCMD_OK(x) ( ((unsigned int)(x) >= TELCMD_MINIMUM) && \
|
#define CURL_TELCMD_OK(x) ( ((unsigned int)(x) >= CURL_TELCMD_MINIMUM) && \
|
||||||
((unsigned int)(x) <= TELCMD_MAXIMUM) )
|
((unsigned int)(x) <= CURL_TELCMD_MAXIMUM) )
|
||||||
#define TELCMD(x) telnetcmds[(x)-TELCMD_MINIMUM]
|
#define CURL_TELCMD(x) telnetcmds[(x)-CURL_TELCMD_MINIMUM]
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
12
lib/base64.c
12
lib/base64.c
@@ -5,7 +5,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2003, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -135,7 +135,7 @@ int Curl_base64_encode(const void *inp, int insize, char **outptr)
|
|||||||
|
|
||||||
while(insize > 0) {
|
while(insize > 0) {
|
||||||
for (i = inputparts = 0; i < 3; i++) {
|
for (i = inputparts = 0; i < 3; i++) {
|
||||||
if(*indata) {
|
if(insize > 0) {
|
||||||
inputparts++;
|
inputparts++;
|
||||||
ibuf[i] = *indata;
|
ibuf[i] = *indata;
|
||||||
indata++;
|
indata++;
|
||||||
@@ -266,11 +266,3 @@ void *suck(int *lenptr)
|
|||||||
return (void *)buf;
|
return (void *)buf;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
|
||||||
* local variables:
|
|
||||||
* eval: (load-file "../curl-mode.el")
|
|
||||||
* end:
|
|
||||||
* vim600: fdm=marker
|
|
||||||
* vim: et sw=2 ts=2 sts=2 tw=78
|
|
||||||
*/
|
|
||||||
|
@@ -7,7 +7,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2003, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
|
@@ -2287,82 +2287,6 @@ Certificate Ingredients:
|
|||||||
ec:b9:94:6a:aa:12:4f:1a:dd:f5:77:b5:25:8c:f2:8a:0a:f1:
|
ec:b9:94:6a:aa:12:4f:1a:dd:f5:77:b5:25:8c:f2:8a:0a:f1:
|
||||||
fc:52:5b:58
|
fc:52:5b:58
|
||||||
|
|
||||||
TC TrustCenter, Germany, Class 0 CA
|
|
||||||
===================================
|
|
||||||
MD5 Fingerprint: 35:85:49:8E:6E:57:FE:BD:97:F1:C9:46:23:3A:B6:7D
|
|
||||||
PEM Data:
|
|
||||||
-----BEGIN CERTIFICATE-----
|
|
||||||
MIIENTCCA56gAwIBAgIBATANBgkqhkiG9w0BAQQFADCBvDELMAkGA1UEBhMCREUx
|
|
||||||
EDAOBgNVBAgTB0hhbWJ1cmcxEDAOBgNVBAcTB0hhbWJ1cmcxOjA4BgNVBAoTMVRD
|
|
||||||
IFRydXN0Q2VudGVyIGZvciBTZWN1cml0eSBpbiBEYXRhIE5ldHdvcmtzIEdtYkgx
|
|
||||||
IjAgBgNVBAsTGVRDIFRydXN0Q2VudGVyIENsYXNzIDAgQ0ExKTAnBgkqhkiG9w0B
|
|
||||||
CQEWGmNlcnRpZmljYXRlQHRydXN0Y2VudGVyLmRlMB4XDTk4MDMwOTEzNTQ0OFoX
|
|
||||||
DTA1MTIzMTEzNTQ0OFowgbwxCzAJBgNVBAYTAkRFMRAwDgYDVQQIEwdIYW1idXJn
|
|
||||||
MRAwDgYDVQQHEwdIYW1idXJnMTowOAYDVQQKEzFUQyBUcnVzdENlbnRlciBmb3Ig
|
|
||||||
U2VjdXJpdHkgaW4gRGF0YSBOZXR3b3JrcyBHbWJIMSIwIAYDVQQLExlUQyBUcnVz
|
|
||||||
dENlbnRlciBDbGFzcyAwIENBMSkwJwYJKoZIhvcNAQkBFhpjZXJ0aWZpY2F0ZUB0
|
|
||||||
cnVzdGNlbnRlci5kZTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA333mvr/V
|
|
||||||
8C9tTg7R4I0LfztU6IrisJ8oxYrGubMzJ/UnyhpMVBJrtLJGsx1Ls/QhC0sCLqHC
|
|
||||||
NJyFoMR4EdvbaycrCSoYTkDMn3EZZ5l0onw/wdiLI8hjO4ohq1zeHvSN3LQYwwVz
|
|
||||||
9Gq0ofoBCCsBD203W6o4hmc51+Vf+uR+zKMCAwEAAaOCAUMwggE/MEAGCWCGSAGG
|
|
||||||
+EIBAwQzFjFodHRwczovL3d3dy50cnVzdGNlbnRlci5kZS9jZ2ktYmluL2NoZWNr
|
|
||||||
LXJldi5jZ2k/MEAGCWCGSAGG+EIBBAQzFjFodHRwczovL3d3dy50cnVzdGNlbnRl
|
|
||||||
ci5kZS9jZ2ktYmluL2NoZWNrLXJldi5jZ2k/MDwGCWCGSAGG+EIBBwQvFi1odHRw
|
|
||||||
czovL3d3dy50cnVzdGNlbnRlci5kZS9jZ2ktYmluL1JlbmV3LmNnaT8wPgYJYIZI
|
|
||||||
AYb4QgEIBDEWL2h0dHA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvZ3VpZGVsaW5lcy9p
|
|
||||||
bmRleC5odG1sMCgGCWCGSAGG+EIBDQQbFhlUQyBUcnVzdENlbnRlciBDbGFzcyAw
|
|
||||||
IENBMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQQFAAOBgQBNB39fCTAZ
|
|
||||||
kqoFR3qUdVQqrs/82AxC4UU4KySVssqHynnEw5eQXmIYxsk4YUxoNdNMFBHrxM2h
|
|
||||||
qdjFnmgnMgc1RQT4XyGgYB4cAEgEWNLFy65tMm49d5WMhcflrlCddUp7/wsneepN
|
|
||||||
pFn/7FrqJqU5g6TReM6nqX683SvKEpMDSg==
|
|
||||||
-----END CERTIFICATE-----
|
|
||||||
Certificate Ingredients:
|
|
||||||
Data:
|
|
||||||
Version: 3 (0x2)
|
|
||||||
Serial Number: 1 (0x1)
|
|
||||||
Signature Algorithm: md5WithRSAEncryption
|
|
||||||
Issuer: C=DE, ST=Hamburg, L=Hamburg, O=TC TrustCenter for Security in Data Networks GmbH, OU=TC TrustCenter Class 0 CA/Email=certificate@trustcenter.de
|
|
||||||
Validity
|
|
||||||
Not Before: Mar 9 13:54:48 1998 GMT
|
|
||||||
Not After : Dec 31 13:54:48 2005 GMT
|
|
||||||
Subject: C=DE, ST=Hamburg, L=Hamburg, O=TC TrustCenter for Security in Data Networks GmbH, OU=TC TrustCenter Class 0 CA/Email=certificate@trustcenter.de
|
|
||||||
Subject Public Key Info:
|
|
||||||
Public Key Algorithm: rsaEncryption
|
|
||||||
RSA Public Key: (1024 bit)
|
|
||||||
Modulus (1024 bit):
|
|
||||||
00:df:7d:e6:be:bf:d5:f0:2f:6d:4e:0e:d1:e0:8d:
|
|
||||||
0b:7f:3b:54:e8:8a:e2:b0:9f:28:c5:8a:c6:b9:b3:
|
|
||||||
33:27:f5:27:ca:1a:4c:54:12:6b:b4:b2:46:b3:1d:
|
|
||||||
4b:b3:f4:21:0b:4b:02:2e:a1:c2:34:9c:85:a0:c4:
|
|
||||||
78:11:db:db:6b:27:2b:09:2a:18:4e:40:cc:9f:71:
|
|
||||||
19:67:99:74:a2:7c:3f:c1:d8:8b:23:c8:63:3b:8a:
|
|
||||||
21:ab:5c:de:1e:f4:8d:dc:b4:18:c3:05:73:f4:6a:
|
|
||||||
b4:a1:fa:01:08:2b:01:0f:6d:37:5b:aa:38:86:67:
|
|
||||||
39:d7:e5:5f:fa:e4:7e:cc:a3
|
|
||||||
Exponent: 65537 (0x10001)
|
|
||||||
X509v3 extensions:
|
|
||||||
Netscape Revocation Url:
|
|
||||||
https://www.trustcenter.de/cgi-bin/check-rev.cgi?
|
|
||||||
Netscape CA Revocation Url:
|
|
||||||
https://www.trustcenter.de/cgi-bin/check-rev.cgi?
|
|
||||||
Netscape Renewal Url:
|
|
||||||
https://www.trustcenter.de/cgi-bin/Renew.cgi?
|
|
||||||
Netscape CA Policy Url:
|
|
||||||
http://www.trustcenter.de/guidelines/index.html
|
|
||||||
Netscape Comment:
|
|
||||||
TC TrustCenter Class 0 CA
|
|
||||||
Netscape Cert Type:
|
|
||||||
SSL CA, S/MIME CA, Object Signing CA
|
|
||||||
Signature Algorithm: md5WithRSAEncryption
|
|
||||||
4d:07:7f:5f:09:30:19:92:aa:05:47:7a:94:75:54:2a:ae:cf:
|
|
||||||
fc:d8:0c:42:e1:45:38:2b:24:95:b2:ca:87:ca:79:c4:c3:97:
|
|
||||||
90:5e:62:18:c6:c9:38:61:4c:68:35:d3:4c:14:11:eb:c4:cd:
|
|
||||||
a1:a9:d8:c5:9e:68:27:32:07:35:45:04:f8:5f:21:a0:60:1e:
|
|
||||||
1c:00:48:04:58:d2:c5:cb:ae:6d:32:6e:3d:77:95:8c:85:c7:
|
|
||||||
e5:ae:50:9d:75:4a:7b:ff:0b:27:79:ea:4d:a4:59:ff:ec:5a:
|
|
||||||
ea:26:a5:39:83:a4:d1:78:ce:a7:a9:7e:bc:dd:2b:ca:12:93:
|
|
||||||
03:4a
|
|
||||||
|
|
||||||
TC TrustCenter, Germany, Class 1 CA
|
TC TrustCenter, Germany, Class 1 CA
|
||||||
===================================
|
===================================
|
||||||
MD5 Fingerprint: 64:3F:F8:3E:52:14:4A:59:BA:93:56:04:0B:23:02:D1
|
MD5 Fingerprint: 64:3F:F8:3E:52:14:4A:59:BA:93:56:04:0B:23:02:D1
|
||||||
|
@@ -369,3 +369,13 @@
|
|||||||
|
|
||||||
/* Define if you have the `sigsetjmp' function. */
|
/* Define if you have the `sigsetjmp' function. */
|
||||||
#define HAVE_SIGSETJMP 1
|
#define HAVE_SIGSETJMP 1
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <setjmp.h> header file. */
|
||||||
|
#define HAVE_SETJMP_H 1
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This needs to be defined for OpenSSL 0.9.7 and other versions that have the
|
||||||
|
* ENGINE stuff supported. If an include of "openssl/engine.h" fails, then
|
||||||
|
* undefine the define below.
|
||||||
|
*/
|
||||||
|
#define HAVE_OPENSSL_ENGINE_H 1
|
||||||
|
@@ -5,7 +5,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2003, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -81,8 +81,7 @@
|
|||||||
#include "memdebug.h"
|
#include "memdebug.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static
|
int Curl_ourerrno(void)
|
||||||
int geterrno(void)
|
|
||||||
{
|
{
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
return (int)GetLastError();
|
return (int)GetLastError();
|
||||||
@@ -144,7 +143,11 @@ int Curl_nonblock(int socket, /* operate on this */
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return 0 on fine connect, -1 on error and 1 on timeout.
|
* waitconnect() returns:
|
||||||
|
* 0 fine connect
|
||||||
|
* -1 select() error
|
||||||
|
* 1 select() timeout
|
||||||
|
* 2 select() returned with an error condition
|
||||||
*/
|
*/
|
||||||
static
|
static
|
||||||
int waitconnect(int sockfd, /* socket */
|
int waitconnect(int sockfd, /* socket */
|
||||||
@@ -194,10 +197,6 @@ static CURLcode bindlocal(struct connectdata *conn,
|
|||||||
|
|
||||||
#ifdef HAVE_INET_NTOA
|
#ifdef HAVE_INET_NTOA
|
||||||
|
|
||||||
#ifndef INADDR_NONE
|
|
||||||
#define INADDR_NONE (in_addr_t) ~0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
struct SessionHandle *data = conn->data;
|
struct SessionHandle *data = conn->data;
|
||||||
|
|
||||||
/*************************************************************
|
/*************************************************************
|
||||||
@@ -210,7 +209,11 @@ static CURLcode bindlocal(struct connectdata *conn,
|
|||||||
char myhost[256] = "";
|
char myhost[256] = "";
|
||||||
in_addr_t in;
|
in_addr_t in;
|
||||||
|
|
||||||
if(Curl_if2ip(data->set.device, myhost, sizeof(myhost))) {
|
/* First check if the given name is an IP address */
|
||||||
|
in=inet_addr(data->set.device);
|
||||||
|
|
||||||
|
if((in == CURL_INADDR_NONE) &&
|
||||||
|
Curl_if2ip(data->set.device, myhost, sizeof(myhost))) {
|
||||||
/*
|
/*
|
||||||
* We now have the numerical IPv4-style x.y.z.w in the 'myhost' buffer
|
* We now have the numerical IPv4-style x.y.z.w in the 'myhost' buffer
|
||||||
*/
|
*/
|
||||||
@@ -243,22 +246,31 @@ static CURLcode bindlocal(struct connectdata *conn,
|
|||||||
infof(data, "We bind local end to %s\n", myhost);
|
infof(data, "We bind local end to %s\n", myhost);
|
||||||
|
|
||||||
in=inet_addr(myhost);
|
in=inet_addr(myhost);
|
||||||
if (INADDR_NONE != in) {
|
if (CURL_INADDR_NONE != in) {
|
||||||
|
|
||||||
if ( h ) {
|
if ( h ) {
|
||||||
Curl_addrinfo *addr = h->addr;
|
Curl_addrinfo *addr = h->addr;
|
||||||
|
|
||||||
Curl_resolv_unlock(h);
|
Curl_resolv_unlock(data, h);
|
||||||
/* we don't need it anymore after this function has returned */
|
/* we don't need it anymore after this function has returned */
|
||||||
|
|
||||||
memset((char *)&sa, 0, sizeof(sa));
|
|
||||||
#ifdef ENABLE_IPV6
|
#ifdef ENABLE_IPV6
|
||||||
memcpy((char *)&sa.sin_addr, addr->ai_addr, addr->ai_addrlen);
|
(void)sa; /* prevent compiler warning */
|
||||||
sa.sin_family = addr->ai_family;
|
if( bind(sockfd, addr->ai_addr, addr->ai_addrlen) >= 0) {
|
||||||
|
/* we succeeded to bind */
|
||||||
|
struct sockaddr_in6 add;
|
||||||
|
|
||||||
|
size = sizeof(add);
|
||||||
|
if(getsockname(sockfd, (struct sockaddr *) &add,
|
||||||
|
(socklen_t *)&size)<0) {
|
||||||
|
failf(data, "getsockname() failed");
|
||||||
|
return CURLE_HTTP_PORT_FAILED;
|
||||||
|
}
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
|
memset((char *)&sa, 0, sizeof(sa));
|
||||||
memcpy((char *)&sa.sin_addr, addr->h_addr, addr->h_length);
|
memcpy((char *)&sa.sin_addr, addr->h_addr, addr->h_length);
|
||||||
sa.sin_family = AF_INET;
|
sa.sin_family = AF_INET;
|
||||||
#endif
|
|
||||||
sa.sin_addr.s_addr = in;
|
sa.sin_addr.s_addr = in;
|
||||||
sa.sin_port = 0; /* get any port */
|
sa.sin_port = 0; /* get any port */
|
||||||
|
|
||||||
@@ -273,6 +285,7 @@ static CURLcode bindlocal(struct connectdata *conn,
|
|||||||
return CURLE_HTTP_PORT_FAILED;
|
return CURLE_HTTP_PORT_FAILED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
else {
|
else {
|
||||||
switch(errno) {
|
switch(errno) {
|
||||||
case EBADF:
|
case EBADF:
|
||||||
@@ -336,7 +349,7 @@ int socketerror(int sockfd)
|
|||||||
|
|
||||||
if( -1 == getsockopt(sockfd, SOL_SOCKET, SO_ERROR,
|
if( -1 == getsockopt(sockfd, SOL_SOCKET, SO_ERROR,
|
||||||
(void *)&err, &errSize))
|
(void *)&err, &errSize))
|
||||||
err = geterrno();
|
err = Curl_ourerrno();
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
@@ -396,10 +409,15 @@ CURLcode Curl_is_connected(struct connectdata *conn,
|
|||||||
return CURLE_OK;
|
return CURLE_OK;
|
||||||
}
|
}
|
||||||
/* nope, not connected for real */
|
/* nope, not connected for real */
|
||||||
if(err)
|
failf(data, "Connection failed, socket error: %d", err);
|
||||||
return CURLE_COULDNT_CONNECT;
|
return CURLE_COULDNT_CONNECT;
|
||||||
|
}
|
||||||
|
else if(1 != rc) {
|
||||||
|
int error = Curl_ourerrno();
|
||||||
|
failf(data, "Failed connect to %s:%d, errno: %d",
|
||||||
|
conn->hostname, conn->port, error);
|
||||||
|
return CURLE_COULDNT_CONNECT;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If the connection phase is "done" here, we should attempt to connect
|
* If the connection phase is "done" here, we should attempt to connect
|
||||||
* to the "next address" in the Curl_hostaddr structure that we resolved
|
* to the "next address" in the Curl_hostaddr structure that we resolved
|
||||||
@@ -507,7 +525,7 @@ CURLcode Curl_connecthost(struct connectdata *conn, /* context */
|
|||||||
rc = connect(sockfd, ai->ai_addr, ai->ai_addrlen);
|
rc = connect(sockfd, ai->ai_addr, ai->ai_addrlen);
|
||||||
|
|
||||||
if(-1 == rc) {
|
if(-1 == rc) {
|
||||||
int error=geterrno();
|
int error=Curl_ourerrno();
|
||||||
|
|
||||||
switch (error) {
|
switch (error) {
|
||||||
case EINPROGRESS:
|
case EINPROGRESS:
|
||||||
@@ -548,6 +566,9 @@ CURLcode Curl_connecthost(struct connectdata *conn, /* context */
|
|||||||
failf(data, "socket error: %d", err);
|
failf(data, "socket error: %d", err);
|
||||||
/* we are _not_ connected, it was a false alert, continue please */
|
/* we are _not_ connected, it was a false alert, continue please */
|
||||||
}
|
}
|
||||||
|
else if(2 == rc)
|
||||||
|
/* waitconnect() returned error */
|
||||||
|
;
|
||||||
else if(data->state.used_interface == Curl_if_multi) {
|
else if(data->state.used_interface == Curl_if_multi) {
|
||||||
/* When running the multi interface, we bail out here */
|
/* When running the multi interface, we bail out here */
|
||||||
rc = 0;
|
rc = 0;
|
||||||
@@ -623,7 +644,7 @@ CURLcode Curl_connecthost(struct connectdata *conn, /* context */
|
|||||||
sizeof(serv_addr));
|
sizeof(serv_addr));
|
||||||
|
|
||||||
if(-1 == rc) {
|
if(-1 == rc) {
|
||||||
int error=geterrno();
|
int error=Curl_ourerrno();
|
||||||
|
|
||||||
switch (error) {
|
switch (error) {
|
||||||
case EINPROGRESS:
|
case EINPROGRESS:
|
||||||
|
@@ -7,7 +7,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2003, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -37,4 +37,6 @@ CURLcode Curl_connecthost(struct connectdata *conn,
|
|||||||
Curl_ipconnect **addr, /* the one we used */
|
Curl_ipconnect **addr, /* the one we used */
|
||||||
bool *connected /* truly connected? */
|
bool *connected /* truly connected? */
|
||||||
);
|
);
|
||||||
|
|
||||||
|
int Curl_ourerrno(void);
|
||||||
#endif
|
#endif
|
||||||
|
@@ -5,7 +5,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2003, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -25,13 +25,26 @@
|
|||||||
|
|
||||||
#ifdef HAVE_LIBZ
|
#ifdef HAVE_LIBZ
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
#include "urldata.h"
|
#include "urldata.h"
|
||||||
#include <curl/curl.h>
|
#include <curl/curl.h>
|
||||||
#include <curl/types.h>
|
#include <curl/types.h>
|
||||||
#include "sendf.h"
|
#include "sendf.h"
|
||||||
|
|
||||||
#define DSIZ 4096 /* buffer size for decompressed data */
|
#define DSIZ 0x10000 /* buffer size for decompressed data */
|
||||||
|
|
||||||
|
#define GZIP_MAGIC_0 0x1f
|
||||||
|
#define GZIP_MAGIC_1 0x8b
|
||||||
|
|
||||||
|
/* gzip flag byte */
|
||||||
|
#define ASCII_FLAG 0x01 /* bit 0 set: file probably ascii text */
|
||||||
|
#define HEAD_CRC 0x02 /* bit 1 set: header CRC present */
|
||||||
|
#define EXTRA_FIELD 0x04 /* bit 2 set: extra field present */
|
||||||
|
#define ORIG_NAME 0x08 /* bit 3 set: original file name present */
|
||||||
|
#define COMMENT 0x10 /* bit 4 set: file comment present */
|
||||||
|
#define RESERVED 0xE0 /* bits 5..7: reserved */
|
||||||
|
|
||||||
static CURLcode
|
static CURLcode
|
||||||
process_zlib_error(struct SessionHandle *data, z_stream *z)
|
process_zlib_error(struct SessionHandle *data, z_stream *z)
|
||||||
@@ -74,7 +87,7 @@ Curl_unencode_deflate_write(struct SessionHandle *data,
|
|||||||
k->zlib_init = 1;
|
k->zlib_init = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set the compressed input when this fucntion is called */
|
/* Set the compressed input when this function is called */
|
||||||
z->next_in = (Bytef *)k->str;
|
z->next_in = (Bytef *)k->str;
|
||||||
z->avail_in = nread;
|
z->avail_in = nread;
|
||||||
|
|
||||||
@@ -87,11 +100,12 @@ Curl_unencode_deflate_write(struct SessionHandle *data,
|
|||||||
|
|
||||||
status = inflate(z, Z_SYNC_FLUSH);
|
status = inflate(z, Z_SYNC_FLUSH);
|
||||||
if (status == Z_OK || status == Z_STREAM_END) {
|
if (status == Z_OK || status == Z_STREAM_END) {
|
||||||
result = Curl_client_write(data, CLIENTWRITE_BODY, decomp,
|
if (DSIZ - z->avail_out) {
|
||||||
DSIZ - z->avail_out);
|
result = Curl_client_write(data, CLIENTWRITE_BODY, decomp,
|
||||||
/* if !CURLE_OK, clean up, return */
|
DSIZ - z->avail_out);
|
||||||
if (result) {
|
/* if !CURLE_OK, clean up, return */
|
||||||
return exit_zlib(z, &k->zlib_init, result);
|
if (result)
|
||||||
|
return exit_zlib(z, &k->zlib_init, result);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Done?; clean up, return */
|
/* Done?; clean up, return */
|
||||||
@@ -111,12 +125,230 @@ Curl_unencode_deflate_write(struct SessionHandle *data,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif /* HAVE_LIBZ */
|
|
||||||
|
|
||||||
/*
|
/* Skip over the gzip header */
|
||||||
* local variables:
|
static enum {
|
||||||
* eval: (load-file "../curl-mode.el")
|
GZIP_OK,
|
||||||
* end:
|
GZIP_BAD,
|
||||||
* vim600: fdm=marker
|
GZIP_UNDERFLOW
|
||||||
* vim: et sw=2 ts=2 sts=2 tw=78
|
} check_gzip_header(unsigned char const *data, ssize_t len, ssize_t *headerlen)
|
||||||
*/
|
{
|
||||||
|
int method, flags;
|
||||||
|
const ssize_t totallen = len;
|
||||||
|
|
||||||
|
/* The shortest header is 10 bytes */
|
||||||
|
if (len < 10)
|
||||||
|
return GZIP_UNDERFLOW;
|
||||||
|
|
||||||
|
if ((data[0] != GZIP_MAGIC_0) || (data[1] != GZIP_MAGIC_1))
|
||||||
|
return GZIP_BAD;
|
||||||
|
|
||||||
|
method = data[2];
|
||||||
|
flags = data[3];
|
||||||
|
|
||||||
|
if (method != Z_DEFLATED || (flags & RESERVED) != 0) {
|
||||||
|
/* Can't handle this compression method or unknown flag */
|
||||||
|
return GZIP_BAD;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Skip over time, xflags, OS code and all previous bytes */
|
||||||
|
len -= 10;
|
||||||
|
data += 10;
|
||||||
|
|
||||||
|
if (flags & EXTRA_FIELD) {
|
||||||
|
ssize_t extra_len;
|
||||||
|
|
||||||
|
if (len < 2)
|
||||||
|
return GZIP_UNDERFLOW;
|
||||||
|
|
||||||
|
extra_len = (data[1] << 8) | data[0];
|
||||||
|
|
||||||
|
if (len < (extra_len+2))
|
||||||
|
return GZIP_UNDERFLOW;
|
||||||
|
|
||||||
|
len -= (extra_len + 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (flags & ORIG_NAME) {
|
||||||
|
/* Skip over NUL-terminated file name */
|
||||||
|
while (len && *data) {
|
||||||
|
--len;
|
||||||
|
++data;
|
||||||
|
}
|
||||||
|
if (!len || *data)
|
||||||
|
return GZIP_UNDERFLOW;
|
||||||
|
|
||||||
|
/* Skip over the NUL */
|
||||||
|
--len;
|
||||||
|
++data;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (flags & COMMENT) {
|
||||||
|
/* Skip over NUL-terminated comment */
|
||||||
|
while (len && *data) {
|
||||||
|
--len;
|
||||||
|
++data;
|
||||||
|
}
|
||||||
|
if (!len || *data)
|
||||||
|
return GZIP_UNDERFLOW;
|
||||||
|
|
||||||
|
/* Skip over the NUL */
|
||||||
|
--len;
|
||||||
|
++data;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (flags & HEAD_CRC) {
|
||||||
|
if (len < 2)
|
||||||
|
return GZIP_UNDERFLOW;
|
||||||
|
|
||||||
|
len -= 2;
|
||||||
|
data += 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
*headerlen = totallen - len;
|
||||||
|
return GZIP_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
CURLcode
|
||||||
|
Curl_unencode_gzip_write(struct SessionHandle *data,
|
||||||
|
struct Curl_transfer_keeper *k,
|
||||||
|
ssize_t nread)
|
||||||
|
{
|
||||||
|
int status; /* zlib status */
|
||||||
|
int result; /* Curl_client_write status */
|
||||||
|
char decomp[DSIZ]; /* Put the decompressed data here. */
|
||||||
|
z_stream *z = &k->z; /* zlib state structure */
|
||||||
|
|
||||||
|
/* Initialize zlib? */
|
||||||
|
if (!k->zlib_init) {
|
||||||
|
z->zalloc = (alloc_func)Z_NULL;
|
||||||
|
z->zfree = (free_func)Z_NULL;
|
||||||
|
z->opaque = 0; /* of dubious use 08/27/02 jhrg */
|
||||||
|
if (inflateInit2(z, -MAX_WBITS) != Z_OK)
|
||||||
|
return process_zlib_error(data, z);
|
||||||
|
k->zlib_init = 1; /* Initial call state */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* This next mess is to get around the potential case where there isn't
|
||||||
|
enough data passed in to skip over the gzip header. If that happens,
|
||||||
|
we malloc a block and copy what we have then wait for the next call. If
|
||||||
|
there still isn't enough (this is definitely a worst-case scenario), we
|
||||||
|
make the block bigger, copy the next part in and keep waiting. */
|
||||||
|
|
||||||
|
/* Skip over gzip header? */
|
||||||
|
if (k->zlib_init == 1) {
|
||||||
|
/* Initial call state */
|
||||||
|
ssize_t hlen;
|
||||||
|
|
||||||
|
switch (check_gzip_header((unsigned char *)k->str, nread, &hlen)) {
|
||||||
|
case GZIP_OK:
|
||||||
|
z->next_in = (Bytef *)k->str + hlen;
|
||||||
|
z->avail_in = nread - hlen;
|
||||||
|
k->zlib_init = 3; /* Inflating stream state */
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GZIP_UNDERFLOW:
|
||||||
|
/* We need more data so we can find the end of the gzip header.
|
||||||
|
It's possible that the memory block we malloc here will never be
|
||||||
|
freed if the transfer abruptly aborts after this point. Since it's
|
||||||
|
unlikely that circumstances will be right for this code path to be
|
||||||
|
followed in the first place, and it's even more unlikely for a transfer
|
||||||
|
to fail immediately afterwards, it should seldom be a problem. */
|
||||||
|
z->avail_in = nread;
|
||||||
|
z->next_in = malloc(z->avail_in);
|
||||||
|
if (z->next_in == NULL) {
|
||||||
|
return exit_zlib(z, &k->zlib_init, CURLE_OUT_OF_MEMORY);
|
||||||
|
}
|
||||||
|
memcpy(z->next_in, k->str, z->avail_in);
|
||||||
|
k->zlib_init = 2; /* Need more gzip header data state */
|
||||||
|
/* We don't have any data to inflate yet */
|
||||||
|
return CURLE_OK;
|
||||||
|
|
||||||
|
case GZIP_BAD:
|
||||||
|
default:
|
||||||
|
return exit_zlib(z, &k->zlib_init, process_zlib_error(data, z));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
else if (k->zlib_init == 2) {
|
||||||
|
/* Need more gzip header data state */
|
||||||
|
ssize_t hlen;
|
||||||
|
unsigned char *oldblock = z->next_in;
|
||||||
|
|
||||||
|
z->avail_in += nread;
|
||||||
|
z->next_in = realloc(z->next_in, z->avail_in);
|
||||||
|
if (z->next_in == NULL) {
|
||||||
|
free(oldblock);
|
||||||
|
return exit_zlib(z, &k->zlib_init, CURLE_OUT_OF_MEMORY);
|
||||||
|
}
|
||||||
|
/* Append the new block of data to the previous one */
|
||||||
|
memcpy(z->next_in + z->avail_in - nread, k->str, nread);
|
||||||
|
|
||||||
|
switch (check_gzip_header(z->next_in, z->avail_in, &hlen)) {
|
||||||
|
case GZIP_OK:
|
||||||
|
/* This is the zlib stream data */
|
||||||
|
free(z->next_in);
|
||||||
|
/* Don't point into the malloced block since we just freed it */
|
||||||
|
z->next_in = (Bytef *)k->str + hlen + nread - z->avail_in;
|
||||||
|
z->avail_in = z->avail_in - hlen;
|
||||||
|
k->zlib_init = 3; /* Inflating stream state */
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GZIP_UNDERFLOW:
|
||||||
|
/* We still don't have any data to inflate! */
|
||||||
|
return CURLE_OK;
|
||||||
|
|
||||||
|
case GZIP_BAD:
|
||||||
|
default:
|
||||||
|
free(z->next_in);
|
||||||
|
return exit_zlib(z, &k->zlib_init, process_zlib_error(data, z));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* Inflating stream state */
|
||||||
|
z->next_in = (Bytef *)k->str;
|
||||||
|
z->avail_in = nread;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (z->avail_in == 0) {
|
||||||
|
/* We don't have any data to inflate; wait until next time */
|
||||||
|
return CURLE_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* because the buffer size is fixed, iteratively decompress
|
||||||
|
and transfer to the client via client_write. */
|
||||||
|
for (;;) {
|
||||||
|
/* (re)set buffer for decompressed output for every iteration */
|
||||||
|
z->next_out = (Bytef *)&decomp[0];
|
||||||
|
z->avail_out = DSIZ;
|
||||||
|
|
||||||
|
status = inflate(z, Z_SYNC_FLUSH);
|
||||||
|
if (status == Z_OK || status == Z_STREAM_END) {
|
||||||
|
if(DSIZ - z->avail_out) {
|
||||||
|
result = Curl_client_write(data, CLIENTWRITE_BODY, decomp,
|
||||||
|
DSIZ - z->avail_out);
|
||||||
|
/* if !CURLE_OK, clean up, return */
|
||||||
|
if (result)
|
||||||
|
return exit_zlib(z, &k->zlib_init, result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Done?; clean up, return */
|
||||||
|
/* We should really check the gzip CRC here */
|
||||||
|
if (status == Z_STREAM_END) {
|
||||||
|
if (inflateEnd(z) == Z_OK)
|
||||||
|
return exit_zlib(z, &k->zlib_init, result);
|
||||||
|
else
|
||||||
|
return exit_zlib(z, &k->zlib_init, process_zlib_error(data, z));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Done with these bytes, exit */
|
||||||
|
if (status == Z_OK && z->avail_in == 0 && z->avail_out > 0)
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
else { /* Error; exit loop, handle below */
|
||||||
|
return exit_zlib(z, &k->zlib_init, process_zlib_error(data, z));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* HAVE_LIBZ */
|
||||||
|
@@ -5,7 +5,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2003, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -20,15 +20,22 @@
|
|||||||
*
|
*
|
||||||
* $Id$
|
* $Id$
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
#include "setup.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Comma-separated list all supported Content-Encodings ('identity' is implied)
|
||||||
|
*/
|
||||||
|
#ifdef HAVE_LIBZ
|
||||||
|
#define ALL_CONTENT_ENCODINGS "deflate, gzip"
|
||||||
|
#else
|
||||||
|
#define ALL_CONTENT_ENCODINGS "identity"
|
||||||
|
#endif
|
||||||
|
|
||||||
CURLcode Curl_unencode_deflate_write(struct SessionHandle *data,
|
CURLcode Curl_unencode_deflate_write(struct SessionHandle *data,
|
||||||
struct Curl_transfer_keeper *k,
|
struct Curl_transfer_keeper *k,
|
||||||
ssize_t nread);
|
ssize_t nread);
|
||||||
|
|
||||||
/*
|
CURLcode
|
||||||
* local variables:
|
Curl_unencode_gzip_write(struct SessionHandle *data,
|
||||||
* eval: (load-file "../curl-mode.el")
|
struct Curl_transfer_keeper *k,
|
||||||
* end:
|
ssize_t nread);
|
||||||
* vim600: fdm=marker
|
|
||||||
* vim: et sw=2 ts=2 sts=2 tw=78
|
|
||||||
*/
|
|
||||||
|
199
lib/cookie.c
199
lib/cookie.c
@@ -5,7 +5,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2003, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -77,6 +77,7 @@ Example set of cookies:
|
|||||||
13-Jun-1988 03:04:55 GMT; domain=.fidelity.com; path=/; secure
|
13-Jun-1988 03:04:55 GMT; domain=.fidelity.com; path=/; secure
|
||||||
****/
|
****/
|
||||||
|
|
||||||
|
|
||||||
#include "setup.h"
|
#include "setup.h"
|
||||||
|
|
||||||
#ifndef CURL_DISABLE_HTTP
|
#ifndef CURL_DISABLE_HTTP
|
||||||
@@ -110,6 +111,17 @@ free_cookiemess(struct Cookie *co)
|
|||||||
free(co);
|
free(co);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool tailmatch(const char *little, const char *bigone)
|
||||||
|
{
|
||||||
|
unsigned int littlelen = strlen(little);
|
||||||
|
unsigned int biglen = strlen(bigone);
|
||||||
|
|
||||||
|
if(littlelen > biglen)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
return strequal(little, bigone+biglen-littlelen);
|
||||||
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
*
|
*
|
||||||
* Curl_cookie_add()
|
* Curl_cookie_add()
|
||||||
@@ -122,7 +134,10 @@ struct Cookie *
|
|||||||
Curl_cookie_add(struct CookieInfo *c,
|
Curl_cookie_add(struct CookieInfo *c,
|
||||||
bool httpheader, /* TRUE if HTTP header-style line */
|
bool httpheader, /* TRUE if HTTP header-style line */
|
||||||
char *lineptr, /* first character of the line */
|
char *lineptr, /* first character of the line */
|
||||||
char *domain) /* default domain */
|
char *domain, /* default domain */
|
||||||
|
char *path) /* full path used when this cookie is set,
|
||||||
|
used to get default path for the cookie
|
||||||
|
unless set */
|
||||||
{
|
{
|
||||||
struct Cookie *clist;
|
struct Cookie *clist;
|
||||||
char what[MAX_COOKIE_LINE];
|
char what[MAX_COOKIE_LINE];
|
||||||
@@ -133,6 +148,7 @@ Curl_cookie_add(struct CookieInfo *c,
|
|||||||
struct Cookie *lastc=NULL;
|
struct Cookie *lastc=NULL;
|
||||||
time_t now = time(NULL);
|
time_t now = time(NULL);
|
||||||
bool replace_old = FALSE;
|
bool replace_old = FALSE;
|
||||||
|
bool badcookie = FALSE; /* cookies are good by default. mmmmm yummy */
|
||||||
|
|
||||||
/* First, alloc and init a new struct for it */
|
/* First, alloc and init a new struct for it */
|
||||||
co = (struct Cookie *)malloc(sizeof(struct Cookie));
|
co = (struct Cookie *)malloc(sizeof(struct Cookie));
|
||||||
@@ -185,8 +201,63 @@ Curl_cookie_add(struct CookieInfo *c,
|
|||||||
co->path=strdup(whatptr);
|
co->path=strdup(whatptr);
|
||||||
}
|
}
|
||||||
else if(strequal("domain", name)) {
|
else if(strequal("domain", name)) {
|
||||||
co->domain=strdup(whatptr);
|
/* note that this name may or may not have a preceeding dot, but
|
||||||
co->field1= (whatptr[0]=='.')?2:1;
|
we don't care about that, we treat the names the same anyway */
|
||||||
|
|
||||||
|
char *ptr=whatptr;
|
||||||
|
int dotcount=1;
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
|
static const char *seventhree[]= {
|
||||||
|
"com", "edu", "net", "org", "gov", "mil", "int"
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Count the dots, we need to make sure that there are THREE dots
|
||||||
|
in the normal domains, or TWO in the seventhree-domains. */
|
||||||
|
|
||||||
|
if('.' == whatptr[0])
|
||||||
|
/* don't count the initial dot, assume it */
|
||||||
|
ptr++;
|
||||||
|
|
||||||
|
do {
|
||||||
|
ptr = strchr(ptr, '.');
|
||||||
|
if(ptr) {
|
||||||
|
ptr++;
|
||||||
|
dotcount++;
|
||||||
|
}
|
||||||
|
} while(ptr);
|
||||||
|
|
||||||
|
for(i=0;
|
||||||
|
i<sizeof(seventhree)/sizeof(seventhree[0]); i++) {
|
||||||
|
if(tailmatch(seventhree[i], whatptr)) {
|
||||||
|
dotcount++; /* we allow one dot less for these */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(dotcount < 3) {
|
||||||
|
/* Received and skipped a cookie with a domain using too few
|
||||||
|
dots. */
|
||||||
|
badcookie=TRUE; /* mark this as a bad cookie */
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* Now, we make sure that our host is within the given domain,
|
||||||
|
or the given domain is not valid and thus cannot be set. */
|
||||||
|
|
||||||
|
if(!domain || tailmatch(whatptr, domain)) {
|
||||||
|
char *ptr=whatptr;
|
||||||
|
if(ptr[0] == '.')
|
||||||
|
ptr++;
|
||||||
|
co->domain=strdup(ptr); /* dont prefix with dots internally */
|
||||||
|
co->tailmatch=TRUE; /* we always do that if the domain name was
|
||||||
|
given */
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* we did not get a tailmatch and then the attempted set domain
|
||||||
|
is not a domain to which the current host belongs. Mark as
|
||||||
|
bad. */
|
||||||
|
badcookie=TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if(strequal("version", name)) {
|
else if(strequal("version", name)) {
|
||||||
co->version=strdup(whatptr);
|
co->version=strdup(whatptr);
|
||||||
@@ -248,8 +319,11 @@ Curl_cookie_add(struct CookieInfo *c,
|
|||||||
semiptr=strchr(ptr, '\0');
|
semiptr=strchr(ptr, '\0');
|
||||||
} while(semiptr);
|
} while(semiptr);
|
||||||
|
|
||||||
if(NULL == co->name) {
|
if(badcookie || (NULL == co->name)) {
|
||||||
/* we didn't get a cookie name, this is an illegal line, bail out */
|
/* we didn't get a cookie name or a bad one,
|
||||||
|
this is an illegal line, bail out */
|
||||||
|
if(co->expirestr)
|
||||||
|
free(co->expirestr);
|
||||||
if(co->domain)
|
if(co->domain)
|
||||||
free(co->domain);
|
free(co->domain);
|
||||||
if(co->path)
|
if(co->path)
|
||||||
@@ -263,8 +337,20 @@ Curl_cookie_add(struct CookieInfo *c,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(NULL == co->domain)
|
if(NULL == co->domain)
|
||||||
/* no domain given in the header line, set the default now */
|
/* no domain was given in the header line, set the default now */
|
||||||
co->domain=domain?strdup(domain):NULL;
|
co->domain=domain?strdup(domain):NULL;
|
||||||
|
if((NULL == co->path) && path) {
|
||||||
|
/* no path was given in the header line, set the default now */
|
||||||
|
char *endslash = strrchr(path, '/');
|
||||||
|
if(endslash) {
|
||||||
|
int pathlen = endslash-path+1; /* include the ending slash */
|
||||||
|
co->path=malloc(pathlen+1); /* one extra for the zero byte */
|
||||||
|
if(co->path) {
|
||||||
|
memcpy(co->path, path, pathlen);
|
||||||
|
co->path[pathlen]=0; /* zero terminate */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* This line is NOT a HTTP header style line, we do offer support for
|
/* This line is NOT a HTTP header style line, we do offer support for
|
||||||
@@ -296,9 +382,12 @@ Curl_cookie_add(struct CookieInfo *c,
|
|||||||
|
|
||||||
/* Now loop through the fields and init the struct we already have
|
/* Now loop through the fields and init the struct we already have
|
||||||
allocated */
|
allocated */
|
||||||
for(ptr=firstptr, fields=0; ptr; ptr=strtok_r(NULL, "\t", &tok_buf), fields++) {
|
for(ptr=firstptr, fields=0; ptr;
|
||||||
|
ptr=strtok_r(NULL, "\t", &tok_buf), fields++) {
|
||||||
switch(fields) {
|
switch(fields) {
|
||||||
case 0:
|
case 0:
|
||||||
|
if(ptr[0]=='.') /* skip preceeding dots */
|
||||||
|
ptr++;
|
||||||
co->domain = strdup(ptr);
|
co->domain = strdup(ptr);
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
@@ -311,10 +400,8 @@ Curl_cookie_add(struct CookieInfo *c,
|
|||||||
|
|
||||||
As far as I can see, it is set to true when the cookie says
|
As far as I can see, it is set to true when the cookie says
|
||||||
.domain.com and to false when the domain is complete www.domain.com
|
.domain.com and to false when the domain is complete www.domain.com
|
||||||
|
|
||||||
We don't currently take advantage of this knowledge.
|
|
||||||
*/
|
*/
|
||||||
co->field1=strequal(ptr, "TRUE")+1; /* store information */
|
co->tailmatch=strequal(ptr, "TRUE"); /* store information */
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
/* It turns out, that sometimes the file format allows the path
|
/* It turns out, that sometimes the file format allows the path
|
||||||
@@ -373,13 +460,8 @@ Curl_cookie_add(struct CookieInfo *c,
|
|||||||
/* the names are identical */
|
/* the names are identical */
|
||||||
|
|
||||||
if(clist->domain && co->domain) {
|
if(clist->domain && co->domain) {
|
||||||
if(strequal(clist->domain, co->domain) ||
|
if(strequal(clist->domain, co->domain))
|
||||||
(clist->domain[0]=='.' &&
|
/* The domains are identical */
|
||||||
strequal(&(clist->domain[1]), co->domain)) ||
|
|
||||||
(co->domain[0]=='.' &&
|
|
||||||
strequal(clist->domain, &(co->domain[1]))) )
|
|
||||||
/* The domains are identical, or at least identical if you skip the
|
|
||||||
preceeding dot */
|
|
||||||
replace_old=TRUE;
|
replace_old=TRUE;
|
||||||
}
|
}
|
||||||
else if(!clist->domain && !co->domain)
|
else if(!clist->domain && !co->domain)
|
||||||
@@ -469,7 +551,6 @@ Curl_cookie_add(struct CookieInfo *c,
|
|||||||
}
|
}
|
||||||
|
|
||||||
c->numcookies++; /* one more cookie in the jar */
|
c->numcookies++; /* one more cookie in the jar */
|
||||||
|
|
||||||
return co;
|
return co;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -531,7 +612,7 @@ struct CookieInfo *Curl_cookie_init(char *file,
|
|||||||
while(*lineptr && isspace((int)*lineptr))
|
while(*lineptr && isspace((int)*lineptr))
|
||||||
lineptr++;
|
lineptr++;
|
||||||
|
|
||||||
Curl_cookie_add(c, headerline, lineptr, NULL);
|
Curl_cookie_add(c, headerline, lineptr, NULL, NULL);
|
||||||
}
|
}
|
||||||
if(fromfile)
|
if(fromfile)
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
@@ -560,9 +641,6 @@ struct Cookie *Curl_cookie_getlist(struct CookieInfo *c,
|
|||||||
struct Cookie *newco;
|
struct Cookie *newco;
|
||||||
struct Cookie *co;
|
struct Cookie *co;
|
||||||
time_t now = time(NULL);
|
time_t now = time(NULL);
|
||||||
int hostlen=strlen(host);
|
|
||||||
int domlen;
|
|
||||||
|
|
||||||
struct Cookie *mainco=NULL;
|
struct Cookie *mainco=NULL;
|
||||||
|
|
||||||
if(!c || !c->cookies)
|
if(!c || !c->cookies)
|
||||||
@@ -571,43 +649,42 @@ struct Cookie *Curl_cookie_getlist(struct CookieInfo *c,
|
|||||||
co = c->cookies;
|
co = c->cookies;
|
||||||
|
|
||||||
while(co) {
|
while(co) {
|
||||||
/* only process this cookie if it is not expired or had no expire
|
/* only process this cookie if it is not expired or had no expire
|
||||||
date AND that if the cookie requires we're secure we must only
|
date AND that if the cookie requires we're secure we must only
|
||||||
continue if we are! */
|
continue if we are! */
|
||||||
if( (co->expires<=0 || (co->expires> now)) &&
|
if( (co->expires<=0 || (co->expires> now)) &&
|
||||||
(co->secure?secure:TRUE) ) {
|
(co->secure?secure:TRUE) ) {
|
||||||
|
|
||||||
/* now check if the domain is correct */
|
/* now check if the domain is correct */
|
||||||
domlen=co->domain?strlen(co->domain):0;
|
if(!co->domain ||
|
||||||
if(!co->domain ||
|
(co->tailmatch && tailmatch(co->domain, host)) ||
|
||||||
((domlen<=hostlen) &&
|
(!co->tailmatch && strequal(host, co->domain)) ) {
|
||||||
strequal(host+(hostlen-domlen), co->domain)) ) {
|
/* the right part of the host matches the domain stuff in the
|
||||||
/* the right part of the host matches the domain stuff in the
|
cookie data */
|
||||||
cookie data */
|
|
||||||
|
|
||||||
/* now check the left part of the path with the cookies path
|
/* now check the left part of the path with the cookies path
|
||||||
requirement */
|
requirement */
|
||||||
if(!co->path ||
|
if(!co->path ||
|
||||||
checkprefix(co->path, path) ) {
|
checkprefix(co->path, path) ) {
|
||||||
|
|
||||||
/* and now, we know this is a match and we should create an
|
/* and now, we know this is a match and we should create an
|
||||||
entry for the return-linked-list */
|
entry for the return-linked-list */
|
||||||
|
|
||||||
newco = (struct Cookie *)malloc(sizeof(struct Cookie));
|
newco = (struct Cookie *)malloc(sizeof(struct Cookie));
|
||||||
if(newco) {
|
if(newco) {
|
||||||
/* first, copy the whole source cookie: */
|
/* first, copy the whole source cookie: */
|
||||||
memcpy(newco, co, sizeof(struct Cookie));
|
memcpy(newco, co, sizeof(struct Cookie));
|
||||||
|
|
||||||
/* then modify our next */
|
/* then modify our next */
|
||||||
newco->next = mainco;
|
newco->next = mainco;
|
||||||
|
|
||||||
/* point the main to us */
|
/* point the main to us */
|
||||||
mainco = newco;
|
mainco = newco;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
co = co->next;
|
co = co->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
return mainco; /* return the new list */
|
return mainco; /* return the new list */
|
||||||
@@ -715,15 +792,19 @@ int Curl_cookie_output(struct CookieInfo *c, char *dumphere)
|
|||||||
|
|
||||||
while(co) {
|
while(co) {
|
||||||
fprintf(out,
|
fprintf(out,
|
||||||
"%s\t" /* domain */
|
"%s%s\t" /* domain */
|
||||||
"%s\t" /* field1 */
|
"%s\t" /* tailmatch */
|
||||||
"%s\t" /* path */
|
"%s\t" /* path */
|
||||||
"%s\t" /* secure */
|
"%s\t" /* secure */
|
||||||
"%u\t" /* expires */
|
"%u\t" /* expires */
|
||||||
"%s\t" /* name */
|
"%s\t" /* name */
|
||||||
"%s\n", /* value */
|
"%s\n", /* value */
|
||||||
|
|
||||||
|
/* Make sure all domains are prefixed with a dot if they allow
|
||||||
|
tailmatching. This is Mozilla-style. */
|
||||||
|
(co->tailmatch && co->domain && co->domain[0] != '.')? ".":"",
|
||||||
co->domain?co->domain:"unknown",
|
co->domain?co->domain:"unknown",
|
||||||
co->field1==2?"TRUE":"FALSE",
|
co->tailmatch?"TRUE":"FALSE",
|
||||||
co->path?co->path:"/",
|
co->path?co->path:"/",
|
||||||
co->secure?"TRUE":"FALSE",
|
co->secure?"TRUE":"FALSE",
|
||||||
(unsigned int)co->expires,
|
(unsigned int)co->expires,
|
||||||
@@ -768,11 +849,3 @@ int main(int argc, char **argv)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* CURL_DISABLE_HTTP */
|
#endif /* CURL_DISABLE_HTTP */
|
||||||
|
|
||||||
/*
|
|
||||||
* local variables:
|
|
||||||
* eval: (load-file "../curl-mode.el")
|
|
||||||
* end:
|
|
||||||
* vim600: fdm=marker
|
|
||||||
* vim: et sw=2 ts=2 sts=2 tw=78
|
|
||||||
*/
|
|
||||||
|
11
lib/cookie.h
11
lib/cookie.h
@@ -7,7 +7,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2003, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -40,8 +40,7 @@ struct Cookie {
|
|||||||
char *domain; /* domain = <this> */
|
char *domain; /* domain = <this> */
|
||||||
long expires; /* expires = <this> */
|
long expires; /* expires = <this> */
|
||||||
char *expirestr; /* the plain text version */
|
char *expirestr; /* the plain text version */
|
||||||
|
bool tailmatch; /* weather we do tail-matchning of the domain name */
|
||||||
char field1; /* read from a cookie file, 1 => FALSE, 2=> TRUE */
|
|
||||||
|
|
||||||
/* RFC 2109 keywords. Version=1 means 2109-compliant cookie sending */
|
/* RFC 2109 keywords. Version=1 means 2109-compliant cookie sending */
|
||||||
char *version; /* Version = <value> */
|
char *version; /* Version = <value> */
|
||||||
@@ -70,11 +69,11 @@ struct CookieInfo {
|
|||||||
#define MAX_NAME_TXT "255"
|
#define MAX_NAME_TXT "255"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Add a cookie to the internal list of cookies. The domain argument is only
|
* Add a cookie to the internal list of cookies. The domain and path arguments
|
||||||
* used if the header boolean is TRUE.
|
* are only used if the header boolean is TRUE.
|
||||||
*/
|
*/
|
||||||
struct Cookie *Curl_cookie_add(struct CookieInfo *, bool header, char *line,
|
struct Cookie *Curl_cookie_add(struct CookieInfo *, bool header, char *line,
|
||||||
char *domain);
|
char *domain, char *path);
|
||||||
|
|
||||||
struct CookieInfo *Curl_cookie_init(char *, struct CookieInfo *, bool);
|
struct CookieInfo *Curl_cookie_init(char *, struct CookieInfo *, bool);
|
||||||
struct Cookie *Curl_cookie_getlist(struct CookieInfo *, char *, char *, bool);
|
struct Cookie *Curl_cookie_getlist(struct CookieInfo *, char *, char *, bool);
|
||||||
|
@@ -243,6 +243,10 @@ SOURCE=.\url.c
|
|||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\share.c
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
SOURCE=.\version.c
|
SOURCE=.\version.c
|
||||||
# End Source File
|
# End Source File
|
||||||
# End Group
|
# End Group
|
||||||
|
10
lib/dict.c
10
lib/dict.c
@@ -5,7 +5,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2003, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -231,11 +231,3 @@ CURLcode Curl_dict(struct connectdata *conn)
|
|||||||
|
|
||||||
return CURLE_OK;
|
return CURLE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* local variables:
|
|
||||||
* eval: (load-file "../curl-mode.el")
|
|
||||||
* end:
|
|
||||||
* vim600: fdm=marker
|
|
||||||
* vim: et sw=2 ts=2 sts=2 tw=78
|
|
||||||
*/
|
|
||||||
|
@@ -8,7 +8,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2003, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
|
19
lib/easy.c
19
lib/easy.c
@@ -5,7 +5,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2003, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -200,6 +200,7 @@ CURLcode curl_easy_setopt(CURL *curl, CURLoption tag, ...)
|
|||||||
long param_long = 0;
|
long param_long = 0;
|
||||||
void *param_obj = NULL;
|
void *param_obj = NULL;
|
||||||
struct SessionHandle *data = curl;
|
struct SessionHandle *data = curl;
|
||||||
|
CURLcode ret=CURLE_FAILED_INIT;
|
||||||
|
|
||||||
va_start(arg, tag);
|
va_start(arg, tag);
|
||||||
|
|
||||||
@@ -213,20 +214,20 @@ CURLcode curl_easy_setopt(CURL *curl, CURLoption tag, ...)
|
|||||||
if(tag < CURLOPTTYPE_OBJECTPOINT) {
|
if(tag < CURLOPTTYPE_OBJECTPOINT) {
|
||||||
/* This is a LONG type */
|
/* This is a LONG type */
|
||||||
param_long = va_arg(arg, long);
|
param_long = va_arg(arg, long);
|
||||||
Curl_setopt(data, tag, param_long);
|
ret = Curl_setopt(data, tag, param_long);
|
||||||
}
|
}
|
||||||
else if(tag < CURLOPTTYPE_FUNCTIONPOINT) {
|
else if(tag < CURLOPTTYPE_FUNCTIONPOINT) {
|
||||||
/* This is a object pointer type */
|
/* This is a object pointer type */
|
||||||
param_obj = va_arg(arg, void *);
|
param_obj = va_arg(arg, void *);
|
||||||
Curl_setopt(data, tag, param_obj);
|
ret = Curl_setopt(data, tag, param_obj);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
param_func = va_arg(arg, func_T );
|
param_func = va_arg(arg, func_T );
|
||||||
Curl_setopt(data, tag, param_func);
|
ret = Curl_setopt(data, tag, param_func);
|
||||||
}
|
}
|
||||||
|
|
||||||
va_end(arg);
|
va_end(arg);
|
||||||
return CURLE_OK;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
CURLcode curl_easy_perform(CURL *curl)
|
CURLcode curl_easy_perform(CURL *curl)
|
||||||
@@ -333,11 +334,3 @@ CURL *curl_easy_duphandle(CURL *incurl)
|
|||||||
|
|
||||||
return outcurl;
|
return outcurl;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* local variables:
|
|
||||||
* eval: (load-file "../curl-mode.el")
|
|
||||||
* end:
|
|
||||||
* vim600: fdm=marker
|
|
||||||
* vim: et sw=2 ts=2 sts=2 tw=78
|
|
||||||
*/
|
|
||||||
|
10
lib/escape.c
10
lib/escape.c
@@ -5,7 +5,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2003, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -113,11 +113,3 @@ void curl_free(void *p)
|
|||||||
{
|
{
|
||||||
free(p);
|
free(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* local variables:
|
|
||||||
* eval: (load-file "../curl-mode.el")
|
|
||||||
* end:
|
|
||||||
* vim600: fdm=marker
|
|
||||||
* vim: et sw=2 ts=2 sts=2 tw=78
|
|
||||||
*/
|
|
||||||
|
@@ -8,7 +8,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2003, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
|
10
lib/file.c
10
lib/file.c
@@ -5,7 +5,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2003, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -211,12 +211,4 @@ CURLcode Curl_file(struct connectdata *conn)
|
|||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* local variables:
|
|
||||||
* eval: (load-file "../curl-mode.el")
|
|
||||||
* end:
|
|
||||||
* vim600: fdm=marker
|
|
||||||
* vim: et sw=2 ts=2 sts=2 tw=78
|
|
||||||
*/
|
|
||||||
#endif
|
#endif
|
||||||
|
@@ -8,7 +8,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2003, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
|
@@ -5,7 +5,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2003, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -128,11 +128,8 @@ Content-Disposition: form-data; name="FILECONTENT"
|
|||||||
#include "memdebug.h"
|
#include "memdebug.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Length of the random boundary string. The risk of this being used
|
/* Length of the random boundary string. */
|
||||||
in binary data is very close to zero, 64^32 makes
|
#define BOUNDARY_LENGTH 40
|
||||||
6277101735386680763835789423207666416102355444464034512896
|
|
||||||
combinations... */
|
|
||||||
#define BOUNDARY_LENGTH 32
|
|
||||||
|
|
||||||
/* What kind of Content-Type to use on un-specified files with unrecognized
|
/* What kind of Content-Type to use on un-specified files with unrecognized
|
||||||
extensions. */
|
extensions. */
|
||||||
@@ -520,7 +517,7 @@ static const char * ContentTypeForFilename (const char *filename,
|
|||||||
{".jpg", "image/jpeg"},
|
{".jpg", "image/jpeg"},
|
||||||
{".jpeg", "image/jpeg"},
|
{".jpeg", "image/jpeg"},
|
||||||
{".txt", "text/plain"},
|
{".txt", "text/plain"},
|
||||||
{".html", "text/plain"}
|
{".html", "text/html"}
|
||||||
};
|
};
|
||||||
|
|
||||||
if(prevtype)
|
if(prevtype)
|
||||||
@@ -1049,22 +1046,23 @@ char *Curl_FormBoundary(void)
|
|||||||
the same form won't be identical */
|
the same form won't be identical */
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
static char table62[]=
|
static char table16[]="abcdef0123456789";
|
||||||
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
|
|
||||||
|
|
||||||
retstring = (char *)malloc(BOUNDARY_LENGTH);
|
retstring = (char *)malloc(BOUNDARY_LENGTH+1);
|
||||||
|
|
||||||
if(!retstring)
|
if(!retstring)
|
||||||
return NULL; /* failed */
|
return NULL; /* failed */
|
||||||
|
|
||||||
srand(time(NULL)+randomizer++); /* seed */
|
srand(time(NULL)+randomizer++); /* seed */
|
||||||
|
|
||||||
strcpy(retstring, "curl"); /* bonus commercials 8*) */
|
strcpy(retstring, "----------------------------");
|
||||||
|
|
||||||
for(i=4; i<(BOUNDARY_LENGTH-1); i++) {
|
for(i=strlen(retstring); i<BOUNDARY_LENGTH; i++)
|
||||||
retstring[i] = table62[rand()%62];
|
retstring[i] = table16[rand()%16];
|
||||||
}
|
|
||||||
retstring[BOUNDARY_LENGTH-1]=0; /* zero terminate */
|
/* 28 dashes and 12 hexadecimal digits makes 12^16 (184884258895036416)
|
||||||
|
combinations */
|
||||||
|
retstring[BOUNDARY_LENGTH]=0; /* zero terminate */
|
||||||
|
|
||||||
return retstring;
|
return retstring;
|
||||||
}
|
}
|
||||||
@@ -1596,11 +1594,3 @@ int main(int argc, char **argv)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* CURL_DISABLE_HTTP */
|
#endif /* CURL_DISABLE_HTTP */
|
||||||
|
|
||||||
/*
|
|
||||||
* local variables:
|
|
||||||
* eval: (load-file "../curl-mode.el")
|
|
||||||
* end:
|
|
||||||
* vim600: fdm=marker
|
|
||||||
* vim: et sw=2 ts=2 sts=2 tw=78
|
|
||||||
*/
|
|
||||||
|
@@ -8,7 +8,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2003, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
|
200
lib/ftp.c
200
lib/ftp.c
@@ -5,7 +5,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2003, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -158,6 +158,7 @@ static CURLcode AllowServerConnect(struct SessionHandle *data,
|
|||||||
infof(data, "Connection accepted from server\n");
|
infof(data, "Connection accepted from server\n");
|
||||||
|
|
||||||
conn->secondarysocket = s;
|
conn->secondarysocket = s;
|
||||||
|
Curl_nonblock(s, TRUE); /* enable non-blocking */
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -173,7 +174,7 @@ static CURLcode AllowServerConnect(struct SessionHandle *data,
|
|||||||
* response and extract the relevant return code for the invoking function.
|
* response and extract the relevant return code for the invoking function.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
CURLcode Curl_GetFTPResponse(int *nreadp, /* return number of bytes read */
|
CURLcode Curl_GetFTPResponse(ssize_t *nreadp, /* return number of bytes read */
|
||||||
struct connectdata *conn,
|
struct connectdata *conn,
|
||||||
int *ftpcode) /* return the ftp-code */
|
int *ftpcode) /* return the ftp-code */
|
||||||
{
|
{
|
||||||
@@ -237,7 +238,7 @@ CURLcode Curl_GetFTPResponse(int *nreadp, /* return number of bytes read */
|
|||||||
|
|
||||||
if(!ftp->cache) {
|
if(!ftp->cache) {
|
||||||
readfd = rkeepfd; /* set every lap */
|
readfd = rkeepfd; /* set every lap */
|
||||||
interval.tv_sec = timeout;
|
interval.tv_sec = 1; /* use 1 second timeout intervals */
|
||||||
interval.tv_usec = 0;
|
interval.tv_usec = 0;
|
||||||
|
|
||||||
switch (select (sockfd+1, &readfd, NULL, NULL, &interval)) {
|
switch (select (sockfd+1, &readfd, NULL, NULL, &interval)) {
|
||||||
@@ -246,9 +247,10 @@ CURLcode Curl_GetFTPResponse(int *nreadp, /* return number of bytes read */
|
|||||||
failf(data, "Transfer aborted due to select() error: %d", errno);
|
failf(data, "Transfer aborted due to select() error: %d", errno);
|
||||||
break;
|
break;
|
||||||
case 0: /* timeout */
|
case 0: /* timeout */
|
||||||
result = CURLE_OPERATION_TIMEDOUT;
|
if(Curl_pgrsUpdate(conn))
|
||||||
failf(data, "Transfer aborted due to timeout");
|
return CURLE_ABORTED_BY_CALLBACK;
|
||||||
break;
|
continue; /* just continue in our loop for the timeout duration */
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -387,7 +389,7 @@ CURLcode Curl_GetFTPResponse(int *nreadp, /* return number of bytes read */
|
|||||||
CURLcode Curl_ftp_connect(struct connectdata *conn)
|
CURLcode Curl_ftp_connect(struct connectdata *conn)
|
||||||
{
|
{
|
||||||
/* this is FTP and no proxy */
|
/* this is FTP and no proxy */
|
||||||
int nread;
|
ssize_t nread;
|
||||||
struct SessionHandle *data=conn->data;
|
struct SessionHandle *data=conn->data;
|
||||||
char *buf = data->state.buffer; /* this is our buffer */
|
char *buf = data->state.buffer; /* this is our buffer */
|
||||||
struct FTP *ftp;
|
struct FTP *ftp;
|
||||||
@@ -726,7 +728,10 @@ CURLcode ftp_cwd(struct connectdata *conn, char *path)
|
|||||||
if (result)
|
if (result)
|
||||||
return result;
|
return result;
|
||||||
|
|
||||||
if (ftpcode != 250) {
|
/* According to RFC959, CWD is supposed to return 250 on success, but
|
||||||
|
there seem to be non-compliant FTP servers out there that return 200,
|
||||||
|
so we accept any '2xy' code here. */
|
||||||
|
if (ftpcode/100 != 2) {
|
||||||
failf(conn->data, "Couldn't cd to %s", path);
|
failf(conn->data, "Couldn't cd to %s", path);
|
||||||
return CURLE_FTP_ACCESS_DENIED;
|
return CURLE_FTP_ACCESS_DENIED;
|
||||||
}
|
}
|
||||||
@@ -933,6 +938,7 @@ ftp_pasv_verbose(struct connectdata *conn,
|
|||||||
# endif
|
# endif
|
||||||
|
|
||||||
# else
|
# else
|
||||||
|
(void)hostent_buf; /* avoid compiler warning */
|
||||||
answer = gethostbyaddr((char *) &address, sizeof(address), AF_INET);
|
answer = gethostbyaddr((char *) &address, sizeof(address), AF_INET);
|
||||||
# endif
|
# endif
|
||||||
#else
|
#else
|
||||||
@@ -961,7 +967,7 @@ ftp_pasv_verbose(struct connectdata *conn,
|
|||||||
#else
|
#else
|
||||||
const int niflags = NI_NUMERICHOST | NI_NUMERICSERV;
|
const int niflags = NI_NUMERICHOST | NI_NUMERICSERV;
|
||||||
#endif
|
#endif
|
||||||
port = 0; /* unused, prevent warning */
|
(void)port; /* prevent compiler warning */
|
||||||
if (getnameinfo(addr->ai_addr, addr->ai_addrlen,
|
if (getnameinfo(addr->ai_addr, addr->ai_addrlen,
|
||||||
nbuf, sizeof(nbuf), sbuf, sizeof(sbuf), niflags)) {
|
nbuf, sizeof(nbuf), sbuf, sizeof(sbuf), niflags)) {
|
||||||
snprintf(nbuf, sizeof(nbuf), "?");
|
snprintf(nbuf, sizeof(nbuf), "?");
|
||||||
@@ -1076,7 +1082,8 @@ CURLcode ftp_use_port(struct connectdata *conn)
|
|||||||
return CURLE_FTP_PORT_FAILED;
|
return CURLE_FTP_PORT_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (modep = (char **)mode; modep && *modep; modep++) {
|
for (modep = (char **)(data->set.ftp_use_eprt?&mode[0]:&mode[2]);
|
||||||
|
modep && *modep; modep++) {
|
||||||
int lprtaf, eprtaf;
|
int lprtaf, eprtaf;
|
||||||
int alen=0, plen=0;
|
int alen=0, plen=0;
|
||||||
|
|
||||||
@@ -1206,7 +1213,13 @@ CURLcode ftp_use_port(struct connectdata *conn)
|
|||||||
bool sa_filled_in = FALSE;
|
bool sa_filled_in = FALSE;
|
||||||
|
|
||||||
if(data->set.ftpport) {
|
if(data->set.ftpport) {
|
||||||
if(Curl_if2ip(data->set.ftpport, myhost, sizeof(myhost))) {
|
in_addr_t in;
|
||||||
|
|
||||||
|
/* First check if the given name is an IP address */
|
||||||
|
in=inet_addr(data->set.ftpport);
|
||||||
|
|
||||||
|
if((in == CURL_INADDR_NONE) &&
|
||||||
|
Curl_if2ip(data->set.ftpport, myhost, sizeof(myhost))) {
|
||||||
h = Curl_resolv(data, myhost, 0);
|
h = Curl_resolv(data, myhost, 0);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@@ -1233,7 +1246,7 @@ CURLcode ftp_use_port(struct connectdata *conn)
|
|||||||
|
|
||||||
if(h)
|
if(h)
|
||||||
/* when we return from here, we can forget about this */
|
/* when we return from here, we can forget about this */
|
||||||
Curl_resolv_unlock(h);
|
Curl_resolv_unlock(data, h);
|
||||||
|
|
||||||
if ( h || sa_filled_in) {
|
if ( h || sa_filled_in) {
|
||||||
if( (portsock = socket(AF_INET, SOCK_STREAM, 0)) >= 0 ) {
|
if( (portsock = socket(AF_INET, SOCK_STREAM, 0)) >= 0 ) {
|
||||||
@@ -1497,7 +1510,7 @@ CURLcode ftp_use_pasv(struct connectdata *conn,
|
|||||||
&conninfo,
|
&conninfo,
|
||||||
connected);
|
connected);
|
||||||
|
|
||||||
Curl_resolv_unlock(addr); /* we're done using this address */
|
Curl_resolv_unlock(data, addr); /* we're done using this address */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* When this is used from the multi interface, this might've returned with
|
* When this is used from the multi interface, this might've returned with
|
||||||
@@ -1854,9 +1867,19 @@ CURLcode Curl_ftp_nextconnect(struct connectdata *conn)
|
|||||||
|
|
||||||
int size=-1; /* default unknown size */
|
int size=-1; /* default unknown size */
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* It appears that there are FTP-servers that return size 0 for files
|
||||||
|
* when SIZE is used on the file while being in BINARY mode. To work
|
||||||
|
* around that (stupid) behavior, we attempt to parse the RETR response
|
||||||
|
* even if the SIZE returned size zero.
|
||||||
|
*
|
||||||
|
* Debugging help from Salvatore Sorrentino on February 26, 2003.
|
||||||
|
*/
|
||||||
|
|
||||||
if(!dirlist &&
|
if(!dirlist &&
|
||||||
!data->set.ftp_ascii &&
|
!data->set.ftp_ascii &&
|
||||||
(-1 == downloadsize)) {
|
(downloadsize < 1)) {
|
||||||
/*
|
/*
|
||||||
* It seems directory listings either don't show the size or very
|
* It seems directory listings either don't show the size or very
|
||||||
* often uses size 0 anyway. ASCII transfers may very well turn out
|
* often uses size 0 anyway. ASCII transfers may very well turn out
|
||||||
@@ -1953,17 +1976,46 @@ CURLcode ftp_perform(struct connectdata *conn,
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* change directory first! */
|
{
|
||||||
if(ftp->dir && ftp->dir[0]) {
|
int i; /* counter for loop */
|
||||||
if ((result = ftp_cwd(conn, ftp->dir)) != CURLE_OK)
|
for (i=0; ftp->dirs[i]; i++) {
|
||||||
|
/* RFC 1738 says empty components should be respected too */
|
||||||
|
if ((result = ftp_cwd(conn, ftp->dirs[i])) != CURLE_OK)
|
||||||
return result;
|
return result;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Requested time of file? */
|
/* Requested time of file or time-depended transfer? */
|
||||||
if(data->set.get_filetime && ftp->file) {
|
if((data->set.get_filetime || data->set.timecondition) &&
|
||||||
|
ftp->file) {
|
||||||
result = ftp_getfiletime(conn, ftp->file);
|
result = ftp_getfiletime(conn, ftp->file);
|
||||||
if(result)
|
if(result)
|
||||||
return result;
|
return result;
|
||||||
|
|
||||||
|
if(data->set.timecondition) {
|
||||||
|
if((data->info.filetime > 0) && (data->set.timevalue > 0)) {
|
||||||
|
switch(data->set.timecondition) {
|
||||||
|
case TIMECOND_IFMODSINCE:
|
||||||
|
default:
|
||||||
|
if(data->info.filetime < data->set.timevalue) {
|
||||||
|
infof(data, "The requested document is not new enough\n");
|
||||||
|
ftp->no_transfer = TRUE; /* mark this to not transfer data */
|
||||||
|
return CURLE_OK;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case TIMECOND_IFUNMODSINCE:
|
||||||
|
if(data->info.filetime > data->set.timevalue) {
|
||||||
|
infof(data, "The requested document is not old enough\n");
|
||||||
|
ftp->no_transfer = TRUE; /* mark this to not transfer data */
|
||||||
|
return CURLE_OK;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
} /* switch */
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
infof(data, "Skipping time comparison\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If we have selected NOBODY and HEADER, it means that we only want file
|
/* If we have selected NOBODY and HEADER, it means that we only want file
|
||||||
@@ -2006,7 +2058,7 @@ CURLcode ftp_perform(struct connectdata *conn,
|
|||||||
tm = localtime((unsigned long *)&data->info.filetime);
|
tm = localtime((unsigned long *)&data->info.filetime);
|
||||||
#endif
|
#endif
|
||||||
/* format: "Tue, 15 Nov 1994 12:45:26 GMT" */
|
/* format: "Tue, 15 Nov 1994 12:45:26 GMT" */
|
||||||
strftime(buf, BUFSIZE-1, "Last-Modified: %a, %d %b %Y %H:%M:%S %Z\r\n",
|
strftime(buf, BUFSIZE-1, "Last-Modified: %a, %d %b %Y %H:%M:%S GMT\r\n",
|
||||||
tm);
|
tm);
|
||||||
result = Curl_client_write(data, CLIENTWRITE_BOTH, buf, 0);
|
result = Curl_client_write(data, CLIENTWRITE_BOTH, buf, 0);
|
||||||
if(result)
|
if(result)
|
||||||
@@ -2051,33 +2103,70 @@ CURLcode ftp_perform(struct connectdata *conn,
|
|||||||
*/
|
*/
|
||||||
CURLcode Curl_ftp(struct connectdata *conn)
|
CURLcode Curl_ftp(struct connectdata *conn)
|
||||||
{
|
{
|
||||||
CURLcode retcode;
|
CURLcode retcode=CURLE_OK;
|
||||||
bool connected;
|
bool connected=0;
|
||||||
|
|
||||||
struct SessionHandle *data = conn->data;
|
struct SessionHandle *data = conn->data;
|
||||||
struct FTP *ftp;
|
struct FTP *ftp;
|
||||||
int dirlength=0; /* 0 forces strlen() */
|
|
||||||
|
char *slash_pos; /* position of the first '/' char in curpos */
|
||||||
|
char *cur_pos=conn->ppath; /* current position in ppath. point at the begin
|
||||||
|
of next path component */
|
||||||
|
int path_part=0;/* current path component */
|
||||||
|
|
||||||
/* the ftp struct is already inited in ftp_connect() */
|
/* the ftp struct is already inited in ftp_connect() */
|
||||||
ftp = conn->proto.ftp;
|
ftp = conn->proto.ftp;
|
||||||
|
conn->size = -1; /* make sure this is unknown at this point */
|
||||||
|
|
||||||
/* We split the path into dir and file parts *before* we URLdecode
|
Curl_pgrsSetUploadCounter(data, 0);
|
||||||
it */
|
Curl_pgrsSetDownloadCounter(data, 0);
|
||||||
ftp->file = strrchr(conn->ppath, '/');
|
Curl_pgrsSetUploadSize(data, 0);
|
||||||
if(ftp->file) {
|
Curl_pgrsSetDownloadSize(data, 0);
|
||||||
if(ftp->file != conn->ppath)
|
|
||||||
dirlength=ftp->file-conn->ppath; /* don't count the traling slash */
|
|
||||||
|
|
||||||
ftp->file++; /* point to the first letter in the file name part or
|
/* fixed : initialize ftp->dirs[xxx] to NULL !
|
||||||
remain NULL */
|
is done in Curl_ftp_connect() */
|
||||||
}
|
|
||||||
else {
|
/* parse the URL path into separate path components */
|
||||||
ftp->file = conn->ppath; /* there's only a file part */
|
while((slash_pos=strchr(cur_pos, '/'))) {
|
||||||
|
/* seek out the next path component */
|
||||||
|
if (0 == slash_pos-cur_pos) /* empty path component, like "x//y" */
|
||||||
|
ftp->dirs[path_part] = strdup(""); /* empty string */
|
||||||
|
else
|
||||||
|
ftp->dirs[path_part] = curl_unescape(cur_pos,slash_pos-cur_pos);
|
||||||
|
|
||||||
|
if (!ftp->dirs[path_part]) { /* run out of memory ... */
|
||||||
|
failf(data, "no memory");
|
||||||
|
retcode = CURLE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
cur_pos = slash_pos + 1; /* jump to the rest of the string */
|
||||||
|
if(++path_part >= (CURL_MAX_FTP_DIRDEPTH-1)) {
|
||||||
|
/* too deep, we need the last entry to be kept NULL at all
|
||||||
|
times to signal end of list */
|
||||||
|
failf(data, "too deep dir hierarchy");
|
||||||
|
retcode = CURLE_URL_MALFORMAT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (retcode) {
|
||||||
|
int i;
|
||||||
|
for (i=0;i<path_part;i++) { /* free previous parts */
|
||||||
|
free(ftp->dirs[i]);
|
||||||
|
ftp->dirs[i]=NULL;
|
||||||
|
}
|
||||||
|
return retcode; /* failure */
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ftp->file = cur_pos; /* the rest is the file name */
|
||||||
|
|
||||||
if(*ftp->file) {
|
if(*ftp->file) {
|
||||||
ftp->file = curl_unescape(ftp->file, 0);
|
ftp->file = curl_unescape(ftp->file, 0);
|
||||||
if(NULL == ftp->file) {
|
if(NULL == ftp->file) {
|
||||||
|
int i;
|
||||||
|
for (i=0;i<path_part;i++){
|
||||||
|
free(ftp->dirs[i]);
|
||||||
|
ftp->dirs[i]=NULL;
|
||||||
|
}
|
||||||
failf(data, "no memory");
|
failf(data, "no memory");
|
||||||
return CURLE_OUT_OF_MEMORY;
|
return CURLE_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
@@ -2086,27 +2175,21 @@ CURLcode Curl_ftp(struct connectdata *conn)
|
|||||||
ftp->file=NULL; /* instead of point to a zero byte, we make it a NULL
|
ftp->file=NULL; /* instead of point to a zero byte, we make it a NULL
|
||||||
pointer */
|
pointer */
|
||||||
|
|
||||||
ftp->urlpath = conn->ppath;
|
|
||||||
if(dirlength) {
|
|
||||||
ftp->dir = curl_unescape(ftp->urlpath, dirlength);
|
|
||||||
if(NULL == ftp->dir) {
|
|
||||||
if(ftp->file)
|
|
||||||
free(ftp->file);
|
|
||||||
failf(data, "no memory");
|
|
||||||
return CURLE_OUT_OF_MEMORY; /* failure */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
ftp->dir = NULL;
|
|
||||||
|
|
||||||
retcode = ftp_perform(conn, &connected);
|
retcode = ftp_perform(conn, &connected);
|
||||||
|
|
||||||
if(CURLE_OK == retcode) {
|
if(CURLE_OK == retcode) {
|
||||||
if(connected)
|
if(connected)
|
||||||
retcode = Curl_ftp_nextconnect(conn);
|
retcode = Curl_ftp_nextconnect(conn);
|
||||||
else
|
else {
|
||||||
/* since we didn't connect now, we want do_more to get called */
|
if(ftp->no_transfer) {
|
||||||
conn->bits.do_more = TRUE;
|
/* no data to transfer */
|
||||||
|
retcode=Curl_Transfer(conn, -1, -1, FALSE, NULL, -1, NULL);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* since we didn't connect now, we want do_more to get called */
|
||||||
|
conn->bits.do_more = TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return retcode;
|
return retcode;
|
||||||
@@ -2171,6 +2254,7 @@ CURLcode Curl_ftpsendf(struct connectdata *conn,
|
|||||||
CURLcode Curl_ftp_disconnect(struct connectdata *conn)
|
CURLcode Curl_ftp_disconnect(struct connectdata *conn)
|
||||||
{
|
{
|
||||||
struct FTP *ftp= conn->proto.ftp;
|
struct FTP *ftp= conn->proto.ftp;
|
||||||
|
int i;
|
||||||
|
|
||||||
/* The FTP session may or may not have been allocated/setup at this point! */
|
/* The FTP session may or may not have been allocated/setup at this point! */
|
||||||
if(ftp) {
|
if(ftp) {
|
||||||
@@ -2180,20 +2264,14 @@ CURLcode Curl_ftp_disconnect(struct connectdata *conn)
|
|||||||
free(ftp->cache);
|
free(ftp->cache);
|
||||||
if(ftp->file)
|
if(ftp->file)
|
||||||
free(ftp->file);
|
free(ftp->file);
|
||||||
if(ftp->dir)
|
for (i=0;ftp->dirs[i];i++){
|
||||||
free(ftp->dir);
|
free(ftp->dirs[i]);
|
||||||
|
ftp->dirs[i]=NULL;
|
||||||
|
}
|
||||||
|
|
||||||
ftp->file = ftp->dir = NULL; /* zero */
|
ftp->file = NULL; /* zero */
|
||||||
}
|
}
|
||||||
return CURLE_OK;
|
return CURLE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* local variables:
|
|
||||||
* eval: (load-file "../curl-mode.el")
|
|
||||||
* end:
|
|
||||||
* vim600: fdm=marker
|
|
||||||
* vim: et sw=2 ts=2 sts=2 tw=78
|
|
||||||
*/
|
|
||||||
|
|
||||||
#endif /* CURL_DISABLE_FTP */
|
#endif /* CURL_DISABLE_FTP */
|
||||||
|
@@ -7,7 +7,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2003, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -29,7 +29,7 @@ CURLcode Curl_ftp_done(struct connectdata *conn);
|
|||||||
CURLcode Curl_ftp_connect(struct connectdata *conn);
|
CURLcode Curl_ftp_connect(struct connectdata *conn);
|
||||||
CURLcode Curl_ftp_disconnect(struct connectdata *conn);
|
CURLcode Curl_ftp_disconnect(struct connectdata *conn);
|
||||||
CURLcode Curl_ftpsendf(struct connectdata *, const char *fmt, ...);
|
CURLcode Curl_ftpsendf(struct connectdata *, const char *fmt, ...);
|
||||||
CURLcode Curl_GetFTPResponse(int *nread, struct connectdata *conn,
|
CURLcode Curl_GetFTPResponse(ssize_t *nread, struct connectdata *conn,
|
||||||
int *ftpcode);
|
int *ftpcode);
|
||||||
CURLcode Curl_ftp_nextconnect(struct connectdata *conn);
|
CURLcode Curl_ftp_nextconnect(struct connectdata *conn);
|
||||||
#endif
|
#endif
|
||||||
|
@@ -195,7 +195,7 @@ typedef enum _MERIDIAN {
|
|||||||
} MERIDIAN;
|
} MERIDIAN;
|
||||||
|
|
||||||
/* parse results and input string */
|
/* parse results and input string */
|
||||||
typedef struct _CONTEXT {
|
typedef struct _CURL_CONTEXT {
|
||||||
const char *yyInput;
|
const char *yyInput;
|
||||||
int yyDayOrdinal;
|
int yyDayOrdinal;
|
||||||
int yyDayNumber;
|
int yyDayNumber;
|
||||||
@@ -218,14 +218,14 @@ typedef struct _CONTEXT {
|
|||||||
int yyRelMonth;
|
int yyRelMonth;
|
||||||
int yyRelSeconds;
|
int yyRelSeconds;
|
||||||
int yyRelYear;
|
int yyRelYear;
|
||||||
} CONTEXT;
|
} CURL_CONTEXT;
|
||||||
|
|
||||||
/* enable use of extra argument to yyparse and yylex which can be used to pass
|
/* enable use of extra argument to yyparse and yylex which can be used to pass
|
||||||
** in a user defined value (CONTEXT struct in our case)
|
** in a user defined value (CURL_CONTEXT struct in our case)
|
||||||
*/
|
*/
|
||||||
#define YYPARSE_PARAM cookie
|
#define YYPARSE_PARAM cookie
|
||||||
#define YYLEX_PARAM cookie
|
#define YYLEX_PARAM cookie
|
||||||
#define context ((CONTEXT *) cookie)
|
#define context ((CURL_CONTEXT *) cookie)
|
||||||
|
|
||||||
#line 215 "getdate.y"
|
#line 215 "getdate.y"
|
||||||
typedef union {
|
typedef union {
|
||||||
@@ -397,7 +397,7 @@ static const short yycheck[] = { 0,
|
|||||||
#define YYPURE 1
|
#define YYPURE 1
|
||||||
|
|
||||||
/* -*-C-*- Note some compilers choke on comments on `#line' lines. */
|
/* -*-C-*- Note some compilers choke on comments on `#line' lines. */
|
||||||
#line 3 "/usr/local/share/bison.simple"
|
#line 3 "/usr/lib/bison.simple"
|
||||||
/* This file comes from bison-1.28. */
|
/* This file comes from bison-1.28. */
|
||||||
|
|
||||||
/* Skeleton output parser for bison,
|
/* Skeleton output parser for bison,
|
||||||
@@ -611,7 +611,7 @@ __yy_memcpy (char *to, char *from, unsigned int count)
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#line 217 "/usr/local/share/bison.simple"
|
#line 217 "/usr/lib/bison.simple"
|
||||||
|
|
||||||
/* The user can define YYPARSE_PARAM as the name of an argument to be passed
|
/* The user can define YYPARSE_PARAM as the name of an argument to be passed
|
||||||
into yyparse. The argument should have type void *.
|
into yyparse. The argument should have type void *.
|
||||||
@@ -1303,7 +1303,7 @@ case 50:
|
|||||||
break;}
|
break;}
|
||||||
}
|
}
|
||||||
/* the action file gets copied in in place of this dollarsign */
|
/* the action file gets copied in in place of this dollarsign */
|
||||||
#line 543 "/usr/local/share/bison.simple"
|
#line 543 "/usr/lib/bison.simple"
|
||||||
|
|
||||||
yyvsp -= yylen;
|
yyvsp -= yylen;
|
||||||
yyssp -= yylen;
|
yyssp -= yylen;
|
||||||
@@ -1988,7 +1988,7 @@ curl_getdate (const char *p, const time_t *now)
|
|||||||
{
|
{
|
||||||
struct tm tm, tm0, *tmp;
|
struct tm tm, tm0, *tmp;
|
||||||
time_t Start;
|
time_t Start;
|
||||||
CONTEXT cookie;
|
CURL_CONTEXT cookie;
|
||||||
#ifdef HAVE_LOCALTIME_R
|
#ifdef HAVE_LOCALTIME_R
|
||||||
struct tm keeptime;
|
struct tm keeptime;
|
||||||
#endif
|
#endif
|
@@ -171,7 +171,7 @@ typedef enum _MERIDIAN {
|
|||||||
} MERIDIAN;
|
} MERIDIAN;
|
||||||
|
|
||||||
/* parse results and input string */
|
/* parse results and input string */
|
||||||
typedef struct _CONTEXT {
|
typedef struct _CURL_CONTEXT {
|
||||||
const char *yyInput;
|
const char *yyInput;
|
||||||
int yyDayOrdinal;
|
int yyDayOrdinal;
|
||||||
int yyDayNumber;
|
int yyDayNumber;
|
||||||
@@ -194,14 +194,14 @@ typedef struct _CONTEXT {
|
|||||||
int yyRelMonth;
|
int yyRelMonth;
|
||||||
int yyRelSeconds;
|
int yyRelSeconds;
|
||||||
int yyRelYear;
|
int yyRelYear;
|
||||||
} CONTEXT;
|
} CURL_CONTEXT;
|
||||||
|
|
||||||
/* enable use of extra argument to yyparse and yylex which can be used to pass
|
/* enable use of extra argument to yyparse and yylex which can be used to pass
|
||||||
** in a user defined value (CONTEXT struct in our case)
|
** in a user defined value (CURL_CONTEXT struct in our case)
|
||||||
*/
|
*/
|
||||||
#define YYPARSE_PARAM cookie
|
#define YYPARSE_PARAM cookie
|
||||||
#define YYLEX_PARAM cookie
|
#define YYLEX_PARAM cookie
|
||||||
#define context ((CONTEXT *) cookie)
|
#define context ((CURL_CONTEXT *) cookie)
|
||||||
%}
|
%}
|
||||||
|
|
||||||
/* This grammar has 13 shift/reduce conflicts. */
|
/* This grammar has 13 shift/reduce conflicts. */
|
||||||
@@ -944,7 +944,7 @@ curl_getdate (const char *p, const time_t *now)
|
|||||||
{
|
{
|
||||||
struct tm tm, tm0, *tmp;
|
struct tm tm, tm0, *tmp;
|
||||||
time_t Start;
|
time_t Start;
|
||||||
CONTEXT cookie;
|
CURL_CONTEXT cookie;
|
||||||
#ifdef HAVE_LOCALTIME_R
|
#ifdef HAVE_LOCALTIME_R
|
||||||
struct tm keeptime;
|
struct tm keeptime;
|
||||||
#endif
|
#endif
|
||||||
|
10
lib/getenv.c
10
lib/getenv.c
@@ -5,7 +5,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2003, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -67,11 +67,3 @@ char *curl_getenv(const char *v)
|
|||||||
{
|
{
|
||||||
return GetEnv(v);
|
return GetEnv(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* local variables:
|
|
||||||
* eval: (load-file "../curl-mode.el")
|
|
||||||
* end:
|
|
||||||
* vim600: fdm=marker
|
|
||||||
* vim: et sw=2 ts=2 sts=2 tw=78
|
|
||||||
*/
|
|
||||||
|
@@ -5,7 +5,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2003, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -38,6 +38,8 @@
|
|||||||
/* Make this the last #include */
|
/* Make this the last #include */
|
||||||
#ifdef MALLOCDEBUG
|
#ifdef MALLOCDEBUG
|
||||||
#include "memdebug.h"
|
#include "memdebug.h"
|
||||||
|
#else
|
||||||
|
#include <stdlib.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -159,18 +161,10 @@ CURLcode Curl_getinfo(struct SessionHandle *data, CURLINFO info, ...)
|
|||||||
*param_charp = data->info.contenttype;
|
*param_charp = data->info.contenttype;
|
||||||
break;
|
break;
|
||||||
case CURLINFO_PRIVATE:
|
case CURLINFO_PRIVATE:
|
||||||
*param_charp = data->set.private?data->set.private:(char *)"";
|
*param_charp = data->set.private;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return CURLE_BAD_FUNCTION_ARGUMENT;
|
return CURLE_BAD_FUNCTION_ARGUMENT;
|
||||||
}
|
}
|
||||||
return CURLE_OK;
|
return CURLE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* local variables:
|
|
||||||
* eval: (load-file "../curl-mode.el")
|
|
||||||
* end:
|
|
||||||
* vim600: fdm=marker
|
|
||||||
* vim: et sw=2 ts=2 sts=2 tw=78
|
|
||||||
*/
|
|
||||||
|
@@ -7,7 +7,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2003, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
|
@@ -224,11 +224,3 @@ char *getpass(const char *prompt)
|
|||||||
return getpass_r(prompt, buf, sizeof(buf));
|
return getpass_r(prompt, buf, sizeof(buf));
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
|
||||||
* local variables:
|
|
||||||
* eval: (load-file "../curl-mode.el")
|
|
||||||
* end:
|
|
||||||
* vim600: fdm=marker
|
|
||||||
* vim: et sw=2 ts=2 sts=2 tw=78
|
|
||||||
*/
|
|
||||||
|
@@ -7,7 +7,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2003, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
|
55
lib/hash.c
55
lib/hash.c
@@ -5,7 +5,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2003, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -35,8 +35,6 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* {{{ static unsigned long _hash_str (const char *, size_t)
|
|
||||||
*/
|
|
||||||
static unsigned long
|
static unsigned long
|
||||||
_hash_str (const char *key, size_t key_length)
|
_hash_str (const char *key, size_t key_length)
|
||||||
{
|
{
|
||||||
@@ -50,10 +48,7 @@ _hash_str (const char *key, size_t key_length)
|
|||||||
|
|
||||||
return h;
|
return h;
|
||||||
}
|
}
|
||||||
/* }}} */
|
|
||||||
|
|
||||||
/* {{{ static void _hash_element_dtor (void *, void *)
|
|
||||||
*/
|
|
||||||
static void
|
static void
|
||||||
_hash_element_dtor (void *user, void *element)
|
_hash_element_dtor (void *user, void *element)
|
||||||
{
|
{
|
||||||
@@ -68,10 +63,7 @@ _hash_element_dtor (void *user, void *element)
|
|||||||
|
|
||||||
free(e);
|
free(e);
|
||||||
}
|
}
|
||||||
/* }}} */
|
|
||||||
|
|
||||||
/* {{{ void curl_hash_init (curl_hash *, int, curl_hash_dtor)
|
|
||||||
*/
|
|
||||||
void
|
void
|
||||||
Curl_hash_init (curl_hash *h, int slots, curl_hash_dtor dtor)
|
Curl_hash_init (curl_hash *h, int slots, curl_hash_dtor dtor)
|
||||||
{
|
{
|
||||||
@@ -86,10 +78,7 @@ Curl_hash_init (curl_hash *h, int slots, curl_hash_dtor dtor)
|
|||||||
h->table[i] = Curl_llist_alloc((curl_llist_dtor) _hash_element_dtor);
|
h->table[i] = Curl_llist_alloc((curl_llist_dtor) _hash_element_dtor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* }}} */
|
|
||||||
|
|
||||||
/* {{{ curl_hash *curl_hash_alloc (int, curl_hash_dtor)
|
|
||||||
*/
|
|
||||||
curl_hash *
|
curl_hash *
|
||||||
Curl_hash_alloc (int slots, curl_hash_dtor dtor)
|
Curl_hash_alloc (int slots, curl_hash_dtor dtor)
|
||||||
{
|
{
|
||||||
@@ -103,10 +92,7 @@ Curl_hash_alloc (int slots, curl_hash_dtor dtor)
|
|||||||
|
|
||||||
return h;
|
return h;
|
||||||
}
|
}
|
||||||
/* }}} */
|
|
||||||
|
|
||||||
/* {{{ static int _hash_key_compare (char *, size_t, char *, size_t)
|
|
||||||
*/
|
|
||||||
static int
|
static int
|
||||||
_hash_key_compare (char *key1, size_t key1_len, char *key2, size_t key2_len)
|
_hash_key_compare (char *key1, size_t key1_len, char *key2, size_t key2_len)
|
||||||
{
|
{
|
||||||
@@ -118,12 +104,10 @@ _hash_key_compare (char *key1, size_t key1_len, char *key2, size_t key2_len)
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
/* }}} */
|
|
||||||
|
|
||||||
/* {{{ static int _mk_hash_element (curl_hash_element **, char *, size_t, const void *)
|
|
||||||
*/
|
|
||||||
static int
|
static int
|
||||||
_mk_hash_element (curl_hash_element **e, char *key, size_t key_len, const void *p)
|
_mk_hash_element (curl_hash_element **e, char *key, size_t key_len,
|
||||||
|
const void *p)
|
||||||
{
|
{
|
||||||
*e = (curl_hash_element *) malloc(sizeof(curl_hash_element));
|
*e = (curl_hash_element *) malloc(sizeof(curl_hash_element));
|
||||||
(*e)->key = strdup(key);
|
(*e)->key = strdup(key);
|
||||||
@@ -131,16 +115,12 @@ _mk_hash_element (curl_hash_element **e, char *key, size_t key_len, const void *
|
|||||||
(*e)->ptr = (void *) p;
|
(*e)->ptr = (void *) p;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
/* }}} */
|
|
||||||
|
|
||||||
#define find_slot(__h, __k, __k_len) (_hash_str(__k, __k_len) % (__h)->slots)
|
#define find_slot(__h, __k, __k_len) (_hash_str(__k, __k_len) % (__h)->slots)
|
||||||
|
|
||||||
#define FETCH_LIST \
|
#define FETCH_LIST \
|
||||||
curl_llist *l = h->table[find_slot(h, key, key_len)]
|
curl_llist *l = h->table[find_slot(h, key, key_len)]
|
||||||
|
|
||||||
|
|
||||||
/* {{{ int curl_hash_add (curl_hash *, char *, size_t, const void *)
|
|
||||||
*/
|
|
||||||
int
|
int
|
||||||
Curl_hash_add (curl_hash *h, char *key, size_t key_len, const void *p)
|
Curl_hash_add (curl_hash *h, char *key, size_t key_len, const void *p)
|
||||||
{
|
{
|
||||||
@@ -169,10 +149,7 @@ Curl_hash_add (curl_hash *h, char *key, size_t key_len, const void *p)
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
/* }}} */
|
|
||||||
|
|
||||||
/* {{{ int curl_hash_delete (curl_hash *, char *, size_t)
|
|
||||||
*/
|
|
||||||
int
|
int
|
||||||
Curl_hash_delete(curl_hash *h, char *key, size_t key_len)
|
Curl_hash_delete(curl_hash *h, char *key, size_t key_len)
|
||||||
{
|
{
|
||||||
@@ -193,10 +170,7 @@ Curl_hash_delete(curl_hash *h, char *key, size_t key_len)
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
/* }}} */
|
|
||||||
|
|
||||||
/* {{{ int curl_hash_pick (curl_hash *, char *, size_t, void **)
|
|
||||||
*/
|
|
||||||
void *
|
void *
|
||||||
Curl_hash_pick(curl_hash *h, char *key, size_t key_len)
|
Curl_hash_pick(curl_hash *h, char *key, size_t key_len)
|
||||||
{
|
{
|
||||||
@@ -215,10 +189,7 @@ Curl_hash_pick(curl_hash *h, char *key, size_t key_len)
|
|||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
/* }}} */
|
|
||||||
|
|
||||||
/* {{{ void curl_hash_apply (curl_hash *, void *, void (*)(void *, curl_hash_element *))
|
|
||||||
*/
|
|
||||||
void
|
void
|
||||||
Curl_hash_apply(curl_hash *h, void *user,
|
Curl_hash_apply(curl_hash *h, void *user,
|
||||||
void (*cb)(void *user, void *ptr))
|
void (*cb)(void *user, void *ptr))
|
||||||
@@ -235,10 +206,7 @@ Curl_hash_apply(curl_hash *h, void *user,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* }}} */
|
|
||||||
|
|
||||||
/* {{{ void curl_hash_clean (curl_hash *)
|
|
||||||
*/
|
|
||||||
void
|
void
|
||||||
Curl_hash_clean(curl_hash *h)
|
Curl_hash_clean(curl_hash *h)
|
||||||
{
|
{
|
||||||
@@ -250,11 +218,7 @@ Curl_hash_clean(curl_hash *h)
|
|||||||
|
|
||||||
free(h->table);
|
free(h->table);
|
||||||
}
|
}
|
||||||
/* }}} */
|
|
||||||
|
|
||||||
/* {{{ void curl_hash_clean_with_criterium (curl_hash *, void *,
|
|
||||||
int (*)(void *, void *))
|
|
||||||
*/
|
|
||||||
void
|
void
|
||||||
Curl_hash_clean_with_criterium(curl_hash *h, void *user,
|
Curl_hash_clean_with_criterium(curl_hash *h, void *user,
|
||||||
int (*comp)(void *, void *))
|
int (*comp)(void *, void *))
|
||||||
@@ -277,17 +241,12 @@ Curl_hash_clean_with_criterium(curl_hash *h, void *user,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* {{{ int curl_hash_count (curl_hash *)
|
|
||||||
*/
|
|
||||||
int
|
int
|
||||||
Curl_hash_count(curl_hash *h)
|
Curl_hash_count(curl_hash *h)
|
||||||
{
|
{
|
||||||
return h->size;
|
return h->size;
|
||||||
}
|
}
|
||||||
/* }}} */
|
|
||||||
|
|
||||||
/* {{{ void curl_hash_destroy (curl_hash *)
|
|
||||||
*/
|
|
||||||
void
|
void
|
||||||
Curl_hash_destroy(curl_hash *h)
|
Curl_hash_destroy(curl_hash *h)
|
||||||
{
|
{
|
||||||
@@ -297,12 +256,4 @@ Curl_hash_destroy(curl_hash *h)
|
|||||||
Curl_hash_clean(h);
|
Curl_hash_clean(h);
|
||||||
free(h);
|
free(h);
|
||||||
}
|
}
|
||||||
/* }}} */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* local variables:
|
|
||||||
* eval: (load-file "../curl-mode.el")
|
|
||||||
* end:
|
|
||||||
* vim600: fdm=marker
|
|
||||||
* vim: et sw=2 ts=2 sts=2 tw=78
|
|
||||||
*/
|
|
||||||
|
10
lib/hash.h
10
lib/hash.h
@@ -7,7 +7,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2003, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -58,11 +58,3 @@ void Curl_hash_clean_with_criterium(curl_hash *h, void *user, int (*comp)(void *
|
|||||||
void Curl_hash_destroy(curl_hash *h);
|
void Curl_hash_destroy(curl_hash *h);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
|
||||||
* local variables:
|
|
||||||
* eval: (load-file "../curl-mode.el")
|
|
||||||
* end:
|
|
||||||
* vim600: fdm=marker
|
|
||||||
* vim: et sw=2 ts=2 sts=2 tw=78
|
|
||||||
*/
|
|
||||||
|
63
lib/hostip.c
63
lib/hostip.c
@@ -5,7 +5,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2003, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -64,6 +64,7 @@
|
|||||||
#include "sendf.h"
|
#include "sendf.h"
|
||||||
#include "hostip.h"
|
#include "hostip.h"
|
||||||
#include "hash.h"
|
#include "hash.h"
|
||||||
|
#include "share.h"
|
||||||
|
|
||||||
#define _MPRINTF_REPLACE /* use our functions only */
|
#define _MPRINTF_REPLACE /* use our functions only */
|
||||||
#include <curl/mprintf.h>
|
#include <curl/mprintf.h>
|
||||||
@@ -211,6 +212,10 @@ void Curl_scan_cache_used(void *user, void *ptr)
|
|||||||
#define HOSTCACHE_RETURN(dns) \
|
#define HOSTCACHE_RETURN(dns) \
|
||||||
{ \
|
{ \
|
||||||
free(entry_id); \
|
free(entry_id); \
|
||||||
|
if(data->share) \
|
||||||
|
{ \
|
||||||
|
Curl_share_unlock(data, CURL_LOCK_DATA_DNS); \
|
||||||
|
} \
|
||||||
return dns; \
|
return dns; \
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -234,7 +239,7 @@ struct Curl_dns_entry *Curl_resolv(struct SessionHandle *data,
|
|||||||
will generate a signal and we will siglongjmp() from that here */
|
will generate a signal and we will siglongjmp() from that here */
|
||||||
if(!data->set.no_signal && sigsetjmp(curl_jmpenv, 1)) {
|
if(!data->set.no_signal && sigsetjmp(curl_jmpenv, 1)) {
|
||||||
/* this is coming from a siglongjmp() */
|
/* this is coming from a siglongjmp() */
|
||||||
failf(data, "name lookup time-outed");
|
failf(data, "name lookup timed out");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -246,6 +251,11 @@ struct Curl_dns_entry *Curl_resolv(struct SessionHandle *data,
|
|||||||
if (!entry_id)
|
if (!entry_id)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
if(data->share)
|
||||||
|
{
|
||||||
|
Curl_share_lock(data, CURL_LOCK_DATA_DNS, CURL_LOCK_ACCESS_SINGLE);
|
||||||
|
}
|
||||||
|
|
||||||
/* See if its already in our dns cache */
|
/* See if its already in our dns cache */
|
||||||
dns = Curl_hash_pick(data->hostcache, entry_id, entry_len+1);
|
dns = Curl_hash_pick(data->hostcache, entry_id, entry_len+1);
|
||||||
|
|
||||||
@@ -284,6 +294,19 @@ struct Curl_dns_entry *Curl_resolv(struct SessionHandle *data,
|
|||||||
HOSTCACHE_RETURN(dns);
|
HOSTCACHE_RETURN(dns);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Curl_resolv_unlock(struct SessionHandle *data, struct Curl_dns_entry *dns)
|
||||||
|
{
|
||||||
|
if(data->share)
|
||||||
|
{
|
||||||
|
Curl_share_lock(data, CURL_LOCK_DATA_DNS, CURL_LOCK_ACCESS_SINGLE);
|
||||||
|
}
|
||||||
|
dns->inuse--;
|
||||||
|
if(data->share)
|
||||||
|
{
|
||||||
|
Curl_share_unlock(data, CURL_LOCK_DATA_DNS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This is a wrapper function for freeing name information in a protocol
|
* This is a wrapper function for freeing name information in a protocol
|
||||||
* independent way. This takes care of using the appropriate underlaying
|
* independent way. This takes care of using the appropriate underlaying
|
||||||
@@ -488,7 +511,7 @@ static struct hostent* pack_hostent(char** buf, struct hostent* orig)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static char *MakeIP(unsigned long num,char *addr, int addr_len)
|
static char *MakeIP(unsigned long num, char *addr, int addr_len)
|
||||||
{
|
{
|
||||||
#if defined(HAVE_INET_NTOA) || defined(HAVE_INET_NTOA_R)
|
#if defined(HAVE_INET_NTOA) || defined(HAVE_INET_NTOA_R)
|
||||||
struct in_addr in;
|
struct in_addr in;
|
||||||
@@ -509,10 +532,6 @@ static char *MakeIP(unsigned long num,char *addr, int addr_len)
|
|||||||
return (addr);
|
return (addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef INADDR_NONE
|
|
||||||
#define INADDR_NONE (in_addr_t) ~0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static void hostcache_fixoffset(struct hostent *h, int offset)
|
static void hostcache_fixoffset(struct hostent *h, int offset)
|
||||||
{
|
{
|
||||||
int i=0;
|
int i=0;
|
||||||
@@ -550,7 +569,8 @@ static Curl_addrinfo *my_getaddrinfo(struct SessionHandle *data,
|
|||||||
port=0; /* unused in IPv4 code */
|
port=0; /* unused in IPv4 code */
|
||||||
ret = 0; /* to prevent the compiler warning */
|
ret = 0; /* to prevent the compiler warning */
|
||||||
|
|
||||||
if ( (in=inet_addr(hostname)) != INADDR_NONE ) {
|
in=inet_addr(hostname);
|
||||||
|
if (in != CURL_INADDR_NONE) {
|
||||||
struct in_addr *addrentry;
|
struct in_addr *addrentry;
|
||||||
struct namebuf {
|
struct namebuf {
|
||||||
struct hostent hostentry;
|
struct hostent hostentry;
|
||||||
@@ -571,7 +591,7 @@ static Curl_addrinfo *my_getaddrinfo(struct SessionHandle *data,
|
|||||||
h->h_addrtype = AF_INET;
|
h->h_addrtype = AF_INET;
|
||||||
h->h_length = sizeof(*addrentry);
|
h->h_length = sizeof(*addrentry);
|
||||||
h->h_name = &buf->h_name[0];
|
h->h_name = &buf->h_name[0];
|
||||||
MakeIP(ntohl(in), h->h_name, sizeof(buf->h_name));
|
MakeIP(ntohl(in), (char *)h->h_name, sizeof(buf->h_name));
|
||||||
}
|
}
|
||||||
#if defined(HAVE_GETHOSTBYNAME_R)
|
#if defined(HAVE_GETHOSTBYNAME_R)
|
||||||
else {
|
else {
|
||||||
@@ -673,6 +693,19 @@ static Curl_addrinfo *my_getaddrinfo(struct SessionHandle *data,
|
|||||||
#ifdef HAVE_GETHOSTBYNAME_R_3
|
#ifdef HAVE_GETHOSTBYNAME_R_3
|
||||||
/* AIX, Digital Unix, HPUX 10, more? */
|
/* AIX, Digital Unix, HPUX 10, more? */
|
||||||
|
|
||||||
|
/* For AIX 4.3 or later, we don't use gethostbyname_r() at all, because of
|
||||||
|
the plain fact that it does not return unique full buffers on each
|
||||||
|
call, but instead several of the pointers in the hostent structs will
|
||||||
|
point to the same actual data! This have the unfortunate down-side that
|
||||||
|
our caching system breaks down horribly. Luckily for us though, AIX 4.3
|
||||||
|
and more recent versions have a completely thread-safe libc where all
|
||||||
|
the data is stored in thread-specific memory areas making calls to the
|
||||||
|
plain old gethostbyname() work fine even for multi-threaded programs.
|
||||||
|
|
||||||
|
This AIX 4.3 or later detection is all made in the configure script.
|
||||||
|
|
||||||
|
Troels Walsted Hansen helped us work this out on March 3rd, 2003. */
|
||||||
|
|
||||||
if(CURL_NAMELOOKUP_SIZE >=
|
if(CURL_NAMELOOKUP_SIZE >=
|
||||||
(sizeof(struct hostent)+sizeof(struct hostent_data)))
|
(sizeof(struct hostent)+sizeof(struct hostent_data)))
|
||||||
|
|
||||||
@@ -682,7 +715,8 @@ static Curl_addrinfo *my_getaddrinfo(struct SessionHandle *data,
|
|||||||
|
|
||||||
ret = gethostbyname_r(hostname,
|
ret = gethostbyname_r(hostname,
|
||||||
(struct hostent *)buf,
|
(struct hostent *)buf,
|
||||||
(struct hostent_data *)((char *)buf + sizeof(struct hostent)));
|
(struct hostent_data *)((char *)buf +
|
||||||
|
sizeof(struct hostent)));
|
||||||
else
|
else
|
||||||
ret = -1; /* failure, too smallish buffer size */
|
ret = -1; /* failure, too smallish buffer size */
|
||||||
|
|
||||||
@@ -718,12 +752,3 @@ static Curl_addrinfo *my_getaddrinfo(struct SessionHandle *data,
|
|||||||
}
|
}
|
||||||
|
|
||||||
#endif /* end of IPv4-specific code */
|
#endif /* end of IPv4-specific code */
|
||||||
|
|
||||||
/*
|
|
||||||
* local variables:
|
|
||||||
* eval: (load-file "../curl-mode.el")
|
|
||||||
* end:
|
|
||||||
* vim600: fdm=marker
|
|
||||||
* vim: et sw=2 ts=2 sts=2 tw=78
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
11
lib/hostip.h
11
lib/hostip.h
@@ -7,7 +7,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2003, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -59,7 +59,7 @@ struct Curl_dns_entry *Curl_resolv(struct SessionHandle *data,
|
|||||||
int port);
|
int port);
|
||||||
|
|
||||||
/* unlock a previously resolved dns entry */
|
/* unlock a previously resolved dns entry */
|
||||||
#define Curl_resolv_unlock(dns) dns->inuse--
|
void Curl_resolv_unlock(struct SessionHandle *data, struct Curl_dns_entry *dns);
|
||||||
|
|
||||||
/* for debugging purposes only: */
|
/* for debugging purposes only: */
|
||||||
void Curl_scan_cache_used(void *user, void *ptr);
|
void Curl_scan_cache_used(void *user, void *ptr);
|
||||||
@@ -79,4 +79,11 @@ int curl_getaddrinfo(char *hostname, char *service,
|
|||||||
int line, const char *source);
|
int line, const char *source);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef INADDR_NONE
|
||||||
|
#define CURL_INADDR_NONE (in_addr_t) ~0
|
||||||
|
#else
|
||||||
|
#define CURL_INADDR_NONE INADDR_NONE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
100
lib/http.c
100
lib/http.c
@@ -5,7 +5,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2003, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -232,7 +232,7 @@ CURLcode add_buffer_send(send_buffer *in,
|
|||||||
|
|
||||||
return CURLE_OK;
|
return CURLE_OK;
|
||||||
}
|
}
|
||||||
|
http->sending = HTTPSEND_BODY;
|
||||||
/* the full buffer was sent, clean up and return */
|
/* the full buffer was sent, clean up and return */
|
||||||
}
|
}
|
||||||
if(in->buffer)
|
if(in->buffer)
|
||||||
@@ -491,16 +491,16 @@ CURLcode Curl_ConnectHTTPProxyTunnel(struct connectdata *conn,
|
|||||||
/* a newline is CRLF in ftp-talk, so the CR is ignored as
|
/* a newline is CRLF in ftp-talk, so the CR is ignored as
|
||||||
the line isn't really terminated until the LF comes */
|
the line isn't really terminated until the LF comes */
|
||||||
|
|
||||||
/* output debug output if that is requested */
|
|
||||||
if(data->set.verbose)
|
|
||||||
Curl_debug(data, CURLINFO_DATA_IN, line_start, perline);
|
|
||||||
|
|
||||||
if('\r' == line_start[0]) {
|
if('\r' == line_start[0]) {
|
||||||
/* end of headers */
|
/* end of headers */
|
||||||
keepon=FALSE;
|
keepon=FALSE;
|
||||||
break; /* breaks out of loop, not switch */
|
break; /* breaks out of loop, not switch */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* output debug output if that is requested */
|
||||||
|
if(data->set.verbose)
|
||||||
|
Curl_debug(data, CURLINFO_HEADER_IN, line_start, perline);
|
||||||
|
|
||||||
if(2 == sscanf(line_start, "HTTP/1.%d %d",
|
if(2 == sscanf(line_start, "HTTP/1.%d %d",
|
||||||
&subversion,
|
&subversion,
|
||||||
&httperror)) {
|
&httperror)) {
|
||||||
@@ -626,6 +626,7 @@ CURLcode Curl_http(struct connectdata *conn)
|
|||||||
char *ppath = conn->ppath; /* three previous function arguments */
|
char *ppath = conn->ppath; /* three previous function arguments */
|
||||||
char *host = conn->name;
|
char *host = conn->name;
|
||||||
const char *te = ""; /* tranfer-encoding */
|
const char *te = ""; /* tranfer-encoding */
|
||||||
|
char *ptr;
|
||||||
|
|
||||||
if(!conn->proto.http) {
|
if(!conn->proto.http) {
|
||||||
/* Only allocate this struct if we don't already have it! */
|
/* Only allocate this struct if we don't already have it! */
|
||||||
@@ -663,7 +664,8 @@ CURLcode Curl_http(struct connectdata *conn)
|
|||||||
host due to a location-follow, we do some weirdo checks here */
|
host due to a location-follow, we do some weirdo checks here */
|
||||||
if(!data->state.this_is_a_follow ||
|
if(!data->state.this_is_a_follow ||
|
||||||
!data->state.auth_host ||
|
!data->state.auth_host ||
|
||||||
curl_strequal(data->state.auth_host, conn->hostname)) {
|
curl_strequal(data->state.auth_host, conn->hostname) ||
|
||||||
|
data->set.http_disable_hostname_check_before_authentication) {
|
||||||
sprintf(data->state.buffer, "%s:%s",
|
sprintf(data->state.buffer, "%s:%s",
|
||||||
data->state.user, data->state.passwd);
|
data->state.user, data->state.passwd);
|
||||||
if(Curl_base64_encode(data->state.buffer, strlen(data->state.buffer),
|
if(Curl_base64_encode(data->state.buffer, strlen(data->state.buffer),
|
||||||
@@ -713,30 +715,30 @@ CURLcode Curl_http(struct connectdata *conn)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(data->cookies) {
|
ptr = checkheaders(data, "Host:");
|
||||||
co = Curl_cookie_getlist(data->cookies,
|
if(ptr) {
|
||||||
host, ppath,
|
/* If we have a given custom Host: header, we extract the host name
|
||||||
(conn->protocol&PROT_HTTPS?TRUE:FALSE));
|
in order to possibly use it for cookie reasons later on. */
|
||||||
}
|
char *start = ptr+strlen("Host:");
|
||||||
if (data->change.proxy && *data->change.proxy &&
|
char *ptr;
|
||||||
!data->set.tunnel_thru_httpproxy &&
|
while(*start && isspace((int)*start ))
|
||||||
!(conn->protocol&PROT_HTTPS)) {
|
start++;
|
||||||
/* The path sent to the proxy is in fact the entire URL */
|
ptr = start; /* start host-scanning here */
|
||||||
ppath = data->change.url;
|
|
||||||
}
|
|
||||||
if(HTTPREQ_POST_FORM == data->set.httpreq) {
|
|
||||||
/* we must build the whole darned post sequence first, so that we have
|
|
||||||
a size of the whole shebang before we start to send it */
|
|
||||||
result = Curl_getFormData(&http->sendit, data->set.httppost,
|
|
||||||
&http->postsize);
|
|
||||||
if(CURLE_OK != result) {
|
|
||||||
/* Curl_getFormData() doesn't use failf() */
|
|
||||||
failf(data, "failed creating formpost data");
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!checkheaders(data, "Host:")) {
|
/* scan through the string to find the end (space or colon) */
|
||||||
|
while(*ptr && !isspace((int)*ptr) && !(':'==*ptr))
|
||||||
|
ptr++;
|
||||||
|
|
||||||
|
if(ptr != start) {
|
||||||
|
int len=ptr-start;
|
||||||
|
conn->allocptr.cookiehost = malloc(len+1);
|
||||||
|
if(!conn->allocptr.cookiehost)
|
||||||
|
return CURLE_OUT_OF_MEMORY;
|
||||||
|
memcpy(conn->allocptr.cookiehost, start, len);
|
||||||
|
conn->allocptr.cookiehost[len]=0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
/* if ptr_host is already set, it is almost OK since we only re-use
|
/* if ptr_host is already set, it is almost OK since we only re-use
|
||||||
connections to the very same host and port, but when we use a HTTP
|
connections to the very same host and port, but when we use a HTTP
|
||||||
proxy we have a persistant connect and yet we must change the Host:
|
proxy we have a persistant connect and yet we must change the Host:
|
||||||
@@ -764,6 +766,32 @@ CURLcode Curl_http(struct connectdata *conn)
|
|||||||
conn->remote_port);
|
conn->remote_port);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(data->cookies) {
|
||||||
|
co = Curl_cookie_getlist(data->cookies,
|
||||||
|
conn->allocptr.cookiehost?
|
||||||
|
conn->allocptr.cookiehost:host, ppath,
|
||||||
|
(bool)(conn->protocol&PROT_HTTPS?TRUE:FALSE));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data->change.proxy && *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;
|
||||||
|
}
|
||||||
|
if(HTTPREQ_POST_FORM == data->set.httpreq) {
|
||||||
|
/* we must build the whole darned post sequence first, so that we have
|
||||||
|
a size of the whole shebang before we start to send it */
|
||||||
|
result = Curl_getFormData(&http->sendit, data->set.httppost,
|
||||||
|
&http->postsize);
|
||||||
|
if(CURLE_OK != result) {
|
||||||
|
/* Curl_getFormData() doesn't use failf() */
|
||||||
|
failf(data, "failed creating formpost data");
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
if(!checkheaders(data, "Pragma:"))
|
if(!checkheaders(data, "Pragma:"))
|
||||||
http->p_pragma = "Pragma: no-cache\r\n";
|
http->p_pragma = "Pragma: no-cache\r\n";
|
||||||
|
|
||||||
@@ -997,6 +1025,9 @@ CURLcode Curl_http(struct connectdata *conn)
|
|||||||
headers = headers->next;
|
headers = headers->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
http->postdata = NULL; /* nothing to post at this point */
|
||||||
|
Curl_pgrsSetUploadSize(data, 0); /* upload size is 0 atm */
|
||||||
|
|
||||||
switch(data->set.httpreq) {
|
switch(data->set.httpreq) {
|
||||||
|
|
||||||
case HTTPREQ_POST_FORM:
|
case HTTPREQ_POST_FORM:
|
||||||
@@ -1179,13 +1210,4 @@ CURLcode Curl_http(struct connectdata *conn)
|
|||||||
|
|
||||||
return CURLE_OK;
|
return CURLE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* local variables:
|
|
||||||
* eval: (load-file "../curl-mode.el")
|
|
||||||
* end:
|
|
||||||
* vim600: fdm=marker
|
|
||||||
* vim: et sw=2 ts=2 sts=2 tw=78
|
|
||||||
*/
|
|
||||||
#endif
|
#endif
|
||||||
|
@@ -8,7 +8,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2003, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
|
@@ -5,7 +5,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2003, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -186,15 +186,22 @@ CHUNKcode Curl_httpchunk_read(struct connectdata *conn,
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case DEFLATE:
|
case DEFLATE:
|
||||||
|
/* update conn->keep.str to point to the chunk data. */
|
||||||
|
conn->keep.str = datap;
|
||||||
result = Curl_unencode_deflate_write(conn->data, &conn->keep, piece);
|
result = Curl_unencode_deflate_write(conn->data, &conn->keep, piece);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GZIP:
|
case GZIP:
|
||||||
|
/* update conn->keep.str to point to the chunk data. */
|
||||||
|
conn->keep.str = datap;
|
||||||
|
result = Curl_unencode_gzip_write(conn->data, &conn->keep, piece);
|
||||||
|
break;
|
||||||
|
|
||||||
case COMPRESS:
|
case COMPRESS:
|
||||||
default:
|
default:
|
||||||
failf (conn->data,
|
failf (conn->data,
|
||||||
"Unrecognized content encoding type. "
|
"Unrecognized content encoding type. "
|
||||||
"libcurl understands `identity' and `deflate' "
|
"libcurl understands `identity', `deflate' and `gzip' "
|
||||||
"content encodings.");
|
"content encodings.");
|
||||||
return CHUNKE_BAD_ENCODING;
|
return CHUNKE_BAD_ENCODING;
|
||||||
}
|
}
|
||||||
@@ -248,12 +255,4 @@ CHUNKcode Curl_httpchunk_read(struct connectdata *conn,
|
|||||||
}
|
}
|
||||||
return CHUNKE_OK;
|
return CHUNKE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* local variables:
|
|
||||||
* eval: (load-file "../curl-mode.el")
|
|
||||||
* end:
|
|
||||||
* vim600: fdm=marker
|
|
||||||
* vim: et sw=2 ts=2 sts=2 tw=78
|
|
||||||
*/
|
|
||||||
#endif /* CURL_DISABLE_HTTP */
|
#endif /* CURL_DISABLE_HTTP */
|
||||||
|
@@ -7,7 +7,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2003, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
|
13
lib/if2ip.c
13
lib/if2ip.c
@@ -5,7 +5,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2003, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -32,7 +32,8 @@
|
|||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if ! defined(WIN32) && ! defined(__BEOS__) && !defined(__CYGWIN32__)
|
#if ! defined(WIN32) && ! defined(__BEOS__) && !defined(__CYGWIN32__) && \
|
||||||
|
! defined(__riscos__)
|
||||||
|
|
||||||
#ifdef HAVE_SYS_SOCKET_H
|
#ifdef HAVE_SYS_SOCKET_H
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
@@ -124,11 +125,3 @@ char *Curl_if2ip(char *interface, char *buf, int buf_size)
|
|||||||
#else
|
#else
|
||||||
#define if2ip(x) NULL
|
#define if2ip(x) NULL
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
|
||||||
* local variables:
|
|
||||||
* eval: (load-file "../curl-mode.el")
|
|
||||||
* end:
|
|
||||||
* vim600: fdm=marker
|
|
||||||
* vim: et sw=2 ts=2 sts=2 tw=78
|
|
||||||
*/
|
|
||||||
|
@@ -7,7 +7,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2003, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -24,7 +24,8 @@
|
|||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
#include "setup.h"
|
#include "setup.h"
|
||||||
|
|
||||||
#if ! defined(WIN32) && ! defined(__BEOS__) && !defined(__CYGWIN32__)
|
#if ! defined(WIN32) && ! defined(__BEOS__) && !defined(__CYGWIN32__) && \
|
||||||
|
! defined(__riscos__)
|
||||||
extern char *Curl_if2ip(char *interface, char *buf, int buf_size);
|
extern char *Curl_if2ip(char *interface, char *buf, int buf_size);
|
||||||
#else
|
#else
|
||||||
#define Curl_if2ip(a,b,c) NULL
|
#define Curl_if2ip(a,b,c) NULL
|
||||||
|
27
lib/krb4.c
27
lib/krb4.c
@@ -50,6 +50,7 @@
|
|||||||
#include <syslog.h>
|
#include <syslog.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <krb.h>
|
#include <krb.h>
|
||||||
|
#include <des.h>
|
||||||
|
|
||||||
#ifdef HAVE_UNISTD_H
|
#ifdef HAVE_UNISTD_H
|
||||||
#include <unistd.h> /* for getpid() */
|
#include <unistd.h> /* for getpid() */
|
||||||
@@ -187,6 +188,10 @@ mk_auth(struct krb4_data *d, KTEXT adat,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_KRB_GET_OUR_IP_FOR_REALM
|
||||||
|
int krb_get_our_ip_for_realm(char *, struct in_addr *);
|
||||||
|
#endif
|
||||||
|
|
||||||
static int
|
static int
|
||||||
krb4_auth(void *app_data, struct connectdata *conn)
|
krb4_auth(void *app_data, struct connectdata *conn)
|
||||||
{
|
{
|
||||||
@@ -328,7 +333,7 @@ CURLcode Curl_krb_kauth(struct connectdata *conn)
|
|||||||
|
|
||||||
if(conn->data->state.buffer[0] != '3'){
|
if(conn->data->state.buffer[0] != '3'){
|
||||||
Curl_set_command_prot(conn, save);
|
Curl_set_command_prot(conn, save);
|
||||||
return;
|
return CURLE_FTP_WEIRD_SERVER_REPLY;
|
||||||
}
|
}
|
||||||
|
|
||||||
p = strstr(conn->data->state.buffer, "T=");
|
p = strstr(conn->data->state.buffer, "T=");
|
||||||
@@ -361,16 +366,16 @@ CURLcode Curl_krb_kauth(struct connectdata *conn)
|
|||||||
des_string_to_key (conn->data->state.passwd, &key);
|
des_string_to_key (conn->data->state.passwd, &key);
|
||||||
des_key_sched(&key, schedule);
|
des_key_sched(&key, schedule);
|
||||||
|
|
||||||
des_pcbc_encrypt((des_cblock*)tkt.dat, (des_cblock*)tktcopy.dat,
|
des_pcbc_encrypt((void *)tkt.dat, (void *)tktcopy.dat,
|
||||||
tkt.length,
|
tkt.length,
|
||||||
schedule, &key, DES_DECRYPT);
|
schedule, &key, DES_DECRYPT);
|
||||||
if (strcmp ((char*)tktcopy.dat + 8,
|
if (strcmp ((char*)tktcopy.dat + 8,
|
||||||
KRB_TICKET_GRANTING_TICKET) != 0) {
|
KRB_TICKET_GRANTING_TICKET) != 0) {
|
||||||
afs_string_to_key (passwd,
|
afs_string_to_key(passwd,
|
||||||
krb_realmofhost(conn->hostname),
|
krb_realmofhost(conn->hostname),
|
||||||
&key);
|
&key);
|
||||||
des_key_sched (&key, schedule);
|
des_key_sched(&key, schedule);
|
||||||
des_pcbc_encrypt((des_cblock*)tkt.dat, (des_cblock*)tktcopy.dat,
|
des_pcbc_encrypt((void *)tkt.dat, (void *)tktcopy.dat,
|
||||||
tkt.length,
|
tkt.length,
|
||||||
schedule, &key, DES_DECRYPT);
|
schedule, &key, DES_DECRYPT);
|
||||||
}
|
}
|
||||||
@@ -399,11 +404,3 @@ CURLcode Curl_krb_kauth(struct connectdata *conn)
|
|||||||
|
|
||||||
#endif /* KRB4 */
|
#endif /* KRB4 */
|
||||||
#endif /* CURL_DISABLE_FTP */
|
#endif /* CURL_DISABLE_FTP */
|
||||||
|
|
||||||
/*
|
|
||||||
* local variables:
|
|
||||||
* eval: (load-file "../curl-mode.el")
|
|
||||||
* end:
|
|
||||||
* vim600: fdm=marker
|
|
||||||
* vim: et sw=2 ts=2 sts=2 tw=78
|
|
||||||
*/
|
|
||||||
|
@@ -7,7 +7,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2003, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
|
10
lib/ldap.c
10
lib/ldap.c
@@ -5,7 +5,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2003, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -222,12 +222,4 @@ CURLcode Curl_ldap(struct connectdata *conn)
|
|||||||
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* local variables:
|
|
||||||
* eval: (load-file "../curl-mode.el")
|
|
||||||
* end:
|
|
||||||
* vim600: fdm=marker
|
|
||||||
* vim: et sw=2 ts=2 sts=2 tw=78
|
|
||||||
*/
|
|
||||||
#endif
|
#endif
|
||||||
|
@@ -8,7 +8,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2003, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
|
@@ -5,7 +5,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2003, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
|
@@ -7,7 +7,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2003, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
|
@@ -6,7 +6,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2003, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -221,11 +221,3 @@ int curl_fclose(FILE *file, int line, const char *source)
|
|||||||
int VOID_VAR_MEMDEBUG;
|
int VOID_VAR_MEMDEBUG;
|
||||||
#endif
|
#endif
|
||||||
#endif /* MALLOCDEBUG */
|
#endif /* MALLOCDEBUG */
|
||||||
|
|
||||||
/*
|
|
||||||
* local variables:
|
|
||||||
* eval: (load-file "../curl-mode.el")
|
|
||||||
* end:
|
|
||||||
* vim600: fdm=marker
|
|
||||||
* vim: et sw=2 ts=2 sts=2 tw=78
|
|
||||||
*/
|
|
||||||
|
@@ -6,7 +6,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2003, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -28,6 +28,9 @@
|
|||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef WIN32
|
||||||
|
#include <winsock.h>
|
||||||
|
#endif
|
||||||
#ifdef HAVE_SYS_SOCKET_H
|
#ifdef HAVE_SYS_SOCKET_H
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#endif
|
#endif
|
||||||
|
@@ -1180,11 +1180,3 @@ int main()
|
|||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
|
||||||
* local variables:
|
|
||||||
* eval: (load-file "../curl-mode.el")
|
|
||||||
* end:
|
|
||||||
* vim600: fdm=marker
|
|
||||||
* vim: et sw=2 ts=2 sts=2 tw=78
|
|
||||||
*/
|
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user