Compare commits
204 Commits
curl-7_14_
...
curl-7_14_
Author | SHA1 | Date | |
---|---|---|---|
![]() |
6e1a986e0f | ||
![]() |
e0785ade35 | ||
![]() |
0177ed6f03 | ||
![]() |
c62635a3b5 | ||
![]() |
0177476fd2 | ||
![]() |
76d7dface7 | ||
![]() |
982ba21460 | ||
![]() |
6081c60556 | ||
![]() |
2fe3c22108 | ||
![]() |
75dbb3189a | ||
![]() |
32330300a9 | ||
![]() |
64414df27e | ||
![]() |
f98ec86798 | ||
![]() |
87bbd13899 | ||
![]() |
51a4493add | ||
![]() |
5effe8f336 | ||
![]() |
296eb2bd61 | ||
![]() |
9853acba66 | ||
![]() |
09cb9c782d | ||
![]() |
575ce905b2 | ||
![]() |
54887af471 | ||
![]() |
573350637e | ||
![]() |
49a16f7121 | ||
![]() |
a4773fcbbb | ||
![]() |
1e038c4bc6 | ||
![]() |
6ba19692a3 | ||
![]() |
432dfe2b8f | ||
![]() |
a142372750 | ||
![]() |
f14195f786 | ||
![]() |
9d54f9a6b7 | ||
![]() |
ebb91191bf | ||
![]() |
8742e294d4 | ||
![]() |
8882d1fa1b | ||
![]() |
0c37ab5255 | ||
![]() |
747a05844d | ||
![]() |
c7b7bf32f8 | ||
![]() |
710ee3b0e0 | ||
![]() |
7a8993892d | ||
![]() |
5e16a77fa9 | ||
![]() |
ef35519696 | ||
![]() |
d5baaf7756 | ||
![]() |
2a94387fc3 | ||
![]() |
6a5c2b0fc3 | ||
![]() |
fc281d6440 | ||
![]() |
e22ac39da4 | ||
![]() |
34cadb1e54 | ||
![]() |
94692b904e | ||
![]() |
18f3087afd | ||
![]() |
15bc228ae9 | ||
![]() |
2b7a38d032 | ||
![]() |
90e1a6905a | ||
![]() |
c36af24cbd | ||
![]() |
a676c18502 | ||
![]() |
362912ff83 | ||
![]() |
46ff13f243 | ||
![]() |
340a67a6f8 | ||
![]() |
9294c1e76c | ||
![]() |
fd704f8de0 | ||
![]() |
d9ca9154d1 | ||
![]() |
35110eca73 | ||
![]() |
9ad92b3007 | ||
![]() |
2f78c96330 | ||
![]() |
639857ceb2 | ||
![]() |
162f58c53c | ||
![]() |
84c4d96e71 | ||
![]() |
c0d343d56d | ||
![]() |
6d14a80608 | ||
![]() |
f451bb7c49 | ||
![]() |
20b17d6b04 | ||
![]() |
bb2317b63c | ||
![]() |
189461dc98 | ||
![]() |
69af552bc1 | ||
![]() |
0ae6ff9f72 | ||
![]() |
8b571fbbb1 | ||
![]() |
f3fcd409d5 | ||
![]() |
a47532f88a | ||
![]() |
6c157a404b | ||
![]() |
4f8a49143d | ||
![]() |
493d6033aa | ||
![]() |
8f219af884 | ||
![]() |
aeb04136f7 | ||
![]() |
0b8f57bf06 | ||
![]() |
6508d446e1 | ||
![]() |
82cb462bb4 | ||
![]() |
9a264bf610 | ||
![]() |
57007e80a9 | ||
![]() |
b6c876bdb6 | ||
![]() |
57afae79eb | ||
![]() |
84c2184909 | ||
![]() |
e358a24a75 | ||
![]() |
9da9d00c62 | ||
![]() |
ec3f269d1f | ||
![]() |
1c388a52a5 | ||
![]() |
34a827bbfe | ||
![]() |
726b9e2240 | ||
![]() |
2236ba0d20 | ||
![]() |
463c0f7096 | ||
![]() |
e49a7e361c | ||
![]() |
6e87cf5b30 | ||
![]() |
5872e8dd7e | ||
![]() |
e81d4ac8c8 | ||
![]() |
4922904991 | ||
![]() |
decae2dcda | ||
![]() |
16bbd13af7 | ||
![]() |
ee0666c8df | ||
![]() |
a8a8ae2e92 | ||
![]() |
fd1148a728 | ||
![]() |
74c7b41ee7 | ||
![]() |
465e19dbe9 | ||
![]() |
86660c73e5 | ||
![]() |
6d8a208df2 | ||
![]() |
c3a826fdce | ||
![]() |
c5d6a42abf | ||
![]() |
d49c144297 | ||
![]() |
e7de7d5eb3 | ||
![]() |
20005a83d2 | ||
![]() |
27926030f9 | ||
![]() |
701de67b79 | ||
![]() |
883479f01e | ||
![]() |
b37a0b0512 | ||
![]() |
5c5d5270d2 | ||
![]() |
36461fb2aa | ||
![]() |
d8dcd5e472 | ||
![]() |
c51b46c982 | ||
![]() |
b1b63c1dd1 | ||
![]() |
30c93d66eb | ||
![]() |
3b60bb7259 | ||
![]() |
c73f8e835f | ||
![]() |
93558c4299 | ||
![]() |
396cff5779 | ||
![]() |
336154e729 | ||
![]() |
bb0aba34fa | ||
![]() |
1dc0ce9562 | ||
![]() |
e4aee168b5 | ||
![]() |
2c10c895da | ||
![]() |
c04fae3096 | ||
![]() |
a214af0830 | ||
![]() |
f21bc46e82 | ||
![]() |
044327a488 | ||
![]() |
c4bbcc83b6 | ||
![]() |
eb162b73c2 | ||
![]() |
29aafb9cea | ||
![]() |
40eb7d0d48 | ||
![]() |
1dcb2b7e65 | ||
![]() |
5470b9aa73 | ||
![]() |
050bd7dd0b | ||
![]() |
f75038634f | ||
![]() |
300b4a9158 | ||
![]() |
52071f3476 | ||
![]() |
42ddd745f8 | ||
![]() |
a7846189cd | ||
![]() |
4762995d1f | ||
![]() |
e3a530eb61 | ||
![]() |
d1235ff058 | ||
![]() |
4370e92dbd | ||
![]() |
50e9522a06 | ||
![]() |
b5bb9aa8e3 | ||
![]() |
cf2e365f23 | ||
![]() |
72e532cb67 | ||
![]() |
ac5635f77d | ||
![]() |
640d67c119 | ||
![]() |
3e79693e3b | ||
![]() |
d55d3c2fd0 | ||
![]() |
3aced17c75 | ||
![]() |
bac63914db | ||
![]() |
6a63c51f7c | ||
![]() |
632cf13767 | ||
![]() |
e7012a515c | ||
![]() |
6b638af92f | ||
![]() |
c654b79c53 | ||
![]() |
bee7b874ea | ||
![]() |
9c3fc592f7 | ||
![]() |
4eab7a1ebc | ||
![]() |
3d985688e4 | ||
![]() |
17ea2631cd | ||
![]() |
b749910e6c | ||
![]() |
eff36caea8 | ||
![]() |
6ff092f140 | ||
![]() |
28bb36e53d | ||
![]() |
4a091bbd8a | ||
![]() |
e99a6b813e | ||
![]() |
b9e5302f27 | ||
![]() |
dd7b6aef39 | ||
![]() |
910b8b6a69 | ||
![]() |
c3207e215f | ||
![]() |
f83be11b85 | ||
![]() |
45bce1062a | ||
![]() |
8cb344bf3c | ||
![]() |
fcc4518cdc | ||
![]() |
c84839eb91 | ||
![]() |
1f878aee69 | ||
![]() |
84fd4686e2 | ||
![]() |
ede9fb4fcc | ||
![]() |
723aef71e8 | ||
![]() |
48964a911e | ||
![]() |
6a35cb60fd | ||
![]() |
1e51c3a832 | ||
![]() |
205dda2b39 | ||
![]() |
1c18d19da0 | ||
![]() |
645729e943 | ||
![]() |
f425a25c98 | ||
![]() |
aaace2e802 | ||
![]() |
3f16d9fbc9 | ||
![]() |
3afc57bab8 |
242
CHANGES
242
CHANGES
@@ -7,6 +7,248 @@
|
|||||||
Changelog
|
Changelog
|
||||||
|
|
||||||
|
|
||||||
|
Version 7.14.1 (1 September 2005)
|
||||||
|
|
||||||
|
Daniel (29 August 2005)
|
||||||
|
- Kevin Lussier pointed out a problem with curllib.dsp and how to fix it.
|
||||||
|
|
||||||
|
- Igor Polyakov fixed a rather nasty problem with the threaded name resolver
|
||||||
|
for Windows, that could lead to an Access Violation when the multi interface
|
||||||
|
was used due to an issue with how the resolver thread was and was not
|
||||||
|
terminated.
|
||||||
|
|
||||||
|
- Simon Josefsson brought a patch that allows curl to get built to use GNU GSS
|
||||||
|
instead of MIT/Heimdal for GSS capabilities.
|
||||||
|
|
||||||
|
Daniel (24 August 2005)
|
||||||
|
- Toby Peterson added CURLOPT_IGNORE_CONTENT_LENGTH to the library, accessible
|
||||||
|
from the command line tool with --ignore-content-length. This will make it
|
||||||
|
easier to download files from Apache 1.x (and similar) servers that are
|
||||||
|
still having problems serving files larger than 2 or 4 GB. When this option
|
||||||
|
is enabled, curl will simply have to wait for the server to close the
|
||||||
|
connection to signal end of transfer. I wrote test case 269 that runs a
|
||||||
|
simple test to verify that this works.
|
||||||
|
|
||||||
|
- (Trying hard to exclude emotions now.) valgrind version 3 suddenly renamed
|
||||||
|
the --logfile command line option to --log-file, and thus the test script
|
||||||
|
valgrind autodetection now has yet another version check to do and then it
|
||||||
|
alters the valgrind command line accordingly.
|
||||||
|
|
||||||
|
- Fixed CA cert verification using GnuTLS with the default bundle, which
|
||||||
|
previously failed due to GnuTLS not allowing x509 v1 CA certs by default.
|
||||||
|
Ralph Mitchell reported.
|
||||||
|
|
||||||
|
Daniel (19 August 2005)
|
||||||
|
- Norbert Novotny had problems with FTPS and he helped me work out a patch
|
||||||
|
that made curl run fine in his end. The key was to make sure we do the
|
||||||
|
SSL/TLS negotiation immediately after the TCP connect is done and not after
|
||||||
|
a few other commands have been sent like we did previously. I don't consider
|
||||||
|
this change necessary to obey the standards, I think this server is pickier
|
||||||
|
than what the specs allow it to be, but I can't see how this modified
|
||||||
|
libcurl code can add any problems to those who are interpreting the
|
||||||
|
standards more liberally.
|
||||||
|
|
||||||
|
Daniel (17 August 2005)
|
||||||
|
- Jeff Pohlmeyer found out that if you ask libcurl to load a cookiefile (with
|
||||||
|
CURLOPT_COOKIEFILE), add a cookie (with CURLOPT_COOKIELIST), tell it to
|
||||||
|
write the result to a given cookie jar and then never actually call
|
||||||
|
curl_easy_perform() - the given file(s) to read was never read but the
|
||||||
|
output file was written and thus it caused a "funny" result.
|
||||||
|
|
||||||
|
- While doing some tests for the bug above, I noticed that Firefox generates
|
||||||
|
large numbers (for the expire time) in the cookies.txt file and libcurl
|
||||||
|
didn't treat them properly. Now it does.
|
||||||
|
|
||||||
|
Daniel (15 August 2005)
|
||||||
|
- Added more verbose "warning" messages to the curl client for cases where it
|
||||||
|
fails to open/read files etc to help users diagnose why it doesn't do what
|
||||||
|
you'd expect it to. Converted lots of old messages to use the new generic
|
||||||
|
function I wrote for this purpose.
|
||||||
|
|
||||||
|
Daniel (13 August 2005)
|
||||||
|
- James Bursa identified a libcurl HTTP bug and a good way to repeat it. If a
|
||||||
|
site responds with bad HTTP response that doesn't contain any header at all,
|
||||||
|
only a response body, and the write callback returns 0 to abort the
|
||||||
|
transfer, it didn't have any real effect but the write callback would be
|
||||||
|
called once more anyway.
|
||||||
|
|
||||||
|
Daniel (12 August 2005)
|
||||||
|
- Based on Richard Clayton's reports, I found out that using curl -d @filename
|
||||||
|
when 'filename' was not possible to access made curl use a GET request
|
||||||
|
instead.
|
||||||
|
|
||||||
|
- The time condition illegal syntax warning is now inhibited if -s is used.
|
||||||
|
|
||||||
|
Daniel (10 August 2005)
|
||||||
|
- Mario Schroeder found out that one of the debug callbacks calls that regards
|
||||||
|
SSL data with the CURLINFO_TEXT type claimed that the data was one byte
|
||||||
|
larger than it actually is, thus falsely telling the application that the
|
||||||
|
terminating zero was part of the data.
|
||||||
|
|
||||||
|
Daniel (9 August 2005)
|
||||||
|
- Christopher R. Palmer fixed the offsets used for date parsings when the time
|
||||||
|
zone name of a daylight savings time was used. For example, PDT vs PDS. This
|
||||||
|
flaw was introduced with the new date parser (11 sep 2004 - 7.12.2).
|
||||||
|
Fortunately, no web server or cookie string etc should be using such time
|
||||||
|
zone names thus limiting the effect of this bug.
|
||||||
|
|
||||||
|
Daniel (8 August 2005)
|
||||||
|
- Jon Grubbs filed bug report #1249962 which identified a problem with NTLM on
|
||||||
|
a HTTP proxy if an FTP URL was given. libcurl now properly switches to pure
|
||||||
|
HTTP internally when an HTTP proxy is used, even for FTP URLs. The problem
|
||||||
|
would also occur with other multi-pass auth methods.
|
||||||
|
|
||||||
|
Daniel (7 August 2005)
|
||||||
|
- When curl is built with GnuTLS, curl-config didn't include "SSL" when
|
||||||
|
--features was used.
|
||||||
|
|
||||||
|
Daniel (28 July 2005)
|
||||||
|
- If any of the options CURLOPT_HTTPGET, CURLOPT_POST and CURLOPT_HTTPPOST is
|
||||||
|
set to 1, CURLOPT_NOBODY will now automatically be set to 0.
|
||||||
|
|
||||||
|
Daniel (27 July 2005)
|
||||||
|
- Dan Fandrich changes over the last week: fixed numerous minor configure
|
||||||
|
option parsing flaws: --without-gnutls, --without-spnego --without-gssapi
|
||||||
|
and --without-krb4. Spellfixed several error messages.
|
||||||
|
|
||||||
|
- Peteris Krumins added CURLOPT_COOKIELIST and CURLINFO_COOKIELIST, which is a
|
||||||
|
simple interface to extracting and setting cookies in libcurl's internal
|
||||||
|
"cookie jar". See the new cookie_interface.c example code.
|
||||||
|
|
||||||
|
Daniel (13 July 2005)
|
||||||
|
- Diego Casorran provided patches to make curl build fine on Amiga again.
|
||||||
|
|
||||||
|
Daniel (12 July 2005)
|
||||||
|
- Adrian Schuur added trailer support in the chunked encoding stream. The
|
||||||
|
trailer is then sent to the normal header callback/stream. I wrote up test
|
||||||
|
case 266 to verify the basic functionality. Do note that test case 34
|
||||||
|
contains a flawed chunked encoding stream that still works the same.
|
||||||
|
|
||||||
|
Daniel (5 July 2005)
|
||||||
|
- Gisle Vanem came up with a nice little work-around for bug #1230118. It
|
||||||
|
seems the Windows (MSVC) libc time functions may return data one hour off if
|
||||||
|
TZ is not set and automatic DST adjustment is enabled. This made
|
||||||
|
curl_getdate() return wrong value, and it also concerned internal cookie
|
||||||
|
expirations etc.
|
||||||
|
|
||||||
|
Daniel (4 July 2005)
|
||||||
|
- Andrew Bushnell provided enough info for me to tell that we badly needed to
|
||||||
|
fix the CONNECT authentication code with multi-pass auth methods (such as
|
||||||
|
NTLM) as it didn't previously properly ignore response-bodies - in fact it
|
||||||
|
stopped reading after all response headers had been received. This could
|
||||||
|
lead to libcurl sending the next request and reading the body from the first
|
||||||
|
request as response to the second request. (I also renamed the function,
|
||||||
|
which wasn't strictly necessary but...)
|
||||||
|
|
||||||
|
The best fix would to once and for all make the CONNECT code use the
|
||||||
|
ordinary request sending/receiving code, treating it as any ordinary request
|
||||||
|
instead of the special-purpose function we have now. It should make it
|
||||||
|
better for multi-interface too. And possibly lead to less code...
|
||||||
|
|
||||||
|
Added test case 265 for this. It doesn't work as a _really_ good test case
|
||||||
|
since the test proxy is too stupid, but the test case helps when running the
|
||||||
|
debugger to verify.
|
||||||
|
|
||||||
|
Daniel (30 June 2005)
|
||||||
|
- Dan Fandrich improved the configure script's ability to figure out what kind
|
||||||
|
of strerror_r() API that is used when cross-compiling. If __GLIB__ is
|
||||||
|
defined, it assumes the glibc API. If not, it issues a notice as before that
|
||||||
|
the user needs to manually edit lib/config.h for this.
|
||||||
|
|
||||||
|
Daniel (23 June 2005)
|
||||||
|
- David Shaw's fix that unifies proxy string treatment so that a proxy given
|
||||||
|
with CURLOPT_PROXY can use a http:// prefix and user + password. The user
|
||||||
|
and password fields are now also URL decoded properly. Test case 264 added
|
||||||
|
to verify.
|
||||||
|
|
||||||
|
Daniel (22 June 2005)
|
||||||
|
- David Shaw updated libcurl.m4
|
||||||
|
|
||||||
|
Daniel (14 June 2005)
|
||||||
|
- Gisle Vanem fixed a potential thread handle leak. Bug report #1216500.
|
||||||
|
Comment in http://curl.haxx.se/mail/lib-2005-06/0059.html
|
||||||
|
|
||||||
|
Daniel (13 June 2005)
|
||||||
|
- Made buildconf run libtoolize in the ares dir too (inspired by Tupone's
|
||||||
|
reverted patch).
|
||||||
|
|
||||||
|
Daniel (9 June 2005)
|
||||||
|
- Incorporated Tupone's findtool fix in buildconf (slightly edited)
|
||||||
|
|
||||||
|
- Incorporated Tupone's head -n fix in buildconf.
|
||||||
|
|
||||||
|
Daniel (8 June 2005)
|
||||||
|
- Reverted Tupone's patch again, it broke numerous autobuilds. Let's apply it
|
||||||
|
in pieces, one by one and see what we need to adjust to work all over.
|
||||||
|
|
||||||
|
Daniel (6 June 2005)
|
||||||
|
- Tupone Alfredo fixed three problems in buildconf:
|
||||||
|
|
||||||
|
1) findtool does look per tool in PATH and think ./perl is the perl
|
||||||
|
executable, while is just a local directory (I have . in the PATH)
|
||||||
|
|
||||||
|
2) I got several warning for head -1 deprecated in favour of head -n 1
|
||||||
|
|
||||||
|
3) ares directory is missing some file (missing is missing :-) ) because
|
||||||
|
automake and friends is not run.
|
||||||
|
|
||||||
|
Daniel (3 June 2005)
|
||||||
|
- Added docs/libcurl/getinfo-times, based on feedback from 'Edi':
|
||||||
|
http://curl.haxx.se/feedback/display.cgi?id=11178325798299&support=yes
|
||||||
|
|
||||||
|
- Andres Garcia provided yet another text mode patch for several test cases so
|
||||||
|
that they do text comparisions better on Windows (newline-wise).
|
||||||
|
|
||||||
|
Daniel (1 June 2005)
|
||||||
|
- The configure check for c-ares now adds the cares lib before the other libs,
|
||||||
|
to make it build fine with mingw. Inspired by Tupone Alfredo's bug report
|
||||||
|
(and patch) #1212940
|
||||||
|
|
||||||
|
Daniel (31 May 2005)
|
||||||
|
- Todd Kulesza reported a flaw in the proxy option, since a numerical IPv6
|
||||||
|
address was not possible to use. It is now, but requires it written
|
||||||
|
RFC2732-style, within brackets - which incidently is how you enter numerical
|
||||||
|
IPv6 addresses in URLs. Test case 263 added to verify.
|
||||||
|
|
||||||
|
Daniel (30 May 2005)
|
||||||
|
- Eric Cooper reported about a problem with HTTP servers that responds with
|
||||||
|
binary zeroes within the headers. They confused libcurl to do wrong so the
|
||||||
|
downloaded headers become incomplete. The fix is now verified with test case
|
||||||
|
262.
|
||||||
|
|
||||||
|
Daniel (25 May 2005)
|
||||||
|
- Fixed problems with the test suite, and in particular the FTP test cases
|
||||||
|
since it previously was failing every now and then in a nonsense manner.
|
||||||
|
|
||||||
|
- --trace-time now outputs the full microsecond, all 6 digits.
|
||||||
|
|
||||||
|
Daniel (24 May 2005)
|
||||||
|
- Andres Garcia provided a text mode patch for several test cases so that they
|
||||||
|
do text comparisions better on Windows (newline-wise).
|
||||||
|
|
||||||
|
- Any 2xx response (and not just 200) is now considered a fine response to
|
||||||
|
TYPE, as some servers obviously sends a 226 there. Added test case 261 to
|
||||||
|
verify. Based on a question/report by Georg Wicherski.
|
||||||
|
|
||||||
|
Daniel (20 May 2005)
|
||||||
|
- Improved runtests.pl to allow stdout tests to be mode=text as well, just
|
||||||
|
as file comparisons already supports. Added this info to the FILEFORMAT
|
||||||
|
docs.
|
||||||
|
|
||||||
|
Daniel (18 May 2005)
|
||||||
|
- John McGowan identified a problem in bug report #1204435 with malformed URLs
|
||||||
|
like "http://somehost?data" as it added a slash too much in the request
|
||||||
|
("GET /?data/"...). Added test case 260 to verify.
|
||||||
|
|
||||||
|
- The configure check for strerror_r() failed to detect the proper API at
|
||||||
|
times, like on HP-UX 10.20. Then lib/strerror.c badly assumed the glibc
|
||||||
|
version if the posix define wasn't set (since it _had_ found a strerror_r).
|
||||||
|
|
||||||
|
Daniel (16 May 2005)
|
||||||
|
- The gmtime_r() function in HP-UX 10.20 is broken. About 13 test cases fail
|
||||||
|
due to this. There's now a configure check that attempts to detect the bad
|
||||||
|
function and not use it on such systems.
|
||||||
|
|
||||||
Version 7.14.0 (16 May 2005)
|
Version 7.14.0 (16 May 2005)
|
||||||
|
|
||||||
Daniel (13 May 2005)
|
Daniel (13 May 2005)
|
||||||
|
@@ -200,9 +200,21 @@ netware:
|
|||||||
$(MAKE) -C lib -f Makefile.netware
|
$(MAKE) -C lib -f Makefile.netware
|
||||||
$(MAKE) -C src -f Makefile.netware
|
$(MAKE) -C src -f Makefile.netware
|
||||||
|
|
||||||
|
netware-ares:
|
||||||
|
$(MAKE) -C lib -f Makefile.netware WITH_ARES=1
|
||||||
|
$(MAKE) -C src -f Makefile.netware WITH_ARES=1
|
||||||
|
|
||||||
netware-ssl:
|
netware-ssl:
|
||||||
$(MAKE) -C lib -f Makefile.netware SSL=1
|
$(MAKE) -C lib -f Makefile.netware WITH_SSL=1
|
||||||
$(MAKE) -C src -f Makefile.netware SSL=1
|
$(MAKE) -C src -f Makefile.netware WITH_SSL=1
|
||||||
|
|
||||||
|
netware-ssl-zlib:
|
||||||
|
$(MAKE) -C lib -f Makefile.netware WITH_SSL=1 WITH_ZLIB=1
|
||||||
|
$(MAKE) -C src -f Makefile.netware WITH_SSL=1 WITH_ZLIB=1
|
||||||
|
|
||||||
|
netware-zlib:
|
||||||
|
$(MAKE) -C lib -f Makefile.netware WITH_ZLIB=1
|
||||||
|
$(MAKE) -C src -f Makefile.netware WITH_ZLIB=1
|
||||||
|
|
||||||
netware-clean:
|
netware-clean:
|
||||||
$(MAKE) -C lib -f Makefile.netware clean
|
$(MAKE) -C lib -f Makefile.netware clean
|
||||||
|
37
README
37
README
@@ -26,50 +26,37 @@ CONTACT
|
|||||||
If you have problems, questions, ideas or suggestions, please contact us
|
If you have problems, questions, ideas or suggestions, please contact us
|
||||||
by posting to a suitable mailing list. See http://curl.haxx.se/mail/
|
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.
|
All contributors to the project are listed in the THANKS document.
|
||||||
|
|
||||||
WEB SITE
|
WEB SITE
|
||||||
|
|
||||||
Visit the curl web site or mirrors for the latest news:
|
Visit the curl web site or mirrors for the latest news and downloads:
|
||||||
|
|
||||||
Sweden -- http://curl.haxx.se/
|
Sweden -- http://curl.haxx.se/
|
||||||
Australia -- http://curl.planetmirror.com/
|
Australia -- http://curl.planetmirror.com/
|
||||||
Austria -- http://curl.gds.tuwien.ac.at/
|
Austria -- http://curl.gds.tuwien.ac.at/
|
||||||
|
Canada -- http://curl.meulie.net/
|
||||||
Denmark -- http://curl.cofman.dk/
|
Denmark -- http://curl.cofman.dk/
|
||||||
Estonia -- http://curl.wildyou.net/
|
Estonia -- http://curl.wildyou.net/
|
||||||
France -- http://curl.mirror.internet.tp/
|
France -- http://curl.mirror.internet.tp/
|
||||||
Germany -- http://curl.kgt.org/
|
Germany -- http://curl.miscellaneousmirror.org/
|
||||||
Germany -- http://curl.mirror.at.stealer.net/
|
Germany -- http://curl.mirror.at.stealer.net/
|
||||||
|
Germany -- http://curl.mirroring.de/
|
||||||
|
Germany -- http://curl.mons-new-media.de/
|
||||||
Germany -- http://curl.netmirror.org/
|
Germany -- http://curl.netmirror.org/
|
||||||
Russia -- http://curl.tsuren.net/
|
Russia -- http://curl.tsuren.net/
|
||||||
Taiwan -- http://curl.cs.pu.edu.tw/
|
Taiwan -- http://curl.cs.pu.edu.tw/
|
||||||
Thailand -- http://curl.siamu.ac.th/
|
Thailand -- http://curl.siamu.ac.th/
|
||||||
|
US (AZ) -- http://curl.islandofpoker.com/
|
||||||
US (CA) -- http://curl.mirror.redwire.net/
|
US (CA) -- http://curl.mirror.redwire.net/
|
||||||
US (CA) -- http://curl.mirrormonster.com/
|
US (CA) -- http://curl.mirrormonster.com/
|
||||||
US (CA) -- http://curl.signal42.com/
|
US (CA) -- http://curl.signal42.com/
|
||||||
|
US (CA) -- http://curl.tolix.org/
|
||||||
|
US (CA) -- http://curl.webhosting76.com/
|
||||||
US (TX) -- http://curl.109k.com/
|
US (TX) -- http://curl.109k.com/
|
||||||
|
US (TX) -- http://curl.mirrors.cyberservers.net/
|
||||||
DOWNLOAD
|
US (TX) -- http://curl.seekmeup.com/
|
||||||
|
US (TX) -- http://curl.hostingzero.com/
|
||||||
The official download mirror sites are:
|
|
||||||
|
|
||||||
Australia -- http://curl.planetmirror.com/download.html
|
|
||||||
Austria -- http://curl.gds.tuwien.ac.at/download.html
|
|
||||||
Estonia -- http://curl.wildyou.net/download.html
|
|
||||||
Germany -- ftp://ftp.fu-berlin.de/pub/unix/network/curl/
|
|
||||||
Germany -- http://curl.mirror.at.stealer.net/download.html
|
|
||||||
Germany -- http://curl.netmirror.org/download.html
|
|
||||||
Germany -- http://www.mirrorspace.org/curl/
|
|
||||||
Hongkong -- http://www.execve.net/curl/
|
|
||||||
Russia -- http://curl.tsuren.net/download.html
|
|
||||||
Sweden -- ftp://ftp.sunet.se/pub/www/utilities/curl/
|
|
||||||
Sweden -- http://cool.haxx.se/curl/
|
|
||||||
Taiwan -- http://curl.cs.pu.edu.tw/download.html
|
|
||||||
Thailand -- http://curl.siamu.ac.th/download.html
|
|
||||||
US (CA) -- http://curl.mirror.redwire.net/download.html
|
|
||||||
US (CA) -- http://curl.mirrormonster.com/download.html
|
|
||||||
US (CA) -- http://curl.signal42.com/download.html
|
|
||||||
US (TX) -- http://curl.109k.com/download.html
|
|
||||||
|
|
||||||
CVS
|
CVS
|
||||||
|
|
||||||
|
@@ -1,58 +1,74 @@
|
|||||||
Curl and libcurl 7.14.0
|
Curl and libcurl 7.14.1
|
||||||
|
|
||||||
Public curl release number: 88
|
Public curl release number: 89
|
||||||
Releases counted from the very beginning: 115
|
Releases counted from the very beginning: 116
|
||||||
Available command line options: 107
|
Available command line options: 108
|
||||||
Available curl_easy_setopt() options: 122
|
Available curl_easy_setopt() options: 123
|
||||||
Number of public functions in libcurl: 46
|
Number of public functions in libcurl: 46
|
||||||
Amount of public web site mirrors: 23
|
Amount of public web site mirrors: 25
|
||||||
Number of known libcurl bindings: 31
|
Number of known libcurl bindings: 31
|
||||||
Number of contributors: 437
|
Number of contributors: 447
|
||||||
|
|
||||||
This release includes the following changes:
|
This release includes the following changes:
|
||||||
|
|
||||||
o modified default HTTP request headers
|
o GNU GSS support
|
||||||
o curl --trace-time added for time stamping trace logs
|
o --ignore-content-length and CURLOPT_IGNORE_CONTENT_LENGTH added
|
||||||
o curl now respects the SSL_CERT_DIR and SSL_CERT_PATH environment variables
|
o negotiates data connection SSL earlier when doing FTPS with PASV
|
||||||
o more search paths for curl's default .curlrc config file check
|
o CURLOPT_COOKIELIST and CURLINFO_COOKIELIST
|
||||||
o GnuTLS support, use configure --with-gnutls. Work on this was sponsored
|
o trailer support for chunked encoded data streams
|
||||||
by The Written Word.
|
o -x/CURL_PROXY strings may now contain user+password
|
||||||
|
o --trace-time now outputs the full microsecond, all 6 digits
|
||||||
|
|
||||||
This release includes the following bugfixes:
|
This release includes the following bugfixes:
|
||||||
|
|
||||||
o uses select() instead of poll() even on Mac OS X 10.4
|
o MSVC build problem with the DSP file
|
||||||
o reconnected proxy use with NTLM auth on the same handle
|
o windows threaded resolver access violation with multi interface
|
||||||
o warns about bad -z date syntax
|
o test suite works with valgrind 3
|
||||||
o docs/THANKS now contains all known contributors
|
o CA cert verification with GnuTLS builds
|
||||||
o builds out-of-the-box on (presumably ipv6-enabled) AIX 4.3 hosts
|
o handles expiry times in cookie files that go beyond 32 bits in size
|
||||||
o curl --head could wrongly complain on bad chunked-encoding
|
o several client problems with files, such as doing -d @file when the file
|
||||||
o --interface SIGSEGVed on a bad address
|
isn't readable now gets a warning displayed
|
||||||
o kill the HTTPS server better when stopping the test suite
|
o write callback abort didn't always "take"
|
||||||
o builds fine with VS2005 on x64
|
o the curl -z "bad syntax" warning is now hidden when -s is used
|
||||||
o auth fix for HTTP redirects and .netrc usage
|
o curl -d @nonexisting no longer makes a GET
|
||||||
o FTP uploads show the progress meter easier
|
o minor debug callback data size
|
||||||
o MSVC makefile fixes for static libcurl builds
|
o date parsing of dates including daylight savings time zone names
|
||||||
o configure fix for static libcurl build on Windows
|
o using NTLM over proxy with an FTP URL
|
||||||
o --retry-delay
|
o curl-config --features now displays SSL when built with GnuTLS too
|
||||||
o POST with read callback now uses Expect: 100-continue
|
o CURLOPT_HTTPGET, CURLOPT_POST and CURLOPT_HTTPPOST reset CURLOPT_NOBODY
|
||||||
o CURLOPT_PORT didn't actually use the set port number
|
o builds fine on AmigaOS again
|
||||||
o HTTP 304 response with Content-Length: header
|
o corrected date parsing on Windows with auto-DST-adjust enabled
|
||||||
o time-conditioned FTP uploads
|
o treats CONNECT 407 responses with bodies better during Digest/NTLM auth
|
||||||
|
o improved strerror_r() API guessing when cross-compiling
|
||||||
|
o debug builds work on Tru64
|
||||||
|
o improved libcurl.m4
|
||||||
|
o possible memory leak in windows name resolves
|
||||||
|
o c-ares enabled build with mingw
|
||||||
|
o proxy host set with numerical IPv6 address
|
||||||
|
o better treatment of binary zeroes in HTTP response headers
|
||||||
|
o fixed the notorious FTP server failure in the test suite
|
||||||
|
o better checking of text output in the test suite on windows
|
||||||
|
o FTP servers' TYPE command response check made less strict
|
||||||
|
o URL-without-slash as in http://somehost?data
|
||||||
|
o strerror_r() configure check for HP-UX 10.20 (and others)
|
||||||
|
o time parse work-around on HP-UX 10.20 since its gmtime_r() is broken
|
||||||
|
|
||||||
Other curl-related news since the previous public release:
|
Other curl-related news since the previous public release:
|
||||||
|
|
||||||
o http://curl.mirroring.de/ is a new german curl mirror
|
o cURLpp 0.5.2 was released at http://rrette.com/curlpp.html
|
||||||
o pycurl 7.13.2: http://pycurl.sf.net/
|
o Rexx/CURL 1.3 was released at http://rexxcurl.sf.net/
|
||||||
o TclCurl 0.13.2: http://personal1.iddeo.es/andresgarci/tclcurl/english/
|
o http://curl.miscellaneousmirror.org is a new German curl mirror
|
||||||
o http://curl.webhosting76.com/ is a new US curl mirror
|
o LuaCURL by Alexander Marinov at http://luacurl.luaforge.net/
|
||||||
o http://curl.meulie.net/ is a new Canadian curl mirror
|
o http://curl.hostingzero.com/ is a new US curl mirror
|
||||||
|
o ocurl 0.2.1 was released at http://sourceforge.net/projects/ocurl
|
||||||
|
|
||||||
This release would not have looked like this without help, code, reports and
|
This release would not have looked like this without help, code, reports and
|
||||||
advice from friends like these:
|
advice from friends like these:
|
||||||
|
|
||||||
Christophe Legry, Cory Nelson, Gisle Vanem, Dan Fandrich, Toshiyuki Maezawa,
|
John McGowan, Georg Wicherski, Andres Garcia, Eric Cooper, Todd Kulesza,
|
||||||
Olivier, Andres Garcia, Dave Dribin, Alex Suykov, Cory Nelson, Fred New,
|
Tupone Alfredo, Gisle Vanem, David Shaw, Andrew Bushnell, Dan Fandrich,
|
||||||
Paul Moore, Alexander Zhuravlev, Bryan Henderson, Jeremy Brown, Allan,
|
Adrian Schuur, Diego Casorran, Peteris Krumins, Jon Grubbs, Christopher
|
||||||
Grigory Entin
|
R. Palmer, Mario Schroeder, Richard Clayton, James Bursa, Jeff Pohlmeyer,
|
||||||
|
Norbert Novotny, Toby Peterson, Simon Josefsson, Igor Polyakov, Kevin Lussier
|
||||||
|
|
||||||
Thanks! (and sorry if I forgot to mention someone)
|
Thanks! (and sorry if I forgot to mention someone)
|
||||||
|
36
TODO-RELEASE
36
TODO-RELEASE
@@ -1,40 +1,12 @@
|
|||||||
Issues not sorted in any particular order.
|
Issues not sorted in any particular order.
|
||||||
|
|
||||||
To get fixed in 7.14.0 (planned release: May/June 2005)
|
To get fixed in 7.14.1 (planned release: August 2005)
|
||||||
======================
|
======================
|
||||||
|
|
||||||
- Make the tests run better on more platforms.
|
To get fixed in 7.14.2 (planned release: October 2005)
|
||||||
|
|
||||||
To get fixed in 7.14.1 (planned release: June 2005)
|
|
||||||
======================
|
======================
|
||||||
|
|
||||||
58 - Fix KNOWN_BUGS #19: "FTP 3rd party transfers with the multi interface
|
60 - CONNECT 407 responses that kills the connection
|
||||||
doesn't work"
|
|
||||||
|
|
||||||
47 - Peter Sylvester's patch for SRP on the TLS layer
|
63 -
|
||||||
Awaits OpenSSL support for this, no need to support this in libcurl before
|
|
||||||
there's an OpenSSL release that does it.
|
|
||||||
|
|
||||||
To get fixed in 7.15.0
|
|
||||||
======================
|
|
||||||
|
|
||||||
55 - Add a function to the multi interface that gets file descriptors, as an
|
|
||||||
alternative to the curl_multi_fdset(). This is necessary to allow apps to
|
|
||||||
properly avoid the FD_SETSIZE problem.
|
|
||||||
|
|
||||||
56 - Make curl_easy_perform() a wrapper-function that simply creates a multi
|
|
||||||
handle, adds the easy handle to it, runs curl_multi_perform() until the
|
|
||||||
transfer is done, then detach the easy handle, destroy the multi handle
|
|
||||||
and return the easy handle's return code. This will thus make everything
|
|
||||||
internally use and assume the multi interface. The select()-loop should
|
|
||||||
use the new function from (55).
|
|
||||||
|
|
||||||
To get fixed in 7.16.0
|
|
||||||
======================
|
|
||||||
|
|
||||||
57 - Add an interface to libcurl for getting and setting cookies from an easy
|
|
||||||
handle. One idea: http://curl.haxx.se/mail/lib-2004-12/0195.html the
|
|
||||||
older idea: http://curl.haxx.se/dev/COOKIES. We need to settle on some
|
|
||||||
middle ground I guess.
|
|
||||||
|
|
||||||
60 -
|
|
||||||
|
59
acinclude.m4
59
acinclude.m4
@@ -192,8 +192,7 @@ AC_DEFUN([TYPE_SOCKLEN_T],
|
|||||||
])
|
])
|
||||||
|
|
||||||
dnl Check for in_addr_t: it is used to receive the return code of inet_addr()
|
dnl Check for in_addr_t: it is used to receive the return code of inet_addr()
|
||||||
dnl and a few other things. If not found, we set it to unsigned int, as even
|
dnl and a few other things.
|
||||||
dnl 64-bit implementations use to set it to a 32-bit type.
|
|
||||||
AC_DEFUN([TYPE_IN_ADDR_T],
|
AC_DEFUN([TYPE_IN_ADDR_T],
|
||||||
[
|
[
|
||||||
AC_CHECK_TYPE([in_addr_t], ,[
|
AC_CHECK_TYPE([in_addr_t], ,[
|
||||||
@@ -417,34 +416,25 @@ dnl int strerror_r(int errnum, char *buf, size_t n);
|
|||||||
dnl
|
dnl
|
||||||
AC_DEFUN([CURL_CHECK_STRERROR_R],
|
AC_DEFUN([CURL_CHECK_STRERROR_R],
|
||||||
[
|
[
|
||||||
dnl determine of strerror_r is present
|
AC_CHECK_FUNCS(strerror_r)
|
||||||
AC_CHECK_FUNCS(strerror_r,[
|
|
||||||
|
if test "x$ac_cv_func_strerror_r" = "xyes"; then
|
||||||
|
|
||||||
AC_MSG_CHECKING(whether strerror_r is declared)
|
AC_MSG_CHECKING(whether strerror_r is declared)
|
||||||
AC_EGREP_CPP(strerror_r,[
|
AC_EGREP_CPP(strerror_r,[
|
||||||
#include <string.h>],[
|
#include <string.h>],[
|
||||||
strerror_r="yes"
|
|
||||||
AC_MSG_RESULT(yes)],[
|
AC_MSG_RESULT(yes)],[
|
||||||
AC_MSG_RESULT(no)
|
AC_MSG_RESULT(no)
|
||||||
AC_MSG_CHECKING(whether strerror_r with -D_THREAD_SAFE is declared)
|
AC_MSG_CHECKING(whether strerror_r with -D_REENTRANT is declared)
|
||||||
AC_EGREP_CPP(strerror_r,[
|
AC_EGREP_CPP(strerror_r,[
|
||||||
#define _THREAD_SAFE
|
#define _REENTRANT
|
||||||
#include <string.h>],[
|
#include <string.h>],[
|
||||||
strerror_r="yes"
|
CPPFLAGS="-D_REENTRANT $CPPFLAGS"
|
||||||
CPPFLAGS="-D_THREAD_SAFE $CPPFLAGS"
|
|
||||||
AC_MSG_RESULT(yes)],
|
AC_MSG_RESULT(yes)],
|
||||||
AC_MSG_RESULT(no))])])
|
AC_MSG_RESULT(no)
|
||||||
|
AC_DEFINE(HAVE_NO_STRERROR_R_DECL, 1, [we have no strerror_r() proto])
|
||||||
if test "x$strerror_r" = "xyes"; then
|
) dnl with _THREAD_SAFE
|
||||||
|
]) dnl plain cpp for it
|
||||||
dnl check if strerror_r is properly declared in the headers
|
|
||||||
AC_CHECK_DECL(strerror_r, ,
|
|
||||||
AC_DEFINE(HAVE_NO_STRERROR_R_DECL, 1, [we have no strerror_r() proto])
|
|
||||||
,
|
|
||||||
[#include <stdlib.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <errno.h>
|
|
||||||
])
|
|
||||||
|
|
||||||
dnl determine if this strerror_r() is glibc or POSIX
|
dnl determine if this strerror_r() is glibc or POSIX
|
||||||
AC_MSG_CHECKING([for a glibc strerror_r API])
|
AC_MSG_CHECKING([for a glibc strerror_r API])
|
||||||
@@ -466,8 +456,20 @@ main () {
|
|||||||
AC_DEFINE(HAVE_GLIBC_STRERROR_R, 1, [we have a glibc-style strerror_r()])
|
AC_DEFINE(HAVE_GLIBC_STRERROR_R, 1, [we have a glibc-style strerror_r()])
|
||||||
AC_MSG_RESULT([yes]),
|
AC_MSG_RESULT([yes]),
|
||||||
AC_MSG_RESULT([no]),
|
AC_MSG_RESULT([no]),
|
||||||
dnl cross-compiling!
|
|
||||||
AC_MSG_NOTICE([cannot determine strerror_r() style: edit lib/config.h manually!])
|
dnl Use an inferior method of strerror_r detection while cross-compiling
|
||||||
|
AC_EGREP_CPP(yes, [
|
||||||
|
#include <features.h>
|
||||||
|
#ifdef __GLIBC__
|
||||||
|
yes
|
||||||
|
#endif
|
||||||
|
],
|
||||||
|
dnl looks like glibc, so assume a glibc-style strerror_r()
|
||||||
|
GLIBC_STRERROR_R="1"
|
||||||
|
AC_DEFINE(HAVE_GLIBC_STRERROR_R, 1, [we have a glibc-style strerror_r()])
|
||||||
|
AC_MSG_RESULT([yes]),
|
||||||
|
AC_MSG_NOTICE([cannot determine strerror_r() style: edit lib/config.h manually!])
|
||||||
|
) dnl while cross-compiling
|
||||||
)
|
)
|
||||||
|
|
||||||
if test -z "$GLIBC_STRERROR_R"; then
|
if test -z "$GLIBC_STRERROR_R"; then
|
||||||
@@ -756,15 +758,18 @@ AC_DEFUN([CURL_CC_DEBUG_OPTS],
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
dnl -Wunreachable-code seems totally unreliable on my gcc 3.3.2 on
|
dnl -Wunreachable-code seems totally unreliable on my gcc 3.3.2 on
|
||||||
dnl on i686-Linux as it gives us heaps with false positives
|
dnl on i686-Linux as it gives us heaps with false positives.
|
||||||
|
dnl Also, on gcc 4.0.X it is totally unbearable and complains all
|
||||||
|
dnl over making it unusable for generic purposes. Let's not use it.
|
||||||
|
|
||||||
if test "$gccnum" -ge "303"; then
|
if test "$gccnum" -ge "303"; then
|
||||||
dnl gcc 3.3 and later
|
dnl gcc 3.3 and later
|
||||||
WARN="$WARN -Wendif-labels -Wstrict-prototypes"
|
WARN="$WARN -Wendif-labels -Wstrict-prototypes"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if test "$gccnum" -ge "304"; then
|
if test "$gccnum" -ge "304"; then
|
||||||
# try -Wunreachable-code on gcc 3.4
|
# try these on gcc 3.4
|
||||||
WARN="$WARN -Wunreachable-code"
|
WARN="$WARN -Wdeclaration-after-statement"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
for flag in $CPPFLAGS; do
|
for flag in $CPPFLAGS; do
|
||||||
|
36
ares/CHANGES
36
ares/CHANGES
@@ -1,5 +1,41 @@
|
|||||||
Changelog for the c-ares project
|
Changelog for the c-ares project
|
||||||
|
|
||||||
|
Version 1.3.0 (August 29, 2004)
|
||||||
|
|
||||||
|
* August 21
|
||||||
|
|
||||||
|
- Alfredo Tupone provided a fix for the Windows code in get_iphlpapi_dns_info()
|
||||||
|
when getting the DNS server etc.
|
||||||
|
|
||||||
|
* June 19
|
||||||
|
|
||||||
|
- Added some checks for the addrinfo structure.
|
||||||
|
|
||||||
|
* June 2
|
||||||
|
|
||||||
|
- William Ahern:
|
||||||
|
|
||||||
|
Make UDP sockets non-blocking. I've confirmed that at least on Linux 2.4 a
|
||||||
|
read event can come back from poll() on a valid SOCK_DGRAM socket but
|
||||||
|
recv(2) will still block. This patch doesn't ignore EAGAIN in
|
||||||
|
read_udp_packets(), though maybe it should. (This patch was edited by Daniel
|
||||||
|
Stenberg and a new configure test was added (imported from curl's configure)
|
||||||
|
to properly detect what non-blocking socket approach to use.)
|
||||||
|
|
||||||
|
I'm not quite sure how this was happening, but I've been seeing PTR queries
|
||||||
|
which seem to return empty responses. At least, they were empty when calling
|
||||||
|
ares_expand_name() on the record. Here's a patch which guarantees to
|
||||||
|
NUL-terminate the expanded name. The old behavior failed to NUL-terminate if
|
||||||
|
len was 0, and this was causing strlen() to run past the end of the buffer
|
||||||
|
after calling ares_expand_name() and getting ARES_SUCCESS as the return
|
||||||
|
value. If q is not greater than *s then it's equal and *s is always
|
||||||
|
allocated with at least one byte.
|
||||||
|
|
||||||
|
* May 16
|
||||||
|
|
||||||
|
- Added ares_getnameinfo which mimics the getnameinfo API (another feature
|
||||||
|
that could use testing).
|
||||||
|
|
||||||
* May 14
|
* May 14
|
||||||
|
|
||||||
- Added an inet_ntop function from BIND for systems that do not have it.
|
- Added an inet_ntop function from BIND for systems that do not have it.
|
||||||
|
@@ -15,7 +15,7 @@ EXTRA_DIST = CHANGES README.cares Makefile.inc adig.c ahost.c $(man_MANS) \
|
|||||||
$(MSVCFILES) AUTHORS
|
$(MSVCFILES) AUTHORS
|
||||||
|
|
||||||
|
|
||||||
VER=-version-info 0:0:0
|
VER=-version-info 1:0:0
|
||||||
# This flag accepts an argument of the form current[:revision[:age]]. So,
|
# This flag accepts an argument of the form current[:revision[:age]]. So,
|
||||||
# passing -version-info 3:12:1 sets current to 3, revision to 12, and age to
|
# passing -version-info 3:12:1 sets current to 3, revision to 12, and age to
|
||||||
# 1.
|
# 1.
|
||||||
|
@@ -1,17 +1,18 @@
|
|||||||
CSOURCES = ares_fds.c ares_process.c ares_free_hostent.c ares_query.c \
|
CSOURCES = ares_fds.c ares_process.c ares_free_hostent.c ares_query.c \
|
||||||
ares__close_sockets.c ares_free_string.c ares_search.c ares__get_hostent.c \
|
ares__close_sockets.c ares_free_string.c ares_search.c ares__get_hostent.c \
|
||||||
ares_gethostbyaddr.c ares_send.c ares__read_line.c ares_gethostbyname.c \
|
ares_gethostbyaddr.c ares_send.c ares__read_line.c ares_gethostbyname.c \
|
||||||
ares_strerror.c ares_cancel.c ares_init.c ares_timeout.c ares_destroy.c \
|
ares_strerror.c ares_cancel.c ares_init.c ares_timeout.c ares_destroy.c \
|
||||||
ares_mkquery.c ares_version.c ares_expand_name.c ares_parse_a_reply.c \
|
ares_mkquery.c ares_version.c ares_expand_name.c ares_parse_a_reply.c \
|
||||||
windows_port.c ares_expand_string.c ares_parse_ptr_reply.c \
|
windows_port.c ares_expand_string.c ares_parse_ptr_reply.c \
|
||||||
ares_parse_aaaa_reply.c inet_net_pton.c bitncmp.c inet_ntop.c
|
ares_parse_aaaa_reply.c ares_getnameinfo.c inet_net_pton.c bitncmp.c \
|
||||||
|
inet_ntop.c
|
||||||
|
|
||||||
HHEADERS = ares.h ares_private.h setup.h ares_dns.h ares_version.h nameser.h \
|
HHEADERS = ares.h ares_private.h setup.h ares_dns.h ares_version.h \
|
||||||
inet_net_pton.h ares_ipv6.h bitncmp.h
|
nameser.h inet_net_pton.h inet_ntop.h ares_ipv6.h bitncmp.h
|
||||||
|
|
||||||
MANPAGES= ares_destroy.3 ares_expand_name.3 ares_expand_string.3 ares_fds.3 \
|
MANPAGES= ares_destroy.3 ares_expand_name.3 ares_expand_string.3 ares_fds.3 \
|
||||||
ares_free_hostent.3 ares_free_string.3 ares_gethostbyaddr.3 \
|
ares_free_hostent.3 ares_free_string.3 ares_gethostbyaddr.3 \
|
||||||
ares_gethostbyname.3 ares_init.3 ares_init_options.3 ares_mkquery.3 \
|
ares_gethostbyname.3 ares_init.3 ares_init_options.3 ares_mkquery.3 \
|
||||||
ares_parse_a_reply.3 ares_parse_ptr_reply.3 ares_process.3 \
|
ares_parse_a_reply.3 ares_parse_ptr_reply.3 ares_process.3 \
|
||||||
ares_query.3 ares_search.3 ares_send.3 ares_strerror.3 ares_timeout.3 \
|
ares_query.3 ares_search.3 ares_send.3 ares_strerror.3 ares_timeout.3 \
|
||||||
ares_version.3 ares_cancel.3 ares_parse_aaaa_reply.3
|
ares_version.3 ares_cancel.3 ares_parse_aaaa_reply.3 ares_getnameinfo.3
|
||||||
|
@@ -89,7 +89,7 @@ LDFLAGS = -T
|
|||||||
AR = ar
|
AR = ar
|
||||||
ARFLAGS = -cq
|
ARFLAGS = -cq
|
||||||
CFLAGS += -fno-builtin -fpack-struct -fpcc-struct-return -fno-strict-aliasing
|
CFLAGS += -fno-builtin -fpack-struct -fpcc-struct-return -fno-strict-aliasing
|
||||||
CFLAGS += -Wall -Wno-format # -pedantic
|
CFLAGS += -Wall -Wno-format -Wno-uninitialized # -pedantic
|
||||||
ifeq ($(LIBARCH),LIBC)
|
ifeq ($(LIBARCH),LIBC)
|
||||||
PRELUDE = $(SDK_LIBC)/imports/libcpre.gcc.o
|
PRELUDE = $(SDK_LIBC)/imports/libcpre.gcc.o
|
||||||
else
|
else
|
||||||
@@ -104,7 +104,7 @@ SDK_LIBC = $(NDK_ROOT)/libc
|
|||||||
|
|
||||||
ifeq ($(LIBARCH),LIBC)
|
ifeq ($(LIBARCH),LIBC)
|
||||||
INCLUDES += -I$(SDK_LIBC)/include -I$(SDK_LIBC)/include/nks
|
INCLUDES += -I$(SDK_LIBC)/include -I$(SDK_LIBC)/include/nks
|
||||||
INCLUDES += -I$(SDK_LIBC)/include/winsock
|
# INCLUDES += -I$(SDK_LIBC)/include/winsock
|
||||||
CFLAGS += -D_POSIX_SOURCE
|
CFLAGS += -D_POSIX_SOURCE
|
||||||
# CFLAGS += -D__ANSIC__
|
# CFLAGS += -D__ANSIC__
|
||||||
else
|
else
|
||||||
@@ -304,6 +304,8 @@ config.h: Makefile.netware
|
|||||||
@echo $(DL)#define HAVE_AF_INET6 1$(DL) >> $@
|
@echo $(DL)#define HAVE_AF_INET6 1$(DL) >> $@
|
||||||
@echo $(DL)#define HAVE_PF_INET6 1$(DL) >> $@
|
@echo $(DL)#define HAVE_PF_INET6 1$(DL) >> $@
|
||||||
@echo $(DL)#define HAVE_STRUCT_IN6_ADDR 1$(DL) >> $@
|
@echo $(DL)#define HAVE_STRUCT_IN6_ADDR 1$(DL) >> $@
|
||||||
|
@echo $(DL)#define HAVE_STRUCT_SOCKADDR_IN6 1$(DL) >> $@
|
||||||
|
@echo $(DL)#define HAVE_STRUCT_ADDRINFO 1$(DL) >> $@
|
||||||
@echo $(DL)#define SIZEOF_STRUCT_IN6_ADDR 16$(DL) >> $@
|
@echo $(DL)#define SIZEOF_STRUCT_IN6_ADDR 16$(DL) >> $@
|
||||||
@echo $(DL)#define SIZEOF_STRUCT_IN_ADDR 4$(DL) >> $@
|
@echo $(DL)#define SIZEOF_STRUCT_IN_ADDR 4$(DL) >> $@
|
||||||
ifdef NW_WINSOCK
|
ifdef NW_WINSOCK
|
||||||
|
@@ -1,3 +1,126 @@
|
|||||||
|
dnl Check for how to set a socket to non-blocking state. There seems to exist
|
||||||
|
dnl four known different ways, with the one used almost everywhere being POSIX
|
||||||
|
dnl and XPG3, while the other different ways for different systems (old BSD,
|
||||||
|
dnl Windows and Amiga).
|
||||||
|
dnl
|
||||||
|
dnl There are two known platforms (AIX 3.x and SunOS 4.1.x) where the
|
||||||
|
dnl O_NONBLOCK define is found but does not work. This condition is attempted
|
||||||
|
dnl to get caught in this script by using an excessive number of #ifdefs...
|
||||||
|
dnl
|
||||||
|
AC_DEFUN([CURL_CHECK_NONBLOCKING_SOCKET],
|
||||||
|
[
|
||||||
|
AC_MSG_CHECKING([non-blocking sockets style])
|
||||||
|
|
||||||
|
AC_TRY_COMPILE([
|
||||||
|
/* headers for O_NONBLOCK test */
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
],[
|
||||||
|
/* try to compile O_NONBLOCK */
|
||||||
|
|
||||||
|
#if defined(sun) || defined(__sun__) || defined(__SUNPRO_C) || defined(__SUNPRO_CC)
|
||||||
|
# if defined(__SVR4) || defined(__srv4__)
|
||||||
|
# define PLATFORM_SOLARIS
|
||||||
|
# else
|
||||||
|
# define PLATFORM_SUNOS4
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
#if (defined(_AIX) || defined(__xlC__)) && !defined(_AIX4)
|
||||||
|
# define PLATFORM_AIX_V3
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(PLATFORM_SUNOS4) || defined(PLATFORM_AIX_V3) || defined(__BEOS__)
|
||||||
|
#error "O_NONBLOCK does not work on this platform"
|
||||||
|
#endif
|
||||||
|
int socket;
|
||||||
|
int flags = fcntl(socket, F_SETFL, flags | O_NONBLOCK);
|
||||||
|
],[
|
||||||
|
dnl the O_NONBLOCK test was fine
|
||||||
|
nonblock="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
|
||||||
|
|
||||||
|
AC_TRY_COMPILE([
|
||||||
|
/* headers for FIONBIO test */
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stropts.h>
|
||||||
|
],[
|
||||||
|
/* FIONBIO source test (old-style unix) */
|
||||||
|
int socket;
|
||||||
|
int flags = ioctl(socket, FIONBIO, &flags);
|
||||||
|
],[
|
||||||
|
dnl FIONBIO test was good
|
||||||
|
nonblock="FIONBIO"
|
||||||
|
AC_DEFINE(HAVE_FIONBIO, 1, [use FIONBIO for non-blocking sockets])
|
||||||
|
],[
|
||||||
|
dnl FIONBIO test was also bad
|
||||||
|
dnl the code was bad, try a different program now, test 3
|
||||||
|
|
||||||
|
AC_TRY_COMPILE([
|
||||||
|
/* headers for ioctlsocket test (cygwin?) */
|
||||||
|
#include <windows.h>
|
||||||
|
],[
|
||||||
|
/* ioctlsocket source code */
|
||||||
|
int socket;
|
||||||
|
unsigned long flags = ioctlsocket(socket, FIONBIO, &flags);
|
||||||
|
],[
|
||||||
|
dnl ioctlsocket test was good
|
||||||
|
nonblock="ioctlsocket"
|
||||||
|
AC_DEFINE(HAVE_IOCTLSOCKET, 1, [use ioctlsocket() for non-blocking sockets])
|
||||||
|
],[
|
||||||
|
dnl ioctlsocket didnt compile!, go to test 4
|
||||||
|
|
||||||
|
AC_TRY_LINK([
|
||||||
|
/* headers for IoctlSocket test (Amiga?) */
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
],[
|
||||||
|
/* IoctlSocket source code */
|
||||||
|
int socket;
|
||||||
|
int flags = IoctlSocket(socket, FIONBIO, (long)1);
|
||||||
|
],[
|
||||||
|
dnl ioctlsocket test was good
|
||||||
|
nonblock="IoctlSocket"
|
||||||
|
AC_DEFINE(HAVE_IOCTLSOCKET_CASE, 1, [use Ioctlsocket() for non-blocking sockets])
|
||||||
|
],[
|
||||||
|
dnl Ioctlsocket didnt compile, do test 5!
|
||||||
|
AC_TRY_COMPILE([
|
||||||
|
/* headers for SO_NONBLOCK test (BeOS) */
|
||||||
|
#include <socket.h>
|
||||||
|
],[
|
||||||
|
/* SO_NONBLOCK source code */
|
||||||
|
long b = 1;
|
||||||
|
int socket;
|
||||||
|
int flags = setsockopt(socket, SOL_SOCKET, SO_NONBLOCK, &b, sizeof(b));
|
||||||
|
],[
|
||||||
|
dnl the SO_NONBLOCK test was good
|
||||||
|
nonblock="SO_NONBLOCK"
|
||||||
|
AC_DEFINE(HAVE_SO_NONBLOCK, 1, [use SO_NONBLOCK for non-blocking sockets])
|
||||||
|
],[
|
||||||
|
dnl test 5 didnt compile!
|
||||||
|
nonblock="nada"
|
||||||
|
AC_DEFINE(HAVE_DISABLED_NONBLOCKING, 1, [disabled non-blocking sockets])
|
||||||
|
])
|
||||||
|
dnl end of fifth test
|
||||||
|
|
||||||
|
])
|
||||||
|
dnl end of forth test
|
||||||
|
|
||||||
|
])
|
||||||
|
dnl end of third test
|
||||||
|
|
||||||
|
])
|
||||||
|
dnl end of second test
|
||||||
|
|
||||||
|
])
|
||||||
|
dnl end of non-blocking try-compile test
|
||||||
|
AC_MSG_RESULT($nonblock)
|
||||||
|
|
||||||
|
if test "$nonblock" = "nada"; then
|
||||||
|
AC_MSG_WARN([non-block sockets disabled])
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
|
||||||
dnl We create a function for detecting which compiler we use and then set as
|
dnl We create a function for detecting which compiler we use and then set as
|
||||||
dnl pendantic compiler options as possible for that particular compiler. The
|
dnl pendantic compiler options as possible for that particular compiler. The
|
||||||
@@ -119,6 +242,26 @@ AC_DEFUN([CARES_CHECK_STRUCT], [
|
|||||||
fi
|
fi
|
||||||
])
|
])
|
||||||
|
|
||||||
|
dnl This macro determins if the specified struct contains a specific member.
|
||||||
|
dnl Syntax:
|
||||||
|
dnl CARES_CHECK_STRUCT_MEMBER(headers, struct name, member name, if found, [if not found])
|
||||||
|
|
||||||
|
AC_DEFUN([CARES_CHECK_STRUCT_MEMBER], [
|
||||||
|
AC_MSG_CHECKING([if struct $2 has member $3])
|
||||||
|
AC_TRY_COMPILE([$1],
|
||||||
|
[
|
||||||
|
struct $2 struct_instance;
|
||||||
|
struct_instance.$3 = 0;
|
||||||
|
], ac_struct="yes", ac_found="no")
|
||||||
|
if test "$ac_struct" = "yes" ; then
|
||||||
|
AC_MSG_RESULT(yes)
|
||||||
|
$4
|
||||||
|
else
|
||||||
|
AC_MSG_RESULT(no)
|
||||||
|
$5
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
|
||||||
dnl This macro determines if the specified constant exists in the specified file
|
dnl This macro determines if the specified constant exists in the specified file
|
||||||
dnl Syntax:
|
dnl Syntax:
|
||||||
dnl CARES_CHECK_CONSTANT(headers, constant name, if found, [if not found])
|
dnl CARES_CHECK_CONSTANT(headers, constant name, if found, [if not found])
|
||||||
|
30
ares/ares.h
30
ares/ares.h
@@ -29,12 +29,14 @@
|
|||||||
|
|
||||||
#if defined(WATT32)
|
#if defined(WATT32)
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
#include <tcp.h>
|
#include <tcp.h>
|
||||||
#elif defined(WIN32)
|
#elif defined(WIN32)
|
||||||
#include <winsock.h>
|
#include <winsock.h>
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#else
|
#else
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
@@ -64,6 +66,9 @@ extern "C" {
|
|||||||
#define ARES_EDESTRUCTION 16
|
#define ARES_EDESTRUCTION 16
|
||||||
#define ARES_EBADSTR 17
|
#define ARES_EBADSTR 17
|
||||||
|
|
||||||
|
/* ares_getnameinfo error codes */
|
||||||
|
#define ARES_EBADFLAGS 18
|
||||||
|
|
||||||
/* Flag values */
|
/* Flag values */
|
||||||
#define ARES_FLAG_USEVC (1 << 0)
|
#define ARES_FLAG_USEVC (1 << 0)
|
||||||
#define ARES_FLAG_PRIMARY (1 << 1)
|
#define ARES_FLAG_PRIMARY (1 << 1)
|
||||||
@@ -85,6 +90,24 @@ extern "C" {
|
|||||||
#define ARES_OPT_DOMAINS (1 << 7)
|
#define ARES_OPT_DOMAINS (1 << 7)
|
||||||
#define ARES_OPT_LOOKUPS (1 << 8)
|
#define ARES_OPT_LOOKUPS (1 << 8)
|
||||||
|
|
||||||
|
/* Nameinfo flag values */
|
||||||
|
#define ARES_NI_NOFQDN (1 << 0)
|
||||||
|
#define ARES_NI_NUMERICHOST (1 << 1)
|
||||||
|
#define ARES_NI_NAMEREQD (1 << 2)
|
||||||
|
#define ARES_NI_NUMERICSERV (1 << 3)
|
||||||
|
#define ARES_NI_DGRAM (1 << 4)
|
||||||
|
#define ARES_NI_TCP 0
|
||||||
|
#define ARES_NI_UDP ARES_NI_DGRAM
|
||||||
|
#define ARES_NI_SCTP (1 << 5)
|
||||||
|
#define ARES_NI_DCCP (1 << 6)
|
||||||
|
#define ARES_NI_NUMERICSCOPE (1 << 7)
|
||||||
|
#define ARES_NI_LOOKUPHOST (1 << 8)
|
||||||
|
#define ARES_NI_LOOKUPSERVICE (1 << 9)
|
||||||
|
/* Reserved for future use */
|
||||||
|
#define ARES_NI_IDN (1 << 10)
|
||||||
|
#define ARES_NI_ALLOW_UNASSIGNED (1 << 11)
|
||||||
|
#define ARES_NI_USE_STD3_ASCII_RULES (1 << 12)
|
||||||
|
|
||||||
struct ares_options {
|
struct ares_options {
|
||||||
int flags;
|
int flags;
|
||||||
int timeout;
|
int timeout;
|
||||||
@@ -101,12 +124,15 @@ struct ares_options {
|
|||||||
|
|
||||||
struct hostent;
|
struct hostent;
|
||||||
struct timeval;
|
struct timeval;
|
||||||
|
struct sockaddr;
|
||||||
struct ares_channeldata;
|
struct ares_channeldata;
|
||||||
typedef struct ares_channeldata *ares_channel;
|
typedef struct ares_channeldata *ares_channel;
|
||||||
typedef void (*ares_callback)(void *arg, int status, unsigned char *abuf,
|
typedef void (*ares_callback)(void *arg, int status, unsigned char *abuf,
|
||||||
int alen);
|
int alen);
|
||||||
typedef void (*ares_host_callback)(void *arg, int status,
|
typedef void (*ares_host_callback)(void *arg, int status,
|
||||||
struct hostent *hostent);
|
struct hostent *hostent);
|
||||||
|
typedef void (*ares_nameinfo_callback)(void *arg, int status,
|
||||||
|
char *node, char *service);
|
||||||
|
|
||||||
int ares_init(ares_channel *channelptr);
|
int ares_init(ares_channel *channelptr);
|
||||||
int ares_init_options(ares_channel *channelptr, struct ares_options *options,
|
int ares_init_options(ares_channel *channelptr, struct ares_options *options,
|
||||||
@@ -123,7 +149,9 @@ void ares_gethostbyname(ares_channel channel, const char *name, int family,
|
|||||||
ares_host_callback callback, void *arg);
|
ares_host_callback callback, void *arg);
|
||||||
void ares_gethostbyaddr(ares_channel channel, const void *addr, int addrlen,
|
void ares_gethostbyaddr(ares_channel channel, const void *addr, int addrlen,
|
||||||
int family, ares_host_callback callback, void *arg);
|
int family, ares_host_callback callback, void *arg);
|
||||||
|
void ares_getnameinfo(ares_channel channel, const struct sockaddr *sa,
|
||||||
|
socklen_t salen, int flags, ares_nameinfo_callback callback,
|
||||||
|
void *arg);
|
||||||
int ares_fds(ares_channel channel, fd_set *read_fds, fd_set *write_fds);
|
int ares_fds(ares_channel channel, fd_set *read_fds, fd_set *write_fds);
|
||||||
struct timeval *ares_timeout(ares_channel channel, struct timeval *maxtv,
|
struct timeval *ares_timeout(ares_channel channel, struct timeval *maxtv,
|
||||||
struct timeval *tv);
|
struct timeval *tv);
|
||||||
|
@@ -106,6 +106,8 @@ int ares_expand_name(const unsigned char *encoded, const unsigned char *abuf,
|
|||||||
/* Nuke the trailing period if we wrote one. */
|
/* Nuke the trailing period if we wrote one. */
|
||||||
if (q > *s)
|
if (q > *s)
|
||||||
*(q - 1) = 0;
|
*(q - 1) = 0;
|
||||||
|
else
|
||||||
|
*q = 0; /* zero terminate */
|
||||||
|
|
||||||
return ARES_SUCCESS;
|
return ARES_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@@ -28,8 +28,8 @@ The
|
|||||||
.I ares_free_hostent
|
.I ares_free_hostent
|
||||||
function frees a
|
function frees a
|
||||||
.B struct hostent
|
.B struct hostent
|
||||||
allocated by one of the functions \fIares_parse_a_reply(3)\fP or
|
allocated by one of the functions \fIares_parse_a_reply(3)\fP,
|
||||||
\fIares_parse_ptr_reply(3)\fP.
|
\fIares_parse_aaaa_reply(3)\fP, or \fIares_parse_ptr_reply(3)\fP.
|
||||||
.SH NOTES
|
.SH NOTES
|
||||||
It is not necessary (and is not correct) to free the host structure passed to
|
It is not necessary (and is not correct) to free the host structure passed to
|
||||||
the callback functions for \fIares_gethostbyname(3)\fP or
|
the callback functions for \fIares_gethostbyname(3)\fP or
|
||||||
@@ -37,6 +37,7 @@ the callback functions for \fIares_gethostbyname(3)\fP or
|
|||||||
host structures when the callback returns.
|
host structures when the callback returns.
|
||||||
.SH SEE ALSO
|
.SH SEE ALSO
|
||||||
.BR ares_parse_a_reply (3),
|
.BR ares_parse_a_reply (3),
|
||||||
|
.BR ares_parse_aaaa_reply (3),
|
||||||
.BR ares_parse_ptr_reply (3)
|
.BR ares_parse_ptr_reply (3)
|
||||||
.SH AUTHOR
|
.SH AUTHOR
|
||||||
Greg Hudson, MIT Information Systems
|
Greg Hudson, MIT Information Systems
|
||||||
|
@@ -107,7 +107,7 @@ static void next_lookup(struct addr_query *aquery)
|
|||||||
switch (*p)
|
switch (*p)
|
||||||
{
|
{
|
||||||
case 'b':
|
case 'b':
|
||||||
if (aquery->family == AF_INET)
|
if (aquery->family == AF_INET)
|
||||||
{
|
{
|
||||||
addr = ntohl(aquery->addr.addr4.s_addr);
|
addr = ntohl(aquery->addr.addr4.s_addr);
|
||||||
a1 = (int)((addr >> 24) & 0xff);
|
a1 = (int)((addr >> 24) & 0xff);
|
||||||
|
@@ -124,10 +124,10 @@ static void next_lookup(struct host_query *hquery)
|
|||||||
case 'b':
|
case 'b':
|
||||||
/* DNS lookup */
|
/* DNS lookup */
|
||||||
hquery->remaining_lookups = p + 1;
|
hquery->remaining_lookups = p + 1;
|
||||||
if (hquery->family == AF_INET6)
|
if (hquery->family == AF_INET6)
|
||||||
ares_search(hquery->channel, hquery->name, C_IN, T_AAAA, host_callback,
|
ares_search(hquery->channel, hquery->name, C_IN, T_AAAA, host_callback,
|
||||||
hquery);
|
hquery);
|
||||||
else
|
else
|
||||||
ares_search(hquery->channel, hquery->name, C_IN, T_A, host_callback,
|
ares_search(hquery->channel, hquery->name, C_IN, T_A, host_callback,
|
||||||
hquery);
|
hquery);
|
||||||
return;
|
return;
|
||||||
|
145
ares/ares_getnameinfo.3
Normal file
145
ares/ares_getnameinfo.3
Normal file
@@ -0,0 +1,145 @@
|
|||||||
|
.\" $Id$
|
||||||
|
.\"
|
||||||
|
.\" Copyright 2005 by Dominick Meglio.
|
||||||
|
.\"
|
||||||
|
.\" Permission to use, copy, modify, and distribute this
|
||||||
|
.\" software and its documentation for any purpose and without
|
||||||
|
.\" fee is hereby granted, provided that the above copyright
|
||||||
|
.\" notice appear in all copies and that both that copyright
|
||||||
|
.\" notice and this permission notice appear in supporting
|
||||||
|
.\" documentation, and that the name of M.I.T. not be used in
|
||||||
|
.\" advertising or publicity pertaining to distribution of the
|
||||||
|
.\" software without specific, written prior permission.
|
||||||
|
.\" M.I.T. makes no representations about the suitability of
|
||||||
|
.\" this software for any purpose. It is provided "as is"
|
||||||
|
.\" without express or implied warranty.
|
||||||
|
.\"
|
||||||
|
.TH ARES_GETNAMEINFO 3 "16 May 2005"
|
||||||
|
.SH NAME
|
||||||
|
ares_getnameinfo \- Address-to-nodename translation in protocol-independent manner
|
||||||
|
.SH SYNOPSIS
|
||||||
|
.nf
|
||||||
|
.B #include <ares.h>
|
||||||
|
.PP
|
||||||
|
.B typedef void (*ares_nameinfo_callback)(void *\fIarg\fP, int \fIstatus\fP,
|
||||||
|
.B char *\fInode\fP, char *\fIservice\fP)
|
||||||
|
.PP
|
||||||
|
.B void ares_getnameinfo(ares_channel \fIchannel\fP, const struct sockaddr *\fIsa\fP,
|
||||||
|
.B socklen_t \fIsalen\fP, int \fIflags\fP, ares_nameinfo_callback \fIcallback\fP,
|
||||||
|
.B void *\fIarg\fP)
|
||||||
|
.fi
|
||||||
|
.SH DESCRIPTION
|
||||||
|
The
|
||||||
|
.B ares_getnameinfo
|
||||||
|
function is defined for protocol-independent address translation. The function
|
||||||
|
is a combination of \fIares_gethostbyaddr(3)\fP and \fIgetservbyport(3)\fP. The function will
|
||||||
|
translate the address either by executing a host query on the name service channel
|
||||||
|
identified by
|
||||||
|
.IR channel
|
||||||
|
or it will attempt to resolve it locally if possible.
|
||||||
|
The parameters
|
||||||
|
.I sa
|
||||||
|
and
|
||||||
|
.I len
|
||||||
|
give the address as a sockaddr structure, and
|
||||||
|
.I flags
|
||||||
|
gives the options that the function will use. Valid flags are listed below:
|
||||||
|
.TP 19
|
||||||
|
.B ARES_NI_NOFQDN
|
||||||
|
Only the nodename portion of the FQDN is returned for local hosts.
|
||||||
|
.TP 19
|
||||||
|
.B ARES_NI_NUMERICHOST
|
||||||
|
The numeric form of the hostname is returned rather than the name.
|
||||||
|
.TP 19
|
||||||
|
.B ARES_NI_NAMEREQD
|
||||||
|
An error is returned if the hostname cannot be found in the DNS.
|
||||||
|
.TP 19
|
||||||
|
.B ARES_NI_NUMERICSERV
|
||||||
|
The numeric form of the service is returned rather than the name.
|
||||||
|
.TP 19
|
||||||
|
.B ARES_NI_TCP
|
||||||
|
The service name is to be looked up for the TCP protocol.
|
||||||
|
.TP 19
|
||||||
|
.B ARES_NI_UDP
|
||||||
|
The service name is to be looked up for the UDP protocol.
|
||||||
|
.TP 19
|
||||||
|
.B ARES_NI_SCTP
|
||||||
|
The service name is to be looked up for the SCTP protocol.
|
||||||
|
.TP 19
|
||||||
|
.B ARES_NI_DCCP
|
||||||
|
The service name is to be looked up for the DCCP protocol.
|
||||||
|
.TP 19
|
||||||
|
.B ARES_NI_NUMERICSCOPE
|
||||||
|
The numeric form of the scope ID is returned rather than the name.
|
||||||
|
.TP 19
|
||||||
|
.B ARES_NI_LOOKUPHOST
|
||||||
|
A hostname lookup is being requested.
|
||||||
|
.TP 19
|
||||||
|
.B ARES_NI_LOOKUPSERVICE
|
||||||
|
A service name lookup is being requested.
|
||||||
|
.PP
|
||||||
|
When the query
|
||||||
|
is complete or has
|
||||||
|
failed, the ares library will invoke \fIcallback\fP. Completion or failure of
|
||||||
|
the query may happen immediately, or may happen during a later call to
|
||||||
|
\fIares_process(3)\fP, \fIares_destroy(3)\fP or \fIares_cancel(3)\fP.
|
||||||
|
.PP
|
||||||
|
The callback argument
|
||||||
|
.I arg
|
||||||
|
is copied from the
|
||||||
|
.B ares_getnameinfo
|
||||||
|
argument
|
||||||
|
.IR arg .
|
||||||
|
The callback argument
|
||||||
|
.I status
|
||||||
|
indicates whether the query succeeded and, if not, how it failed. It
|
||||||
|
may have any of the following values:
|
||||||
|
.TP 19
|
||||||
|
.B ARES_SUCCESS
|
||||||
|
The host lookup completed successfully.
|
||||||
|
.TP 19
|
||||||
|
.B ARES_ENOTIMP
|
||||||
|
The ares library does not know how to look up addresses of type
|
||||||
|
.IR family .
|
||||||
|
.TP 19
|
||||||
|
.B ARES_ENOTFOUND
|
||||||
|
The address
|
||||||
|
.I addr
|
||||||
|
was not found.
|
||||||
|
.TP 19
|
||||||
|
.B ARES_ENOMEM
|
||||||
|
Memory was exhausted.
|
||||||
|
.TP 19
|
||||||
|
.B ARES_EDESTRUCTION
|
||||||
|
The name service channel
|
||||||
|
.I channel
|
||||||
|
is being destroyed; the query will not be completed.
|
||||||
|
.TP 19
|
||||||
|
.B ARES_EBADFLAGS
|
||||||
|
The
|
||||||
|
.I flags
|
||||||
|
parameter contains an illegal value.
|
||||||
|
.PP
|
||||||
|
On successful completion of the query, the callback argument
|
||||||
|
.I node
|
||||||
|
contains a string representing the hostname (assuming
|
||||||
|
.B ARES_NI_LOOKUPHOST
|
||||||
|
was specified). Additionally,
|
||||||
|
.I service
|
||||||
|
contains a string representing the service name (assuming
|
||||||
|
.B ARES_NI_LOOKUPSERVICE
|
||||||
|
was specified).
|
||||||
|
If the query did not complete successfully, or one of the values
|
||||||
|
was not requested,
|
||||||
|
.I node
|
||||||
|
or
|
||||||
|
.I service
|
||||||
|
will be
|
||||||
|
.BR NULL .
|
||||||
|
.SH SEE ALSO
|
||||||
|
.BR ares_process (3),
|
||||||
|
.BR ares_getaddrinfo (3)
|
||||||
|
.SH AUTHOR
|
||||||
|
Dominick Meglio
|
||||||
|
.br
|
||||||
|
Copyright 2005 by Dominick Meglio.
|
331
ares/ares_getnameinfo.c
Normal file
331
ares/ares_getnameinfo.c
Normal file
@@ -0,0 +1,331 @@
|
|||||||
|
/* Copyright 2005 by Dominick Meglio
|
||||||
|
*
|
||||||
|
* Permission to use, copy, modify, and distribute this
|
||||||
|
* software and its documentation for any purpose and without
|
||||||
|
* fee is hereby granted, provided that the above copyright
|
||||||
|
* notice appear in all copies and that both that copyright
|
||||||
|
* notice and this permission notice appear in supporting
|
||||||
|
* documentation, and that the name of M.I.T. not be used in
|
||||||
|
* advertising or publicity pertaining to distribution of the
|
||||||
|
* software without specific, written prior permission.
|
||||||
|
* M.I.T. makes no representations about the suitability of
|
||||||
|
* this software for any purpose. It is provided "as is"
|
||||||
|
* without express or implied warranty.
|
||||||
|
*/
|
||||||
|
#include "setup.h"
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
|
||||||
|
#if defined(WIN32) && !defined(WATT32)
|
||||||
|
#include "nameser.h"
|
||||||
|
#else
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#include <netdb.h>
|
||||||
|
#include <arpa/inet.h>
|
||||||
|
#include <arpa/nameser.h>
|
||||||
|
#ifdef HAVE_ARPA_NAMESER_COMPAT_H
|
||||||
|
#include <arpa/nameser_compat.h>
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_NET_IF_H
|
||||||
|
#include <net/if.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_UNISTD_H
|
||||||
|
#include <unistd.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "ares.h"
|
||||||
|
#include "ares_private.h"
|
||||||
|
#include "ares_ipv6.h"
|
||||||
|
#include "inet_ntop.h"
|
||||||
|
|
||||||
|
#ifdef WATT32
|
||||||
|
#undef WIN32
|
||||||
|
#endif
|
||||||
|
|
||||||
|
struct nameinfo_query {
|
||||||
|
ares_nameinfo_callback callback;
|
||||||
|
void *arg;
|
||||||
|
union {
|
||||||
|
struct sockaddr_in addr4;
|
||||||
|
struct sockaddr_in6 addr6;
|
||||||
|
} addr;
|
||||||
|
int family;
|
||||||
|
int flags;
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID
|
||||||
|
#define IPBUFSIZ 40+IF_NAMESIZE
|
||||||
|
#else
|
||||||
|
#define IPBUFSIZ 40
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static void nameinfo_callback(void *arg, int status, struct hostent *host);
|
||||||
|
static char *lookup_service(unsigned short port, int flags, char *buf);
|
||||||
|
#ifdef HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID
|
||||||
|
static char *append_scopeid(struct sockaddr_in6 *addr6, unsigned int scopeid, char *buf);
|
||||||
|
#endif
|
||||||
|
static char *ares_striendstr(const char *s1, const char *s2);
|
||||||
|
|
||||||
|
void ares_getnameinfo(ares_channel channel, const struct sockaddr *sa, socklen_t salen,
|
||||||
|
int flags, ares_nameinfo_callback callback, void *arg)
|
||||||
|
{
|
||||||
|
struct sockaddr_in *addr;
|
||||||
|
struct sockaddr_in6 *addr6;
|
||||||
|
struct nameinfo_query *niquery;
|
||||||
|
|
||||||
|
/* Verify the buffer size */
|
||||||
|
if (salen == sizeof(struct sockaddr_in))
|
||||||
|
addr = (struct sockaddr_in *)sa;
|
||||||
|
else if (salen == sizeof(struct sockaddr_in6))
|
||||||
|
addr6 = (struct sockaddr_in6 *)sa;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
callback(arg, ARES_ENOTIMP, NULL, NULL);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If neither, assume they want a host */
|
||||||
|
if (!(flags & ARES_NI_LOOKUPSERVICE) && !(flags & ARES_NI_LOOKUPHOST))
|
||||||
|
flags |= ARES_NI_LOOKUPHOST;
|
||||||
|
|
||||||
|
/* All they want is a service, no need for DNS */
|
||||||
|
if ((flags & ARES_NI_LOOKUPSERVICE) && !(flags & ARES_NI_LOOKUPHOST))
|
||||||
|
{
|
||||||
|
char buf[33], *service;
|
||||||
|
unsigned int port = 0;
|
||||||
|
|
||||||
|
if (salen == sizeof(struct sockaddr_in))
|
||||||
|
port = addr->sin_port;
|
||||||
|
else
|
||||||
|
port = addr6->sin6_port;
|
||||||
|
service = lookup_service(port, flags, buf);
|
||||||
|
callback(arg, ARES_SUCCESS, NULL, service);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* They want a host lookup */
|
||||||
|
if ((flags & ARES_NI_LOOKUPHOST))
|
||||||
|
{
|
||||||
|
/* A numeric host can be handled without DNS */
|
||||||
|
if ((flags & ARES_NI_NUMERICHOST))
|
||||||
|
{
|
||||||
|
unsigned int port = 0;
|
||||||
|
char ipbuf[IPBUFSIZ];
|
||||||
|
char srvbuf[32];
|
||||||
|
char *service = NULL;
|
||||||
|
ipbuf[0] = 0;
|
||||||
|
|
||||||
|
/* Specifying not to lookup a host, but then saying a host
|
||||||
|
* is required has to be illegal.
|
||||||
|
*/
|
||||||
|
if (flags & ARES_NI_NAMEREQD)
|
||||||
|
{
|
||||||
|
callback(arg, ARES_EBADFLAGS, NULL, NULL);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (salen == sizeof(struct sockaddr_in6))
|
||||||
|
{
|
||||||
|
ares_inet_ntop(AF_INET6, &addr6->sin6_addr, ipbuf, IPBUFSIZ);
|
||||||
|
port = addr6->sin6_port;
|
||||||
|
/* If the system supports scope IDs, use it */
|
||||||
|
#ifdef HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID
|
||||||
|
append_scopeid(addr6, flags, ipbuf);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ares_inet_ntop(AF_INET, &addr->sin_addr, ipbuf, IPBUFSIZ);
|
||||||
|
port = addr->sin_port;
|
||||||
|
}
|
||||||
|
/* They also want a service */
|
||||||
|
if (flags & ARES_NI_LOOKUPSERVICE)
|
||||||
|
service = lookup_service(port, flags, srvbuf);
|
||||||
|
callback(arg, ARES_SUCCESS, ipbuf, service);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/* This is where a DNS lookup becomes necessary */
|
||||||
|
else
|
||||||
|
{
|
||||||
|
niquery = malloc(sizeof(struct nameinfo_query));
|
||||||
|
if (!niquery)
|
||||||
|
{
|
||||||
|
callback(arg, ARES_ENOMEM, NULL, NULL);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
niquery->callback = callback;
|
||||||
|
niquery->arg = arg;
|
||||||
|
niquery->flags = flags;
|
||||||
|
if (sa->sa_family == AF_INET)
|
||||||
|
{
|
||||||
|
niquery->family = AF_INET;
|
||||||
|
memcpy(&niquery->addr.addr4, addr, sizeof(addr));
|
||||||
|
ares_gethostbyaddr(channel, &addr->sin_addr, sizeof(struct in_addr), AF_INET,
|
||||||
|
nameinfo_callback, niquery);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
niquery->family = AF_INET6;
|
||||||
|
memcpy(&niquery->addr.addr6, addr6, sizeof(addr6));
|
||||||
|
ares_gethostbyaddr(channel, &addr6->sin6_addr, sizeof(struct in6_addr), AF_INET6,
|
||||||
|
nameinfo_callback, niquery);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void nameinfo_callback(void *arg, int status, struct hostent *host)
|
||||||
|
{
|
||||||
|
struct nameinfo_query *niquery = (struct nameinfo_query *) arg;
|
||||||
|
char srvbuf[33];
|
||||||
|
char *service = NULL;
|
||||||
|
|
||||||
|
|
||||||
|
if (status == ARES_SUCCESS)
|
||||||
|
{
|
||||||
|
/* They want a service too */
|
||||||
|
if (niquery->flags & ARES_NI_LOOKUPSERVICE)
|
||||||
|
{
|
||||||
|
if (niquery->family == AF_INET)
|
||||||
|
service = lookup_service(niquery->addr.addr4.sin_port, niquery->flags, srvbuf);
|
||||||
|
else
|
||||||
|
service = lookup_service(niquery->addr.addr6.sin6_port, niquery->flags, srvbuf);
|
||||||
|
}
|
||||||
|
/* NOFQDN means we have to strip off the domain name portion.
|
||||||
|
We do this by determining our own domain name, then searching the string
|
||||||
|
for this domain name and removing it.
|
||||||
|
*/
|
||||||
|
if (niquery->flags & ARES_NI_NOFQDN)
|
||||||
|
{
|
||||||
|
char buf[255];
|
||||||
|
char *domain;
|
||||||
|
gethostname(buf, 255);
|
||||||
|
if ((domain = strchr(buf, '.')))
|
||||||
|
{
|
||||||
|
char *end = ares_striendstr(host->h_name, domain);
|
||||||
|
if (end)
|
||||||
|
*end = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
niquery->callback(niquery->arg, ARES_SUCCESS, host->h_name, service);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/* We couldn't find the host, but it's OK, we can use the IP */
|
||||||
|
else if (status == ARES_ENOTFOUND && !(niquery->flags & ARES_NI_NAMEREQD))
|
||||||
|
{
|
||||||
|
char ipbuf[IPBUFSIZ];
|
||||||
|
if (niquery->family == AF_INET)
|
||||||
|
ares_inet_ntop(AF_INET, &niquery->addr.addr4.sin_addr, ipbuf, IPBUFSIZ);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ares_inet_ntop(AF_INET6, &niquery->addr.addr6.sin6_addr, ipbuf, IPBUFSIZ);
|
||||||
|
#ifdef HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID
|
||||||
|
append_scopeid(&niquery->addr.addr6, niquery->flags, ipbuf);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
/* They want a service too */
|
||||||
|
if (niquery->flags & ARES_NI_LOOKUPSERVICE)
|
||||||
|
{
|
||||||
|
if (niquery->family == AF_INET)
|
||||||
|
service = lookup_service(niquery->addr.addr4.sin_port, niquery->flags, srvbuf);
|
||||||
|
else
|
||||||
|
service = lookup_service(niquery->addr.addr6.sin6_port, niquery->flags, srvbuf);
|
||||||
|
}
|
||||||
|
niquery->callback(niquery->arg, ARES_SUCCESS, ipbuf, service);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
niquery->callback(niquery->arg, status, NULL, NULL);
|
||||||
|
free(niquery);
|
||||||
|
}
|
||||||
|
|
||||||
|
static char *lookup_service(unsigned short port, int flags, char *buf)
|
||||||
|
{
|
||||||
|
if (port)
|
||||||
|
{
|
||||||
|
/* Just return the port as a string */
|
||||||
|
if (flags & ARES_NI_NUMERICSERV)
|
||||||
|
sprintf(buf, "%u", ntohs(port));
|
||||||
|
else
|
||||||
|
{
|
||||||
|
struct servent *se;
|
||||||
|
const char *proto;
|
||||||
|
|
||||||
|
if (flags & ARES_NI_UDP)
|
||||||
|
proto = "udp";
|
||||||
|
else if (flags & ARES_NI_SCTP)
|
||||||
|
proto = "sctp";
|
||||||
|
else if (flags & ARES_NI_DCCP)
|
||||||
|
proto = "dccp";
|
||||||
|
else
|
||||||
|
proto = "tcp";
|
||||||
|
se = getservbyport(port, proto);
|
||||||
|
if (se && se->s_name)
|
||||||
|
strcpy(buf, se->s_name);
|
||||||
|
else
|
||||||
|
sprintf(buf, "%u", ntohs(port));
|
||||||
|
}
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID
|
||||||
|
static char *append_scopeid(struct sockaddr_in6 *addr6, unsigned int flags, char *buf)
|
||||||
|
{
|
||||||
|
char tmpbuf[IF_NAMESIZE + 1];
|
||||||
|
|
||||||
|
tmpbuf[0] = '%';
|
||||||
|
#ifdef HAVE_IF_INDEXTONAME
|
||||||
|
if ((flags & ARES_NI_NUMERICSCOPE) || (!IN6_IS_ADDR_LINKLOCAL(&addr6->sin6_addr)
|
||||||
|
&& !IN6_IS_ADDR_MC_LINKLOCAL(&addr6->sin6_addr)))
|
||||||
|
{
|
||||||
|
sprintf(&tmpbuf[1], "%u", addr6->sin6_scope_id);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (if_indextoname(addr6->sin6_scope_id, &tmpbuf[1]) == NULL)
|
||||||
|
sprintf(&tmpbuf[1], "%u", addr6->sin6_scope_id);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
sprintf(&tmpbuf[1], "%u", addr6->sin6_scope_id);
|
||||||
|
#endif
|
||||||
|
strcat(buf, tmpbuf);
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Determines if s1 ends with the string in s2 (case-insensitive) */
|
||||||
|
static char *ares_striendstr(const char *s1, const char *s2)
|
||||||
|
{
|
||||||
|
const char *c1, *c2, *c1_begin;
|
||||||
|
size_t s1_len = strlen(s1), s2_len = strlen(s2);
|
||||||
|
|
||||||
|
/* If the substr is longer than the full str, it can't match */
|
||||||
|
if (s2_len > s1_len)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
/* Jump to the end of s1 minus the length of s2 */
|
||||||
|
c1_begin = s1+s1_len-s2_len;
|
||||||
|
c1 = (const char *)c1_begin;
|
||||||
|
c2 = s2;
|
||||||
|
while (c2 < s2+s2_len)
|
||||||
|
{
|
||||||
|
if (tolower(*c1) != tolower(*c2))
|
||||||
|
return NULL;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
c1++;
|
||||||
|
c2++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (c2 == c1 && c2 == NULL)
|
||||||
|
return (char *)c1_begin;
|
||||||
|
return NULL;
|
||||||
|
}
|
@@ -327,6 +327,7 @@ static int get_iphlpapi_dns_info (char *ret_buf, size_t ret_size)
|
|||||||
size_t ip_size = sizeof("255.255.255.255,")-1;
|
size_t ip_size = sizeof("255.255.255.255,")-1;
|
||||||
size_t left = ret_size;
|
size_t left = ret_size;
|
||||||
char *ret = ret_buf;
|
char *ret = ret_buf;
|
||||||
|
HRESULT res;
|
||||||
|
|
||||||
if (!fi)
|
if (!fi)
|
||||||
return (0);
|
return (0);
|
||||||
@@ -339,7 +340,8 @@ static int get_iphlpapi_dns_info (char *ret_buf, size_t ret_size)
|
|||||||
if (!GetNetworkParams)
|
if (!GetNetworkParams)
|
||||||
goto quit;
|
goto quit;
|
||||||
|
|
||||||
if ((*GetNetworkParams) (fi, &size) != ERROR_BUFFER_OVERFLOW)
|
res = (*GetNetworkParams) (fi, &size);
|
||||||
|
if ((res != ERROR_BUFFER_OVERFLOW) && (res != ERROR_SUCCESS))
|
||||||
goto quit;
|
goto quit;
|
||||||
|
|
||||||
fi = alloca (size);
|
fi = alloca (size);
|
||||||
@@ -858,7 +860,8 @@ static int config_sortlist(struct apattern **sortlist, int *nsort,
|
|||||||
ipbufpfx[0] = 0;
|
ipbufpfx[0] = 0;
|
||||||
/* Lets see if it is CIDR */
|
/* Lets see if it is CIDR */
|
||||||
/* First we'll try IPv6 */
|
/* First we'll try IPv6 */
|
||||||
if ((bits = ares_inet_net_pton(AF_INET6, ipbufpfx ? ipbufpfx : ipbuf, &pat.addr.addr6,
|
if ((bits = ares_inet_net_pton(AF_INET6, ipbufpfx ? ipbufpfx : ipbuf,
|
||||||
|
&pat.addr.addr6,
|
||||||
sizeof(pat.addr.addr6))) > 0)
|
sizeof(pat.addr.addr6))) > 0)
|
||||||
{
|
{
|
||||||
pat.type = PATTERN_CIDR;
|
pat.type = PATTERN_CIDR;
|
||||||
@@ -890,7 +893,7 @@ static int config_sortlist(struct apattern **sortlist, int *nsort,
|
|||||||
else
|
else
|
||||||
natural_mask(&pat);
|
natural_mask(&pat);
|
||||||
pat.family = AF_INET;
|
pat.family = AF_INET;
|
||||||
pat.type = PATTERN_MASK;
|
pat.type = PATTERN_MASK;
|
||||||
if (!sortlist_alloc(sortlist, nsort, &pat))
|
if (!sortlist_alloc(sortlist, nsort, &pat))
|
||||||
return ARES_ENOMEM;
|
return ARES_ENOMEM;
|
||||||
}
|
}
|
||||||
@@ -1011,7 +1014,8 @@ static const char *try_option(const char *p, const char *q, const char *opt)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifndef WIN32
|
#ifndef WIN32
|
||||||
static int sortlist_alloc(struct apattern **sortlist, int *nsort, struct apattern *pat)
|
static int sortlist_alloc(struct apattern **sortlist, int *nsort,
|
||||||
|
struct apattern *pat)
|
||||||
{
|
{
|
||||||
struct apattern *newsort;
|
struct apattern *newsort;
|
||||||
newsort = realloc(*sortlist, (*nsort + 1) * sizeof(struct apattern));
|
newsort = realloc(*sortlist, (*nsort + 1) * sizeof(struct apattern));
|
||||||
|
@@ -28,6 +28,31 @@ struct in6_addr
|
|||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef HAVE_STRUCT_SOCKADDR_IN6
|
||||||
|
struct sockaddr_in6
|
||||||
|
{
|
||||||
|
unsigned short sin6_family;
|
||||||
|
unsigned short sin6_port;
|
||||||
|
unsigned long sin6_flowinfo;
|
||||||
|
struct in6_addr sin6_addr;
|
||||||
|
unsigned int sin6_scope_id;
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef HAVE_STRUCT_ADDRINFO
|
||||||
|
struct addrinfo
|
||||||
|
{
|
||||||
|
int ai_flags;
|
||||||
|
int ai_family;
|
||||||
|
int ai_socktype;
|
||||||
|
int ai_protocol;
|
||||||
|
size_t ai_addrlen;
|
||||||
|
char *ai_cannonname;
|
||||||
|
struct sockaddr *ai_addr;
|
||||||
|
struct addrinfo *ai_next;
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef NS_IN6ADDRSZ
|
#ifndef NS_IN6ADDRSZ
|
||||||
#if SIZEOF_STRUCT_IN6_ADDR == 0
|
#if SIZEOF_STRUCT_IN6_ADDR == 0
|
||||||
/* We cannot have it set to zero, so we pick a fixed value here */
|
/* We cannot have it set to zero, so we pick a fixed value here */
|
||||||
@@ -45,4 +70,12 @@ struct in6_addr
|
|||||||
#define NS_INT16SZ 2
|
#define NS_INT16SZ 2
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef IF_NAMESIZE
|
||||||
|
#ifdef IFNAMSIZ
|
||||||
|
#define IF_NAMESIZE IFNAMSIZ
|
||||||
|
#else
|
||||||
|
#define IF_NAMESIZE 256
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* ARES_IPV6_H */
|
#endif /* ARES_IPV6_H */
|
||||||
|
@@ -33,6 +33,10 @@
|
|||||||
#define writev(s,v,c) writev_s(s,v,c)
|
#define writev(s,v,c) writev_s(s,v,c)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef NETWARE
|
||||||
|
#include <time.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#define DEFAULT_TIMEOUT 5
|
#define DEFAULT_TIMEOUT 5
|
||||||
#define DEFAULT_TRIES 4
|
#define DEFAULT_TRIES 4
|
||||||
#ifndef INADDR_NONE
|
#ifndef INADDR_NONE
|
||||||
|
@@ -33,6 +33,12 @@
|
|||||||
#ifdef HAVE_UNISTD_H
|
#ifdef HAVE_UNISTD_H
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef HAVE_SYS_IOCTL_H
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
#endif
|
||||||
|
#ifdef NETWARE
|
||||||
|
#include <sys/filio.h>
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@@ -45,6 +51,11 @@
|
|||||||
#include "ares_dns.h"
|
#include "ares_dns.h"
|
||||||
#include "ares_private.h"
|
#include "ares_private.h"
|
||||||
|
|
||||||
|
#ifndef TRUE
|
||||||
|
/* at least Solaris 7 does not have TRUE at this point */
|
||||||
|
#define TRUE 1
|
||||||
|
#endif
|
||||||
|
|
||||||
#if (defined(WIN32) || defined(WATT32)) && !defined(MSDOS)
|
#if (defined(WIN32) || defined(WATT32)) && !defined(MSDOS)
|
||||||
#define GET_ERRNO() WSAGetLastError()
|
#define GET_ERRNO() WSAGetLastError()
|
||||||
#else
|
#else
|
||||||
@@ -466,13 +477,76 @@ void ares__send_query(ares_channel channel, struct query *query, time_t now)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* nonblock() set the given socket to either blocking or non-blocking mode
|
||||||
|
* based on the 'nonblock' boolean argument. This function is highly portable.
|
||||||
|
*/
|
||||||
|
static int nonblock(ares_socket_t sockfd, /* operate on this */
|
||||||
|
int nonblock /* TRUE or FALSE */)
|
||||||
|
{
|
||||||
|
#undef SETBLOCK
|
||||||
|
#define SETBLOCK 0
|
||||||
|
#ifdef HAVE_O_NONBLOCK
|
||||||
|
/* most recent unix versions */
|
||||||
|
int flags;
|
||||||
|
|
||||||
|
flags = fcntl(sockfd, F_GETFL, 0);
|
||||||
|
if (TRUE == nonblock)
|
||||||
|
return fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);
|
||||||
|
else
|
||||||
|
return fcntl(sockfd, F_SETFL, flags & (~O_NONBLOCK));
|
||||||
|
#undef SETBLOCK
|
||||||
|
#define SETBLOCK 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(HAVE_FIONBIO) && (SETBLOCK == 0)
|
||||||
|
/* older unix versions */
|
||||||
|
int flags;
|
||||||
|
|
||||||
|
flags = nonblock;
|
||||||
|
return ioctl(sockfd, FIONBIO, &flags);
|
||||||
|
#undef SETBLOCK
|
||||||
|
#define SETBLOCK 2
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(HAVE_IOCTLSOCKET) && (SETBLOCK == 0)
|
||||||
|
/* Windows? */
|
||||||
|
unsigned long flags;
|
||||||
|
flags = nonblock;
|
||||||
|
|
||||||
|
return ioctlsocket(sockfd, FIONBIO, &flags);
|
||||||
|
#undef SETBLOCK
|
||||||
|
#define SETBLOCK 3
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(HAVE_IOCTLSOCKET_CASE) && (SETBLOCK == 0)
|
||||||
|
/* presumably for Amiga */
|
||||||
|
return IoctlSocket(sockfd, FIONBIO, (long)nonblock);
|
||||||
|
#undef SETBLOCK
|
||||||
|
#define SETBLOCK 4
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(HAVE_SO_NONBLOCK) && (SETBLOCK == 0)
|
||||||
|
/* BeOS */
|
||||||
|
long b = nonblock ? 1 : 0;
|
||||||
|
return setsockopt(sockfd, SOL_SOCKET, SO_NONBLOCK, &b, sizeof(b));
|
||||||
|
#undef SETBLOCK
|
||||||
|
#define SETBLOCK 5
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_DISABLED_NONBLOCKING
|
||||||
|
return 0; /* returns success */
|
||||||
|
#undef SETBLOCK
|
||||||
|
#define SETBLOCK 6
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (SETBLOCK == 0)
|
||||||
|
#error "no non-blocking method was found/used/set"
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
static int open_tcp_socket(ares_channel channel, struct server_state *server)
|
static int open_tcp_socket(ares_channel channel, struct server_state *server)
|
||||||
{
|
{
|
||||||
#if defined(WIN32)
|
|
||||||
u_long flags;
|
|
||||||
#else
|
|
||||||
int flags;
|
|
||||||
#endif
|
|
||||||
ares_socket_t s;
|
ares_socket_t s;
|
||||||
struct sockaddr_in sockin;
|
struct sockaddr_in sockin;
|
||||||
|
|
||||||
@@ -482,25 +556,7 @@ static int open_tcp_socket(ares_channel channel, struct server_state *server)
|
|||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
/* Set the socket non-blocking. */
|
/* Set the socket non-blocking. */
|
||||||
|
nonblock(s, TRUE);
|
||||||
#if defined(WIN32) || defined(WATT32)
|
|
||||||
flags = 1;
|
|
||||||
ioctlsocket(s, FIONBIO, &flags);
|
|
||||||
#else
|
|
||||||
flags = fcntl(s, F_GETFL, 0);
|
|
||||||
|
|
||||||
if (flags == -1)
|
|
||||||
{
|
|
||||||
closesocket(s);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
flags |= O_NONBLOCK;
|
|
||||||
if (fcntl(s, F_SETFL, flags) == -1)
|
|
||||||
{
|
|
||||||
closesocket(s);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Connect to the server. */
|
/* Connect to the server. */
|
||||||
memset(&sockin, 0, sizeof(sockin));
|
memset(&sockin, 0, sizeof(sockin));
|
||||||
@@ -531,6 +587,9 @@ static int open_udp_socket(ares_channel channel, struct server_state *server)
|
|||||||
if (s == ARES_SOCKET_BAD)
|
if (s == ARES_SOCKET_BAD)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
/* Set the socket non-blocking. */
|
||||||
|
nonblock(s, TRUE);
|
||||||
|
|
||||||
/* Connect to the server. */
|
/* Connect to the server. */
|
||||||
memset(&sockin, 0, sizeof(sockin));
|
memset(&sockin, 0, sizeof(sockin));
|
||||||
sockin.sin_family = AF_INET;
|
sockin.sin_family = AF_INET;
|
||||||
|
@@ -38,7 +38,8 @@ const char *ares_strerror(int code)
|
|||||||
"Error reading file",
|
"Error reading file",
|
||||||
"Out of memory",
|
"Out of memory",
|
||||||
"Channel is being destroyed",
|
"Channel is being destroyed",
|
||||||
"Misformatted string"
|
"Misformatted string",
|
||||||
|
"Illegal flags specified"
|
||||||
};
|
};
|
||||||
|
|
||||||
assert(code >= 0 && code < (int)(sizeof(errtext) / sizeof(*errtext)));
|
assert(code >= 0 && code < (int)(sizeof(errtext) / sizeof(*errtext)));
|
||||||
|
@@ -65,8 +65,10 @@ AC_CHECK_HEADERS(
|
|||||||
sys/time.h \
|
sys/time.h \
|
||||||
sys/select.h \
|
sys/select.h \
|
||||||
sys/socket.h \
|
sys/socket.h \
|
||||||
|
sys/ioctl.h \
|
||||||
winsock.h \
|
winsock.h \
|
||||||
netinet/in.h \
|
netinet/in.h \
|
||||||
|
net/if.h \
|
||||||
arpa/nameser.h \
|
arpa/nameser.h \
|
||||||
arpa/nameser_compat.h \
|
arpa/nameser_compat.h \
|
||||||
arpa/inet.h, , ,
|
arpa/inet.h, , ,
|
||||||
@@ -80,9 +82,31 @@ dnl (and others?) is not designed to allow this.
|
|||||||
#ifdef HAVE_ARPA_NAMESER_H
|
#ifdef HAVE_ARPA_NAMESER_H
|
||||||
#include <arpa/nameser.h>
|
#include <arpa/nameser.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
dnl *Sigh* these are needed in order for net/if.h to get properly detected.
|
||||||
|
#ifdef HAVE_SYS_SOCKET_H
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_WINSOCK_H
|
||||||
|
#include <winsock.h>
|
||||||
|
#endif
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
AC_CHECK_TYPE(socklen_t, ,
|
||||||
|
AC_DEFINE(socklen_t, int, [the length of a socket address]),
|
||||||
|
[
|
||||||
|
#ifdef HAVE_SYS_TYPES_H
|
||||||
|
#include <sys/types.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_SYS_SOCKET_H
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_WINSOCK_H
|
||||||
|
#include <winsock.h>
|
||||||
|
#endif
|
||||||
|
])
|
||||||
|
|
||||||
dnl check for AF_INET6
|
dnl check for AF_INET6
|
||||||
CARES_CHECK_CONSTANT(
|
CARES_CHECK_CONSTANT(
|
||||||
[
|
[
|
||||||
@@ -134,6 +158,58 @@ CARES_CHECK_STRUCT(
|
|||||||
AC_DEFINE_UNQUOTED(HAVE_STRUCT_IN6_ADDR,1,[Define to 1 if you have struct in6_addr.])
|
AC_DEFINE_UNQUOTED(HAVE_STRUCT_IN6_ADDR,1,[Define to 1 if you have struct in6_addr.])
|
||||||
)
|
)
|
||||||
|
|
||||||
|
dnl check for the sockaddr_in6 structure
|
||||||
|
CARES_CHECK_STRUCT(
|
||||||
|
[
|
||||||
|
#ifdef HAVE_SYS_TYPES_H
|
||||||
|
#include <sys/types.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_WINSOCK_H
|
||||||
|
#include <winsock.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_NETINET_IN_H
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#endif
|
||||||
|
], [sockaddr_in6],
|
||||||
|
AC_DEFINE_UNQUOTED(HAVE_STRUCT_SOCKADDR_IN6,1,
|
||||||
|
[Define to 1 if you have struct sockaddr_in6.]) ac_have_sockaddr_in6=yes
|
||||||
|
)
|
||||||
|
|
||||||
|
if test "$ac_have_sockaddr_in6" = "yes" ; then
|
||||||
|
CARES_CHECK_STRUCT_MEMBER(
|
||||||
|
[
|
||||||
|
#ifdef HAVE_SYS_TYPES_H
|
||||||
|
#include <sys/types.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_WINSOCK_H
|
||||||
|
#include <winsock.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_NETINET_IN_H
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#endif
|
||||||
|
], [sockaddr_in6], [sin6_scope_id],
|
||||||
|
AC_DEFINE_UNQUOTED(HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID,1,
|
||||||
|
[Define to 1 if your struct sockaddr_in6 has sin6_scope_id.])
|
||||||
|
)
|
||||||
|
fi
|
||||||
|
|
||||||
|
dnl check for the addrinfo structure
|
||||||
|
CARES_CHECK_STRUCT(
|
||||||
|
[
|
||||||
|
#ifdef HAVE_SYS_TYPES_H
|
||||||
|
#include <sys/types.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_WINSOCK_H
|
||||||
|
#include <winsock.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_NETINET_IN_H
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#endif
|
||||||
|
], [addrinfo],
|
||||||
|
AC_DEFINE_UNQUOTED(HAVE_STRUCT_ADDRINFO,1,
|
||||||
|
[Define to 1 if you have struct addrinfo.])
|
||||||
|
)
|
||||||
|
|
||||||
dnl check for inet_pton
|
dnl check for inet_pton
|
||||||
AC_CHECK_FUNCS(inet_pton)
|
AC_CHECK_FUNCS(inet_pton)
|
||||||
dnl Some systems have it, but not IPv6
|
dnl Some systems have it, but not IPv6
|
||||||
@@ -268,7 +344,8 @@ AC_CHECK_SIZEOF(struct in_addr, ,
|
|||||||
]
|
]
|
||||||
)
|
)
|
||||||
|
|
||||||
AC_CHECK_FUNCS(bitncmp)
|
AC_CHECK_FUNCS([bitncmp if_indextoname])
|
||||||
|
|
||||||
|
CURL_CHECK_NONBLOCKING_SOCKET
|
||||||
|
|
||||||
AC_OUTPUT(Makefile)
|
AC_OUTPUT(Makefile)
|
||||||
|
@@ -19,6 +19,7 @@
|
|||||||
#else
|
#else
|
||||||
/* simple work-around for now, for systems without configure support */
|
/* simple work-around for now, for systems without configure support */
|
||||||
#define ssize_t int
|
#define ssize_t int
|
||||||
|
#define socklen_t int
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Recent autoconf versions define these symbols in config.h. We don't want
|
/* Recent autoconf versions define these symbols in config.h. We don't want
|
||||||
|
18
buildconf
18
buildconf
@@ -13,7 +13,7 @@ findtool(){
|
|||||||
IFS=":"
|
IFS=":"
|
||||||
for path in $PATH
|
for path in $PATH
|
||||||
do
|
do
|
||||||
if test -r "$path/$file"; then
|
if test -f "$path/$file"; then
|
||||||
echo "$path/$file"
|
echo "$path/$file"
|
||||||
return
|
return
|
||||||
fi
|
fi
|
||||||
@@ -24,7 +24,7 @@ findtool(){
|
|||||||
# autoconf 2.57 or newer
|
# autoconf 2.57 or newer
|
||||||
#
|
#
|
||||||
need_autoconf="2.57"
|
need_autoconf="2.57"
|
||||||
ac_version=`${AUTOCONF:-autoconf} --version 2>/dev/null|head -1| sed -e 's/^[^0-9]*//' -e 's/[a-z]* *$//'`
|
ac_version=`${AUTOCONF:-autoconf} --version 2>/dev/null|head -n 1| sed -e 's/^[^0-9]*//' -e 's/[a-z]* *$//'`
|
||||||
if test -z "$ac_version"; then
|
if test -z "$ac_version"; then
|
||||||
echo "buildconf: autoconf not found."
|
echo "buildconf: autoconf not found."
|
||||||
echo " You need autoconf version $need_autoconf or newer installed."
|
echo " You need autoconf version $need_autoconf or newer installed."
|
||||||
@@ -45,7 +45,7 @@ echo "buildconf: autoconf version $ac_version (ok)"
|
|||||||
#--------------------------------------------------------------------------
|
#--------------------------------------------------------------------------
|
||||||
# autoheader 2.50 or newer
|
# autoheader 2.50 or newer
|
||||||
#
|
#
|
||||||
ah_version=`${AUTOHEADER:-autoheader} --version 2>/dev/null|head -1| sed -e 's/^[^0-9]*//' -e 's/[a-z]* *$//'`
|
ah_version=`${AUTOHEADER:-autoheader} --version 2>/dev/null|head -n 1| sed -e 's/^[^0-9]*//' -e 's/[a-z]* *$//'`
|
||||||
if test -z "$ah_version"; then
|
if test -z "$ah_version"; then
|
||||||
echo "buildconf: autoheader not found."
|
echo "buildconf: autoheader not found."
|
||||||
echo " You need autoheader version 2.50 or newer installed."
|
echo " You need autoheader version 2.50 or newer installed."
|
||||||
@@ -67,7 +67,7 @@ echo "buildconf: autoheader version $ah_version (ok)"
|
|||||||
# automake 1.7 or newer
|
# automake 1.7 or newer
|
||||||
#
|
#
|
||||||
need_automake="1.7"
|
need_automake="1.7"
|
||||||
am_version=`${AUTOMAKE:-automake} --version 2>/dev/null|head -1| sed -e 's/^.* \([0-9]\)/\1/' -e 's/[a-z]* *$//' -e 's/\(.*\)\(-p.*\)/\1/'`
|
am_version=`${AUTOMAKE:-automake} --version 2>/dev/null|head -n 1| sed -e 's/^.* \([0-9]\)/\1/' -e 's/[a-z]* *$//' -e 's/\(.*\)\(-p.*\)/\1/'`
|
||||||
if test -z "$am_version"; then
|
if test -z "$am_version"; then
|
||||||
echo "buildconf: automake not found."
|
echo "buildconf: automake not found."
|
||||||
echo " You need automake version $need_automake or newer installed."
|
echo " You need automake version $need_automake or newer installed."
|
||||||
@@ -113,7 +113,7 @@ fi
|
|||||||
# set the LIBTOOLIZE here so that glibtoolize is used if glibtool was found
|
# set the LIBTOOLIZE here so that glibtoolize is used if glibtool was found
|
||||||
LIBTOOLIZE="${libtool}ize"
|
LIBTOOLIZE="${libtool}ize"
|
||||||
|
|
||||||
lt_pversion=`$libtool --version 2>/dev/null|head -1|sed -e 's/^[^0-9]*//g' -e 's/[- ].*//'`
|
lt_pversion=`$libtool --version 2>/dev/null|head -n 1|sed -e 's/^[^0-9]*//g' -e 's/[- ].*//'`
|
||||||
if test -z "$lt_pversion"; then
|
if test -z "$lt_pversion"; then
|
||||||
echo "buildconf: libtool not found."
|
echo "buildconf: libtool not found."
|
||||||
echo " You need libtool version $LIBTOOL_WANTED_VERSION or newer installed"
|
echo " You need libtool version $LIBTOOL_WANTED_VERSION or newer installed"
|
||||||
@@ -160,7 +160,7 @@ fi
|
|||||||
#--------------------------------------------------------------------------
|
#--------------------------------------------------------------------------
|
||||||
# m4 check
|
# m4 check
|
||||||
#
|
#
|
||||||
m4=`${M4:-m4} --version 2>/dev/null|head -1`;
|
m4=`${M4:-m4} --version 2>/dev/null|head -n 1`;
|
||||||
m4_version=`echo $m4 | sed -e 's/^.* \([0-9]\)/\1/' -e 's/[a-z]* *$//'`
|
m4_version=`echo $m4 | sed -e 's/^.* \([0-9]\)/\1/' -e 's/[a-z]* *$//'`
|
||||||
|
|
||||||
if { echo $m4 | grep "GNU" >/dev/null 2>&1; } then
|
if { echo $m4 | grep "GNU" >/dev/null 2>&1; } then
|
||||||
@@ -199,9 +199,11 @@ ${AUTOCONF:-autoconf} || die "The autoconf command failed"
|
|||||||
|
|
||||||
if test -d ares; then
|
if test -d ares; then
|
||||||
cd ares
|
cd ares
|
||||||
echo "buildconf: running aclocal in the ares directory"
|
echo "buildconf: running ares/libtoolize"
|
||||||
|
${LIBTOOLIZE:-libtoolize} --copy --automake --force || die "The libtool command failed"
|
||||||
|
echo "buildconf: running ares/aclocal"
|
||||||
${ACLOCAL:-aclocal} $ACLOCAL_FLAGS || die "The ares aclocal command failed"
|
${ACLOCAL:-aclocal} $ACLOCAL_FLAGS || die "The ares aclocal command failed"
|
||||||
echo "buildconf: running autoconf in the ares directory"
|
echo "buildconf: running ares/autoconf"
|
||||||
${AUTOCONF:-autoconf} || die "The ares autoconf command failed"
|
${AUTOCONF:-autoconf} || die "The ares autoconf command failed"
|
||||||
cd ..
|
cd ..
|
||||||
fi
|
fi
|
||||||
|
195
configure.ac
195
configure.ac
@@ -567,14 +567,15 @@ OPT_KRB4=off
|
|||||||
AC_ARG_WITH(krb4,dnl
|
AC_ARG_WITH(krb4,dnl
|
||||||
AC_HELP_STRING([--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" != Xno; then
|
||||||
then
|
want_krb4="yes"
|
||||||
LDFLAGS="$LDFLAGS -L$OPT_KRB4/lib$libsuff"
|
if test X"$OPT_KRB4" != Xyes; then
|
||||||
KRB4LIB="$OPT_KRB4/lib$libsuff"
|
LDFLAGS="$LDFLAGS -L$OPT_KRB4/lib$libsuff"
|
||||||
CPPFLAGS="$CPPFLAGS -I$OPT_KRB4/include"
|
KRB4LIB="$OPT_KRB4/lib$libsuff"
|
||||||
KRB4INC="$OPT_KRB4/include"
|
CPPFLAGS="$CPPFLAGS -I$OPT_KRB4/include"
|
||||||
|
KRB4INC="$OPT_KRB4/include"
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
want_krb4="yes"
|
|
||||||
])
|
])
|
||||||
|
|
||||||
AC_MSG_CHECKING([if Kerberos4 support is requested])
|
AC_MSG_CHECKING([if Kerberos4 support is requested])
|
||||||
@@ -643,10 +644,13 @@ dnl **********************************************************************
|
|||||||
|
|
||||||
AC_ARG_WITH(spnego,
|
AC_ARG_WITH(spnego,
|
||||||
AC_HELP_STRING([--with-spnego=DIR],
|
AC_HELP_STRING([--with-spnego=DIR],
|
||||||
[Specify location of SPNEGO library fbopenssl]),
|
[Specify location of SPNEGO library fbopenssl]), [
|
||||||
[ SPNEGO_ROOT="$withval"
|
SPNEGO_ROOT="$withval"
|
||||||
want_spnego="yes" ]
|
if test x"$SPNEGO_ROOT" != xno; then
|
||||||
)
|
want_spnego="yes"
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
|
||||||
AC_MSG_CHECKING([if SPNEGO support is requested])
|
AC_MSG_CHECKING([if SPNEGO support is requested])
|
||||||
if test x"$want_spnego" = xyes; then
|
if test x"$want_spnego" = xyes; then
|
||||||
|
|
||||||
@@ -683,19 +687,24 @@ AC_ARG_WITH(gssapi-includes,
|
|||||||
AC_ARG_WITH(gssapi-libs,
|
AC_ARG_WITH(gssapi-libs,
|
||||||
AC_HELP_STRING([--with-gssapi-libs=DIR],
|
AC_HELP_STRING([--with-gssapi-libs=DIR],
|
||||||
[Specify location of GSSAPI libs]),
|
[Specify location of GSSAPI libs]),
|
||||||
[ GSSAPI_LIBS="-L$withval -lgssapi"
|
[ GSSAPI_LIBS="-L$withval"
|
||||||
want_gss="yes" ]
|
want_gss="yes" ]
|
||||||
)
|
)
|
||||||
|
|
||||||
AC_ARG_WITH(gssapi,
|
AC_ARG_WITH(gssapi,
|
||||||
AC_HELP_STRING([--with-gssapi=DIR],
|
AC_HELP_STRING([--with-gssapi=DIR],
|
||||||
[Where to look for GSSAPI]),
|
[Where to look for GSSAPI]), [
|
||||||
[ GSSAPI_ROOT="$withval"
|
GSSAPI_ROOT="$withval"
|
||||||
want_gss="yes" ]
|
if test x"$GSSAPI_ROOT" != xno; then
|
||||||
)
|
want_gss="yes"
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
|
||||||
|
save_CPPFLAGS="$CPPFLAGS"
|
||||||
AC_MSG_CHECKING([if GSSAPI support is requested])
|
AC_MSG_CHECKING([if GSSAPI support is requested])
|
||||||
if test x"$want_gss" = xyes; then
|
if test x"$want_gss" = xyes; then
|
||||||
|
AC_MSG_RESULT(yes)
|
||||||
|
|
||||||
if test -z "$GSSAPI_INCS"; then
|
if test -z "$GSSAPI_INCS"; then
|
||||||
if test -f "$GSSAPI_ROOT/bin/krb5-config"; then
|
if test -f "$GSSAPI_ROOT/bin/krb5-config"; then
|
||||||
GSSAPI_INCS=`$GSSAPI_ROOT/bin/krb5-config --cflags gssapi`
|
GSSAPI_INCS=`$GSSAPI_ROOT/bin/krb5-config --cflags gssapi`
|
||||||
@@ -705,7 +714,48 @@ if test x"$want_gss" = xyes; then
|
|||||||
fi
|
fi
|
||||||
CPPFLAGS="$CPPFLAGS $GSSAPI_INCS"
|
CPPFLAGS="$CPPFLAGS $GSSAPI_INCS"
|
||||||
|
|
||||||
if test -z "$GSSAPI_LIB_DIR"; then
|
AC_CHECK_HEADER(gss.h,
|
||||||
|
[
|
||||||
|
dnl found in the given dirs
|
||||||
|
AC_DEFINE(HAVE_GSSGNU, 1, [if you have the GNU gssapi libraries])
|
||||||
|
gnu_gss=yes
|
||||||
|
],
|
||||||
|
[
|
||||||
|
dnl not found, check Heimdal
|
||||||
|
AC_CHECK_HEADER(gssapi.h,
|
||||||
|
[
|
||||||
|
dnl found in the given dirs
|
||||||
|
AC_DEFINE(HAVE_GSSHEIMDAL, 1, [if you have the Heimdal gssapi libraries])
|
||||||
|
],
|
||||||
|
[
|
||||||
|
dnl not found, check in gssapi/ subdir
|
||||||
|
AC_CHECK_HEADER(gssapi/gssapi.h,
|
||||||
|
[
|
||||||
|
dnl found
|
||||||
|
AC_DEFINE(HAVE_GSSMIT, 1, [if you have the MIT gssapi libraries])
|
||||||
|
],
|
||||||
|
[
|
||||||
|
dnl no header found, disabling GSS
|
||||||
|
want_gss=no
|
||||||
|
AC_MSG_WARN(disabling GSSAPI since no header files was found)
|
||||||
|
]
|
||||||
|
)
|
||||||
|
]
|
||||||
|
)
|
||||||
|
]
|
||||||
|
)
|
||||||
|
else
|
||||||
|
AC_MSG_RESULT(no)
|
||||||
|
fi
|
||||||
|
if test x"$want_gss" = xyes; then
|
||||||
|
AC_DEFINE(HAVE_GSSAPI, 1, [if you have the gssapi libraries])
|
||||||
|
|
||||||
|
curl_gss_msg="enabled (MIT/Heimdal)"
|
||||||
|
|
||||||
|
if test -n "$gnu_gss"; then
|
||||||
|
curl_gss_msg="enabled (GNU GSS)"
|
||||||
|
LDFLAGS="$LDFLAGS $GSSAPI_LIB_DIR -lgss"
|
||||||
|
elif test -z "$GSSAPI_LIB_DIR"; then
|
||||||
if test -f "$GSSAPI_ROOT/bin/krb5-config"; then
|
if test -f "$GSSAPI_ROOT/bin/krb5-config"; then
|
||||||
gss_ldflags=`$GSSAPI_ROOT/bin/krb5-config --libs gssapi`
|
gss_ldflags=`$GSSAPI_ROOT/bin/krb5-config --libs gssapi`
|
||||||
LDFLAGS="$LDFLAGS $gss_ldflags"
|
LDFLAGS="$LDFLAGS $gss_ldflags"
|
||||||
@@ -715,31 +765,10 @@ if test x"$want_gss" = xyes; then
|
|||||||
LDFLAGS="$LDFLAGS -lgssapi"
|
LDFLAGS="$LDFLAGS -lgssapi"
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
LDFLAGS="$LDFLAGS $GSSAPI_LIB_DIR"
|
LDFLAGS="$LDFLAGS $GSSAPI_LIB_DIR -lgssapi"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
AC_MSG_RESULT(yes)
|
|
||||||
AC_DEFINE(HAVE_GSSAPI, 1, [if you have the gssapi libraries])
|
|
||||||
|
|
||||||
curl_gss_msg="enabled"
|
|
||||||
|
|
||||||
AC_CHECK_HEADER(gssapi.h,
|
|
||||||
[
|
|
||||||
dnl found in the given dirs
|
|
||||||
AC_DEFINE(HAVE_GSSHEIMDAL, 1, [if you have the Heimdal gssapi libraries])
|
|
||||||
],
|
|
||||||
[
|
|
||||||
dnl not found, check in gssapi/ subdir
|
|
||||||
AC_CHECK_HEADER(gssapi/gssapi.h,
|
|
||||||
dnl found
|
|
||||||
AC_DEFINE(HAVE_GSSMIT, 1, [if you have the MIT gssapi libraries])
|
|
||||||
)
|
|
||||||
|
|
||||||
]
|
|
||||||
)
|
|
||||||
|
|
||||||
else
|
else
|
||||||
AC_MSG_RESULT(no)
|
CPPFLAGS="$save_CPPFLAGS"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
dnl **********************************************************************
|
dnl **********************************************************************
|
||||||
@@ -768,20 +797,24 @@ if test X"$OPT_SSL" != Xno; then
|
|||||||
dnl only do pkg-config magic when not cross-compiling
|
dnl only do pkg-config magic when not cross-compiling
|
||||||
PKGTEST="yes"
|
PKGTEST="yes"
|
||||||
fi
|
fi
|
||||||
EXTRA_SSL=/usr/local/ssl ;;
|
PREFIX_OPENSSL=/usr/local/ssl
|
||||||
|
LIB_OPENSSL="$PREFIX_OPENSSL/lib$libsuff"
|
||||||
|
;;
|
||||||
off)
|
off)
|
||||||
dnl no --with-ssl option given, just check default places
|
dnl no --with-ssl option given, just check default places
|
||||||
if test x$cross_compiling != xyes; then
|
if test x$cross_compiling != xyes; then
|
||||||
dnl only do pkg-config magic when not cross-compiling
|
dnl only do pkg-config magic when not cross-compiling
|
||||||
PKGTEST="yes"
|
PKGTEST="yes"
|
||||||
fi
|
fi
|
||||||
EXTRA_SSL= ;;
|
PREFIX_OPENSSL=
|
||||||
|
;;
|
||||||
*)
|
*)
|
||||||
dnl check the given --with-ssl spot
|
dnl check the given --with-ssl spot
|
||||||
PKGTEST="no"
|
PKGTEST="no"
|
||||||
EXTRA_SSL=$OPT_SSL
|
PREFIX_OPENSSL=$OPT_SSL
|
||||||
LDFLAGS="$LDFLAGS -L$EXTRA_SSL/lib$libsuff"
|
LIB_OPENSSL="$PREFIX_OPENSSL/lib$libsuff"
|
||||||
CPPFLAGS="$CPPFLAGS -I$EXTRA_SSL/include/openssl -I$EXTRA_SSL/include"
|
LDFLAGS="$LDFLAGS -L$LIB_OPENSSL"
|
||||||
|
CPPFLAGS="$CPPFLAGS -I$PREFIX_OPENSSL/include/openssl -I$PREFIX_OPENSSL/include"
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
@@ -803,6 +836,8 @@ if test X"$OPT_SSL" != Xno; then
|
|||||||
SSL_LDFLAGS=`$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`
|
SSL_CPPFLAGS=`$PKGCONFIG --cflags-only-I openssl 2>/dev/null`
|
||||||
|
|
||||||
|
LIB_OPENSSL=`echo $SSL_LDFLAGS | sed -e 's/-L//g'`
|
||||||
|
|
||||||
dnl use the values pkg-config reported
|
dnl use the values pkg-config reported
|
||||||
LIBS="$LIBS $SSL_LIBS"
|
LIBS="$LIBS $SSL_LIBS"
|
||||||
CPPFLAGS="$CPPFLAGS $SSL_CPPFLAGS"
|
CPPFLAGS="$CPPFLAGS $SSL_CPPFLAGS"
|
||||||
@@ -832,8 +867,8 @@ if test X"$OPT_SSL" != Xno; then
|
|||||||
HAVECRYPTO="yes"
|
HAVECRYPTO="yes"
|
||||||
LIBS="-lcrypto $LIBS"
|
LIBS="-lcrypto $LIBS"
|
||||||
],[
|
],[
|
||||||
LDFLAGS="$CLEANLDFLAGS -L$EXTRA_SSL/lib$libsuff"
|
LDFLAGS="$CLEANLDFLAGS -L$LIB_OPENSSL"
|
||||||
CPPFLAGS="$CLEANCPPFLAGS -I$EXTRA_SSL/include/openssl -I$EXTRA_SSL/include"
|
CPPFLAGS="$CLEANCPPFLAGS -I$PREFIX_OPENSSL/include/openssl -I$PREFIX_OPENSSL/include"
|
||||||
AC_CHECK_LIB(crypto, CRYPTO_add_lock,[
|
AC_CHECK_LIB(crypto, CRYPTO_add_lock,[
|
||||||
HAVECRYPTO="yes"
|
HAVECRYPTO="yes"
|
||||||
LIBS="-lcrypto $LIBS"], [
|
LIBS="-lcrypto $LIBS"], [
|
||||||
@@ -918,11 +953,15 @@ if test X"$OPT_SSL" != Xno; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
if test "$OPENSSL_ENABLED" = "1"; then
|
if test "$OPENSSL_ENABLED" = "1"; then
|
||||||
dnl when the ssl shared libs were found in a path that the run-time linker
|
if test -n "$LIB_OPENSSL"; then
|
||||||
dnl doesn't search through, we need to add it to LD_LIBRARY_PATH to
|
dnl when the ssl shared libs were found in a path that the run-time
|
||||||
dnl prevent further configure tests to fail due to this
|
dnl linker doesn't search through, we need to add it to LD_LIBRARY_PATH
|
||||||
LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$EXTRA_SSL/lib$libsuff"
|
dnl to prevent further configure tests to fail due to this
|
||||||
export LD_LIBRARY_PATH
|
|
||||||
|
LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$LIB_OPENSSL"
|
||||||
|
export LD_LIBRARY_PATH
|
||||||
|
AC_MSG_NOTICE([Added $LIB_OPENSSL to LD_LIBRARY_PATH])
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
fi
|
fi
|
||||||
@@ -964,7 +1003,7 @@ dnl FIX: only check for GnuTLS if OpenSSL is not enabled
|
|||||||
dnl ----------------------------------------------------
|
dnl ----------------------------------------------------
|
||||||
|
|
||||||
dnl Default to compiler & linker defaults for GnuTLS files & libraries.
|
dnl Default to compiler & linker defaults for GnuTLS files & libraries.
|
||||||
OPT_GNUTLS=off
|
OPT_GNUTLS=no
|
||||||
|
|
||||||
AC_ARG_WITH(gnutls,dnl
|
AC_ARG_WITH(gnutls,dnl
|
||||||
AC_HELP_STRING([--with-gnutls=PATH],[where to look for GnuTLS, PATH points to the installation root (default: /usr/local/)])
|
AC_HELP_STRING([--with-gnutls=PATH],[where to look for GnuTLS, PATH points to the installation root (default: /usr/local/)])
|
||||||
@@ -973,7 +1012,7 @@ AC_HELP_STRING([--without-gnutls], [disable GnuTLS detection]),
|
|||||||
|
|
||||||
if test "$OPENSSL_ENABLED" != "1"; then
|
if test "$OPENSSL_ENABLED" != "1"; then
|
||||||
|
|
||||||
if test X"$OPT_GNUTLS" != Xoff; then
|
if test X"$OPT_GNUTLS" != Xno; then
|
||||||
if test "x$OPT_GNUTLS" = "xyes"; then
|
if test "x$OPT_GNUTLS" = "xyes"; then
|
||||||
check=`libgnutls-config --version 2>/dev/null`
|
check=`libgnutls-config --version 2>/dev/null`
|
||||||
if test -n "$check"; then
|
if test -n "$check"; then
|
||||||
@@ -1023,6 +1062,7 @@ if test "$OPENSSL_ENABLED" != "1"; then
|
|||||||
|
|
||||||
LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$gtlsprefix/lib$libsuff"
|
LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$gtlsprefix/lib$libsuff"
|
||||||
export LD_LIBRARY_PATH
|
export LD_LIBRARY_PATH
|
||||||
|
AC_MSG_NOTICE([Added $gtlsprefix/lib$libsuff to LD_LIBRARY_PATH])
|
||||||
fi
|
fi
|
||||||
|
|
||||||
fi
|
fi
|
||||||
@@ -1168,7 +1208,6 @@ case "$LIBIDN" in
|
|||||||
dnl if there is a given path, check that FIRST
|
dnl if there is a given path, check that FIRST
|
||||||
if test -n "$LIBIDN"; then
|
if test -n "$LIBIDN"; then
|
||||||
if test "x$LIBIDN" != "xyes"; then
|
if test "x$LIBIDN" != "xyes"; then
|
||||||
AC_MSG_WARN([moo moo $LIBIDN])
|
|
||||||
oldLDFLAGS=$LDFLAGS
|
oldLDFLAGS=$LDFLAGS
|
||||||
oldCPPFLAGS=$CPPFLAGS
|
oldCPPFLAGS=$CPPFLAGS
|
||||||
LDFLAGS="$LDFLAGS -L$LIBIDN/lib"
|
LDFLAGS="$LDFLAGS -L$LIBIDN/lib"
|
||||||
@@ -1254,7 +1293,7 @@ else
|
|||||||
dnl is there a strerror_r()
|
dnl is there a strerror_r()
|
||||||
CURL_CHECK_STRERROR_R()
|
CURL_CHECK_STRERROR_R()
|
||||||
|
|
||||||
AC_CHECK_FUNCS( gmtime_r )
|
checkfor_gmtime_r="yes"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
dnl for recent AIX versions, we skip all the thread-safe checks above since
|
dnl for recent AIX versions, we skip all the thread-safe checks above since
|
||||||
@@ -1290,7 +1329,47 @@ if test "x$RECENTAIX" = "xyes"; then
|
|||||||
dnl is there a strerror_r()
|
dnl is there a strerror_r()
|
||||||
CURL_CHECK_STRERROR_R()
|
CURL_CHECK_STRERROR_R()
|
||||||
|
|
||||||
AC_CHECK_FUNCS( gmtime_r )
|
checkfor_gmtime_r="yes"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test x$cross_compiling != xyes; then
|
||||||
|
|
||||||
|
if test x$checkfor_gmtime_r = xyes; then
|
||||||
|
|
||||||
|
dnl if gmtime_r was found, verify that it actuall works, as (at least) HPUX
|
||||||
|
dnl 10.20 is known to have a buggy one. If it doesn't work, disable use of
|
||||||
|
dnl it.
|
||||||
|
|
||||||
|
AC_MSG_CHECKING([if gmtime_r exists and works])
|
||||||
|
AC_RUN_IFELSE([[
|
||||||
|
#include <time.h>
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
time_t local = 1170352587;
|
||||||
|
struct tm *gmt;
|
||||||
|
struct tm keeper;
|
||||||
|
putenv("TZ=CST6CDT");
|
||||||
|
tzset();
|
||||||
|
gmt = gmtime_r(&local, &keeper);
|
||||||
|
if(gmt) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return 1; /* failure */
|
||||||
|
}
|
||||||
|
]],
|
||||||
|
dnl success, do nothing
|
||||||
|
AC_MSG_RESULT(yes)
|
||||||
|
AC_DEFINE(HAVE_GMTIME_R, 1, [if you have (a working) gmtime_r])
|
||||||
|
,
|
||||||
|
dnl failure, now disable the function
|
||||||
|
AC_MSG_RESULT(no)
|
||||||
|
,
|
||||||
|
dnl not invoked when crosscompiling)
|
||||||
|
])
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
dnl and for crosscompilings
|
||||||
|
AC_CHECK_FUNCS(gmtime_r)
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
@@ -1603,7 +1682,7 @@ AC_HELP_STRING([--disable-ares],[Disable ares for name lookups]),
|
|||||||
AC_SUBST(HAVE_ARES)
|
AC_SUBST(HAVE_ARES)
|
||||||
curl_ares_msg="enabled"
|
curl_ares_msg="enabled"
|
||||||
|
|
||||||
LIBS="$LIBS -lcares"
|
LIBS="-lcares $LIBS"
|
||||||
|
|
||||||
dnl For backwards compatibility default to includes/lib in srcdir/ares
|
dnl For backwards compatibility default to includes/lib in srcdir/ares
|
||||||
dnl If a value is specified it is assumed that the libs are in $val/lib
|
dnl If a value is specified it is assumed that the libs are in $val/lib
|
||||||
|
@@ -60,7 +60,9 @@ while test $# -gt 0; do
|
|||||||
--feature|--features)
|
--feature|--features)
|
||||||
if test "@USE_SSLEAY@" = "1"; then
|
if test "@USE_SSLEAY@" = "1"; then
|
||||||
echo "SSL"
|
echo "SSL"
|
||||||
NTLM=1
|
NTLM=1 # OpenSSL implies NTLM
|
||||||
|
elif test -n "@USE_GNUTLS@"; then
|
||||||
|
echo "SSL"
|
||||||
fi
|
fi
|
||||||
if test "@KRB4_ENABLED@" = "1"; then
|
if test "@KRB4_ENABLED@" = "1"; then
|
||||||
echo "KRB4"
|
echo "KRB4"
|
||||||
|
@@ -82,8 +82,8 @@ Lisp
|
|||||||
|
|
||||||
Lua
|
Lua
|
||||||
|
|
||||||
Written by Steve Dekorte
|
LuaCURL Written by Alexander Marinov
|
||||||
http://curl.haxx.se/libcurl/lua/
|
http://luacurl.luaforge.net/
|
||||||
|
|
||||||
Mono
|
Mono
|
||||||
|
|
||||||
|
186
docs/DISTRO-DILEMMA
Normal file
186
docs/DISTRO-DILEMMA
Normal file
@@ -0,0 +1,186 @@
|
|||||||
|
Date: September 1, 2005
|
||||||
|
Author: Daniel Stenberg <daniel@haxx.se>
|
||||||
|
URL: http://curl.haxx.se/legal/distro-dilemma.html
|
||||||
|
|
||||||
|
Condition
|
||||||
|
|
||||||
|
This document is written to describe the sitution as it is right now. libcurl
|
||||||
|
7.14.0 is currently the latest version available. Things may (or perhaps
|
||||||
|
will) of course change in the future.
|
||||||
|
|
||||||
|
This document reflects my view and understanding of these things. Please tell
|
||||||
|
me where and how you think I'm wrong, and I'll try to correct my mistakes.
|
||||||
|
|
||||||
|
Background
|
||||||
|
|
||||||
|
The Free Software Foundation has deemed the Original BSD license[1] to be
|
||||||
|
"incompatible"[2] with GPL[3]. I'd rather say it is the other way around, but
|
||||||
|
the point is the same: if you distribute a binary version of a GPL program,
|
||||||
|
it MUST NOT be linked with any Original BSD-licenced parts or
|
||||||
|
libraries. Doing so will violate the GPL license. For a long time, very many
|
||||||
|
GPL licensed programs have avoided this license mess by adding an
|
||||||
|
exception[8] to their license. And many others have just closed their eyes
|
||||||
|
for this problem.
|
||||||
|
|
||||||
|
libcurl is MIT-style[4] licensed - how on earth did this dilemma fall onto
|
||||||
|
our plates?
|
||||||
|
|
||||||
|
libcurl is only a little library. libcurl can be built to use OpenSSL for its
|
||||||
|
SSL/TLS capabilities. OpenSSL is basically Original BSD licensed[5].
|
||||||
|
|
||||||
|
If libcurl built to use OpenSSL is used by a GPL-licensed application and you
|
||||||
|
decide to distribute a binary version of it (Linux distros - for example -
|
||||||
|
tend to), you have a clash. GPL vs Original BSD.
|
||||||
|
|
||||||
|
This dilemma is not libcurl-specific nor is it specific to any particular
|
||||||
|
Linux distro.
|
||||||
|
|
||||||
|
Part of the Operating System
|
||||||
|
|
||||||
|
This would not be a problem if the used lib would be considered part of the
|
||||||
|
uderlying operating system, as then the GPL license has an exception
|
||||||
|
clause[6] that allows applications to use such libs without having to be
|
||||||
|
allowed to distribute it or its sources. Possibly some distros will claim
|
||||||
|
that OpenSSL is part of their operating system.
|
||||||
|
|
||||||
|
Debian does however not take this stance and has officially(?) claimed that
|
||||||
|
OpenSSL is not a required part of the Debian operating system
|
||||||
|
|
||||||
|
Debian-legal
|
||||||
|
|
||||||
|
In August 2004 I figured I should start pulling people's attention to this to
|
||||||
|
see if anyone has any bright ideas or if they would dismiss my worries based
|
||||||
|
on some elegant writing I had missed somewhere:
|
||||||
|
|
||||||
|
My post to debian-legal on August 12 2004:
|
||||||
|
|
||||||
|
http://lists.debian.org/debian-legal/2004/08/msg00279.html
|
||||||
|
|
||||||
|
Several people agreed then that this is a known and rather big problem, but
|
||||||
|
the following discussion didn't result in much.
|
||||||
|
|
||||||
|
GnuTLS
|
||||||
|
|
||||||
|
With the release of libcurl 7.14.0 (May 2005), it can now get built to use
|
||||||
|
GnuTLS instead of OpenSSL. GnuTLS is a LGPL[7] licensed library that offers a
|
||||||
|
matching set of features as OpenSSL does. Now, you can build and distribute
|
||||||
|
an SSL capable libcurl without including any Original BSD licensed code.
|
||||||
|
|
||||||
|
I believe Debian is the first distro to provide libcurl/GnutTLS packages.
|
||||||
|
|
||||||
|
GnuTLS vs OpenSSL
|
||||||
|
|
||||||
|
While these two libraries offer similar features, they are not equal. Both
|
||||||
|
libraries have features the other one lacks. libcurl does not (yet) offer a
|
||||||
|
standardized stable ABI if you decide to switch from using libcurl-openssl to
|
||||||
|
libcurl-gnutls or vice versa. The GnuTLS support is very recent in libcurl
|
||||||
|
and it has not been tested nor used very extensively, while the OpenSSL
|
||||||
|
equivalent code has been used and thus matured for more than seven (7) years.
|
||||||
|
|
||||||
|
In August 2005, the debian-devel mailing list discovered the license issue as
|
||||||
|
a GPL licensed application wanted SSL capabilities from libcurl and thus was
|
||||||
|
forced to use the GnuTLS powered libcurl. For a reason that is unknown to me,
|
||||||
|
the application authors didn't want to or was unable to add an exception to
|
||||||
|
their GPL license. Alas, the license problem hit the fan again.
|
||||||
|
|
||||||
|
The Better License, Original BSD or LGPL?
|
||||||
|
|
||||||
|
It isn't obvious or without debate to any objective interested party that
|
||||||
|
either of these licenses are the "better" or even the "preferred" one in a
|
||||||
|
generic situation.
|
||||||
|
|
||||||
|
Instead, I think we should accept the fact that the SSL/TLS libraries and
|
||||||
|
their different licenses will fit different applications and their authors
|
||||||
|
differently depending on the applications' licenses and their general usage
|
||||||
|
pattern (considering how LGPL libraries can be burdonsome for embedded
|
||||||
|
systems usage).
|
||||||
|
|
||||||
|
More SSL Libraries
|
||||||
|
|
||||||
|
In libcurl, there's no stopping us here. There are at least a few more Open
|
||||||
|
Source/Free SSL/TLS libraries and we would very much like to support them as
|
||||||
|
well, to offer application authors an even wider scope of choice.
|
||||||
|
|
||||||
|
Application Angle of this Problem
|
||||||
|
|
||||||
|
libcurl is built to use one SSL/TLS library. It uses a single fixed name (by
|
||||||
|
default), and applications are built/linked to use that single lib. Replacing
|
||||||
|
one libcurl instance with another one that uses the other SSL/TLS library
|
||||||
|
might break one or more applications (due to ABI differences and/or different
|
||||||
|
feature set). You want your application to use the libcurl it was built for.
|
||||||
|
|
||||||
|
Project cURL Angle of this Problem
|
||||||
|
|
||||||
|
We distribute libcurl and everyone may build libcurl with either library. At
|
||||||
|
their choice. This problem is not directly a problem of ours. It merely
|
||||||
|
affects users - GPL application authors only - of our lib as it comes
|
||||||
|
included and delivered on some distros.
|
||||||
|
|
||||||
|
Distro Angle of this Problem
|
||||||
|
|
||||||
|
A distro can provide separate libcurls built with different SSL/TLS libraries
|
||||||
|
to work around this, but at least Debian seems to be very hostile against
|
||||||
|
such an approach, probably since it makes things like devel packages for the
|
||||||
|
different libs collide since they would provide the same include files and
|
||||||
|
man pages etc.
|
||||||
|
|
||||||
|
Fixing the Only Problem
|
||||||
|
|
||||||
|
The only problem is thus for distributions that want to offer libcurl
|
||||||
|
versions built with more than one SSL/TLS library.
|
||||||
|
|
||||||
|
Since multiple libcurl binaries using different names are ruled out, we need
|
||||||
|
to come up with a way to have one single libcurl that someone uses different
|
||||||
|
underlying libraries. The best(?) approach currently suggested involves this:
|
||||||
|
|
||||||
|
A new intermediate library (named lib2 so far in the discussions) with the
|
||||||
|
single purpose of providing libcurl with SSL/TLS capabilities. It would have
|
||||||
|
a unified API and ABI no matter what underlying library it would use.
|
||||||
|
|
||||||
|
There would be one lib2 binary provided for each supported SSL/TLS library.
|
||||||
|
For example: lib2-openssl, lib2-gnutls, lib2-yassl, lib2-matrixssl and
|
||||||
|
lib2-nossl. Yes, take note of the last one that provides the lib2 ABI but
|
||||||
|
that lacks the actual powers.
|
||||||
|
|
||||||
|
When libcurl is built and linked, it will be linked against a lib2 with the
|
||||||
|
set ABI.
|
||||||
|
|
||||||
|
When you link an app against libcurl, it would also need to provide one of
|
||||||
|
the (many) lib2 libs to decide what approach that fits the app. An app that
|
||||||
|
doesn't want SSL at all would still need to link with the lib2-nossl lib.
|
||||||
|
|
||||||
|
GPL apps can pick the lib2-gnutls, others may pick the lib2-openssl.
|
||||||
|
|
||||||
|
This concept works equally well both for shared and static libraries.
|
||||||
|
|
||||||
|
A positive side effect of this approach could be a more generic "de facto"
|
||||||
|
standard API for SSL/TLS libraries.
|
||||||
|
|
||||||
|
When Will This Happen
|
||||||
|
|
||||||
|
Note again that this is not a problem in curl, it doesn't solve any actual
|
||||||
|
technical problems in our project. Don't hold your breath for this to happen
|
||||||
|
very soon (if at all) unless you step forward and contribute.
|
||||||
|
|
||||||
|
The suggestion that is outlined above is still only a suggestion. Feel free
|
||||||
|
to bring a better idea!
|
||||||
|
|
||||||
|
Also, to keep in mind: I don't want this new concept to have too much of an
|
||||||
|
impact on the existing code. Preferably it should be possible to build the
|
||||||
|
code like today (without the use of lib2), should you decide to ignore the
|
||||||
|
problems outlined in this document.
|
||||||
|
|
||||||
|
Footnotes
|
||||||
|
|
||||||
|
[1] = http://www.xfree86.org/3.3.6/COPYRIGHT2.html#6
|
||||||
|
[2] = http://www.fsf.org/licensing/essays/bsd.html
|
||||||
|
[3] = http://www.fsf.org/licensing/licenses/gpl.html
|
||||||
|
[4] = http://curl.haxx.se/docs/copyright.html
|
||||||
|
[5] = http://www.openssl.org/source/license.html
|
||||||
|
[6] = http://www.fsf.org/licensing/licenses/gpl.html end of section 3
|
||||||
|
[7] = http://www.fsf.org/licensing/licenses/lgpl.html
|
||||||
|
[8] = http://en.wikipedia.org/wiki/OpenSSL_exception
|
||||||
|
|
||||||
|
Feedback/Updates provided by
|
||||||
|
|
||||||
|
Eric Cooper
|
68
docs/FAQ
68
docs/FAQ
@@ -1,4 +1,4 @@
|
|||||||
Updated: April 13, 2005 (http://curl.haxx.se/docs/faq.html)
|
Updated: August 26, 2005 (http://curl.haxx.se/docs/faq.html)
|
||||||
_ _ ____ _
|
_ _ ____ _
|
||||||
___| | | | _ \| |
|
___| | | | _ \| |
|
||||||
/ __| | | | |_) | |
|
/ __| | | | |_) | |
|
||||||
@@ -64,6 +64,8 @@ FAQ
|
|||||||
4.10 My HTTP request using HEAD, PUT or DELETE doesn't work!
|
4.10 My HTTP request using HEAD, PUT or DELETE doesn't work!
|
||||||
4.11 Why does my HTTP range requests return the full document?
|
4.11 Why does my HTTP range requests return the full document?
|
||||||
4.12 Why do I get "certificate verify failed" ?
|
4.12 Why do I get "certificate verify failed" ?
|
||||||
|
4.13 Why is curl -R on Windows one hour off?
|
||||||
|
4.14 Redirects work in browser but not with curl!
|
||||||
|
|
||||||
5. libcurl Issues
|
5. libcurl Issues
|
||||||
5.1 Is libcurl thread-safe?
|
5.1 Is libcurl thread-safe?
|
||||||
@@ -132,11 +134,11 @@ FAQ
|
|||||||
|
|
||||||
We pronounce curl and cURL with an initial k sound: [kurl].
|
We pronounce curl and cURL with an initial k sound: [kurl].
|
||||||
|
|
||||||
NOTE: there are numerous sub-projects and related projects that also use the
|
There are numerous sub-projects and related projects that also use the word
|
||||||
word curl in the project names in various combinations, but you should take
|
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
|
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-related
|
libcurl the library), and may therefore not be valid for other curl-related
|
||||||
projects.
|
projects. (There is however a small section for the PHP/CURL in this FAQ.)
|
||||||
|
|
||||||
1.2 What is libcurl?
|
1.2 What is libcurl?
|
||||||
|
|
||||||
@@ -197,15 +199,14 @@ FAQ
|
|||||||
|
|
||||||
1.5 Who makes curl?
|
1.5 Who makes curl?
|
||||||
|
|
||||||
curl and libcurl are not made by any single individual. Sure, Daniel
|
curl and libcurl are not made by any single individual. Daniel Stenberg is
|
||||||
Stenberg writes the major parts, but other persons' submissions are
|
project leader and main developer, but other persons' submissions are
|
||||||
important and crucial. Anyone can contribute and post their changes and
|
important and crucial. Anyone can contribute and post their changes and
|
||||||
improvements and have them inserted in the main sources (of course on the
|
improvements and have them inserted in the main sources (of course on the
|
||||||
condition that developers agree on that the fixes are good).
|
condition that developers agree on that the fixes are good).
|
||||||
|
|
||||||
The list of contributors in the docs/THANKS file is only a small part of all
|
The full list of the more than 400 contributors is found in the docs/THANKS
|
||||||
the people that every day provide us with bug reports, suggestions, ideas
|
file.
|
||||||
and source code.
|
|
||||||
|
|
||||||
curl is developed by a community, with Daniel at the wheel.
|
curl is developed by a community, with Daniel at the wheel.
|
||||||
|
|
||||||
@@ -220,12 +221,8 @@ FAQ
|
|||||||
have sponsored certain parts of the development in the past and I hope some
|
have sponsored certain parts of the development in the past and I hope some
|
||||||
will continue to do so in the future.
|
will continue to do so in the future.
|
||||||
|
|
||||||
If you want to support our project with a donation or similar, one way of
|
If you want to support our project, consider a donation or a banner-program
|
||||||
doing that would be to buy "gift certificates" at useful online shopping
|
or even better: by helping us coding, documenting, testing etc.
|
||||||
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,
|
|
||||||
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?
|
||||||
|
|
||||||
@@ -256,6 +253,12 @@ FAQ
|
|||||||
users thanks to the web based archives of the mailing lists), thus saving us
|
users thanks to the web based archives of the mailing lists), thus saving us
|
||||||
from having to repeat ourselves even more. Thanks for respecting this.
|
from having to repeat ourselves even more. Thanks for respecting this.
|
||||||
|
|
||||||
|
If you have found or simply suspect a security problem in curl or libcurl,
|
||||||
|
mail curl-security at haxx.se (closed list of receivers, mails are not
|
||||||
|
disclosed) and tell. Then we can produce a fix in a timely manner before the
|
||||||
|
flaw is announced to the world, thus lessen the impact the problem will have
|
||||||
|
on existing users.
|
||||||
|
|
||||||
|
|
||||||
2. Install Related Problems
|
2. Install Related Problems
|
||||||
|
|
||||||
@@ -396,6 +399,8 @@ FAQ
|
|||||||
|
|
||||||
curl -L http://redirector.com
|
curl -L http://redirector.com
|
||||||
|
|
||||||
|
Not all redirects are HTTP ones, see 4.14
|
||||||
|
|
||||||
3.9 How do I use curl in my favorite programming language?
|
3.9 How do I use curl in my favorite programming language?
|
||||||
|
|
||||||
There exist many language interfaces/bindings for curl that integrates it
|
There exist many language interfaces/bindings for curl that integrates it
|
||||||
@@ -734,6 +739,28 @@ FAQ
|
|||||||
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/docs/sslcerts.html
|
here: http://curl.haxx.se/docs/sslcerts.html
|
||||||
|
|
||||||
|
4.13 Why is curl -R on Windows one hour off?
|
||||||
|
|
||||||
|
During daylight savings time, when -R is used, curl will set a time that
|
||||||
|
appears one hour off. This happens due to a flaw in how Windows stores and
|
||||||
|
uses file modification times and it is not easily worked around. For details
|
||||||
|
on this problem, read this: http://www.codeproject.com/datetime/dstbugs.asp
|
||||||
|
|
||||||
|
4.14 Redirects work in browser but not with curl!
|
||||||
|
|
||||||
|
curl supports HTTP redirects fine (see item 3.8). Browsers generally support
|
||||||
|
at least two other ways to perform directs that curl does not:
|
||||||
|
|
||||||
|
1 - Meta tags. You can write a HTML tag that will cause the browser to
|
||||||
|
redirect to another given URL after a certain time.
|
||||||
|
|
||||||
|
2 - Javascript. You can write a javascript program embeded in a HTML page
|
||||||
|
that redirects the browser to another given URL.
|
||||||
|
|
||||||
|
There is no way to make curl follow these redirects. You must either
|
||||||
|
manually figure out what the page is set to do, or you write a script that
|
||||||
|
parses the results and fetches the new URL.
|
||||||
|
|
||||||
|
|
||||||
5. libcurl Issues
|
5. libcurl Issues
|
||||||
|
|
||||||
@@ -754,7 +781,7 @@ FAQ
|
|||||||
need to provide locking function(s) for libgcrypt (which is used by GnuTLS
|
need to provide locking function(s) for libgcrypt (which is used by GnuTLS
|
||||||
for the crypto functions).
|
for the crypto functions).
|
||||||
|
|
||||||
[informative link missing]
|
http://www.gnu.org/software/gnutls/manual/html_node/Multi_002dthreaded-applications.html
|
||||||
|
|
||||||
5.2 How can I receive all data into a large memory chunk?
|
5.2 How can I receive all data into a large memory chunk?
|
||||||
|
|
||||||
@@ -978,8 +1005,13 @@ FAQ
|
|||||||
7.1 What is PHP/CURL?
|
7.1 What is PHP/CURL?
|
||||||
|
|
||||||
The module for PHP that makes it possible for PHP programs to access curl-
|
The module for PHP that makes it possible for PHP programs to access curl-
|
||||||
functions from within PHP. We often call it PHP/CURL to differentiate from
|
functions from within PHP.
|
||||||
curl the command line tool and libcurl the library.
|
|
||||||
|
In the cURL project we call this module PHP/CURL to differentiate it from
|
||||||
|
curl the command line tool and libcurl the library. The PHP team however
|
||||||
|
does not refer to it like this (for unknown reasons). They call it plain
|
||||||
|
CURL (often using all caps) which causes much confusion to users which in
|
||||||
|
turn gives us a higher question load.
|
||||||
|
|
||||||
7.2 Who write PHP/CURL?
|
7.2 Who write PHP/CURL?
|
||||||
|
|
||||||
|
@@ -62,11 +62,11 @@ HTTP
|
|||||||
|
|
||||||
HTTPS (*1)
|
HTTPS (*1)
|
||||||
- (all the HTTP features)
|
- (all the HTTP features)
|
||||||
- using certificates
|
- using client certificates
|
||||||
- verify server certificate
|
- verify server certificate
|
||||||
- via http-proxy
|
- via http-proxy
|
||||||
- select desired encryption
|
- select desired encryption
|
||||||
- force usage of a specific SSL version (SSLv2, SSLv3 or TLSv1)
|
- force usage of a specific SSL version (SSLv2(*7), SSLv3 or TLSv1)
|
||||||
|
|
||||||
FTP
|
FTP
|
||||||
- download
|
- download
|
||||||
@@ -118,9 +118,10 @@ FILE
|
|||||||
FOOTNOTES
|
FOOTNOTES
|
||||||
=========
|
=========
|
||||||
|
|
||||||
*1 = requires OpenSSL
|
*1 = requires OpenSSL or GnuTLS
|
||||||
*2 = requires OpenLDAP
|
*2 = requires OpenLDAP
|
||||||
*3 = requires a GSSAPI-compliant library, such as Heimdal or similar.
|
*3 = requires a GSSAPI-compliant library, such as Heimdal or similar.
|
||||||
*4 = requires FBopenssl
|
*4 = requires FBopenssl
|
||||||
*5 = requires a krb4 library, such as the MIT one or similar.
|
*5 = requires a krb4 library, such as the MIT one or similar.
|
||||||
*6 = requires c-ares
|
*6 = requires c-ares
|
||||||
|
*7 = requires OpenSSL specificly, as GnuTLS only supports SSLv3 and TLSv1
|
||||||
|
24
docs/INSTALL
24
docs/INSTALL
@@ -462,21 +462,19 @@ NetWare
|
|||||||
- optional zlib sources (at the moment only dynamic linking with zlib.imp);
|
- optional zlib sources (at the moment only dynamic linking with zlib.imp);
|
||||||
sources with NetWare Makefile can be obtained from:
|
sources with NetWare Makefile can be obtained from:
|
||||||
http://www.gknw.com/mirror/zlib/
|
http://www.gknw.com/mirror/zlib/
|
||||||
|
- optional OpenSSL sources (version 0.9.8 or later which builds with BSD);
|
||||||
|
|
||||||
Set a search path to your compiler, linker and tools; if you want to have
|
Set a search path to your compiler, linker and tools; on Linux make
|
||||||
zlib support then set the environment var ZLIB_PATH pointing to your zlib
|
sure that the var OSTYPE contains the string 'linux'; and then type
|
||||||
sources, on Linux make sure the var OSTYPE contains the string 'linux';
|
'make netware' from the top source directory; other tagets available
|
||||||
and finally type 'make netware' from the top source directory...
|
are 'netware-ssl', 'netware-ssl-zlib', 'netware-zlib' and 'netware-ares';
|
||||||
I found on some Linux systems (RH9) that OS detection didnlt work although
|
if you need other combinations you can control the build with the
|
||||||
|
environment variables WITH_SSL, WITH_ZLIB, WITH_ARES and ENABLE_IPV6.
|
||||||
|
I found on some Linux systems (RH9) that OS detection didnt work although
|
||||||
a 'set | grep OSTYPE' shows the var present and set; I simply overwrote it
|
a 'set | grep OSTYPE' shows the var present and set; I simply overwrote it
|
||||||
with 'OSTYPE=linux-rh9-gnu' and the detection in the Makefile worked...;
|
with 'OSTYPE=linux-rh9-gnu' and the detection in the Makefile worked...
|
||||||
other options are currently not supported, although partly prepared.
|
|
||||||
The Ares lib builds arlready fine, and both test tools work fine at least
|
|
||||||
when build with CodeWarrior...; don't know yet why they fail when build with
|
|
||||||
gcc though; if you want to compile with Ares support then set an env var
|
|
||||||
WITH_ARES=1; I've not tested yet including libares into curl.
|
|
||||||
Any help in testing appreciated!
|
Any help in testing appreciated!
|
||||||
Builds automatically created 4 times a day from current CVS are here:
|
Builds automatically created 8 times a day from current CVS are here:
|
||||||
http://www.gknw.com/mirror/curl/autobuilds/
|
http://www.gknw.com/mirror/curl/autobuilds/
|
||||||
the status of these builds can be viewed at the autobuild table:
|
the status of these builds can be viewed at the autobuild table:
|
||||||
http://curl.haxx.se/auto/
|
http://curl.haxx.se/auto/
|
||||||
@@ -588,7 +586,7 @@ PORTS
|
|||||||
- Sparc Solaris 2.4, 2.5, 2.5.1, 2.6, 7, 8, 9, 10
|
- Sparc Solaris 2.4, 2.5, 2.5.1, 2.6, 7, 8, 9, 10
|
||||||
- Sparc SunOS 4.1.X
|
- Sparc SunOS 4.1.X
|
||||||
- StrongARM (and other ARM) RISC OS 3.1, 4.02
|
- StrongARM (and other ARM) RISC OS 3.1, 4.02
|
||||||
- StrongARM Linux 2.4
|
- StrongARM/ARM7/ARM9 Linux 2.4, 2.6
|
||||||
- StrongARM NetBSD 1.4.1
|
- StrongARM NetBSD 1.4.1
|
||||||
- Ultrix 4.3a
|
- Ultrix 4.3a
|
||||||
- i386 BeOS
|
- i386 BeOS
|
||||||
|
@@ -3,6 +3,22 @@ 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!
|
||||||
|
|
||||||
|
25. When doing a CONNECT request with curl it doesn't properly handle if the
|
||||||
|
proxy closes the connection within the authentication "negotiation phase".
|
||||||
|
Like if you do HTTPS or similar over a proxy and you use perhaps
|
||||||
|
--proxy-anyauth. There's work in progress on this problem, and a recent
|
||||||
|
patch was posted here: http://curl.haxx.se/mail/lib-2005-08/0074.html
|
||||||
|
|
||||||
|
24. Harshal Pradhan's Use-after-free with libcurl+ares. This probably occurs
|
||||||
|
because there is a pending ares callback that gets called after the
|
||||||
|
connection struct has been freed in libcurl:
|
||||||
|
http://curl.haxx.se/mail/lib-2005-08/0022.html
|
||||||
|
Fixing this properly most likely requires a new c-ares function.
|
||||||
|
|
||||||
|
23. We don't support SOCKS for IPv6. We don't support FTPS over a SOCKS proxy.
|
||||||
|
We don't have any test cases for SOCKS proxy. We probably have even more
|
||||||
|
bugs and lack of features when a SOCKS proxy is used.
|
||||||
|
|
||||||
22. Sending files to a FTP server using curl on VMS, might lead to curl
|
22. Sending files to a FTP server using curl on VMS, might lead to curl
|
||||||
complaining on "unaligned file size" on completion. The problem is related
|
complaining on "unaligned file size" on completion. The problem is related
|
||||||
to VMS file structures and the perceived file sizes stat() returns. A
|
to VMS file structures and the perceived file sizes stat() returns. A
|
||||||
@@ -18,14 +34,6 @@ may have been fixed since this was written!
|
|||||||
specification). The receiver will convert the data from the standard
|
specification). The receiver will convert the data from the standard
|
||||||
form to his own internal form.
|
form to his own internal form.
|
||||||
|
|
||||||
20. valgrind errors occur too often when 'make test' is used. It is because
|
|
||||||
too many third-party libs and tools have problems. When curl is built
|
|
||||||
without --disable-shared, the testing is done with a front-end script which
|
|
||||||
makes the valgrind testing include (ba)sh as well and that often causes
|
|
||||||
valgrind errors. Either we improve the valgrind error scanner a lot to
|
|
||||||
better identify (lib)curl errors only, or we disable valgrind checking by
|
|
||||||
default.
|
|
||||||
|
|
||||||
19. FTP 3rd party transfers with the multi interface doesn't work. Test:
|
19. FTP 3rd party transfers with the multi interface doesn't work. Test:
|
||||||
define CURL_MULTIEASY, rebuild curl, run test case 230 - 232.
|
define CURL_MULTIEASY, rebuild curl, run test case 230 - 232.
|
||||||
|
|
||||||
@@ -42,10 +50,6 @@ may have been fixed since this was written!
|
|||||||
would not meaningfully support NUL characters within RFC 959 <string>,
|
would not meaningfully support NUL characters within RFC 959 <string>,
|
||||||
anyway (e.g., UNIX pathnames may not contain NUL).
|
anyway (e.g., UNIX pathnames may not contain NUL).
|
||||||
|
|
||||||
15. Test case 241 fails on all systems that support IPv6 but that don't have
|
|
||||||
the host name 'ip6-localhost' in /etc/hosts (or similar) since the test case
|
|
||||||
uses that host name to test the IPv6 name to address resolver.
|
|
||||||
|
|
||||||
14. Test case 165 might fail on system which has libidn present, but with an
|
14. Test case 165 might fail on system which has libidn present, but with an
|
||||||
old iconv version (2.1.3 is a known bad version), since it doesn't recognize
|
old iconv version (2.1.3 is a known bad version), since it doesn't recognize
|
||||||
the charset when named ISO8859-1. Changing the name to ISO-8859-1 makes the
|
the charset when named ISO8859-1. Changing the name to ISO-8859-1 makes the
|
||||||
|
@@ -12,12 +12,11 @@ I am not a lawyer and this is not legal advice!
|
|||||||
|
|
||||||
One common dilemma is that GPL[1]-licensed code is not allowed to be linked
|
One common dilemma is that GPL[1]-licensed code is not allowed to be linked
|
||||||
with code licensed under the Original BSD license (with the announcement
|
with code licensed under the Original BSD license (with the announcement
|
||||||
clause, unless there's a specified exception in the GPL-licensed module). You
|
clause). You may still build your own copies that use them all, but
|
||||||
may still build your own copies that use them all, but distributing them as
|
distributing them as binaries would be to violate the GPL license - unless you
|
||||||
binaries would be to violate the GPL license - unless you accompany your
|
accompany your license with an exception[2]. This particular problem was
|
||||||
license with an exception[2]. This particular problem was addressed when the
|
addressed when the Modified BSD license was created, which does not have the
|
||||||
Modified BSD license was created, which does not have the annoncement clause
|
annoncement clause that collides with GPL.
|
||||||
that collides with GPL.
|
|
||||||
|
|
||||||
libcurl http://curl.haxx.se/docs/copyright.html
|
libcurl http://curl.haxx.se/docs/copyright.html
|
||||||
|
|
||||||
@@ -28,29 +27,30 @@ libcurl http://curl.haxx.se/docs/copyright.html
|
|||||||
|
|
||||||
OpenSSL http://www.openssl.org/source/license.html
|
OpenSSL http://www.openssl.org/source/license.html
|
||||||
|
|
||||||
Uses an Original BSD-style license with an announement clause that
|
(May be used for SSL/TLS support) Uses an Original BSD-style license
|
||||||
makes it "incompatible" with GPL. You are not allowed to ship binaries
|
with an announement clause that makes it "incompatible" with GPL. You
|
||||||
that link with OpenSSL that includes GPL code (unless that specific
|
are not allowed to ship binaries that link with OpenSSL that includes
|
||||||
GPL code includes an exception for OpenSSL - a habit that is growing
|
GPL code (unless that specific GPL code includes an exception for
|
||||||
more and more common). If OpenSSL's licensing is a problem for you,
|
OpenSSL - a habit that is growing more and more common). If OpenSSL's
|
||||||
consider using GnuTLS instead.
|
licensing is a problem for you, consider using GnuTLS instead.
|
||||||
|
|
||||||
GnuTLS http://www.gnutls.org/
|
GnuTLS http://www.gnutls.org/
|
||||||
|
|
||||||
Uses the LGPL[3] license. If this is a problem for you, consider using
|
(May be used for SSL/TLS support) Uses the LGPL[3] license. If this is
|
||||||
OpenSSL instead. Also note that GnuTLS itself depends on and uses
|
a problem for you, consider using OpenSSL instead. Also note that
|
||||||
other libs (libgcrypt and libgpg-error) and they too are LGPL- or
|
GnuTLS itself depends on and uses other libs (libgcrypt and
|
||||||
GPL-licensed.
|
libgpg-error) and they too are LGPL- or GPL-licensed.
|
||||||
|
|
||||||
c-ares http://daniel.haxx.se/projects/c-ares/license.html
|
c-ares http://daniel.haxx.se/projects/c-ares/license.html
|
||||||
|
|
||||||
Uses an MIT license that is very liberal and imposes no restrictions
|
(Used for asynchronous name resolves) Uses an MIT license that is very
|
||||||
on any other library or part you may link with.
|
liberal and imposes no restrictions on any other library or part you
|
||||||
|
may link with.
|
||||||
|
|
||||||
zlib http://www.gzip.org/zlib/zlib_license.html
|
zlib http://www.gzip.org/zlib/zlib_license.html
|
||||||
|
|
||||||
Uses an MIT-style license that shouldn't collide with any other
|
(Used for compressed Transfer-Encoding support) Uses an MIT-style
|
||||||
library.
|
license that shouldn't collide with any other library.
|
||||||
|
|
||||||
krb4
|
krb4
|
||||||
|
|
||||||
@@ -60,33 +60,43 @@ krb4
|
|||||||
of the code in libcurl that is written to deal with Kerberos4 likewise
|
of the code in libcurl that is written to deal with Kerberos4 likewise
|
||||||
have such a license.
|
have such a license.
|
||||||
|
|
||||||
GSSAPI
|
MIT Kerberos http://web.mit.edu/kerberos/www/dist/
|
||||||
|
|
||||||
While nothing in particular says that a GSS/Kerberos5 library must use
|
(May be used for GSS support) MIT licensed, that shouldn't collide
|
||||||
any particular license, the one I've used (Heimdal) is Original BSD-
|
with any other parts.
|
||||||
licensed with the announcement clause.
|
|
||||||
|
Heimdal http://www.pdc.kth.se/heimdal/
|
||||||
|
|
||||||
|
(May be used for GSS support) Heimdal is Original BSD licensed with
|
||||||
|
the announcement clause.
|
||||||
|
|
||||||
|
GNU GSS http://www.gnu.org/software/gss/
|
||||||
|
|
||||||
|
(May be used for GSS support) GNU GSS is GPL licensed. Note that you
|
||||||
|
may not distribute binary curl packages that uses this if you build
|
||||||
|
curl to also link and use any Original BSD licensed libraries!
|
||||||
|
|
||||||
fbopenssl
|
fbopenssl
|
||||||
|
|
||||||
Unclear license. Based on its name, I assume that it uses the OpenSSL
|
(Used for SPNEGO support) Unclear license. Based on its name, I assume
|
||||||
license and thus shares the same issues as described for OpenSSL
|
that it uses the OpenSSL license and thus shares the same issues as
|
||||||
above.
|
described for OpenSSL above.
|
||||||
|
|
||||||
libidn http://www.gnu.org/licenses/lgpl.html
|
libidn http://www.gnu.org/licenses/lgpl.html
|
||||||
|
|
||||||
Uses the GNU Lesser General Public License. LGPL is a variation of GPL
|
(Used for IDNA support) Uses the GNU Lesser General Public
|
||||||
with slightly less aggressive "copyleft". This license requires more
|
License. LGPL is a variation of GPL with slightly less aggressive
|
||||||
requirements to be met when distributing binaries, see the license for
|
"copyleft". This license requires more requirements to be met when
|
||||||
details. Also note that if you distribute a binary that includes this
|
distributing binaries, see the license for details. Also note that if
|
||||||
library, you must also include the full LGPL license text. Please
|
you distribute a binary that includes this library, you must also
|
||||||
properly point out what parts of the distributed package that the
|
include the full LGPL license text. Please properly point out what
|
||||||
license addresses.
|
parts of the distributed package that the license addresses.
|
||||||
|
|
||||||
OpenLDAP http://www.openldap.org/software/release/license.html
|
OpenLDAP http://www.openldap.org/software/release/license.html
|
||||||
|
|
||||||
Uses a Modified BSD-style license. Since libcurl uses OpenLDAP as a
|
(Used for LDAP support) Uses a Modified BSD-style license. Since
|
||||||
shared library only, I have not heard of anyone that ships OpenLDAP
|
libcurl uses OpenLDAP as a shared library only, I have not heard of
|
||||||
linked with libcurl in an app.
|
anyone that ships OpenLDAP linked with libcurl in an app.
|
||||||
|
|
||||||
|
|
||||||
[1] = GPL - GNU General Public License: http://www.gnu.org/licenses/gpl.html
|
[1] = GPL - GNU General Public License: http://www.gnu.org/licenses/gpl.html
|
||||||
|
@@ -17,7 +17,7 @@ CLEANFILES = $(GENHTMLPAGES) $(PDFPAGES)
|
|||||||
EXTRA_DIST = MANUAL BUGS CONTRIBUTE FAQ FEATURES INTERNALS SSLCERTS \
|
EXTRA_DIST = MANUAL BUGS CONTRIBUTE FAQ FEATURES INTERNALS SSLCERTS \
|
||||||
README.win32 RESOURCES TODO TheArtOfHttpScripting THANKS VERSIONS \
|
README.win32 RESOURCES TODO TheArtOfHttpScripting THANKS VERSIONS \
|
||||||
KNOWN_BUGS BINDINGS $(man_MANS) $(HTMLPAGES) HISTORY INSTALL \
|
KNOWN_BUGS BINDINGS $(man_MANS) $(HTMLPAGES) HISTORY INSTALL \
|
||||||
$(PDFPAGES) LICENSE-MIXING README.netware
|
$(PDFPAGES) LICENSE-MIXING README.netware DISTRO-DILEMMA
|
||||||
|
|
||||||
MAN2HTML= roffit < $< >$@
|
MAN2HTML= roffit < $< >$@
|
||||||
|
|
||||||
|
535
docs/THANKS
535
docs/THANKS
@@ -4,91 +4,450 @@
|
|||||||
|
|
||||||
If you have contributed but are missing here, please let us know!
|
If you have contributed but are missing here, please let us know!
|
||||||
|
|
||||||
Alan Pinstein, Albert Chin-A-Young, Albert Choy, Aleksandar Milivojevic, Alex
|
Adrian Schuur
|
||||||
aka WindEagle, Alex Neblett, Alex Suykov, Alexander Kourakos, Alexander
|
Alan Pinstein
|
||||||
Krasnostavsky, Alexander Zhuravlev, Alexis Carvalho, Andi Jahja, Andreas Damm,
|
Albert Chin-A-Young
|
||||||
Andreas Olsson, Andreas Rieke, Andrew Francis, Andrew Fuller, Andr<64>s Garc<72>a,
|
Albert Choy
|
||||||
Andy Cedilnik, Andy Serpa, Angus Mackay, Antoine Calando, Anton Kalmykov,
|
Aleksandar Milivojevic
|
||||||
Arkadiusz Miskiewicz, Augustus Saunders, Avery Fay, Ben Greear, Benjamin
|
Alex aka WindEagle
|
||||||
Gerard, Bertrand Demiddelaer, Bjorn Reese, Bj<42>rn Stenberg, Bob Schader, Brad
|
Alex Neblett
|
||||||
Burdick, Brent Beardsley, Brian Akins, Brian R Duffy, Bruce Mitchener, Bryan
|
Alex Suykov
|
||||||
Henderson, Bryan Henderson , Bryan Kemp, Caolan McNamara, Casey O'Donnell,
|
Alexander Kourakos
|
||||||
Chih-Chung Chang, Chris "Bob Bob", Chris Combes, Chris Gaukroger, Chris
|
Alexander Krasnostavsky
|
||||||
Maltby, Christian Kurz, Christian Robottom Reis, Christophe Demory, Christophe
|
Alexander Zhuravlev
|
||||||
Legry, Christopher R. Palmer, Clarence Gardner, Clifford Wolf, Cody Jones,
|
Alexis Carvalho
|
||||||
Colin Watson, Colm Buckley, Cory Nelson, Craig Davison, Craig Markwardt, Cris
|
Andi Jahja
|
||||||
Bailiff, Cyrill Osterwalder, Damien Adant, Dan Becker, Dan C, Dan Fandrich,
|
Andr<EFBFBD>s Garc<72>a
|
||||||
Dan Torop, Dan Zitter, Daniel at touchtunes, Daniel Stenberg, Dave Dribin,
|
Andreas Damm
|
||||||
Dave Halbakken, Dave Hamilton, Dave May, David Byron, David Cohen, David
|
Andreas Olsson
|
||||||
Eriksson, David Houlder, David Hull, David J Meyer, David James, David Kimdon,
|
Andreas Rieke
|
||||||
David LeBlanc, David Odin, David Phillips, David Shaw, David Tarendash, David
|
Andres Garcia
|
||||||
Thiel, Detlef Schmier, Diego Casorran, Dimitris Sarris, Dinar, Dirk
|
Andrew Bushnell
|
||||||
Eddelbuettel, Dirk Manske, Dolbneff A.V, Domenico Andreoli, Dominick Meglio,
|
Andrew Francis
|
||||||
Doug Kaufman, Doug Porter, Douglas E. Wegscheid, Douglas R. Horner, Dustin
|
Andrew Fuller
|
||||||
Boswell, Dylan Ellicott, Dylan Salisbury, Early Ehlinger, Edin Kadribasic,
|
Andy Cedilnik
|
||||||
Ellis Pritchard, Emiliano Ida, Enrico Scholz, Enrik Berkhan, Eric Lavigne,
|
Andy Serpa
|
||||||
Eric Melville, Eric Rautman, Eric Thelin, Eric Vergnaud, Eric Young, Erick
|
Angus Mackay
|
||||||
Nuwendam, Erwan Legrand, Erwin Authried, Evan Jordan, Fabrizio Ammollo, Fedor
|
Antoine Calando
|
||||||
Karpelevitch, Felix von Leitner, Florian Schoppmann, Forrest Cahoon, Frank
|
Anton Kalmykov
|
||||||
Keeney, Frank Ticheler, Fred New, Fred Noz, Frederic Lepied, Gautam Mani, Gaz
|
Arkadiusz Miskiewicz
|
||||||
Iqbal, Georg Horn, Georg Huettenegger, Gerd v. Egidy, Gerhard Herre, Giaslas
|
Augustus Saunders
|
||||||
Georgios, Gilad, Gilbert Ramirez Jr., Gisle Vanem, Giuseppe Attardi, Giuseppe
|
Avery Fay
|
||||||
D'Ambrosio, Glen Nakamura, Glen Scott, Greg Hewgill, Greg Onufer, Grigory
|
Ben Greear
|
||||||
Entin, Guenole Bescon, Guillaume Arluison, Gustaf Hui, Gwenole Beauchesne,
|
Benjamin Gerard
|
||||||
G<EFBFBD>tz Babin-Ebell, G<>nter Knauf, Hamish Mackenzie, Hanno Kranzhoff, Hans
|
Bertrand Demiddelaer
|
||||||
Steegers, Hardeep Singh, Harshal Pradhan, Heikki Korpela, Henrik Storner,
|
Bj<EFBFBD>rn Stenberg
|
||||||
Hzhijun, Ian Ford, Ian Gulliver, Ian Wilkes, Ignacio Vazquez-Abrams, Ilguiz
|
Bjorn Reese
|
||||||
Latypov, Ingo Ralf Blum, Ingo Wilken, Jacky Lam, Jacob Meuser, James Bursa,
|
Bob Schader
|
||||||
James Clancy, James Cone, James Gallagher, James Griffiths, James MacMillan,
|
Brad Burdick
|
||||||
Jamie Lokier, Jamie Wilkinson, Jason S. Priebe, Jean-Claude Chauve, Jean-Louis
|
Brent Beardsley
|
||||||
Lemaire, Jean-Marc Ranger, Jean-Philippe Barrette-LaPierre, Jeff Lawson, Jeff
|
Brian Akins
|
||||||
Phillips, Jeffrey Pohlmeyer, Jeremy Friesner, Jesper Jensen, Jesse Noller, Jim
|
Brian R Duffy
|
||||||
Drash, Joe Halpin, Joel Chen, Johan Anderson, Johan Nilsson, John Crow, John
|
Bruce Mitchener
|
||||||
Janssen, John Lask, John McGowan, Jon Travis, Jon Turner, Jonas Forsman,
|
Bryan Henderson
|
||||||
Jonatan Lander, Jonathan Hseu, Jongki Suwandi, Josh Kapell, Juan F. Codagnone,
|
Bryan Henderson
|
||||||
Juan Ignacio Herv<72>s, Juergen Wilke, Jukka Pihl, Julian Noble, Jun-ichiro
|
Bryan Kemp
|
||||||
itojun Hagino, Jurij Smakov, J<>rg Mueller-Tolk, J<>rn Hartroth, Kai Sommerfeld,
|
Caolan McNamara
|
||||||
Kai-Uwe Rommel, Kang-Jin Lee, Karol Pietrzak, Keith MacDonald, Keith McGuigan,
|
Casey O'Donnell
|
||||||
Ken Hirsch, Ken Rastatter, Kevin Fisk, Kevin Roth, Kimmo Kinnunen, Kjell
|
Chih-Chung Chang
|
||||||
Ericson, Kjetil Jacobsen, Klevtsov Vadim, Kris Kennaway, Krishnendu Majumdar,
|
Chris "Bob Bob"
|
||||||
Kristian K<>hntopp, Kyle Sallee, Lachlan O'Dea, Larry Campbell, Larry Fahnoe,
|
Chris Combes
|
||||||
Lars Gustafsson, Lars J. Aas, Lars Nilsson, Lars Torben Wilson, Legoff
|
Chris Gaukroger
|
||||||
Vincent, Lehel Bernadt, Len Krause, Linas Vepstas, Ling Thio, Linus Nielsen
|
Chris Maltby
|
||||||
Feltzing, Loic Dachary, Loren Kirkby, Luca Altea, Luca Alteas, Lucas Adamski,
|
Christian Kurz
|
||||||
Lukasz Czekierda, Luke Call, Luong Dinh Dung, Maciej W. Rozycki, Marc Boucher,
|
Christian Robottom Reis
|
||||||
Marcelo Juchem , Marcin Konicki, Marco G. Salvagno, Marcus Webster, Mark
|
Christophe Demory
|
||||||
Butler, Markus Moeller, Markus Oberhumer, Martijn Koster, Martin C. Martin,
|
Christophe Legry
|
||||||
Martin Hedenfalk, Marty Kuhrt, Maruko, Massimiliano Ziccardi, Mathias
|
Christopher R. Palmer
|
||||||
Axelsson, Mats Lidell, Matt Veenstra, Matthew Blain, Matthew Clarke, Maurice
|
Clarence Gardner
|
||||||
Barnum, Mekonikum, Mettgut Jamalla, Michael Benedict, Michael Curtis, Michael
|
Clifford Wolf
|
||||||
Mealling, Michal Bonino, Mihai Ionescu, Mike Bytnar, Mike Dobbs, Miklos
|
Cody Jones
|
||||||
Nemeth, Mitz Wark, Mohamed Lrhazi, Mohun Biswas, Moonesamy, Nathan O'Sullivan,
|
Colin Watson
|
||||||
Naveen Noel, Neil Dunbar, Neil Spring, Nic Roets, Nick Gimbrone, Nick Humfrey,
|
Colm Buckley
|
||||||
Nico Baggus, Nicolas Berloquin, Nicolas Croiset, Niels van Tongeren, Nikita
|
Cory Nelson
|
||||||
Schmidt, nk, Nodak Sodak, Oren Tirosh, P R Schaffner, Patrick Bihan-Faou,
|
Craig Davison
|
||||||
Patrick Smith, Paul Harrington, Paul Marquis, Paul Moore, Paul Nolan, Pavel
|
Craig Markwardt
|
||||||
Cenek, Pavel Orehov, Pawel A. Gajda, Pedro Neves, Pete Su, Peter Bray, Peter
|
Cris Bailiff
|
||||||
Forret, Peter Pentchev, Peter Sylvester, Peter Todd, Peter Verhas, Peter
|
Cyrill Osterwalder
|
||||||
Wullinger, Phil Karn, Philip Gladstone, Philippe Hameau, Philippe Raoult,
|
Damien Adant
|
||||||
Pierre, Puneet Pawaia, Rafael Sagula, Ralph Beckmann, Ralph Mitchell, Ramana
|
Dan Becker
|
||||||
Mokkapati, Randy McMurchy, Reinout van Schouwen, Renaud Chaillat, Renaud
|
Dan C
|
||||||
Duhaut, Rene Bernhardt, Rene Rebe, Ricardo Cadime, Rich Gray, Richard Archer,
|
Dan Fandrich
|
||||||
Richard Atterer, Richard Bramante, Richard Cooper, Richard Gorton, Richard
|
Dan Torop
|
||||||
Prescott, Rick Jones, Rick Richardson, Rob Stanzel, Robert D. Young, Robert
|
Dan Zitter
|
||||||
Olson, Robert Weaver, Robin Kay, Rodney Simmons, Roland Krikava, Roland
|
Daniel at touchtunes
|
||||||
Zimmermann, Roman Koifman, Ron Zapp, Rosimildo da Silva, Roy Shan, Rune
|
Daniel Stenberg
|
||||||
Kleveland, Ryan Nelson, S. Moonesamy, Salvador D<>vila, Salvatore Sorrentino,
|
Dave Dribin
|
||||||
Sampo Kellomaki, Samuel D<>az Garc<72>a, Samuel Listopad, Sander Gates, Saul good,
|
Dave Halbakken
|
||||||
Sebastien Willemijns, Sergio Ballestrero, Seshubabu Pasam, Shard, Shawn
|
Dave Hamilton
|
||||||
Poulson, Siddhartha Prakash Jain, Simon Dick, Simon Liu, Spiridonoff A.V,
|
Dave May
|
||||||
Stadler Stephan, Stefan Ulrich, Stephan Bergmann, Stephen Kick, Stephen More,
|
David Byron
|
||||||
Sterling Hughes, Steve Green, Steve Lhomme, Steve Marx, Steve Oliphant, Steven
|
David Cohen
|
||||||
Bazyl, Steven G. Johnson, Stoned Elipot, Sven Neuhaus, swalkaus at yahoo.com,
|
David Eriksson
|
||||||
S<EFBFBD>bastien Willemijns, T. Bharath, T. Yamada, Thomas Schwinge, Thomas Tonino,
|
David Houlder
|
||||||
Tim Baker, Tim Bartley, Tim Costello, Tim Sneddon, Toby Peterson, Tom Benoist,
|
David Hull
|
||||||
Tom Lee, Tom Mattison, Tom Moers, Tom Zerucha, Tomas Pospisek, Tomas Szepe,
|
David J Meyer
|
||||||
Tomasz Lacki, Tommy Tam, Ton Voon, Tor Arntsen, Torsten Foertsch, Toshiyuki
|
David James
|
||||||
Maezawa, Traian Nicolescu, Troels Walsted Hansen, Troy Engel, Ulrich Zadow,
|
David Kimdon
|
||||||
Vincent Bronner, Vincent Penquerc'h, Vincent Sanders, Vojtech Janota, Vojtech
|
David LeBlanc
|
||||||
Minarik, Walter J. Mack, Wayne Haigh, Werner Koch, Wesley Laxton, Wez Furlong,
|
David Odin
|
||||||
Wilfredo Sanchez, Wojciech Zwiefka, Yarram Sunil, Zvi Har'El
|
David Phillips
|
||||||
|
David Shaw
|
||||||
|
David Tarendash
|
||||||
|
David Thiel
|
||||||
|
Detlef Schmier
|
||||||
|
Diego Casorran
|
||||||
|
Dimitris Sarris
|
||||||
|
Dinar
|
||||||
|
Dirk Eddelbuettel
|
||||||
|
Dirk Manske
|
||||||
|
Dolbneff A.V
|
||||||
|
Domenico Andreoli
|
||||||
|
Dominick Meglio
|
||||||
|
Doug Kaufman
|
||||||
|
Doug Porter
|
||||||
|
Douglas E. Wegscheid
|
||||||
|
Douglas R. Horner
|
||||||
|
Dustin Boswell
|
||||||
|
Dylan Ellicott
|
||||||
|
Dylan Salisbury
|
||||||
|
Early Ehlinger
|
||||||
|
Edin Kadribasic
|
||||||
|
Ellis Pritchard
|
||||||
|
Emiliano Ida
|
||||||
|
Enrico Scholz
|
||||||
|
Enrik Berkhan
|
||||||
|
Eric Cooper
|
||||||
|
Eric Lavigne
|
||||||
|
Eric Melville
|
||||||
|
Eric Rautman
|
||||||
|
Eric Thelin
|
||||||
|
Eric Vergnaud
|
||||||
|
Eric Young
|
||||||
|
Erick Nuwendam
|
||||||
|
Erwan Legrand
|
||||||
|
Erwin Authried
|
||||||
|
Evan Jordan
|
||||||
|
Fabrizio Ammollo
|
||||||
|
Fedor Karpelevitch
|
||||||
|
Felix von Leitner
|
||||||
|
Florian Schoppmann
|
||||||
|
Forrest Cahoon
|
||||||
|
Frank Keeney
|
||||||
|
Frank Ticheler
|
||||||
|
Fred New
|
||||||
|
Fred Noz
|
||||||
|
Frederic Lepied
|
||||||
|
G<EFBFBD>nter Knauf
|
||||||
|
G<EFBFBD>tz Babin-Ebell
|
||||||
|
Gautam Mani
|
||||||
|
Gaz Iqbal
|
||||||
|
Georg Horn
|
||||||
|
Georg Huettenegger
|
||||||
|
Georg Wicherski
|
||||||
|
Gerd v. Egidy
|
||||||
|
Gerhard Herre
|
||||||
|
Giaslas Georgios
|
||||||
|
Gilad
|
||||||
|
Gilbert Ramirez Jr.
|
||||||
|
Gisle Vanem
|
||||||
|
Giuseppe Attardi
|
||||||
|
Giuseppe D'Ambrosio
|
||||||
|
Glen Nakamura
|
||||||
|
Glen Scott
|
||||||
|
Greg Hewgill
|
||||||
|
Greg Onufer
|
||||||
|
Grigory Entin
|
||||||
|
Guenole Bescon
|
||||||
|
Guillaume Arluison
|
||||||
|
Gustaf Hui
|
||||||
|
Gwenole Beauchesne
|
||||||
|
Hamish Mackenzie
|
||||||
|
Hanno Kranzhoff
|
||||||
|
Hans Steegers
|
||||||
|
Hardeep Singh
|
||||||
|
Harshal Pradhan
|
||||||
|
Heikki Korpela
|
||||||
|
Henrik Storner
|
||||||
|
Hzhijun
|
||||||
|
Ian Ford
|
||||||
|
Ian Gulliver
|
||||||
|
Ian Wilkes
|
||||||
|
Ignacio Vazquez-Abrams
|
||||||
|
Ilguiz Latypov
|
||||||
|
Ingo Ralf Blum
|
||||||
|
Ingo Wilken
|
||||||
|
J<EFBFBD>rg Mueller-Tolk
|
||||||
|
J<EFBFBD>rn Hartroth
|
||||||
|
Jacky Lam
|
||||||
|
Jacob Meuser
|
||||||
|
James Bursa
|
||||||
|
James Clancy
|
||||||
|
James Cone
|
||||||
|
James Gallagher
|
||||||
|
James Griffiths
|
||||||
|
James MacMillan
|
||||||
|
Jamie Lokier
|
||||||
|
Jamie Wilkinson
|
||||||
|
Jason S. Priebe
|
||||||
|
Jean-Claude Chauve
|
||||||
|
Jean-Louis Lemaire
|
||||||
|
Jean-Marc Ranger
|
||||||
|
Jean-Philippe Barrette-LaPierre
|
||||||
|
Jeff Lawson
|
||||||
|
Jeff Phillips
|
||||||
|
Jeff Pohlmeyer
|
||||||
|
Jeffrey Pohlmeyer
|
||||||
|
Jeremy Friesner
|
||||||
|
Jesper Jensen
|
||||||
|
Jesse Noller
|
||||||
|
Jim Drash
|
||||||
|
Joe Halpin
|
||||||
|
Joel Chen
|
||||||
|
Johan Anderson
|
||||||
|
Johan Nilsson
|
||||||
|
John Crow
|
||||||
|
John Janssen
|
||||||
|
John Lask
|
||||||
|
John McGowan
|
||||||
|
Jon Grubbs
|
||||||
|
Jon Travis
|
||||||
|
Jon Turner
|
||||||
|
Jonas Forsman
|
||||||
|
Jonatan Lander
|
||||||
|
Jonathan Hseu
|
||||||
|
Jongki Suwandi
|
||||||
|
Josh Kapell
|
||||||
|
Juan F. Codagnone
|
||||||
|
Juan Ignacio Herv<72>s
|
||||||
|
Juergen Wilke
|
||||||
|
Jukka Pihl
|
||||||
|
Julian Noble
|
||||||
|
Jun-ichiro itojun Hagino
|
||||||
|
Jurij Smakov
|
||||||
|
Kai Sommerfeld
|
||||||
|
Kai-Uwe Rommel
|
||||||
|
Kang-Jin Lee
|
||||||
|
Karol Pietrzak
|
||||||
|
Keith MacDonald
|
||||||
|
Keith McGuigan
|
||||||
|
Ken Hirsch
|
||||||
|
Ken Rastatter
|
||||||
|
Kevin Fisk
|
||||||
|
Kevin Roth
|
||||||
|
Kimmo Kinnunen
|
||||||
|
Kjell Ericson
|
||||||
|
Kjetil Jacobsen
|
||||||
|
Klevtsov Vadim
|
||||||
|
Kris Kennaway
|
||||||
|
Krishnendu Majumdar
|
||||||
|
Kristian K<>hntopp
|
||||||
|
Kyle Sallee
|
||||||
|
Lachlan O'Dea
|
||||||
|
Larry Campbell
|
||||||
|
Larry Fahnoe
|
||||||
|
Lars Gustafsson
|
||||||
|
Lars J. Aas
|
||||||
|
Lars Nilsson
|
||||||
|
Lars Torben Wilson
|
||||||
|
Legoff Vincent
|
||||||
|
Lehel Bernadt
|
||||||
|
Len Krause
|
||||||
|
Linas Vepstas
|
||||||
|
Ling Thio
|
||||||
|
Linus Nielsen Feltzing
|
||||||
|
Loic Dachary
|
||||||
|
Loren Kirkby
|
||||||
|
Luca Altea
|
||||||
|
Luca Alteas
|
||||||
|
Lucas Adamski
|
||||||
|
Lukasz Czekierda
|
||||||
|
Luke Call
|
||||||
|
Luong Dinh Dung
|
||||||
|
Maciej W. Rozycki
|
||||||
|
Marc Boucher
|
||||||
|
Marcelo Juchem
|
||||||
|
Marcin Konicki
|
||||||
|
Marco G. Salvagno
|
||||||
|
Marcus Webster
|
||||||
|
Mario Schroeder
|
||||||
|
Mark Butler
|
||||||
|
Markus Moeller
|
||||||
|
Markus Oberhumer
|
||||||
|
Martijn Koster
|
||||||
|
Martin C. Martin
|
||||||
|
Martin Hedenfalk
|
||||||
|
Marty Kuhrt
|
||||||
|
Maruko
|
||||||
|
Massimiliano Ziccardi
|
||||||
|
Mathias Axelsson
|
||||||
|
Mats Lidell
|
||||||
|
Matt Veenstra
|
||||||
|
Matthew Blain
|
||||||
|
Matthew Clarke
|
||||||
|
Maurice Barnum
|
||||||
|
Mekonikum
|
||||||
|
Mettgut Jamalla
|
||||||
|
Michael Benedict
|
||||||
|
Michael Curtis
|
||||||
|
Michael Mealling
|
||||||
|
Michal Bonino
|
||||||
|
Mihai Ionescu
|
||||||
|
Mike Bytnar
|
||||||
|
Mike Dobbs
|
||||||
|
Miklos Nemeth
|
||||||
|
Mitz Wark
|
||||||
|
Mohamed Lrhazi
|
||||||
|
Mohun Biswas
|
||||||
|
Moonesamy
|
||||||
|
Nathan O'Sullivan
|
||||||
|
Naveen Noel
|
||||||
|
Neil Dunbar
|
||||||
|
Neil Spring
|
||||||
|
Nic Roets
|
||||||
|
Nick Gimbrone
|
||||||
|
Nick Humfrey
|
||||||
|
Nico Baggus
|
||||||
|
Nicolas Berloquin
|
||||||
|
Nicolas Croiset
|
||||||
|
Niels van Tongeren
|
||||||
|
Nikita Schmidt
|
||||||
|
nk
|
||||||
|
Nodak Sodak
|
||||||
|
Oren Tirosh
|
||||||
|
P R Schaffner
|
||||||
|
Patrick Bihan-Faou
|
||||||
|
Patrick Smith
|
||||||
|
Paul Harrington
|
||||||
|
Paul Marquis
|
||||||
|
Paul Moore
|
||||||
|
Paul Nolan
|
||||||
|
Pavel Cenek
|
||||||
|
Pavel Orehov
|
||||||
|
Pawel A. Gajda
|
||||||
|
Pedro Neves
|
||||||
|
Pete Su
|
||||||
|
Peter Bray
|
||||||
|
Peter Forret
|
||||||
|
Peter Pentchev
|
||||||
|
Peter Sylvester
|
||||||
|
Peter Todd
|
||||||
|
Peter Verhas
|
||||||
|
Peter Wullinger
|
||||||
|
Peteris Krumins
|
||||||
|
Phil Karn
|
||||||
|
Philip Gladstone
|
||||||
|
Philippe Hameau
|
||||||
|
Philippe Raoult
|
||||||
|
Pierre
|
||||||
|
Puneet Pawaia
|
||||||
|
Rafael Sagula
|
||||||
|
Ralph Beckmann
|
||||||
|
Ralph Mitchell
|
||||||
|
Ramana Mokkapati
|
||||||
|
Randy McMurchy
|
||||||
|
Reinout van Schouwen
|
||||||
|
Renaud Chaillat
|
||||||
|
Renaud Duhaut
|
||||||
|
Rene Bernhardt
|
||||||
|
Rene Rebe
|
||||||
|
Ricardo Cadime
|
||||||
|
Rich Gray
|
||||||
|
Richard Archer
|
||||||
|
Richard Atterer
|
||||||
|
Richard Bramante
|
||||||
|
Richard Clayton
|
||||||
|
Richard Cooper
|
||||||
|
Richard Gorton
|
||||||
|
Richard Prescott
|
||||||
|
Rick Jones
|
||||||
|
Rick Richardson
|
||||||
|
Rob Stanzel
|
||||||
|
Robert D. Young
|
||||||
|
Robert Olson
|
||||||
|
Robert Weaver
|
||||||
|
Robin Kay
|
||||||
|
Rodney Simmons
|
||||||
|
Roland Krikava
|
||||||
|
Roland Zimmermann
|
||||||
|
Roman Koifman
|
||||||
|
Ron Zapp
|
||||||
|
Rosimildo da Silva
|
||||||
|
Roy Shan
|
||||||
|
Rune Kleveland
|
||||||
|
Ryan Nelson
|
||||||
|
S<EFBFBD>bastien Willemijns
|
||||||
|
S. Moonesamy
|
||||||
|
Salvador D<>vila
|
||||||
|
Salvatore Sorrentino
|
||||||
|
Sampo Kellomaki
|
||||||
|
Samuel D<>az Garc<72>a
|
||||||
|
Samuel Listopad
|
||||||
|
Sander Gates
|
||||||
|
Saul good
|
||||||
|
Sebastien Willemijns
|
||||||
|
Sergio Ballestrero
|
||||||
|
Seshubabu Pasam
|
||||||
|
Shard
|
||||||
|
Shawn Poulson
|
||||||
|
Siddhartha Prakash Jain
|
||||||
|
Simon Dick
|
||||||
|
Simon Liu
|
||||||
|
Spiridonoff A.V
|
||||||
|
Stadler Stephan
|
||||||
|
Stefan Ulrich
|
||||||
|
Stephan Bergmann
|
||||||
|
Stephen Kick
|
||||||
|
Stephen More
|
||||||
|
Sterling Hughes
|
||||||
|
Steve Green
|
||||||
|
Steve Lhomme
|
||||||
|
Steve Marx
|
||||||
|
Steve Oliphant
|
||||||
|
Steven Bazyl
|
||||||
|
Steven G. Johnson
|
||||||
|
Stoned Elipot
|
||||||
|
Sven Neuhaus
|
||||||
|
swalkaus at yahoo.com
|
||||||
|
T. Bharath
|
||||||
|
T. Yamada
|
||||||
|
Thomas Schwinge
|
||||||
|
Thomas Tonino
|
||||||
|
Tim Baker
|
||||||
|
Tim Bartley
|
||||||
|
Tim Costello
|
||||||
|
Tim Sneddon
|
||||||
|
Toby Peterson
|
||||||
|
Todd Kulesza
|
||||||
|
Tom Benoist
|
||||||
|
Tom Lee
|
||||||
|
Tom Mattison
|
||||||
|
Tom Moers
|
||||||
|
Tom Zerucha
|
||||||
|
Tomas Pospisek
|
||||||
|
Tomas Szepe
|
||||||
|
Tomasz Lacki
|
||||||
|
Tommy Tam
|
||||||
|
Ton Voon
|
||||||
|
Tor Arntsen
|
||||||
|
Torsten Foertsch
|
||||||
|
Toshiyuki Maezawa
|
||||||
|
Traian Nicolescu
|
||||||
|
Troels Walsted Hansen
|
||||||
|
Troy Engel
|
||||||
|
Tupone Alfredo
|
||||||
|
Ulrich Zadow
|
||||||
|
Vincent Bronner
|
||||||
|
Vincent Penquerc'h
|
||||||
|
Vincent Sanders
|
||||||
|
Vojtech Janota
|
||||||
|
Vojtech Minarik
|
||||||
|
Walter J. Mack
|
||||||
|
Wayne Haigh
|
||||||
|
Werner Koch
|
||||||
|
Wesley Laxton
|
||||||
|
Wez Furlong
|
||||||
|
Wilfredo Sanchez
|
||||||
|
Wojciech Zwiefka
|
||||||
|
Yarram Sunil
|
||||||
|
Zvi Har'El
|
||||||
|
33
docs/TODO
33
docs/TODO
@@ -40,6 +40,9 @@ TODO
|
|||||||
* Add the following to curl_easy_getinfo(): GET_HTTP_IP, GET_FTP_IP and
|
* Add the following to curl_easy_getinfo(): GET_HTTP_IP, GET_FTP_IP and
|
||||||
GET_FTP_DATA_IP. Return a string with the used IP. Suggested by Alan.
|
GET_FTP_DATA_IP. Return a string with the used IP. Suggested by Alan.
|
||||||
|
|
||||||
|
* Add option that changes the interval in which the progress callback is
|
||||||
|
called at most.
|
||||||
|
|
||||||
LIBCURL - multi interface
|
LIBCURL - multi interface
|
||||||
|
|
||||||
* Add a curl_multi_fdset() alternative. this allows apps to avoid the
|
* Add a curl_multi_fdset() alternative. this allows apps to avoid the
|
||||||
@@ -58,6 +61,17 @@ TODO
|
|||||||
ready to accept read data. Today libcurl feeds the data as soon as it is
|
ready to accept read data. Today libcurl feeds the data as soon as it is
|
||||||
available for reading, no matter what.
|
available for reading, no matter what.
|
||||||
|
|
||||||
|
* Add curl_multi_socket() and family to the multi interface that gets file
|
||||||
|
descriptors, as an alternative to the curl_multi_fdset(). This is necessary
|
||||||
|
to allow apps to properly avoid the FD_SETSIZE problem.
|
||||||
|
|
||||||
|
* Make curl_easy_perform() a wrapper-function that simply creates a multi
|
||||||
|
handle, adds the easy handle to it, runs curl_multi_perform() until the
|
||||||
|
transfer is done, then detach the easy handle, destroy the multi handle and
|
||||||
|
return the easy handle's return code. This will thus make everything
|
||||||
|
internally use and assume the multi interface. The select()-loop should use
|
||||||
|
curl_multi_socket().
|
||||||
|
|
||||||
DOCUMENTATION
|
DOCUMENTATION
|
||||||
|
|
||||||
* More and better
|
* More and better
|
||||||
@@ -149,6 +163,25 @@ TODO
|
|||||||
latter two could be alternatives for those looking to reduce the footprint
|
latter two could be alternatives for those looking to reduce the footprint
|
||||||
of libcurl built with OpenSSL or GnuTLS.
|
of libcurl built with OpenSSL or GnuTLS.
|
||||||
|
|
||||||
|
* Peter Sylvester's patch for SRP on the TLS layer.
|
||||||
|
Awaits OpenSSL support for this, no need to support this in libcurl before
|
||||||
|
there's an OpenSSL release that does it.
|
||||||
|
|
||||||
|
* make the configure --with-ssl option first check for OpenSSL and then for
|
||||||
|
GnuTLS if OpenSSL wasn't detected.
|
||||||
|
|
||||||
|
GnuTLS
|
||||||
|
|
||||||
|
* Get NTLM working using the functions provided by libgcrypt, since GnuTLS
|
||||||
|
already depends on that to function. Not strictly SSL/TLS related, but
|
||||||
|
hey... Another option is to get available DES and MD4 source code from the
|
||||||
|
cryptopp library. They are fine license-wise, but are C++.
|
||||||
|
|
||||||
|
* SSL engine stuff?
|
||||||
|
|
||||||
|
* Work out a common method with Peter Sylvester's OpenSSL-patch for SRP
|
||||||
|
on the TLS to provide name and password
|
||||||
|
|
||||||
LDAP
|
LDAP
|
||||||
|
|
||||||
* Look over the implementation. The looping will have to "go away" from the
|
* Look over the implementation. The looping will have to "go away" from the
|
||||||
|
34
docs/curl.1
34
docs/curl.1
@@ -21,7 +21,7 @@
|
|||||||
.\" * $Id$
|
.\" * $Id$
|
||||||
.\" **************************************************************************
|
.\" **************************************************************************
|
||||||
.\"
|
.\"
|
||||||
.TH curl 1 "28 Apr 2005" "Curl 7.14.0" "Curl Manual"
|
.TH curl 1 "12 Aug 2005" "Curl 7.14.1" "Curl Manual"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
curl \- transfer a URL
|
curl \- transfer a URL
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
@@ -421,9 +421,19 @@ set headers without knowing perfectly well what you're doing. Replacing an
|
|||||||
internal header with one without content on the right side of the colon will
|
internal header with one without content on the right side of the colon will
|
||||||
prevent that header from appearing.
|
prevent that header from appearing.
|
||||||
|
|
||||||
|
curl will make sure that each header you add/replace get sent with the proper
|
||||||
|
end of line marker, you should thus \fBnot\fP add that as a part of the header
|
||||||
|
content: do not add newlines or carriage returns they will only mess things up
|
||||||
|
for you.
|
||||||
|
|
||||||
See also the \fI-A/--user-agent\fP and \fI-e/--referer\fP options.
|
See also the \fI-A/--user-agent\fP and \fI-e/--referer\fP options.
|
||||||
|
|
||||||
This option can be used multiple times to add/replace/remove multiple headers.
|
This option can be used multiple times to add/replace/remove multiple headers.
|
||||||
|
.IP "--ignore-content-length"
|
||||||
|
(HTTP)
|
||||||
|
Ignore the Content-Length header. This is particularly useful for servers
|
||||||
|
running Apache 1.x, which will report incorrect Content-Length for files
|
||||||
|
larger than 2 gigabytes.
|
||||||
.IP "-i/--include"
|
.IP "-i/--include"
|
||||||
(HTTP)
|
(HTTP)
|
||||||
Include the HTTP-header in the output. The HTTP-header includes things
|
Include the HTTP-header in the output. The HTTP-header includes things
|
||||||
@@ -958,11 +968,11 @@ SSPI is supported. If you use NTLM and set a blank user name, curl will
|
|||||||
authenticate with your current user and password.
|
authenticate with your current user and password.
|
||||||
.RE
|
.RE
|
||||||
.IP "-w/--write-out <format>"
|
.IP "-w/--write-out <format>"
|
||||||
Defines what to display after a completed and successful operation. The format
|
Defines what to display on stdout after a completed and successful
|
||||||
is a string that may contain plain text mixed with any number of variables. The
|
operation. The format is a string that may contain plain text mixed with any
|
||||||
string can be specified as "string", to get read from a particular file you
|
number of variables. The string can be specified as "string", to get read from
|
||||||
specify it "@filename" and to tell curl to read the format from stdin you
|
a particular file you specify it "@filename" and to tell curl to read the
|
||||||
write "@-".
|
format from stdin you write "@-".
|
||||||
|
|
||||||
The variables present in the output format will be substituted by the value or
|
The variables present in the output format will be substituted by the value or
|
||||||
text that curl thinks fit, as described below. All variables are specified
|
text that curl thinks fit, as described below. All variables are specified
|
||||||
@@ -1058,12 +1068,16 @@ transparently be converted to HTTP. It means that certain protocol specific
|
|||||||
operations might not be available. This is not the case if you can tunnel
|
operations might not be available. This is not the case if you can tunnel
|
||||||
through the proxy, as done with the \fI-p/--proxytunnel\fP option.
|
through the proxy, as done with the \fI-p/--proxytunnel\fP option.
|
||||||
|
|
||||||
|
Starting with 7.14.1, the proxy host can be specified the exact same way as
|
||||||
|
the proxy environment variables, include protocol prefix (http://) and
|
||||||
|
embedded user + password.
|
||||||
|
|
||||||
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 "-X/--request <command>"
|
.IP "-X/--request <command>"
|
||||||
(HTTP)
|
(HTTP) Specifies a custom request method to use when communicating with the
|
||||||
Specifies a custom request to use when communicating with the HTTP server.
|
HTTP server. The specified request will be used instead of the method
|
||||||
The specified request will be used instead of the standard GET. Read the
|
otherwise used (which defaults to GET). Read the HTTP 1.1 specification for
|
||||||
HTTP 1.1 specification for details and explanations.
|
details and explanations.
|
||||||
|
|
||||||
(FTP)
|
(FTP)
|
||||||
Specifies a custom FTP command to use instead of LIST when doing file lists
|
Specifies a custom FTP command to use instead of LIST when doing file lists
|
||||||
|
@@ -10,7 +10,8 @@ EXTRA_DIST = README curlgtk.c sepheaders.c simple.c postit2.c \
|
|||||||
post-callback.c multi-app.c multi-double.c multi-single.c \
|
post-callback.c multi-app.c multi-double.c multi-single.c \
|
||||||
multi-post.c fopen.c simplepost.c makefile.dj curlx.c https.c \
|
multi-post.c fopen.c simplepost.c makefile.dj curlx.c https.c \
|
||||||
multi-debugcallback.c fileupload.c getinfo.c ftp3rdparty.c debug.c \
|
multi-debugcallback.c fileupload.c getinfo.c ftp3rdparty.c debug.c \
|
||||||
anyauthput.c htmltitle.cc htmltidy.c opensslthreadlock.c
|
anyauthput.c htmltitle.cc htmltidy.c opensslthreadlock.c \
|
||||||
|
cookie_interface.c cacertinmem.c
|
||||||
|
|
||||||
all:
|
all:
|
||||||
@echo "done"
|
@echo "done"
|
||||||
|
138
docs/examples/cacertinmem.c
Normal file
138
docs/examples/cacertinmem.c
Normal file
@@ -0,0 +1,138 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* _ _ ____ _
|
||||||
|
* Project ___| | | | _ \| |
|
||||||
|
* / __| | | | |_) | |
|
||||||
|
* | (__| |_| | _ <| |___
|
||||||
|
* \___|\___/|_| \_\_____|
|
||||||
|
*
|
||||||
|
* $Id$
|
||||||
|
*
|
||||||
|
* Example using a "in core" PEM certificate to retrieve a https page.
|
||||||
|
* Written by Theo Borm
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* on a netBSD system with OPENSSL& LIBCURL installed from
|
||||||
|
* pkgsrc (using default paths) this program can be compiled using:
|
||||||
|
* gcc -I/usr/pkg/include -L/usr/pkg/lib -lcurl -Wl,-R/usr/pkg/lib -lssl
|
||||||
|
* -lcrypto -lz -o curlcacerttest curlcacerttest.c
|
||||||
|
* on other operating systems you may want to change paths to headers
|
||||||
|
* and libraries
|
||||||
|
*/
|
||||||
|
#include <openssl/ssl.h>
|
||||||
|
#include <curl/curl.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
size_t writefunction( void *ptr, size_t size, size_t nmemb, void *stream)
|
||||||
|
{
|
||||||
|
fwrite(ptr,size,nmemb,stream);
|
||||||
|
return(nmemb*size);
|
||||||
|
}
|
||||||
|
|
||||||
|
static CURLcode sslctx_function(CURL * curl, void * sslctx, void * parm)
|
||||||
|
{
|
||||||
|
X509_STORE * store;
|
||||||
|
X509 * cert=NULL;
|
||||||
|
BIO * bio;
|
||||||
|
char * mypem = /* www.cacert.org */
|
||||||
|
"-----BEGIN CERTIFICATE-----\n"\
|
||||||
|
"MIIHPTCCBSWgAwIBAgIBADANBgkqhkiG9w0BAQQFADB5MRAwDgYDVQQKEwdSb290\n"\
|
||||||
|
"IENBMR4wHAYDVQQLExVodHRwOi8vd3d3LmNhY2VydC5vcmcxIjAgBgNVBAMTGUNB\n"\
|
||||||
|
"IENlcnQgU2lnbmluZyBBdXRob3JpdHkxITAfBgkqhkiG9w0BCQEWEnN1cHBvcnRA\n"\
|
||||||
|
"Y2FjZXJ0Lm9yZzAeFw0wMzAzMzAxMjI5NDlaFw0zMzAzMjkxMjI5NDlaMHkxEDAO\n"\
|
||||||
|
"BgNVBAoTB1Jvb3QgQ0ExHjAcBgNVBAsTFWh0dHA6Ly93d3cuY2FjZXJ0Lm9yZzEi\n"\
|
||||||
|
"MCAGA1UEAxMZQ0EgQ2VydCBTaWduaW5nIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJ\n"\
|
||||||
|
"ARYSc3VwcG9ydEBjYWNlcnQub3JnMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC\n"\
|
||||||
|
"CgKCAgEAziLA4kZ97DYoB1CW8qAzQIxL8TtmPzHlawI229Z89vGIj053NgVBlfkJ\n"\
|
||||||
|
"8BLPRoZzYLdufujAWGSuzbCtRRcMY/pnCujW0r8+55jE8Ez64AO7NV1sId6eINm6\n"\
|
||||||
|
"zWYyN3L69wj1x81YyY7nDl7qPv4coRQKFWyGhFtkZip6qUtTefWIonvuLwphK42y\n"\
|
||||||
|
"fk1WpRPs6tqSnqxEQR5YYGUFZvjARL3LlPdCfgv3ZWiYUQXw8wWRBB0bF4LsyFe7\n"\
|
||||||
|
"w2t6iPGwcswlWyCR7BYCEo8y6RcYSNDHBS4CMEK4JZwFaz+qOqfrU0j36NK2B5jc\n"\
|
||||||
|
"G8Y0f3/JHIJ6BVgrCFvzOKKrF11myZjXnhCLotLddJr3cQxyYN/Nb5gznZY0dj4k\n"\
|
||||||
|
"epKwDpUeb+agRThHqtdB7Uq3EvbXG4OKDy7YCbZZ16oE/9KTfWgu3YtLq1i6L43q\n"\
|
||||||
|
"laegw1SJpfvbi1EinbLDvhG+LJGGi5Z4rSDTii8aP8bQUWWHIbEZAWV/RRyH9XzQ\n"\
|
||||||
|
"QUxPKZgh/TMfdQwEUfoZd9vUFBzugcMd9Zi3aQaRIt0AUMyBMawSB3s42mhb5ivU\n"\
|
||||||
|
"fslfrejrckzzAeVLIL+aplfKkQABi6F1ITe1Yw1nPkZPcCBnzsXWWdsC4PDSy826\n"\
|
||||||
|
"YreQQejdIOQpvGQpQsgi3Hia/0PsmBsJUUtaWsJx8cTLc6nloQsCAwEAAaOCAc4w\n"\
|
||||||
|
"ggHKMB0GA1UdDgQWBBQWtTIb1Mfz4OaO873SsDrusjkY0TCBowYDVR0jBIGbMIGY\n"\
|
||||||
|
"gBQWtTIb1Mfz4OaO873SsDrusjkY0aF9pHsweTEQMA4GA1UEChMHUm9vdCBDQTEe\n"\
|
||||||
|
"MBwGA1UECxMVaHR0cDovL3d3dy5jYWNlcnQub3JnMSIwIAYDVQQDExlDQSBDZXJ0\n"\
|
||||||
|
"IFNpZ25pbmcgQXV0aG9yaXR5MSEwHwYJKoZIhvcNAQkBFhJzdXBwb3J0QGNhY2Vy\n"\
|
||||||
|
"dC5vcmeCAQAwDwYDVR0TAQH/BAUwAwEB/zAyBgNVHR8EKzApMCegJaAjhiFodHRw\n"\
|
||||||
|
"czovL3d3dy5jYWNlcnQub3JnL3Jldm9rZS5jcmwwMAYJYIZIAYb4QgEEBCMWIWh0\n"\
|
||||||
|
"dHBzOi8vd3d3LmNhY2VydC5vcmcvcmV2b2tlLmNybDA0BglghkgBhvhCAQgEJxYl\n"\
|
||||||
|
"aHR0cDovL3d3dy5jYWNlcnQub3JnL2luZGV4LnBocD9pZD0xMDBWBglghkgBhvhC\n"\
|
||||||
|
"AQ0ESRZHVG8gZ2V0IHlvdXIgb3duIGNlcnRpZmljYXRlIGZvciBGUkVFIGhlYWQg\n"\
|
||||||
|
"b3ZlciB0byBodHRwOi8vd3d3LmNhY2VydC5vcmcwDQYJKoZIhvcNAQEEBQADggIB\n"\
|
||||||
|
"ACjH7pyCArpcgBLKNQodgW+JapnM8mgPf6fhjViVPr3yBsOQWqy1YPaZQwGjiHCc\n"\
|
||||||
|
"nWKdpIevZ1gNMDY75q1I08t0AoZxPuIrA2jxNGJARjtT6ij0rPtmlVOKTV39O9lg\n"\
|
||||||
|
"18p5aTuxZZKmxoGCXJzN600BiqXfEVWqFcofN8CCmHBh22p8lqOOLlQ+TyGpkO/c\n"\
|
||||||
|
"gr/c6EWtTZBzCDyUZbAEmXZ/4rzCahWqlwQ3JNgelE5tDlG+1sSPypZt90Pf6DBl\n"\
|
||||||
|
"Jzt7u0NDY8RD97LsaMzhGY4i+5jhe1o+ATc7iwiwovOVThrLm82asduycPAtStvY\n"\
|
||||||
|
"sONvRUgzEv/+PDIqVPfE94rwiCPCR/5kenHA0R6mY7AHfqQv0wGP3J8rtsYIqQ+T\n"\
|
||||||
|
"SCX8Ev2fQtzzxD72V7DX3WnRBnc0CkvSyqD/HMaMyRa+xMwyN2hzXwj7UfdJUzYF\n"\
|
||||||
|
"CpUCTPJ5GhD22Dp1nPMd8aINcGeGG7MW9S/lpOt5hvk9C8JzC6WZrG/8Z7jlLwum\n"\
|
||||||
|
"GCSNe9FINSkYQKyTYOGWhlC0elnYjyELn8+CkcY7v2vcB5G5l1YjqrZslMZIBjzk\n"\
|
||||||
|
"zk6q5PYvCdxTby78dOs6Y5nCpqyJvKeyRKANihDjbPIky/qbn3BHLt4Ui9SyIAmW\n"\
|
||||||
|
"omTxJBzcoTWcFbLUvFUufQb1nA5V9FrWk9p2rSVzTMVD\n"\
|
||||||
|
"-----END CERTIFICATE-----\n";
|
||||||
|
/* get a BIO */
|
||||||
|
bio=BIO_new_mem_buf(mypem, -1);
|
||||||
|
/* use it to read the PEM formatted certificate from memory into an X509
|
||||||
|
* structure that SSL can use
|
||||||
|
*/
|
||||||
|
PEM_read_bio_X509(bio, &cert, 0, NULL);
|
||||||
|
if (cert == NULL)
|
||||||
|
printf("PEM_read_bio_X509 failed...\n");
|
||||||
|
|
||||||
|
/* get a pointer to the X509 certificate store (which may be empty!) */
|
||||||
|
store=SSL_CTX_get_cert_store((SSL_CTX *)sslctx);
|
||||||
|
|
||||||
|
/* add our certificate to this store */
|
||||||
|
if (X509_STORE_add_cert(store, cert)==0)
|
||||||
|
printf("error adding certificate\n");
|
||||||
|
|
||||||
|
/* all set to go */
|
||||||
|
return CURLE_OK ;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
CURL * ch;
|
||||||
|
CURLcode rv;
|
||||||
|
|
||||||
|
rv=curl_global_init(CURL_GLOBAL_ALL);
|
||||||
|
ch=curl_easy_init();
|
||||||
|
rv=curl_easy_setopt(ch,CURLOPT_VERBOSE, 0);
|
||||||
|
rv=curl_easy_setopt(ch,CURLOPT_HEADER, 0);
|
||||||
|
rv=curl_easy_setopt(ch,CURLOPT_NOPROGRESS, 1);
|
||||||
|
rv=curl_easy_setopt(ch,CURLOPT_NOSIGNAL, 1);
|
||||||
|
rv=curl_easy_setopt(ch,CURLOPT_WRITEFUNCTION, *writefunction);
|
||||||
|
rv=curl_easy_setopt(ch,CURLOPT_WRITEDATA, stdout);
|
||||||
|
rv=curl_easy_setopt(ch,CURLOPT_HEADERFUNCTION, *writefunction);
|
||||||
|
rv=curl_easy_setopt(ch,CURLOPT_WRITEHEADER, stderr);
|
||||||
|
rv=curl_easy_setopt(ch,CURLOPT_SSLCERTTYPE,"PEM");
|
||||||
|
rv=curl_easy_setopt(ch,CURLOPT_SSL_VERIFYPEER,1);
|
||||||
|
rv=curl_easy_setopt(ch, CURLOPT_URL, "https://www.cacert.org/");
|
||||||
|
|
||||||
|
/* first try: retrieve page without cacerts' certificate -> will fail
|
||||||
|
*/
|
||||||
|
rv=curl_easy_perform(ch);
|
||||||
|
if (rv==CURLE_OK)
|
||||||
|
printf("*** transfer succeeded ***\n");
|
||||||
|
else
|
||||||
|
printf("*** transfer failed ***\n");
|
||||||
|
|
||||||
|
/* second try: retrieve page using cacerts' certificate -> will succeed
|
||||||
|
* load the certificate by installing a function doing the nescessary
|
||||||
|
* "modifications" to the SSL CONTEXT just before link init
|
||||||
|
*/
|
||||||
|
rv=curl_easy_setopt(ch,CURLOPT_SSL_CTX_FUNCTION, *sslctx_function);
|
||||||
|
rv=curl_easy_perform(ch);
|
||||||
|
if (rv==CURLE_OK)
|
||||||
|
printf("*** transfer succeeded ***\n");
|
||||||
|
else
|
||||||
|
printf("*** transfer failed ***\n");
|
||||||
|
|
||||||
|
curl_easy_cleanup(ch);
|
||||||
|
curl_global_cleanup();
|
||||||
|
}
|
110
docs/examples/cookie_interface.c
Normal file
110
docs/examples/cookie_interface.c
Normal file
@@ -0,0 +1,110 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* _ _ ____ _
|
||||||
|
* Project ___| | | | _ \| |
|
||||||
|
* / __| | | | |_) | |
|
||||||
|
* | (__| |_| | _ <| |___
|
||||||
|
* \___|\___/|_| \_\_____|
|
||||||
|
*
|
||||||
|
* This example shows usage of simple cookie interface.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
|
#include <curl/curl.h>
|
||||||
|
|
||||||
|
static void
|
||||||
|
print_cookies(CURL *curl)
|
||||||
|
{
|
||||||
|
CURLcode res;
|
||||||
|
struct curl_slist *cookies;
|
||||||
|
struct curl_slist *nc;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
printf("Cookies, curl knows:\n");
|
||||||
|
res = curl_easy_getinfo(curl, CURLINFO_COOKIELIST, &cookies);
|
||||||
|
if (res != CURLE_OK) {
|
||||||
|
fprintf(stderr, "Curl curl_easy_getinfo failed: %s\n", curl_easy_strerror(res));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
nc = cookies, i = 1;
|
||||||
|
while (nc) {
|
||||||
|
printf("[%d]: %s\n", i, nc->data);
|
||||||
|
nc = nc->next;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
if (i == 1) {
|
||||||
|
printf("(none)\n");
|
||||||
|
}
|
||||||
|
curl_slist_free_all(cookies);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main(void)
|
||||||
|
{
|
||||||
|
CURL *curl;
|
||||||
|
CURLcode res;
|
||||||
|
|
||||||
|
curl_global_init(CURL_GLOBAL_ALL);
|
||||||
|
curl = curl_easy_init();
|
||||||
|
if (curl) {
|
||||||
|
char nline[256];
|
||||||
|
|
||||||
|
curl_easy_setopt(curl, CURLOPT_URL, "http://www.google.com/"); /* google.com sets "PREF" cookie */
|
||||||
|
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);
|
||||||
|
curl_easy_setopt(curl, CURLOPT_COOKIEFILE, ""); /* just to start the cookie engine */
|
||||||
|
res = curl_easy_perform(curl);
|
||||||
|
if (res != CURLE_OK) {
|
||||||
|
fprintf(stderr, "Curl perform failed: %s\n", curl_easy_strerror(res));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
print_cookies(curl);
|
||||||
|
|
||||||
|
printf("Erasing curl's knowledge of cookies!\n");
|
||||||
|
curl_easy_setopt(curl, CURLOPT_COOKIELIST, "ALL");
|
||||||
|
|
||||||
|
print_cookies(curl);
|
||||||
|
|
||||||
|
printf("-----------------------------------------------\n"
|
||||||
|
"Setting a cookie \"PREF\" via cookie interface:\n");
|
||||||
|
#ifdef WIN32
|
||||||
|
#define snprintf _snprintf
|
||||||
|
#endif
|
||||||
|
/* Netscape format cookie */
|
||||||
|
snprintf(nline, 256, "%s\t%s\t%s\t%s\t%u\t%s\t%s",
|
||||||
|
".google.com", "TRUE", "/", "FALSE", time(NULL) + 31337, "PREF", "hello google, i like you very much!");
|
||||||
|
res = curl_easy_setopt(curl, CURLOPT_COOKIELIST, nline);
|
||||||
|
if (res != CURLE_OK) {
|
||||||
|
fprintf(stderr, "Curl curl_easy_setopt failed: %s\n", curl_easy_strerror(res));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* HTTP-header style cookie */
|
||||||
|
snprintf(nline, 256,
|
||||||
|
"Set-Cookie: OLD_PREF=3d141414bf4209321; "
|
||||||
|
"expires=Sun, 17-Jan-2038 19:14:07 GMT; path=/; domain=.google.com");
|
||||||
|
res = curl_easy_setopt(curl, CURLOPT_COOKIELIST, nline);
|
||||||
|
if (res != CURLE_OK) {
|
||||||
|
fprintf(stderr, "Curl curl_easy_setopt failed: %s\n", curl_easy_strerror(res));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
print_cookies(curl);
|
||||||
|
|
||||||
|
res = curl_easy_perform(curl);
|
||||||
|
if (res != CURLE_OK) {
|
||||||
|
fprintf(stderr, "Curl perform failed: %s\n", curl_easy_strerror(res));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
fprintf(stderr, "Curl init failed!\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
curl_global_cleanup();
|
||||||
|
return 0;
|
||||||
|
}
|
@@ -20,7 +20,8 @@ PROGRAMS = fopen.exe ftpget.exe ftpgetresp.exe ftpupload.exe \
|
|||||||
multi-double.exe multi-post.exe multi-single.exe \
|
multi-double.exe multi-post.exe multi-single.exe \
|
||||||
persistant.exe post-callback.exe postit2.exe \
|
persistant.exe post-callback.exe postit2.exe \
|
||||||
sepheaders.exe simple.exe simplessl.exe https.exe \
|
sepheaders.exe simple.exe simplessl.exe https.exe \
|
||||||
ftp3rdparty.exe getinfo.exe anyauthput.exe
|
ftp3rdparty.exe getinfo.exe anyauthput.exe \
|
||||||
|
cookie_interface.exe
|
||||||
|
|
||||||
all: $(PROGRAMS)
|
all: $(PROGRAMS)
|
||||||
|
|
||||||
|
@@ -52,7 +52,8 @@ PDFPAGES = curl_easy_cleanup.pdf curl_easy_getinfo.pdf \
|
|||||||
|
|
||||||
CLEANFILES = $(HTMLPAGES) $(PDFPAGES)
|
CLEANFILES = $(HTMLPAGES) $(PDFPAGES)
|
||||||
|
|
||||||
EXTRA_DIST = $(man_MANS) $(HTMLPAGES) index.html $(PDFPAGES) libcurl.m4
|
EXTRA_DIST = $(man_MANS) $(HTMLPAGES) index.html $(PDFPAGES) libcurl.m4 \
|
||||||
|
getinfo-times
|
||||||
|
|
||||||
MAN2HTML= roffit --mandir=. < $< >$@
|
MAN2HTML= roffit --mandir=. < $< >$@
|
||||||
|
|
||||||
|
@@ -15,9 +15,9 @@ Request internal information from the curl session with this function. The
|
|||||||
third argument \fBMUST\fP be a pointer to a long, a pointer to a char *, a
|
third argument \fBMUST\fP be a pointer to a long, a pointer to a char *, a
|
||||||
pointer to a struct curl_slist * or a pointer to a double (as this
|
pointer to a struct curl_slist * or a pointer to a double (as this
|
||||||
documentation describes further down). The data pointed-to will be filled in
|
documentation describes further down). The data pointed-to will be filled in
|
||||||
accordingly and can be relied upon only if the function returns CURLE_OK.
|
accordingly and can be relied upon only if the function returns CURLE_OK. Use
|
||||||
This function is intended to get used AFTER a performed transfer, all results
|
this function AFTER a performed transfer if you want to get transfer- oriented
|
||||||
from this function are undefined until the transfer is completed.
|
data.
|
||||||
|
|
||||||
You should not free the memory returned by this function unless it is
|
You should not free the memory returned by this function unless it is
|
||||||
explictly mentioned below.
|
explictly mentioned below.
|
||||||
@@ -35,12 +35,14 @@ this.
|
|||||||
Pass a pointer to a long to receive the last received proxy response code to a
|
Pass a pointer to a long to receive the last received proxy response code to a
|
||||||
CONNECT request.
|
CONNECT request.
|
||||||
.IP CURLINFO_FILETIME
|
.IP CURLINFO_FILETIME
|
||||||
Pass a pointer to a long to receive the remote time of the retrieved
|
Pass a pointer to a long to receive the remote time of the retrieved document
|
||||||
document. If you get -1, it can be because of many reasons (unknown, the
|
(in number of seconds since 1 jan 1970 in the GMT/UTC time zone). If you get
|
||||||
server hides it or the server doesn't support the command that tells document
|
-1, it can be because of many reasons (unknown, the server hides it or the
|
||||||
time etc) and the time of the document is unknown. Note that you must tell the
|
server doesn't support the command that tells document time etc) and the time
|
||||||
server to collect this information before the transfer is made, by using the
|
of the document is unknown. Note that you must tell the server to collect this
|
||||||
CURLOPT_FILETIME option to \fIcurl_easy_setopt(3)\fP. (Added in 7.5)
|
information before the transfer is made, by using the CURLOPT_FILETIME option
|
||||||
|
to \fIcurl_easy_setopt(3)\fP or you will unconditionally get a -1 back. (Added
|
||||||
|
in 7.5)
|
||||||
.IP CURLINFO_TOTAL_TIME
|
.IP CURLINFO_TOTAL_TIME
|
||||||
Pass a pointer to a double to receive the total transaction time in seconds
|
Pass a pointer to a double to receive the total transaction time in seconds
|
||||||
for the previous transfer. This time does not include the connect time, so if
|
for the previous transfer. This time does not include the connect time, so if
|
||||||
@@ -132,6 +134,13 @@ counted). Combined with \fICURLINFO_REDIRECT_COUNT\fP you are able to know
|
|||||||
how many times libcurl successfully reused existing connection(s) or not. See
|
how many times libcurl successfully reused existing connection(s) or not. See
|
||||||
the Connection Options of \fIcurl_easy_setopt(3)\fP to see how libcurl tries
|
the Connection Options of \fIcurl_easy_setopt(3)\fP to see how libcurl tries
|
||||||
to make persistent connections to save time. (Added in 7.12.3)
|
to make persistent connections to save time. (Added in 7.12.3)
|
||||||
|
.IP CURLINFO_COOKIELIST
|
||||||
|
Pass a pointer to a 'struct curl_slist *' to receive a linked-list of all
|
||||||
|
cookies cURL knows (expired ones, too). Don't forget to
|
||||||
|
\fIcurl_slist_free_all(3)\fP the list after it has been used. If there are no
|
||||||
|
cookies (cookies for the handle have not been enabled or simply none have been
|
||||||
|
received) 'struct curl_slist *' will be set to point to NULL. (Added in
|
||||||
|
7.14.1)
|
||||||
.SH RETURN VALUE
|
.SH RETURN VALUE
|
||||||
If the operation was successful, CURLE_OK is returned. Otherwise an
|
If the operation was successful, CURLE_OK is returned. Otherwise an
|
||||||
appropriate error code will be returned.
|
appropriate error code will be returned.
|
||||||
|
@@ -21,7 +21,7 @@
|
|||||||
.\" * $Id$
|
.\" * $Id$
|
||||||
.\" **************************************************************************
|
.\" **************************************************************************
|
||||||
.\"
|
.\"
|
||||||
.TH curl_easy_setopt 3 "12 May 2005" "libcurl 7.14.0" "libcurl Manual"
|
.TH curl_easy_setopt 3 "28 Jul 2005" "libcurl 7.14.1" "libcurl Manual"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
curl_easy_setopt - set options for a curl easy handle
|
curl_easy_setopt - set options for a curl easy handle
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
@@ -171,20 +171,30 @@ argument in the progress callback set with \fICURLOPT_PROGRESSFUNCTION\fP.
|
|||||||
.IP CURLOPT_HEADERFUNCTION
|
.IP CURLOPT_HEADERFUNCTION
|
||||||
Function pointer that should match the following prototype: \fIsize_t
|
Function pointer that should match the following prototype: \fIsize_t
|
||||||
function( void *ptr, size_t size, size_t nmemb, void *stream);\fP. This
|
function( void *ptr, size_t size, size_t nmemb, void *stream);\fP. This
|
||||||
function gets called by libcurl as soon as there is received header data that
|
function gets called by libcurl as soon as it has received header data. The
|
||||||
needs to be written down. The headers are guaranteed to be written one-by-one
|
header callback will be called once for each header and only complete header
|
||||||
and only complete lines are written. Parsing headers should be easy enough
|
lines are passed on to the callback. Parsing headers should be easy enough
|
||||||
using this. The size of the data pointed to by \fIptr\fP is \fIsize\fP
|
using this. The size of the data pointed to by \fIptr\fP is \fIsize\fP
|
||||||
multiplied with \fInmemb\fP. The pointer named \fIstream\fP will be the one
|
multiplied with \fInmemb\fP. Do not assume that the header line is zero
|
||||||
you passed to libcurl with the \fICURLOPT_WRITEHEADER\fP option. Return the
|
terminated! The pointer named \fIstream\fP is the one you set with the
|
||||||
number of bytes actually written or return -1 to signal error to the library
|
\fICURLOPT_WRITEHEADER\fP option. The callback function must return the number
|
||||||
|
of bytes actually taken care of, or return -1 to signal error to the library
|
||||||
(it will cause it to abort the transfer with a \fICURLE_WRITE_ERROR\fP return
|
(it will cause it to abort the transfer with a \fICURLE_WRITE_ERROR\fP return
|
||||||
code).
|
code).
|
||||||
|
|
||||||
|
Since 7.14.1: When a server sends a chunked encoded transfer, it may contain a
|
||||||
|
trailer. That trailer is identical to a HTTP header and if such a trailer is
|
||||||
|
received it is passed to the application using this callback as well. There
|
||||||
|
are several ways to detect it being a trailer and not an ordinary header: 1)
|
||||||
|
it comes after the response-body. 2) it comes after the final header line (CR
|
||||||
|
LF) 3) a Trailer: header among the response-headers mention what header to
|
||||||
|
expect in the trailer.
|
||||||
.IP CURLOPT_WRITEHEADER
|
.IP CURLOPT_WRITEHEADER
|
||||||
Pass a pointer to be used to write the header part of the received data to. If
|
(This option is also known as \fBCURLOPT_HEADERDATA\fP) Pass a pointer to be
|
||||||
you don't use your own callback to take care of the writing, this must be a
|
used to write the header part of the received data to. If you don't use your
|
||||||
valid FILE *. See also the \fICURLOPT_HEADERFUNCTION\fP option above on how to
|
own callback to take care of the writing, this must be a valid FILE *. See
|
||||||
set a custom get-all-headers callback.
|
also the \fICURLOPT_HEADERFUNCTION\fP option above on how to set a custom
|
||||||
|
get-all-headers callback.
|
||||||
.IP CURLOPT_DEBUGFUNCTION
|
.IP CURLOPT_DEBUGFUNCTION
|
||||||
Function pointer that should match the following prototype: \fIint
|
Function pointer that should match the following prototype: \fIint
|
||||||
curl_debug_callback (CURL *, curl_infotype, char *, size_t, void *);\fP
|
curl_debug_callback (CURL *, curl_infotype, char *, size_t, void *);\fP
|
||||||
@@ -223,6 +233,9 @@ perform operation will return the error code from this callback function. Set
|
|||||||
the \fIparm\fP argument with the \fICURLOPT_SSL_CTX_DATA\fP option. This
|
the \fIparm\fP argument with the \fICURLOPT_SSL_CTX_DATA\fP option. This
|
||||||
option was introduced in 7.11.0.
|
option was introduced in 7.11.0.
|
||||||
|
|
||||||
|
This function will get called on all new connections made to a server, during
|
||||||
|
the SSL negotiation. The SSL_CTX pointer will be a new one every time.
|
||||||
|
|
||||||
\fBNOTE:\fP To use this properly, a non-trivial amount of knowledge of the
|
\fBNOTE:\fP To use this properly, a non-trivial amount of knowledge of the
|
||||||
openssl libraries is necessary. Using this function allows for example to use
|
openssl libraries is necessary. Using this function allows for example to use
|
||||||
openssl callbacks to add additional validation code for certificates, and even
|
openssl callbacks to add additional validation code for certificates, and even
|
||||||
@@ -274,15 +287,20 @@ be prefixed with [protocol]:// since any such prefix will be ignored. The
|
|||||||
proxy's port number may optionally be specified with the separate option
|
proxy's port number may optionally be specified with the separate option
|
||||||
\fICURLOPT_PROXYPORT\fP.
|
\fICURLOPT_PROXYPORT\fP.
|
||||||
|
|
||||||
\fBNOTE:\fP when you tell the library to use an HTTP proxy, libcurl will
|
When you tell the library to use an HTTP proxy, libcurl will transparently
|
||||||
transparently convert operations to HTTP even if you specify an FTP URL
|
convert operations to HTTP even if you specify an FTP URL etc. This may have
|
||||||
etc. This may have an impact on what other features of the library you can
|
an impact on what other features of the library you can use, such as
|
||||||
use, such as \fICURLOPT_QUOTE\fP and similar FTP specifics that don't work
|
\fICURLOPT_QUOTE\fP and similar FTP specifics that don't work unless you
|
||||||
unless you tunnel through the HTTP proxy. Such tunneling is activated with
|
tunnel through the HTTP proxy. Such tunneling is activated with
|
||||||
\fICURLOPT_HTTPPROXYTUNNEL\fP.
|
\fICURLOPT_HTTPPROXYTUNNEL\fP.
|
||||||
|
|
||||||
\fBNOTE2:\fP libcurl respects the environment variables \fBhttp_proxy\fP,
|
libcurl respects the environment variables \fBhttp_proxy\fP, \fBftp_proxy\fP,
|
||||||
\fBftp_proxy\fP, \fBall_proxy\fP etc, if any of those is set.
|
\fBall_proxy\fP etc, if any of those is set. The \fICURLOPT_PROXY\fP option
|
||||||
|
does however override any possibly set environment variables.
|
||||||
|
|
||||||
|
Starting with 7.14.1, the proxy host string can be specified the exact same
|
||||||
|
way as the proxy environment variables, include protocol prefix (http://) and
|
||||||
|
embedded user + password.
|
||||||
.IP CURLOPT_PROXYPORT
|
.IP CURLOPT_PROXYPORT
|
||||||
Pass a long with this option to set the proxy port to connect to unless it is
|
Pass a long with this option to set the proxy port to connect to unless it is
|
||||||
specified in the proxy string \fICURLOPT_PROXY\fP.
|
specified in the proxy string \fICURLOPT_PROXY\fP.
|
||||||
@@ -511,8 +529,11 @@ adding a header like "Transfer-Encoding: chunked" with
|
|||||||
\fICURLOPT_HTTPHEADER\fP. With HTTP 1.0 or without chunked transfer, you must
|
\fICURLOPT_HTTPHEADER\fP. With HTTP 1.0 or without chunked transfer, you must
|
||||||
specify the size in the request.
|
specify the size in the request.
|
||||||
|
|
||||||
NOTE: if you have issued a POST request and want to make a HEAD or GET
|
When setting \fICURLOPT_POST\fP to a non-zero value, it will automatically set
|
||||||
instead, you must explictly pick the new request type using
|
\fICURLOPT_NOBODY\fP to 0 (since 7.14.1).
|
||||||
|
|
||||||
|
If you issue a POST request and then want to make a HEAD or GET using the same
|
||||||
|
re-used handle, you must explictly set the new request type using
|
||||||
\fICURLOPT_NOBODY\fP or \fICURLOPT_HTTPGET\fP or similar.
|
\fICURLOPT_NOBODY\fP or \fICURLOPT_HTTPGET\fP or similar.
|
||||||
.IP CURLOPT_POSTFIELDS
|
.IP CURLOPT_POSTFIELDS
|
||||||
Pass a char * as parameter, which should be the full data to post in an HTTP
|
Pass a char * as parameter, which should be the full data to post in an HTTP
|
||||||
@@ -550,6 +571,9 @@ must remain intact until you close this curl handle again with
|
|||||||
|
|
||||||
Using POST with HTTP 1.1 implies the use of a "Expect: 100-continue" header.
|
Using POST with HTTP 1.1 implies the use of a "Expect: 100-continue" header.
|
||||||
You can disable this header with \fICURLOPT_HTTPHEADER\fP as usual.
|
You can disable this header with \fICURLOPT_HTTPHEADER\fP as usual.
|
||||||
|
|
||||||
|
When setting \fICURLOPT_HTTPPOST\fP, it will automatically set
|
||||||
|
\fICURLOPT_NOBODY\fP to 0 (since 7.14.1).
|
||||||
.IP CURLOPT_REFERER
|
.IP CURLOPT_REFERER
|
||||||
Pass a pointer to a zero terminated string as parameter. It will be used to
|
Pass a pointer to a zero terminated string as parameter. It will be used to
|
||||||
set the Referer: header in the http request sent to the remote server. This
|
set the Referer: header in the http request sent to the remote server. This
|
||||||
@@ -620,6 +644,9 @@ dumped to a file.
|
|||||||
Given an empty or non-existing file or by passing the empty string (""), this
|
Given an empty or non-existing file or by passing the empty string (""), this
|
||||||
option will enable cookies for this curl handle, making it understand and
|
option will enable cookies for this curl handle, making it understand and
|
||||||
parse received cookies and then use matching cookies in future request.
|
parse received cookies and then use matching cookies in future request.
|
||||||
|
|
||||||
|
If you use this option multiple times, you just add more files to read.
|
||||||
|
Subsequent files will add more cookies.
|
||||||
.IP CURLOPT_COOKIEJAR
|
.IP CURLOPT_COOKIEJAR
|
||||||
Pass a file name as char *, zero terminated. This will make libcurl write all
|
Pass a file name as char *, zero terminated. This will make libcurl write all
|
||||||
internally known cookies to the specified file when \fIcurl_easy_cleanup(3)\fP
|
internally known cookies to the specified file when \fIcurl_easy_cleanup(3)\fP
|
||||||
@@ -640,10 +667,18 @@ cookies" from the previous session. By default, libcurl always stores and
|
|||||||
loads all cookies, independent if they are session cookies are not. Session
|
loads all cookies, independent if they are session cookies are not. Session
|
||||||
cookies are cookies without expiry date and they are meant to be alive and
|
cookies are cookies without expiry date and they are meant to be alive and
|
||||||
existing for this "session" only.
|
existing for this "session" only.
|
||||||
|
.IP CURLOPT_COOKIELIST
|
||||||
|
Pass a char * to a cookie string. Cookie can be either in Netscape / Mozilla
|
||||||
|
format or just regular HTTP-style header (Set-Cookie: ...) format. If cURL
|
||||||
|
cookie engine was not enabled it will enable its cookie engine. Passing a
|
||||||
|
magic string \&"ALL" will erase all cookies known by cURL. (Added in 7.14.1)
|
||||||
.IP CURLOPT_HTTPGET
|
.IP CURLOPT_HTTPGET
|
||||||
Pass a long. If the long is non-zero, this forces the HTTP request to get back
|
Pass a long. If the long is non-zero, this forces the HTTP request to get back
|
||||||
to GET. usable if a POST, HEAD, PUT or a custom request have been used
|
to GET. usable if a POST, HEAD, PUT or a custom request have been used
|
||||||
previously using the same curl handle.
|
previously using the same curl handle.
|
||||||
|
|
||||||
|
When setting \fICURLOPT_HTTPGET\fP to a non-zero value, it will automatically
|
||||||
|
set \fICURLOPT_NOBODY\fP to 0 (since 7.14.1).
|
||||||
.IP CURLOPT_HTTP_VERSION
|
.IP CURLOPT_HTTP_VERSION
|
||||||
Pass a long, set to one of the values described below. They force libcurl to
|
Pass a long, set to one of the values described below. They force libcurl to
|
||||||
use the specific HTTP versions. This is not sensible to do unless you have a
|
use the specific HTTP versions. This is not sensible to do unless you have a
|
||||||
@@ -656,6 +691,12 @@ it thinks fit.
|
|||||||
Enforce HTTP 1.0 requests.
|
Enforce HTTP 1.0 requests.
|
||||||
.IP CURL_HTTP_VERSION_1_1
|
.IP CURL_HTTP_VERSION_1_1
|
||||||
Enforce HTTP 1.1 requests.
|
Enforce HTTP 1.1 requests.
|
||||||
|
.IP CURLOPT_IGNORE_CONTENT_LENGTH
|
||||||
|
Ignore the Content-Length header. This is useful for Apache 1.x (and similar
|
||||||
|
servers) which will report incorrect content length for files over 2
|
||||||
|
gigabytes. If this option is used, curl will not be able to accurately report
|
||||||
|
progress, and will simply stop the download when the server ends the
|
||||||
|
connection. (added in 7.14.1)
|
||||||
.RE
|
.RE
|
||||||
.SH FTP OPTIONS
|
.SH FTP OPTIONS
|
||||||
.IP CURLOPT_FTPPORT
|
.IP CURLOPT_FTPPORT
|
||||||
@@ -770,11 +811,15 @@ this data is sent off using the ACCT command. (Added in 7.13.0)
|
|||||||
.SH PROTOCOL OPTIONS
|
.SH PROTOCOL OPTIONS
|
||||||
.IP CURLOPT_TRANSFERTEXT
|
.IP CURLOPT_TRANSFERTEXT
|
||||||
A non-zero parameter tells the library to use ASCII mode for ftp transfers,
|
A non-zero parameter tells the library to use ASCII mode for ftp transfers,
|
||||||
instead of the default binary transfer. For LDAP transfers it gets the data in
|
instead of the default binary transfer. For win32 systems it does not set the
|
||||||
plain text instead of HTML and for win32 systems it does not set the stdout to
|
stdout to binary mode. This option can be usable when transferring text data
|
||||||
binary mode. This option can be usable when transferring text data between
|
between systems with different views on certain characters, such as newlines
|
||||||
systems with different views on certain characters, such as newlines or
|
or similar.
|
||||||
similar.
|
|
||||||
|
\fBNOTE:\fP libcurl does not do a complete ASCII conversion when doing ASCII
|
||||||
|
transfers over FTP. This is a known limitation/flaw that nobody has
|
||||||
|
rectified. libcurl simply sets the mode to ascii and performs a standard
|
||||||
|
transfer.
|
||||||
.IP CURLOPT_CRLF
|
.IP CURLOPT_CRLF
|
||||||
Convert Unix newlines to CRLF newlines on transfers.
|
Convert Unix newlines to CRLF newlines on transfers.
|
||||||
.IP CURLOPT_RANGE
|
.IP CURLOPT_RANGE
|
||||||
@@ -818,9 +863,8 @@ A non-zero parameter tells the library to not include the body-part in the
|
|||||||
output. This is only relevant for protocols that have separate header and body
|
output. This is only relevant for protocols that have separate header and body
|
||||||
parts. On HTTP(S) servers, this will make libcurl do a HEAD request.
|
parts. On HTTP(S) servers, this will make libcurl do a HEAD request.
|
||||||
|
|
||||||
To change back to GET, you should use \fICURLOPT_HTTPGET\fP. To change back to
|
To change request to GET, you should use \fICURLOPT_HTTPGET\fP. Change request
|
||||||
POST, you should use \fICURLOPT_POST\fP. Setting \fICURLOPT_NOBODY\fP to zero
|
to POST with \fICURLOPT_POST\fP etc.
|
||||||
has no effect.
|
|
||||||
.IP CURLOPT_INFILESIZE
|
.IP CURLOPT_INFILESIZE
|
||||||
When uploading a file to a remote site, this option should be used to tell
|
When uploading a file to a remote site, this option should be used to tell
|
||||||
libcurl what the expected size of the infile is. This value should be passed
|
libcurl what the expected size of the infile is. This value should be passed
|
||||||
|
@@ -90,7 +90,7 @@ followed by a pointer to a string to a name, will make libcurl use the given
|
|||||||
name in the file upload part, instead of the actual file name given to
|
name in the file upload part, instead of the actual file name given to
|
||||||
\fICURLFORM_FILE\fP.
|
\fICURLFORM_FILE\fP.
|
||||||
|
|
||||||
.IP BCURLFORM_BUFFER
|
.IP CURLFORM_BUFFER
|
||||||
followed by a string, tells libcurl that a buffer is to be used to upload data
|
followed by a string, tells libcurl that a buffer is to be used to upload data
|
||||||
instead of using a file. The given string is used as the value of the file
|
instead of using a file. The given string is used as the value of the file
|
||||||
name field in the content header.
|
name field in the content header.
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
.\" nroff -man [file]
|
.\" nroff -man [file]
|
||||||
.\" $Id$
|
.\" $Id$
|
||||||
.\"
|
.\"
|
||||||
.TH curl_getdate 3 "5 March 2001" "libcurl 7.0" "libcurl Manual"
|
.TH curl_getdate 3 "12 Aug 2005" "libcurl 7.0" "libcurl Manual"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
curl_getdate - Convert an date string to number of seconds since January 1,
|
curl_getdate - Convert an date string to number of seconds since January 1,
|
||||||
1970
|
1970
|
||||||
@@ -26,7 +26,7 @@ order of the items is immaterial. A date string may contain many flavors of
|
|||||||
items:
|
items:
|
||||||
.TP 0.8i
|
.TP 0.8i
|
||||||
.B calendar date items
|
.B calendar date items
|
||||||
Can be specified several ways. Month names can only be three-letter
|
Can be specified several ways. Month names can only be three-letter english
|
||||||
abbrivations, numbers can be zero-prefixed and the year may use 2 or 4 digits.
|
abbrivations, numbers can be zero-prefixed and the year may use 2 or 4 digits.
|
||||||
Examples: 06 Nov 1994, 06-Nov-94 and Nov-94 6.
|
Examples: 06 Nov 1994, 06-Nov-94 and Nov-94 6.
|
||||||
.TP
|
.TP
|
||||||
@@ -94,7 +94,7 @@ crippled mktime(), \fIcurl_getdate\fP will return -1 in this case.
|
|||||||
.SH REWRITE
|
.SH REWRITE
|
||||||
The former version of this function was built with yacc and was not only very
|
The former version of this function was built with yacc and was not only very
|
||||||
large, it was also never quite understood and it wasn't possible to build with
|
large, it was also never quite understood and it wasn't possible to build with
|
||||||
non-GNU tools since only Bison could make it thread-safe!
|
non-GNU tools since only GNU Bison could make it thread-safe!
|
||||||
|
|
||||||
The rewrite was done for 7.12.2. The new one is much smaller and use simpler
|
The rewrite was done for 7.12.2. The new one is much smaller and use simpler
|
||||||
code.
|
code.
|
||||||
|
27
docs/libcurl/getinfo-times
Normal file
27
docs/libcurl/getinfo-times
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
An overview of the six time values available from curl_easy_getinfo()
|
||||||
|
|
||||||
|
curk_easy_perform()
|
||||||
|
|
|
||||||
|
|--NT
|
||||||
|
|--|--CT
|
||||||
|
|--|--|--PT
|
||||||
|
|--|--|--|--ST
|
||||||
|
|--|--|--TT
|
||||||
|
|--|--|--|--|--RT
|
||||||
|
|
||||||
|
NT = CURLINFO_NAMELOOKUP_TIME. The time it took from the start until the name
|
||||||
|
resolving was completed.
|
||||||
|
CT = CURLINFO_CONNECT_TIME. The time it took from the start until the connect
|
||||||
|
to the remote host (or proxy) was completed.
|
||||||
|
PT = CURLINFO_PRETRANSFER_TIME. The time it took from the start until the file
|
||||||
|
transfer is just about to begin. This includes all pre-transfer commands
|
||||||
|
and negotiations that are specific to the particular protocol(s)
|
||||||
|
involved.
|
||||||
|
ST = CURLINFO_STARTTRANSFER_TIME. The time it took from the start until the
|
||||||
|
first byte is just about to be transferred.
|
||||||
|
TT = CURLINFO_TOTAL_TIME. Time of the previous transfer. This time does not
|
||||||
|
include the connect time (CT), so if you want the complete operation
|
||||||
|
time, you should add that.
|
||||||
|
RT = CURLINFO_REDIRECT_TIME. The time it took for all redirection steps
|
||||||
|
include name lookup, connect, pretransfer and transfer before final
|
||||||
|
transaction was started. So, this is zero if no redirection took place.
|
@@ -196,8 +196,7 @@ Initiating the SSL Engine failed
|
|||||||
The remote server denied curl to login (Added in 7.13.1)
|
The remote server denied curl to login (Added in 7.13.1)
|
||||||
.SH "CURLMcode"
|
.SH "CURLMcode"
|
||||||
This is the generic return code used by functions in the libcurl multi
|
This is the generic return code used by functions in the libcurl multi
|
||||||
interface. Also consider \fIcurl_multi_strerror(3)\fI.
|
interface. Also consider \fIcurl_multi_strerror(3)\fP.
|
||||||
|
|
||||||
.IP "CURLM_CALL_MULTI_PERFORM (-1)"
|
.IP "CURLM_CALL_MULTI_PERFORM (-1)"
|
||||||
This is not really an error. It means you should call
|
This is not really an error. It means you should call
|
||||||
\fIcurl_multi_perform(3)\fP again without doing select() or similar in between.
|
\fIcurl_multi_perform(3)\fP again without doing select() or similar in between.
|
||||||
@@ -213,9 +212,7 @@ You are doomed.
|
|||||||
This can only be returned if libcurl bugs. Please report it to us!
|
This can only be returned if libcurl bugs. Please report it to us!
|
||||||
.SH "CURLSHcode"
|
.SH "CURLSHcode"
|
||||||
The "share" interface will return a CURLSHcode to indicate when an error has
|
The "share" interface will return a CURLSHcode to indicate when an error has
|
||||||
occurred. Also consider \fIcurl_share_strerror(3)\fI.
|
occurred. Also consider \fIcurl_share_strerror(3)\fP.
|
||||||
|
|
||||||
CURLSHcode is one of the following:
|
|
||||||
.IP "CURLSHE_OK (0)"
|
.IP "CURLSHE_OK (0)"
|
||||||
All fine. Proceed as usual.
|
All fine. Proceed as usual.
|
||||||
.IP "CURLSHE_BAD_OPTION (1)"
|
.IP "CURLSHE_BAD_OPTION (1)"
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
# LIBCURL_CHECK_CONFIG ([DEFAULT-ACTION], [MINIMUM-VERSION],
|
# LIBCURL_CHECK_CONFIG ([DEFAULT-ACTION], [MINIMUM-VERSION],
|
||||||
# [ACTION-IF-YES], [ACTION-IF-NO])
|
# [ACTION-IF-YES], [ACTION-IF-NO])
|
||||||
# ----------------------------------------------------------
|
# ----------------------------------------------------------
|
||||||
# David Shaw <dshaw@jabberwocky.com> Jan-23-2005
|
# David Shaw <dshaw@jabberwocky.com> Jun-21-2005
|
||||||
#
|
#
|
||||||
# Checks for libcurl. DEFAULT-ACTION is the string yes or no to
|
# Checks for libcurl. DEFAULT-ACTION is the string yes or no to
|
||||||
# specify whether to default to --with-libcurl or --without-libcurl.
|
# specify whether to default to --with-libcurl or --without-libcurl.
|
||||||
@@ -32,13 +32,7 @@
|
|||||||
# found is after version 7.7.2, the first version that included the
|
# found is after version 7.7.2, the first version that included the
|
||||||
# curl-config script. Note that it is very important for people
|
# curl-config script. Note that it is very important for people
|
||||||
# packaging binary versions of libcurl to include this script!
|
# packaging binary versions of libcurl to include this script!
|
||||||
# Without curl-config, we can only make educated guesses as to what
|
# Without curl-config, we can only guess what protocols are available.
|
||||||
# protocols are available. Specifically, we assume that all of HTTP,
|
|
||||||
# FTP, GOPHER, FILE, TELNET, LDAP, and DICT exist, and (if SSL exists)
|
|
||||||
# HTTPS is present. All of these protocols existed when libcurl was
|
|
||||||
# first created in version 7, so this is a safe assumption. If the
|
|
||||||
# version is 7.11.0 or later, FTPS is assumed to be present as well.
|
|
||||||
# FTPS existed before then, but was not yet fully standards compliant.
|
|
||||||
|
|
||||||
AC_DEFUN([LIBCURL_CHECK_CONFIG],
|
AC_DEFUN([LIBCURL_CHECK_CONFIG],
|
||||||
[
|
[
|
||||||
@@ -103,6 +97,15 @@ AC_DEFUN([LIBCURL_CHECK_CONFIG],
|
|||||||
fi
|
fi
|
||||||
if test x"$LIBCURL" = "x" ; then
|
if test x"$LIBCURL" = "x" ; then
|
||||||
LIBCURL=`$_libcurl_config --libs`
|
LIBCURL=`$_libcurl_config --libs`
|
||||||
|
|
||||||
|
# This is so silly, but Apple actually has a bug in their
|
||||||
|
# curl-config script. Fixed in Tiger, but there are still
|
||||||
|
# lots of Panther installs around.
|
||||||
|
case "${host}" in
|
||||||
|
powerpc-apple-darwin7*)
|
||||||
|
LIBCURL=`echo $LIBCURL | sed -e 's|-arch i386||g'`
|
||||||
|
;;
|
||||||
|
esac
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# All curl-config scripts support --feature
|
# All curl-config scripts support --feature
|
||||||
@@ -130,8 +133,8 @@ AC_DEFUN([LIBCURL_CHECK_CONFIG],
|
|||||||
[
|
[
|
||||||
_libcurl_save_cppflags=$CPPFLAGS
|
_libcurl_save_cppflags=$CPPFLAGS
|
||||||
CPPFLAGS="$CPPFLAGS $LIBCURL_CPPFLAGS"
|
CPPFLAGS="$CPPFLAGS $LIBCURL_CPPFLAGS"
|
||||||
_libcurl_save_ldflags=$LDFLAGS
|
_libcurl_save_libs=$LIBS
|
||||||
LDFLAGS="$LDFLAGS $LIBCURL"
|
LIBS="$LIBS $LIBCURL"
|
||||||
|
|
||||||
AC_LINK_IFELSE(AC_LANG_PROGRAM([#include <curl/curl.h>],[
|
AC_LINK_IFELSE(AC_LANG_PROGRAM([#include <curl/curl.h>],[
|
||||||
/* Try and use a few common options to force a failure if we are
|
/* Try and use a few common options to force a failure if we are
|
||||||
@@ -147,12 +150,30 @@ x=CURLOPT_VERBOSE;
|
|||||||
]),libcurl_cv_lib_curl_usable=yes,libcurl_cv_lib_curl_usable=no)
|
]),libcurl_cv_lib_curl_usable=yes,libcurl_cv_lib_curl_usable=no)
|
||||||
|
|
||||||
CPPFLAGS=$_libcurl_save_cppflags
|
CPPFLAGS=$_libcurl_save_cppflags
|
||||||
LDFLAGS=$_libcurl_save_ldflags
|
LIBS=$_libcurl_save_libs
|
||||||
unset _libcurl_save_cppflags
|
unset _libcurl_save_cppflags
|
||||||
unset _libcurl_save_ldflags
|
unset _libcurl_save_libs
|
||||||
])
|
])
|
||||||
|
|
||||||
if test $libcurl_cv_lib_curl_usable = yes ; then
|
if test $libcurl_cv_lib_curl_usable = yes ; then
|
||||||
|
|
||||||
|
# Does curl_free() exist in this version of libcurl?
|
||||||
|
# If not, fake it with free()
|
||||||
|
|
||||||
|
_libcurl_save_cppflags=$CPPFLAGS
|
||||||
|
CPPFLAGS="$CPPFLAGS $LIBCURL_CPPFLAGS"
|
||||||
|
_libcurl_save_libs=$LIBS
|
||||||
|
LIBS="$LIBS $LIBCURL"
|
||||||
|
|
||||||
|
AC_CHECK_FUNC(curl_free,,
|
||||||
|
AC_DEFINE(curl_free,free,
|
||||||
|
[Define curl_free() as free() if our version of curl lacks curl_free.]))
|
||||||
|
|
||||||
|
CPPFLAGS=$_libcurl_save_cppflags
|
||||||
|
LIBS=$_libcurl_save_libs
|
||||||
|
unset _libcurl_save_cppflags
|
||||||
|
unset _libcurl_save_libs
|
||||||
|
|
||||||
AC_DEFINE(HAVE_LIBCURL,1,
|
AC_DEFINE(HAVE_LIBCURL,1,
|
||||||
[Define to 1 if you have a functional curl library.])
|
[Define to 1 if you have a functional curl library.])
|
||||||
AC_SUBST(LIBCURL_CPPFLAGS)
|
AC_SUBST(LIBCURL_CPPFLAGS)
|
||||||
|
@@ -890,6 +890,12 @@ typedef enum {
|
|||||||
"account" info */
|
"account" info */
|
||||||
CINIT(FTP_ACCOUNT, OBJECTPOINT, 134),
|
CINIT(FTP_ACCOUNT, OBJECTPOINT, 134),
|
||||||
|
|
||||||
|
/* feed cookies into cookie engine */
|
||||||
|
CINIT(COOKIELIST, OBJECTPOINT, 135),
|
||||||
|
|
||||||
|
/* ignore Content-Length */
|
||||||
|
CINIT(IGNORE_CONTENT_LENGTH, LONG, 136),
|
||||||
|
|
||||||
CURLOPT_LASTENTRY /* the last unused */
|
CURLOPT_LASTENTRY /* the last unused */
|
||||||
} CURLoption;
|
} CURLoption;
|
||||||
|
|
||||||
@@ -1202,11 +1208,10 @@ CURL_EXTERN void curl_slist_free_all(struct curl_slist *);
|
|||||||
* DESCRIPTION
|
* DESCRIPTION
|
||||||
*
|
*
|
||||||
* Returns the time, in seconds since 1 Jan 1970 of the time string given in
|
* Returns the time, in seconds since 1 Jan 1970 of the time string given in
|
||||||
* the first argument. The time argument in the second parameter is for cases
|
* the first argument. The time argument in the second parameter is unused
|
||||||
* where the specified time is relative now, like 'two weeks' or 'tomorrow'
|
* and should be set to NULL.
|
||||||
* etc.
|
|
||||||
*/
|
*/
|
||||||
CURL_EXTERN time_t curl_getdate(const char *p, const time_t *now);
|
CURL_EXTERN time_t curl_getdate(const char *p, const time_t *unused);
|
||||||
|
|
||||||
#define CURLINFO_STRING 0x100000
|
#define CURLINFO_STRING 0x100000
|
||||||
#define CURLINFO_LONG 0x200000
|
#define CURLINFO_LONG 0x200000
|
||||||
@@ -1244,6 +1249,7 @@ typedef enum {
|
|||||||
CURLINFO_OS_ERRNO = CURLINFO_LONG + 25,
|
CURLINFO_OS_ERRNO = CURLINFO_LONG + 25,
|
||||||
CURLINFO_NUM_CONNECTS = CURLINFO_LONG + 26,
|
CURLINFO_NUM_CONNECTS = CURLINFO_LONG + 26,
|
||||||
CURLINFO_SSL_ENGINES = CURLINFO_SLIST + 27,
|
CURLINFO_SSL_ENGINES = CURLINFO_SLIST + 27,
|
||||||
|
CURLINFO_COOKIELIST = CURLINFO_SLIST + 28,
|
||||||
/* Fill in new entries below here! */
|
/* Fill in new entries below here! */
|
||||||
|
|
||||||
CURLINFO_LASTONE = 28
|
CURLINFO_LASTONE = 28
|
||||||
|
@@ -28,7 +28,7 @@
|
|||||||
|
|
||||||
/* This is the version number of the libcurl package from which this header
|
/* This is the version number of the libcurl package from which this header
|
||||||
file origins: */
|
file origins: */
|
||||||
#define LIBCURL_VERSION "7.14.0-CVS"
|
#define LIBCURL_VERSION "7.14.1-CVS"
|
||||||
|
|
||||||
/* This is the numeric version of the libcurl version number, meant for easier
|
/* This is the numeric version of the libcurl version number, meant for easier
|
||||||
parsing and comparions by programs. The LIBCURL_VERSION_NUM define will
|
parsing and comparions by programs. The LIBCURL_VERSION_NUM define will
|
||||||
@@ -44,12 +44,12 @@
|
|||||||
always a greater number in a more recent release. It makes comparisons with
|
always a greater number in a more recent release. It makes comparisons with
|
||||||
greater than and less than work.
|
greater than and less than work.
|
||||||
*/
|
*/
|
||||||
#define LIBCURL_VERSION_NUM 0x070e00
|
#define LIBCURL_VERSION_NUM 0x070e01
|
||||||
|
|
||||||
/* The numeric version number is also available "in parts" by using these
|
/* The numeric version number is also available "in parts" by using these
|
||||||
defines: */
|
defines: */
|
||||||
#define LIBCURL_VERSION_MAJOR 7
|
#define LIBCURL_VERSION_MAJOR 7
|
||||||
#define LIBCURL_VERSION_MINOR 14
|
#define LIBCURL_VERSION_MINOR 14
|
||||||
#define LIBCURL_VERSION_PATCH 0
|
#define LIBCURL_VERSION_PATCH 1
|
||||||
|
|
||||||
#endif /* __CURL_CURLVER_H */
|
#endif /* __CURL_CURLVER_H */
|
||||||
|
@@ -13,15 +13,17 @@ NDKBASE = c:/novell
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
# Edit the path below to point to the base of your Zlib sources.
|
# Edit the path below to point to the base of your Zlib sources.
|
||||||
#ZLIB_PATH = ../../zlib-1.2.2
|
ifndef ZLIB_PATH
|
||||||
|
ZLIB_PATH = ../../zlib-1.2.3
|
||||||
|
endif
|
||||||
|
|
||||||
# Edit the path below to point to the base of your OpenSSL package.
|
# Edit the path below to point to the base of your OpenSSL package.
|
||||||
ifndef OPENSSL_PATH
|
ifndef OPENSSL_PATH
|
||||||
OPENSSL_PATH = ../../openssl-0.9.7g
|
OPENSSL_PATH = ../../openssl-0.9.8
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifndef INSTDIR
|
ifndef INSTDIR
|
||||||
INSTDIR = ../curl-$(LIBCURL_VERSION_STR)-bin-nw
|
INSTDIR = ..$(DS)curl-$(LIBCURL_VERSION_STR)-bin-nw
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# Edit the vars below to change NLM target settings.
|
# Edit the vars below to change NLM target settings.
|
||||||
@@ -103,8 +105,6 @@ else
|
|||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
LDLIBS =
|
|
||||||
|
|
||||||
NDK_ROOT = $(NDKBASE)/ndk
|
NDK_ROOT = $(NDKBASE)/ndk
|
||||||
SDK_CLIB = $(NDK_ROOT)/nwsdk
|
SDK_CLIB = $(NDK_ROOT)/nwsdk
|
||||||
SDK_LIBC = $(NDK_ROOT)/libc
|
SDK_LIBC = $(NDK_ROOT)/libc
|
||||||
@@ -114,21 +114,26 @@ INCLUDES = -I. -I../include
|
|||||||
|
|
||||||
ifdef WITH_ARES
|
ifdef WITH_ARES
|
||||||
INCLUDES += -I../ares
|
INCLUDES += -I../ares
|
||||||
LIBCARES = ../ares/libcares.lib
|
LDLIBS = ../ares/libcares.lib
|
||||||
endif
|
endif
|
||||||
ifdef ZLIB_PATH
|
ifdef WITH_SSL
|
||||||
INCLUDES += -I$(ZLIB_PATH)
|
|
||||||
IMPORTS = @$(ZLIB_PATH)/nw/zlib.imp
|
|
||||||
MODULES = libz.nlm
|
|
||||||
endif
|
|
||||||
ifdef SSL
|
|
||||||
INCLUDES += -I$(OPENSSL_PATH)/outinc_nw_libc -I$(OPENSSL_PATH)/outinc_nw_libc/openssl
|
INCLUDES += -I$(OPENSSL_PATH)/outinc_nw_libc -I$(OPENSSL_PATH)/outinc_nw_libc/openssl
|
||||||
LIBSSL = $(OPENSSL_PATH)/out_nw_libc/crypto.lib $(OPENSSL_PATH)/out_nw_libc/ssl.lib
|
LDLIBS += $(OPENSSL_PATH)/out_nw_libc/crypto.lib $(OPENSSL_PATH)/out_nw_libc/ssl.lib
|
||||||
|
IMPORTS += GetProcessSwitchCount RunningProcess
|
||||||
|
endif
|
||||||
|
ifdef WITH_ZLIB
|
||||||
|
INCLUDES += -I$(ZLIB_PATH)
|
||||||
|
ifdef LINK_STATIC
|
||||||
|
LDLIBS += $(ZLIB_PATH)/nw/libz.lib
|
||||||
|
else
|
||||||
|
IMPORTS += @$(ZLIB_PATH)/nw/libz.imp
|
||||||
|
MODULES += libz.nlm
|
||||||
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(LIBARCH),LIBC)
|
ifeq ($(LIBARCH),LIBC)
|
||||||
INCLUDES += -I$(SDK_LIBC)/include -I$(SDK_LIBC)/include/nks
|
INCLUDES += -I$(SDK_LIBC)/include -I$(SDK_LIBC)/include/nks
|
||||||
INCLUDES += -I$(SDK_LIBC)/include/winsock
|
# INCLUDES += -I$(SDK_LIBC)/include/winsock
|
||||||
# INCLUDES += -I$(SDK_LDAP)/libc/inc
|
# INCLUDES += -I$(SDK_LDAP)/libc/inc
|
||||||
CFLAGS += -D_POSIX_SOURCE
|
CFLAGS += -D_POSIX_SOURCE
|
||||||
# CFLAGS += -D__ANSIC__
|
# CFLAGS += -D__ANSIC__
|
||||||
@@ -152,13 +157,16 @@ endif
|
|||||||
|
|
||||||
ifeq ($(findstring linux,$(OSTYPE)),linux)
|
ifeq ($(findstring linux,$(OSTYPE)),linux)
|
||||||
DL = '
|
DL = '
|
||||||
|
DS = /
|
||||||
#-include $(NDKBASE)/nlmconv/ncpfs.inc
|
#-include $(NDKBASE)/nlmconv/ncpfs.inc
|
||||||
|
else
|
||||||
|
DS = \\
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# Makefile.inc provides the CSOURCES and HHEADERS defines
|
# Makefile.inc provides the CSOURCES and HHEADERS defines
|
||||||
include Makefile.inc
|
include Makefile.inc
|
||||||
|
|
||||||
OBJS := $(patsubst %.c,$(OBJDIR)/%.o,$(strip $(CSOURCES))) $(LIBCARES) $(LIBSSL)
|
OBJS := $(patsubst %.c,$(OBJDIR)/%.o,$(strip $(CSOURCES))) $(LDLIBS)
|
||||||
|
|
||||||
OBJL = $(OBJS) $(OBJDIR)/nwlib.o
|
OBJL = $(OBJS) $(OBJDIR)/nwlib.o
|
||||||
|
|
||||||
@@ -189,6 +197,9 @@ install: $(INSTDIR) all
|
|||||||
@$(CP) ../COPYING $(INSTDIR)
|
@$(CP) ../COPYING $(INSTDIR)
|
||||||
@$(CP) ../README $(INSTDIR)
|
@$(CP) ../README $(INSTDIR)
|
||||||
@$(CP) ../RELEASE-NOTES $(INSTDIR)
|
@$(CP) ../RELEASE-NOTES $(INSTDIR)
|
||||||
|
ifdef WITH_SSL
|
||||||
|
@$(CP) ca-bundle.crt $(INSTDIR)
|
||||||
|
endif
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
-$(RM) config.h ca-bundle.h
|
-$(RM) config.h ca-bundle.h
|
||||||
@@ -274,11 +285,8 @@ ifdef IMPORTS
|
|||||||
@echo $(DL)import $(IMPORTS)$(DL) >> $@
|
@echo $(DL)import $(IMPORTS)$(DL) >> $@
|
||||||
endif
|
endif
|
||||||
ifeq ($(LD),nlmconv)
|
ifeq ($(LD),nlmconv)
|
||||||
ifdef WITH_ARES
|
ifdef LDLIBS
|
||||||
@echo $(DL)input $(LIBCARES)$(DL) >> $@
|
@echo $(DL)input $(LDLIBS)$(DL) >> $@
|
||||||
endif
|
|
||||||
ifdef SSL
|
|
||||||
@echo $(DL)input $(LIBSSL)$(DL) >> $@
|
|
||||||
endif
|
endif
|
||||||
@echo $(DL)input $(OBJL)$(DL) >> $@
|
@echo $(DL)input $(OBJL)$(DL) >> $@
|
||||||
@echo $(DL)input $(PRELUDE)$(DL) >> $@
|
@echo $(DL)input $(PRELUDE)$(DL) >> $@
|
||||||
@@ -336,6 +344,13 @@ config.h: Makefile.netware
|
|||||||
@echo $(DL)#define SIZEOF_CURL_OFF_T 4$(DL) >> $@
|
@echo $(DL)#define SIZEOF_CURL_OFF_T 4$(DL) >> $@
|
||||||
@echo $(DL)#define STDC_HEADERS 1$(DL) >> $@
|
@echo $(DL)#define STDC_HEADERS 1$(DL) >> $@
|
||||||
@echo $(DL)#define TIME_WITH_SYS_TIME 1$(DL) >> $@
|
@echo $(DL)#define TIME_WITH_SYS_TIME 1$(DL) >> $@
|
||||||
|
@echo $(DL)#define HAVE_AF_INET6 1$(DL) >> $@
|
||||||
|
@echo $(DL)#define HAVE_PF_INET6 1$(DL) >> $@
|
||||||
|
@echo $(DL)#define HAVE_STRUCT_IN6_ADDR 1$(DL) >> $@
|
||||||
|
@echo $(DL)#define HAVE_STRUCT_SOCKADDR_IN6 1$(DL) >> $@
|
||||||
|
@echo $(DL)#define HAVE_STRUCT_ADDRINFO 1$(DL) >> $@
|
||||||
|
@echo $(DL)#define SIZEOF_STRUCT_IN6_ADDR 16$(DL) >> $@
|
||||||
|
@echo $(DL)#define SIZEOF_STRUCT_IN_ADDR 4$(DL) >> $@
|
||||||
ifdef DISABLE_LDAP
|
ifdef DISABLE_LDAP
|
||||||
@echo $(DL)#define CURL_DISABLE_LDAP 1$(DL) >> $@
|
@echo $(DL)#define CURL_DISABLE_LDAP 1$(DL) >> $@
|
||||||
else
|
else
|
||||||
@@ -355,11 +370,11 @@ endif
|
|||||||
ifdef WITH_ARES
|
ifdef WITH_ARES
|
||||||
@echo $(DL)#define USE_ARES 1$(DL) >> $@
|
@echo $(DL)#define USE_ARES 1$(DL) >> $@
|
||||||
endif
|
endif
|
||||||
ifdef ZLIB_PATH
|
ifdef WITH_ZLIB
|
||||||
@echo $(DL)#define HAVE_ZLIB_H 1$(DL) >> $@
|
@echo $(DL)#define HAVE_ZLIB_H 1$(DL) >> $@
|
||||||
@echo $(DL)#define HAVE_LIBZ 1$(DL) >> $@
|
@echo $(DL)#define HAVE_LIBZ 1$(DL) >> $@
|
||||||
endif
|
endif
|
||||||
ifdef SSL
|
ifdef WITH_SSL
|
||||||
@echo $(DL)#define USE_SSLEAY 1$(DL) >> $@
|
@echo $(DL)#define USE_SSLEAY 1$(DL) >> $@
|
||||||
@echo $(DL)#define USE_OPENSSL 1$(DL) >> $@
|
@echo $(DL)#define USE_OPENSSL 1$(DL) >> $@
|
||||||
@echo $(DL)#define HAVE_OPENSSL_X509_H 1$(DL) >> $@
|
@echo $(DL)#define HAVE_OPENSSL_X509_H 1$(DL) >> $@
|
||||||
|
@@ -1,17 +0,0 @@
|
|||||||
Things to fix for the GnuTLS support
|
|
||||||
====================================
|
|
||||||
|
|
||||||
* make the configure --with-ssl option first check for OpenSSL and then for
|
|
||||||
GnuTLS if OpenSSL wasn't detected.
|
|
||||||
|
|
||||||
* Get NTLM working using the functions provided by libgcrypt, since GnuTLS
|
|
||||||
already depends on that to function. Not strictly SSL/TLS related, but
|
|
||||||
hey... Another option is to get available DES and MD4 source code from the
|
|
||||||
cryptopp library. They are fine license-wise, but are C++.
|
|
||||||
|
|
||||||
* SSL engine stuff?
|
|
||||||
|
|
||||||
SRP for TLS
|
|
||||||
|
|
||||||
* Work out a common method with Peter Sylvester's OpenSSL-patch for SRP
|
|
||||||
on the TLS to provide name and password
|
|
@@ -22,28 +22,53 @@
|
|||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
|
||||||
#include "amigaos.h"
|
#include "amigaos.h"
|
||||||
#include <stdio.h> /* for stderr */
|
#include <amitcp/socketbasetags.h>
|
||||||
|
|
||||||
struct Library *SocketBase = NULL;
|
struct Library *SocketBase = NULL;
|
||||||
|
extern int errno, h_errno;
|
||||||
|
|
||||||
|
#ifdef __libnix__
|
||||||
|
#include <stabs.h>
|
||||||
|
void __request(const char *msg);
|
||||||
|
#else
|
||||||
|
# define __request( msg ) Printf( msg "\n\a")
|
||||||
|
#endif
|
||||||
|
|
||||||
void amiga_cleanup()
|
void amiga_cleanup()
|
||||||
{
|
{
|
||||||
if(SocketBase)
|
if(SocketBase) {
|
||||||
CloseLibrary(SocketBase);
|
CloseLibrary(SocketBase);
|
||||||
|
SocketBase = NULL;
|
||||||
SocketBase = NULL;
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL amiga_init()
|
BOOL amiga_init()
|
||||||
{
|
{
|
||||||
if(!SocketBase)
|
if(!SocketBase)
|
||||||
SocketBase = OpenLibrary("bsdsocket.library", 4);
|
SocketBase = OpenLibrary("bsdsocket.library", 4);
|
||||||
|
|
||||||
if(!SocketBase) {
|
if(!SocketBase) {
|
||||||
fprintf(stderr, "No TCP/IP Stack running!\n\a");
|
__request("No TCP/IP Stack running!");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
atexit(amiga_cleanup);
|
if(SocketBaseTags(
|
||||||
return TRUE;
|
SBTM_SETVAL(SBTC_ERRNOPTR(sizeof(errno))), (ULONG) &errno,
|
||||||
|
// SBTM_SETVAL(SBTC_HERRNOLONGPTR), (ULONG) &h_errno,
|
||||||
|
SBTM_SETVAL(SBTC_LOGTAGPTR), (ULONG) "cURL",
|
||||||
|
TAG_DONE)) {
|
||||||
|
|
||||||
|
__request("SocketBaseTags ERROR");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef __libnix__
|
||||||
|
atexit(amiga_cleanup);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef __libnix__
|
||||||
|
ADD2EXIT(amiga_cleanup,-50);
|
||||||
|
#endif
|
||||||
|
@@ -32,13 +32,19 @@
|
|||||||
#include <proto/exec.h>
|
#include <proto/exec.h>
|
||||||
#include <proto/dos.h>
|
#include <proto/dos.h>
|
||||||
|
|
||||||
#include <bsdsocket.h>
|
#include <sys/socket.h>
|
||||||
|
|
||||||
#include "config-amigaos.h"
|
#include "config-amigaos.h"
|
||||||
|
|
||||||
#define select(args...) WaitSelect( args, NULL)
|
#ifndef select
|
||||||
#define inet_ntoa(x) Inet_NtoA( x ## .s_addr)
|
# define select(args...) WaitSelect( args, NULL)
|
||||||
#define ioctl(a,b,c,d) IoctlSocket( (LONG)a, (ULONG)b, (char*)c)
|
#endif
|
||||||
|
#ifndef inet_ntoa
|
||||||
|
# define inet_ntoa(x) Inet_NtoA( x ## .s_addr)
|
||||||
|
#endif
|
||||||
|
#ifndef ioctl
|
||||||
|
# define ioctl(a,b,c,d) IoctlSocket( (LONG)a, (ULONG)b, (char*)c)
|
||||||
|
#endif
|
||||||
#define _AMIGASF 1
|
#define _AMIGASF 1
|
||||||
|
|
||||||
extern void amiga_cleanup();
|
extern void amiga_cleanup();
|
||||||
|
@@ -54,6 +54,7 @@
|
|||||||
#define HAVE_UTIME_H 1
|
#define HAVE_UTIME_H 1
|
||||||
#define HAVE_WRITABLE_ARGV 1
|
#define HAVE_WRITABLE_ARGV 1
|
||||||
#define HAVE_ZLIB_H 1
|
#define HAVE_ZLIB_H 1
|
||||||
|
#define HAVE_SYS_IOCTL_H 1
|
||||||
|
|
||||||
#define USE_OPENSSL 1
|
#define USE_OPENSSL 1
|
||||||
#define USE_SSLEAY 1
|
#define USE_SSLEAY 1
|
||||||
@@ -80,7 +81,9 @@
|
|||||||
#define TIME_WITH_SYS_TIME 1
|
#define TIME_WITH_SYS_TIME 1
|
||||||
|
|
||||||
#define in_addr_t int
|
#define in_addr_t int
|
||||||
#define socklen_t int
|
#ifndef socklen_t
|
||||||
|
# define socklen_t int
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef O_RDONLY
|
#ifndef O_RDONLY
|
||||||
# define O_RDONLY 0x0000
|
# define O_RDONLY 0x0000
|
||||||
|
@@ -359,13 +359,13 @@ static CURLcode bindlocal(struct connectdata *conn,
|
|||||||
|
|
||||||
} /* end of if h */
|
} /* end of if h */
|
||||||
else {
|
else {
|
||||||
failf(data,"could't find my own IP address (%s)", myhost);
|
failf(data,"couldn't find my own IP address (%s)", myhost);
|
||||||
return CURLE_HTTP_PORT_FAILED;
|
return CURLE_HTTP_PORT_FAILED;
|
||||||
}
|
}
|
||||||
} /* end of inet_addr */
|
} /* end of inet_addr */
|
||||||
|
|
||||||
else {
|
else {
|
||||||
failf(data, "could't find my own IP address (%s)", myhost);
|
failf(data, "couldn't find my own IP address (%s)", myhost);
|
||||||
return CURLE_HTTP_PORT_FAILED;
|
return CURLE_HTTP_PORT_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
118
lib/cookie.c
118
lib/cookie.c
@@ -85,12 +85,17 @@ Example set of cookies:
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
#define _MPRINTF_REPLACE /* without this on windows OS we get undefined reference to snprintf */
|
||||||
|
#include <curl/mprintf.h>
|
||||||
|
|
||||||
#include "urldata.h"
|
#include "urldata.h"
|
||||||
#include "cookie.h"
|
#include "cookie.h"
|
||||||
#include "strequal.h"
|
#include "strequal.h"
|
||||||
#include "strtok.h"
|
#include "strtok.h"
|
||||||
#include "sendf.h"
|
#include "sendf.h"
|
||||||
#include "memory.h"
|
#include "memory.h"
|
||||||
|
#include "share.h"
|
||||||
|
#include "strtoofft.h"
|
||||||
|
|
||||||
/* The last #include file should be: */
|
/* The last #include file should be: */
|
||||||
#ifdef CURLDEBUG
|
#ifdef CURLDEBUG
|
||||||
@@ -130,6 +135,27 @@ static bool tailmatch(const char *little, const char *bigone)
|
|||||||
return (bool)strequal(little, bigone+biglen-littlelen);
|
return (bool)strequal(little, bigone+biglen-littlelen);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Load cookies from all given cookie files (CURLOPT_COOKIEFILE).
|
||||||
|
*/
|
||||||
|
void Curl_cookie_loadfiles(struct SessionHandle *data)
|
||||||
|
{
|
||||||
|
struct curl_slist *list = data->change.cookielist;
|
||||||
|
if(list) {
|
||||||
|
Curl_share_lock(data, CURL_LOCK_DATA_COOKIE, CURL_LOCK_ACCESS_SINGLE);
|
||||||
|
while(list) {
|
||||||
|
data->cookies = Curl_cookie_init(data,
|
||||||
|
list->data,
|
||||||
|
data->cookies,
|
||||||
|
data->set.cookiesession);
|
||||||
|
list = list->next;
|
||||||
|
}
|
||||||
|
Curl_share_unlock(data, CURL_LOCK_DATA_COOKIE);
|
||||||
|
curl_slist_free_all(data->change.cookielist); /* clean up list */
|
||||||
|
data->change.cookielist = NULL; /* don't do this again! */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
*
|
*
|
||||||
* Curl_cookie_add()
|
* Curl_cookie_add()
|
||||||
@@ -317,7 +343,7 @@ Curl_cookie_add(struct SessionHandle *data,
|
|||||||
badcookie = TRUE;
|
badcookie = TRUE;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
co->expires = (long)curl_getdate(what, &now);
|
co->expires = curl_getdate(what, &now);
|
||||||
}
|
}
|
||||||
else if(!co->name) {
|
else if(!co->name) {
|
||||||
co->name = strdup(name);
|
co->name = strdup(name);
|
||||||
@@ -470,7 +496,7 @@ Curl_cookie_add(struct SessionHandle *data,
|
|||||||
co->secure = (bool)strequal(ptr, "TRUE");
|
co->secure = (bool)strequal(ptr, "TRUE");
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
co->expires = atoi(ptr);
|
co->expires = curlx_strtoofft(ptr, NULL, 10);
|
||||||
break;
|
break;
|
||||||
case 5:
|
case 5:
|
||||||
co->name = strdup(ptr);
|
co->name = strdup(ptr);
|
||||||
@@ -816,6 +842,34 @@ void Curl_cookie_cleanup(struct CookieInfo *c)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* get_netscape_format()
|
||||||
|
*
|
||||||
|
* Formats a string for Netscape output file, w/o a newline at the end.
|
||||||
|
*
|
||||||
|
* Function returns a char * to a formatted line. Has to be free()d
|
||||||
|
*/
|
||||||
|
static char *get_netscape_format(const struct Cookie *co)
|
||||||
|
{
|
||||||
|
return aprintf(
|
||||||
|
"%s%s\t" /* domain */
|
||||||
|
"%s\t" /* tailmatch */
|
||||||
|
"%s\t" /* path */
|
||||||
|
"%s\t" /* secure */
|
||||||
|
"%" FORMAT_OFF_T "\t" /* expires */
|
||||||
|
"%s\t" /* name */
|
||||||
|
"%s", /* 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->tailmatch?"TRUE":"FALSE",
|
||||||
|
co->path?co->path:"/",
|
||||||
|
co->secure?"TRUE":"FALSE",
|
||||||
|
co->expires,
|
||||||
|
co->name,
|
||||||
|
co->value?co->value:"");
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Curl_cookie_output()
|
* Curl_cookie_output()
|
||||||
*
|
*
|
||||||
@@ -847,6 +901,8 @@ int Curl_cookie_output(struct CookieInfo *c, char *dumphere)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(c) {
|
if(c) {
|
||||||
|
char *format_ptr;
|
||||||
|
|
||||||
fputs("# Netscape HTTP Cookie File\n"
|
fputs("# Netscape HTTP Cookie File\n"
|
||||||
"# http://www.netscape.com/newsref/std/cookie_spec.html\n"
|
"# http://www.netscape.com/newsref/std/cookie_spec.html\n"
|
||||||
"# This file was generated by libcurl! Edit at your own risk.\n\n",
|
"# This file was generated by libcurl! Edit at your own risk.\n\n",
|
||||||
@@ -854,26 +910,13 @@ int Curl_cookie_output(struct CookieInfo *c, char *dumphere)
|
|||||||
co = c->cookies;
|
co = c->cookies;
|
||||||
|
|
||||||
while(co) {
|
while(co) {
|
||||||
fprintf(out,
|
format_ptr = get_netscape_format(co);
|
||||||
"%s%s\t" /* domain */
|
if (format_ptr == NULL) {
|
||||||
"%s\t" /* tailmatch */
|
fprintf(out, "#\n# Fatal libcurl error\n");
|
||||||
"%s\t" /* path */
|
return 1;
|
||||||
"%s\t" /* secure */
|
}
|
||||||
"%u\t" /* expires */
|
fprintf(out, "%s\n", format_ptr);
|
||||||
"%s\t" /* name */
|
free(format_ptr);
|
||||||
"%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->tailmatch?"TRUE":"FALSE",
|
|
||||||
co->path?co->path:"/",
|
|
||||||
co->secure?"TRUE":"FALSE",
|
|
||||||
(unsigned int)co->expires,
|
|
||||||
co->name,
|
|
||||||
co->value?co->value:"");
|
|
||||||
|
|
||||||
co=co->next;
|
co=co->next;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -884,4 +927,35 @@ int Curl_cookie_output(struct CookieInfo *c, char *dumphere)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct curl_slist *Curl_cookie_list(struct SessionHandle *data)
|
||||||
|
{
|
||||||
|
struct curl_slist *list = NULL;
|
||||||
|
struct curl_slist *beg;
|
||||||
|
struct Cookie *c;
|
||||||
|
char *line;
|
||||||
|
|
||||||
|
if ((data->cookies == NULL) ||
|
||||||
|
(data->cookies->numcookies == 0))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
c = data->cookies->cookies;
|
||||||
|
|
||||||
|
beg = list;
|
||||||
|
while (c) {
|
||||||
|
/* fill the list with _all_ the cookies we know */
|
||||||
|
line = get_netscape_format(c);
|
||||||
|
if (line == NULL) {
|
||||||
|
/* get_netscape_format returns null only if we run out of memory */
|
||||||
|
|
||||||
|
curl_slist_free_all(beg); /* free some memory */
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
list = curl_slist_append(list, line);
|
||||||
|
free(line);
|
||||||
|
c = c->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* CURL_DISABLE_HTTP || CURL_DISABLE_COOKIES */
|
#endif /* CURL_DISABLE_HTTP || CURL_DISABLE_COOKIES */
|
||||||
|
10
lib/cookie.h
10
lib/cookie.h
@@ -38,7 +38,7 @@ struct Cookie {
|
|||||||
char *value; /* name = <this> */
|
char *value; /* name = <this> */
|
||||||
char *path; /* path = <this> */
|
char *path; /* path = <this> */
|
||||||
char *domain; /* domain = <this> */
|
char *domain; /* domain = <this> */
|
||||||
long expires; /* expires = <this> */
|
curl_off_t 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 */
|
bool tailmatch; /* weather we do tail-matchning of the domain name */
|
||||||
|
|
||||||
@@ -92,4 +92,12 @@ void Curl_cookie_freelist(struct Cookie *);
|
|||||||
void Curl_cookie_cleanup(struct CookieInfo *);
|
void Curl_cookie_cleanup(struct CookieInfo *);
|
||||||
int Curl_cookie_output(struct CookieInfo *, char *);
|
int Curl_cookie_output(struct CookieInfo *, char *);
|
||||||
|
|
||||||
|
#if defined(CURL_DISABLE_HTTP) || defined(CURL_DISABLE_COOKIES)
|
||||||
|
#define Curl_cookie_list(x) NULL
|
||||||
|
#define Curl_cookie_loadfiles(x)
|
||||||
|
#else
|
||||||
|
struct curl_slist *Curl_cookie_list(struct SessionHandle *data);
|
||||||
|
void Curl_cookie_loadfiles(struct SessionHandle *data);
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
36
lib/easy.c
36
lib/easy.c
@@ -308,49 +308,19 @@ CURL *curl_easy_init(void)
|
|||||||
* curl_easy_setopt() is the external interface for setting options on an
|
* curl_easy_setopt() is the external interface for setting options on an
|
||||||
* easy handle.
|
* easy handle.
|
||||||
*/
|
*/
|
||||||
typedef int (*func_T)(void);
|
|
||||||
CURLcode curl_easy_setopt(CURL *curl, CURLoption tag, ...)
|
CURLcode curl_easy_setopt(CURL *curl, CURLoption tag, ...)
|
||||||
{
|
{
|
||||||
va_list arg;
|
va_list arg;
|
||||||
func_T param_func = (func_T)0;
|
|
||||||
long param_long = 0;
|
|
||||||
void *param_obj = NULL;
|
|
||||||
curl_off_t param_offset = 0;
|
|
||||||
struct SessionHandle *data = curl;
|
struct SessionHandle *data = curl;
|
||||||
CURLcode ret=CURLE_FAILED_INIT;
|
CURLcode ret;
|
||||||
|
|
||||||
if(!curl)
|
if(!curl)
|
||||||
return CURLE_BAD_FUNCTION_ARGUMENT;
|
return CURLE_BAD_FUNCTION_ARGUMENT;
|
||||||
|
|
||||||
va_start(arg, tag);
|
va_start(arg, tag);
|
||||||
|
|
||||||
/* PORTING NOTE:
|
ret = Curl_setopt(data, tag, arg);
|
||||||
Object pointers can't necessarily be casted to function pointers and
|
|
||||||
therefore we need to know what type it is and read the correct type
|
|
||||||
at once. This should also correct problems with different sizes of
|
|
||||||
the types.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if(tag < CURLOPTTYPE_OBJECTPOINT) {
|
|
||||||
/* This is a LONG type */
|
|
||||||
param_long = va_arg(arg, long);
|
|
||||||
ret = Curl_setopt(data, tag, param_long);
|
|
||||||
}
|
|
||||||
else if(tag < CURLOPTTYPE_FUNCTIONPOINT) {
|
|
||||||
/* This is a object pointer type */
|
|
||||||
param_obj = va_arg(arg, void *);
|
|
||||||
ret = Curl_setopt(data, tag, param_obj);
|
|
||||||
}
|
|
||||||
else if(tag < CURLOPTTYPE_OFF_T) {
|
|
||||||
/* This is a function pointer type */
|
|
||||||
param_func = va_arg(arg, func_T );
|
|
||||||
ret = Curl_setopt(data, tag, param_func);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
/* This is a curl_off_t type */
|
|
||||||
param_offset = va_arg(arg, curl_off_t);
|
|
||||||
ret = Curl_setopt(data, tag, param_offset);
|
|
||||||
}
|
|
||||||
|
|
||||||
va_end(arg);
|
va_end(arg);
|
||||||
return ret;
|
return ret;
|
||||||
|
76
lib/ftp.c
76
lib/ftp.c
@@ -174,9 +174,13 @@ static bool isBadFtpString(const char *string)
|
|||||||
* to us. This function will sit and wait here until the server has
|
* to us. This function will sit and wait here until the server has
|
||||||
* connected.
|
* connected.
|
||||||
*
|
*
|
||||||
|
* If FTP-SSL is used and SSL is requested for the data connection, this
|
||||||
|
* function will do that transport layer handshake too.
|
||||||
|
*
|
||||||
*/
|
*/
|
||||||
static CURLcode AllowServerConnect(struct connectdata *conn)
|
static CURLcode AllowServerConnect(struct connectdata *conn)
|
||||||
{
|
{
|
||||||
|
CURLcode result;
|
||||||
int timeout_ms;
|
int timeout_ms;
|
||||||
struct SessionHandle *data = conn->data;
|
struct SessionHandle *data = conn->data;
|
||||||
curl_socket_t sock = conn->sock[SECONDARYSOCKET];
|
curl_socket_t sock = conn->sock[SECONDARYSOCKET];
|
||||||
@@ -209,12 +213,12 @@ static CURLcode AllowServerConnect(struct connectdata *conn)
|
|||||||
default:
|
default:
|
||||||
/* we have received data here */
|
/* we have received data here */
|
||||||
{
|
{
|
||||||
curl_socket_t s;
|
curl_socket_t s = CURL_SOCKET_BAD;
|
||||||
size_t size = sizeof(struct sockaddr_in);
|
socklen_t size = (socklen_t) sizeof(struct sockaddr_in);
|
||||||
struct sockaddr_in add;
|
struct sockaddr_in add;
|
||||||
|
|
||||||
getsockname(sock, (struct sockaddr *) &add, (socklen_t *)&size);
|
if(0 == getsockname(sock, (struct sockaddr *) &add, &size))
|
||||||
s=accept(sock, (struct sockaddr *) &add, (socklen_t *)&size);
|
s=accept(sock, (struct sockaddr *) &add, &size);
|
||||||
|
|
||||||
sclose(sock); /* close the first socket */
|
sclose(sock); /* close the first socket */
|
||||||
|
|
||||||
@@ -231,6 +235,17 @@ static CURLcode AllowServerConnect(struct connectdata *conn)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* If PASV is used, this is is made elsewhere */
|
||||||
|
if(conn->ssl[SECONDARYSOCKET].use) {
|
||||||
|
/* since we only have a plaintext TCP connection here, we must now
|
||||||
|
do the TLS stuff */
|
||||||
|
infof(data, "Doing the SSL/TLS handshake on the data stream\n");
|
||||||
|
/* BLOCKING */
|
||||||
|
result = Curl_ssl_connect(conn, SECONDARYSOCKET);
|
||||||
|
if(result)
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
return CURLE_OK;
|
return CURLE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1110,7 +1125,7 @@ static CURLcode ftp_state_use_port(struct connectdata *conn,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
failf(data, "could't find IP address to use");
|
failf(data, "couldn't find IP address to use");
|
||||||
return CURLE_FTP_PORT_FAILED;
|
return CURLE_FTP_PORT_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1670,8 +1685,7 @@ static CURLcode ftp_state_pasv_resp(struct connectdata *conn,
|
|||||||
|
|
||||||
/* BLOCKING */
|
/* BLOCKING */
|
||||||
/* We want "seamless" FTP operations through HTTP proxy tunnel */
|
/* We want "seamless" FTP operations through HTTP proxy tunnel */
|
||||||
result = Curl_ConnectHTTPProxyTunnel(conn, SECONDARYSOCKET,
|
result = Curl_proxyCONNECT(conn, SECONDARYSOCKET, newhost, newport);
|
||||||
newhost, newport);
|
|
||||||
if(CURLE_OK != result)
|
if(CURLE_OK != result)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@@ -1826,10 +1840,17 @@ static CURLcode ftp_state_type_resp(struct connectdata *conn,
|
|||||||
CURLcode result = CURLE_OK;
|
CURLcode result = CURLE_OK;
|
||||||
struct SessionHandle *data=conn->data;
|
struct SessionHandle *data=conn->data;
|
||||||
|
|
||||||
if(ftpcode != 200) {
|
if(ftpcode/100 != 2) {
|
||||||
|
/* "sasserftpd" and "(u)r(x)bot ftpd" both responds with 226 after a
|
||||||
|
successful 'TYPE I'. While that is not as RFC959 says, it is still a
|
||||||
|
positive response code and we allow that. */
|
||||||
failf(data, "Couldn't set desired mode");
|
failf(data, "Couldn't set desired mode");
|
||||||
return CURLE_FTP_COULDNT_SET_BINARY; /* FIX */
|
return CURLE_FTP_COULDNT_SET_BINARY; /* FIX */
|
||||||
}
|
}
|
||||||
|
if(ftpcode != 200)
|
||||||
|
infof(data, "Got a %03d response code instead of the assumed 200\n",
|
||||||
|
ftpcode);
|
||||||
|
|
||||||
if(instate == FTP_TYPE)
|
if(instate == FTP_TYPE)
|
||||||
result = ftp_state_post_type(conn);
|
result = ftp_state_post_type(conn);
|
||||||
else if(instate == FTP_LIST_TYPE)
|
else if(instate == FTP_LIST_TYPE)
|
||||||
@@ -2011,16 +2032,6 @@ static CURLcode ftp_state_stor_resp(struct connectdata *conn,
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(conn->ssl[SECONDARYSOCKET].use) {
|
|
||||||
/* since we only have a plaintext TCP connection here, we must now
|
|
||||||
do the TLS stuff */
|
|
||||||
infof(data, "Doing the SSL/TLS handshake on the data stream\n");
|
|
||||||
/* BLOCKING */
|
|
||||||
result = Curl_ssl_connect(conn, SECONDARYSOCKET);
|
|
||||||
if(result)
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
*(ftp->bytecountp)=0;
|
*(ftp->bytecountp)=0;
|
||||||
|
|
||||||
/* When we know we're uploading a specified file, we can get the file
|
/* When we know we're uploading a specified file, we can get the file
|
||||||
@@ -2120,15 +2131,6 @@ static CURLcode ftp_state_get_resp(struct connectdata *conn,
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(conn->ssl[SECONDARYSOCKET].use) {
|
|
||||||
/* since we only have a plaintext TCP connection here, we must now
|
|
||||||
do the TLS stuff */
|
|
||||||
infof(data, "Doing the SSL/TLS handshake on the data stream\n");
|
|
||||||
result = Curl_ssl_connect(conn, SECONDARYSOCKET);
|
|
||||||
if(result)
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(size > conn->maxdownload && conn->maxdownload > 0)
|
if(size > conn->maxdownload && conn->maxdownload > 0)
|
||||||
size = conn->size = conn->maxdownload;
|
size = conn->size = conn->maxdownload;
|
||||||
|
|
||||||
@@ -2738,8 +2740,8 @@ CURLcode Curl_ftp_connect(struct connectdata *conn,
|
|||||||
if (conn->bits.tunnel_proxy) {
|
if (conn->bits.tunnel_proxy) {
|
||||||
/* BLOCKING */
|
/* BLOCKING */
|
||||||
/* We want "seamless" FTP operations through HTTP proxy tunnel */
|
/* We want "seamless" FTP operations through HTTP proxy tunnel */
|
||||||
result = Curl_ConnectHTTPProxyTunnel(conn, FIRSTSOCKET,
|
result = Curl_proxyCONNECT(conn, FIRSTSOCKET,
|
||||||
conn->host.name, conn->remote_port);
|
conn->host.name, conn->remote_port);
|
||||||
if(CURLE_OK != result)
|
if(CURLE_OK != result)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@@ -3090,6 +3092,18 @@ CURLcode Curl_ftp_nextconnect(struct connectdata *conn)
|
|||||||
if(!ftp->no_transfer && !conn->bits.no_body) {
|
if(!ftp->no_transfer && !conn->bits.no_body) {
|
||||||
/* a transfer is about to take place */
|
/* a transfer is about to take place */
|
||||||
|
|
||||||
|
if(conn->ssl[SECONDARYSOCKET].use &&
|
||||||
|
!data->set.ftp_use_port) {
|
||||||
|
/* PASV is used and we just got the data connection connected, then
|
||||||
|
it is time to handshake the secure stuff. */
|
||||||
|
|
||||||
|
infof(data, "Doing the SSL/TLS handshake on the data stream\n");
|
||||||
|
/* BLOCKING */
|
||||||
|
result = Curl_ssl_connect(conn, SECONDARYSOCKET);
|
||||||
|
if(result)
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
if(data->set.upload) {
|
if(data->set.upload) {
|
||||||
NBFTPSENDF(conn, "TYPE %c", data->set.ftp_ascii?'A':'I');
|
NBFTPSENDF(conn, "TYPE %c", data->set.ftp_ascii?'A':'I');
|
||||||
state(conn, FTP_STOR_TYPE);
|
state(conn, FTP_STOR_TYPE);
|
||||||
@@ -3164,7 +3178,7 @@ CURLcode ftp_perform(struct connectdata *conn,
|
|||||||
*connected = conn->bits.tcpconnect;
|
*connected = conn->bits.tcpconnect;
|
||||||
|
|
||||||
if(*dophase_done)
|
if(*dophase_done)
|
||||||
DEBUGF(infof(conn->data, "DO phase is comlete\n"));
|
DEBUGF(infof(conn->data, "DO phase is complete\n"));
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@@ -3821,7 +3835,7 @@ CURLcode Curl_ftp_doing(struct connectdata *conn,
|
|||||||
if(*dophase_done) {
|
if(*dophase_done) {
|
||||||
result = ftp_dophase_done(conn, FALSE /* not connected */);
|
result = ftp_dophase_done(conn, FALSE /* not connected */);
|
||||||
|
|
||||||
DEBUGF(infof(conn->data, "DO phase is comlete\n"));
|
DEBUGF(infof(conn->data, "DO phase is complete\n"));
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@@ -184,6 +184,9 @@ CURLcode Curl_getinfo(struct SessionHandle *data, CURLINFO info, ...)
|
|||||||
case CURLINFO_SSL_ENGINES:
|
case CURLINFO_SSL_ENGINES:
|
||||||
*param_slistp = Curl_ssl_engines_list(data);
|
*param_slistp = Curl_ssl_engines_list(data);
|
||||||
break;
|
break;
|
||||||
|
case CURLINFO_COOKIELIST:
|
||||||
|
*param_slistp = Curl_cookie_list(data);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return CURLE_BAD_FUNCTION_ARGUMENT;
|
return CURLE_BAD_FUNCTION_ARGUMENT;
|
||||||
}
|
}
|
||||||
|
@@ -151,13 +151,18 @@ Curl_gtls_connect(struct connectdata *conn,
|
|||||||
|
|
||||||
if(data->set.ssl.CAfile) {
|
if(data->set.ssl.CAfile) {
|
||||||
/* set the trusted CA cert bundle file */
|
/* set the trusted CA cert bundle file */
|
||||||
|
gnutls_certificate_set_verify_flags(conn->ssl[sockindex].cred,
|
||||||
|
GNUTLS_VERIFY_ALLOW_X509_V1_CA_CRT);
|
||||||
|
|
||||||
rc = gnutls_certificate_set_x509_trust_file(conn->ssl[sockindex].cred,
|
rc = gnutls_certificate_set_x509_trust_file(conn->ssl[sockindex].cred,
|
||||||
data->set.ssl.CAfile,
|
data->set.ssl.CAfile,
|
||||||
GNUTLS_X509_FMT_PEM);
|
GNUTLS_X509_FMT_PEM);
|
||||||
if(rc < 0) {
|
if(rc < 0)
|
||||||
infof(data, "error reading ca cert file %s (%s)\n",
|
infof(data, "error reading ca cert file %s (%s)\n",
|
||||||
data->set.ssl.CAfile, gnutls_strerror(rc));
|
data->set.ssl.CAfile, gnutls_strerror(rc));
|
||||||
}
|
else
|
||||||
|
infof(data, "found %d certificates in %s\n",
|
||||||
|
rc, data->set.ssl.CAfile);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Initialize TLS session as a client */
|
/* Initialize TLS session as a client */
|
||||||
|
@@ -172,9 +172,8 @@ Curl_addrinfo *Curl_ip2addr(in_addr_t num, char *hostname, int port)
|
|||||||
/*
|
/*
|
||||||
* Curl_getaddrinfo() - the ipv4 synchronous version.
|
* Curl_getaddrinfo() - the ipv4 synchronous version.
|
||||||
*
|
*
|
||||||
* The original code to this function was once stolen from the Dancer source
|
* The original code to this function was from the Dancer source code, written
|
||||||
* code, written by Bjorn Reese, it has since been patched and modified
|
* by Bjorn Reese, it has since been patched and modified considerably.
|
||||||
* considerably.
|
|
||||||
*
|
*
|
||||||
* gethostbyname_r() is the thread-safe version of the gethostbyname()
|
* gethostbyname_r() is the thread-safe version of the gethostbyname()
|
||||||
* function. When we build for plain IPv4, we attempt to use this
|
* function. When we build for plain IPv4, we attempt to use this
|
||||||
|
229
lib/hostthre.c
229
lib/hostthre.c
@@ -157,11 +157,119 @@ struct thread_data {
|
|||||||
FILE *stderr_file;
|
FILE *stderr_file;
|
||||||
HANDLE mutex_waiting; /* marks that we are still waiting for a resolve */
|
HANDLE mutex_waiting; /* marks that we are still waiting for a resolve */
|
||||||
HANDLE event_resolved; /* marks that the thread obtained the information */
|
HANDLE event_resolved; /* marks that the thread obtained the information */
|
||||||
|
HANDLE event_thread_started; /* marks that the thread has initialized and
|
||||||
|
started */
|
||||||
|
HANDLE mutex_terminate; /* serializes access to flag_terminate */
|
||||||
|
HANDLE event_terminate; /* flag for thread to terminate instead of calling
|
||||||
|
callbacks */
|
||||||
#ifdef CURLRES_IPV6
|
#ifdef CURLRES_IPV6
|
||||||
struct addrinfo hints;
|
struct addrinfo hints;
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* Data for synchronization between resolver thread and its parent */
|
||||||
|
struct thread_sync_data {
|
||||||
|
HANDLE mutex_waiting; /* thread_data.mutex_waiting duplicate */
|
||||||
|
HANDLE mutex_terminate; /* thread_data.mutex_terminate duplicate */
|
||||||
|
HANDLE event_terminate; /* thread_data.event_terminate duplicate */
|
||||||
|
char * hostname; /* hostname to resolve, Curl_async.hostname
|
||||||
|
duplicate */
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Destroy resolver thread synchronization data */
|
||||||
|
void destroy_thread_sync_data(struct thread_sync_data * tsd)
|
||||||
|
{
|
||||||
|
if (tsd->hostname) {
|
||||||
|
free(tsd->hostname);
|
||||||
|
tsd->hostname = NULL;
|
||||||
|
}
|
||||||
|
if (tsd->event_terminate) {
|
||||||
|
CloseHandle(tsd->event_terminate);
|
||||||
|
tsd->event_terminate = NULL;
|
||||||
|
}
|
||||||
|
if (tsd->mutex_terminate) {
|
||||||
|
CloseHandle(tsd->mutex_terminate);
|
||||||
|
tsd->mutex_terminate = NULL;
|
||||||
|
}
|
||||||
|
if (tsd->mutex_waiting) {
|
||||||
|
CloseHandle(tsd->mutex_waiting);
|
||||||
|
tsd->mutex_waiting = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Initialize resolver thread synchronization data */
|
||||||
|
BOOL init_thread_sync_data(struct thread_data * td,
|
||||||
|
char * hostname,
|
||||||
|
struct thread_sync_data * tsd)
|
||||||
|
{
|
||||||
|
HANDLE curr_proc = GetCurrentProcess();
|
||||||
|
|
||||||
|
memset(tsd, 0, sizeof(tsd));
|
||||||
|
if (!DuplicateHandle(curr_proc, td->mutex_waiting,
|
||||||
|
curr_proc, &tsd->mutex_waiting, 0, FALSE,
|
||||||
|
DUPLICATE_SAME_ACCESS)) {
|
||||||
|
/* failed to duplicate the mutex, no point in continuing */
|
||||||
|
destroy_thread_sync_data(tsd);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
if (!DuplicateHandle(curr_proc, td->mutex_terminate,
|
||||||
|
curr_proc, &tsd->mutex_terminate, 0, FALSE,
|
||||||
|
DUPLICATE_SAME_ACCESS)) {
|
||||||
|
/* failed to duplicate the mutex, no point in continuing */
|
||||||
|
destroy_thread_sync_data(tsd);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
if (!DuplicateHandle(curr_proc, td->event_terminate,
|
||||||
|
curr_proc, &tsd->event_terminate, 0, FALSE,
|
||||||
|
DUPLICATE_SAME_ACCESS)) {
|
||||||
|
/* failed to duplicate the event, no point in continuing */
|
||||||
|
destroy_thread_sync_data(tsd);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
/* Copying hostname string because original can be destroyed by parent
|
||||||
|
* thread during gethostbyname execution.
|
||||||
|
*/
|
||||||
|
tsd->hostname = strdup(hostname);
|
||||||
|
if (!tsd->hostname) {
|
||||||
|
/* Memory allocation failed */
|
||||||
|
destroy_thread_sync_data(tsd);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* acquire resolver thread synchronization */
|
||||||
|
BOOL acquire_thread_sync(struct thread_sync_data * tsd)
|
||||||
|
{
|
||||||
|
/* is the thread initiator still waiting for us ? */
|
||||||
|
if (WaitForSingleObject(tsd->mutex_waiting, 0) == WAIT_TIMEOUT) {
|
||||||
|
/* yes, it is */
|
||||||
|
|
||||||
|
/* Waiting access to event_terminate */
|
||||||
|
if (WaitForSingleObject(tsd->mutex_terminate, INFINITE) != WAIT_OBJECT_0) {
|
||||||
|
/* Something went wrong - now just ignoring */
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (WaitForSingleObject(tsd->event_terminate, 0) != WAIT_TIMEOUT) {
|
||||||
|
/* Parent thread signaled us to terminate.
|
||||||
|
* This means that all data in conn->async is now destroyed
|
||||||
|
* and we cannot use it.
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* release resolver thread synchronization */
|
||||||
|
void release_thread_sync(struct thread_sync_data * tsd)
|
||||||
|
{
|
||||||
|
ReleaseMutex(tsd->mutex_terminate);
|
||||||
|
}
|
||||||
|
|
||||||
#if defined(CURLRES_IPV4)
|
#if defined(CURLRES_IPV4)
|
||||||
/*
|
/*
|
||||||
* gethostbyname_thread() resolves a name, calls the Curl_addrinfo4_callback
|
* gethostbyname_thread() resolves a name, calls the Curl_addrinfo4_callback
|
||||||
@@ -177,17 +285,13 @@ static unsigned __stdcall gethostbyname_thread (void *arg)
|
|||||||
struct hostent *he;
|
struct hostent *he;
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
|
|
||||||
/* Duplicate the passed mutex handle.
|
/* Duplicate the passed mutex and event handles.
|
||||||
* This allows us to use it even after the container gets destroyed
|
* This allows us to use it even after the container gets destroyed
|
||||||
* due to a resolver timeout.
|
* due to a resolver timeout.
|
||||||
*/
|
*/
|
||||||
HANDLE mutex_waiting = NULL;
|
struct thread_sync_data tsd = {0};
|
||||||
HANDLE curr_proc = GetCurrentProcess();
|
if (!init_thread_sync_data(td, conn->async.hostname, &tsd)) {
|
||||||
|
/* thread synchronization data initialization failed */
|
||||||
if (!DuplicateHandle(curr_proc, td->mutex_waiting,
|
|
||||||
curr_proc, &mutex_waiting, 0, FALSE,
|
|
||||||
DUPLICATE_SAME_ACCESS)) {
|
|
||||||
/* failed to duplicate the mutex, no point in continuing */
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -200,17 +304,18 @@ static unsigned __stdcall gethostbyname_thread (void *arg)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
WSASetLastError (conn->async.status = NO_DATA); /* pending status */
|
WSASetLastError (conn->async.status = NO_DATA); /* pending status */
|
||||||
he = gethostbyname (conn->async.hostname);
|
|
||||||
|
|
||||||
/* is the thread initiator still waiting for us ? */
|
/* Signaling that we have initialized all copies of data and handles we
|
||||||
if (WaitForSingleObject(mutex_waiting, 0) == WAIT_TIMEOUT) {
|
need */
|
||||||
/* yes, it is */
|
SetEvent(td->event_thread_started);
|
||||||
|
|
||||||
/* Mark that we have obtained the information, and that we are
|
he = gethostbyname (tsd.hostname);
|
||||||
* calling back with it.
|
|
||||||
*/
|
/* is parent thread waiting for us and are we able to access conn members? */
|
||||||
|
if (acquire_thread_sync(&tsd)) {
|
||||||
|
/* Mark that we have obtained the information, and that we are calling
|
||||||
|
* back with it. */
|
||||||
SetEvent(td->event_resolved);
|
SetEvent(td->event_resolved);
|
||||||
|
|
||||||
if (he) {
|
if (he) {
|
||||||
rc = Curl_addrinfo4_callback(conn, CURL_ASYNC_SUCCESS, he);
|
rc = Curl_addrinfo4_callback(conn, CURL_ASYNC_SUCCESS, he);
|
||||||
}
|
}
|
||||||
@@ -219,10 +324,11 @@ static unsigned __stdcall gethostbyname_thread (void *arg)
|
|||||||
}
|
}
|
||||||
TRACE(("Winsock-error %d, addr %s\n", conn->async.status,
|
TRACE(("Winsock-error %d, addr %s\n", conn->async.status,
|
||||||
he ? inet_ntoa(*(struct in_addr*)he->h_addr) : "unknown"));
|
he ? inet_ntoa(*(struct in_addr*)he->h_addr) : "unknown"));
|
||||||
|
release_thread_sync(&tsd);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* clean up */
|
/* clean up */
|
||||||
CloseHandle(mutex_waiting);
|
destroy_thread_sync_data(&tsd);
|
||||||
|
|
||||||
return (rc);
|
return (rc);
|
||||||
/* An implicit _endthreadex() here */
|
/* An implicit _endthreadex() here */
|
||||||
@@ -244,18 +350,15 @@ static unsigned __stdcall getaddrinfo_thread (void *arg)
|
|||||||
struct addrinfo *res;
|
struct addrinfo *res;
|
||||||
char service [NI_MAXSERV];
|
char service [NI_MAXSERV];
|
||||||
int rc;
|
int rc;
|
||||||
|
struct addrinfo hints = td->hints;
|
||||||
|
|
||||||
/* Duplicate the passed mutex handle.
|
/* Duplicate the passed mutex handle.
|
||||||
* This allows us to use it even after the container gets destroyed
|
* This allows us to use it even after the container gets destroyed
|
||||||
* due to a resolver timeout.
|
* due to a resolver timeout.
|
||||||
*/
|
*/
|
||||||
HANDLE mutex_waiting = NULL;
|
struct thread_sync_data tsd = {0};
|
||||||
HANDLE curr_proc = GetCurrentProcess();
|
if (!init_thread_sync_data(td, conn->async.hostname, &tsd)) {
|
||||||
|
/* thread synchronization data initialization failed */
|
||||||
if (!DuplicateHandle(curr_proc, td->mutex_waiting,
|
|
||||||
curr_proc, &mutex_waiting, 0, FALSE,
|
|
||||||
DUPLICATE_SAME_ACCESS)) {
|
|
||||||
/* failed to duplicate the mutex, no point in continuing */
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -267,15 +370,16 @@ static unsigned __stdcall getaddrinfo_thread (void *arg)
|
|||||||
|
|
||||||
WSASetLastError(conn->async.status = NO_DATA); /* pending status */
|
WSASetLastError(conn->async.status = NO_DATA); /* pending status */
|
||||||
|
|
||||||
rc = getaddrinfo(conn->async.hostname, service, &td->hints, &res);
|
/* Signaling that we have initialized all copies of data and handles we
|
||||||
|
need */
|
||||||
|
SetEvent(td->event_thread_started);
|
||||||
|
|
||||||
/* is the thread initiator still waiting for us ? */
|
rc = getaddrinfo(tsd.hostname, service, &hints, &res);
|
||||||
if (WaitForSingleObject(mutex_waiting, 0) == WAIT_TIMEOUT) {
|
|
||||||
/* yes, it is */
|
|
||||||
|
|
||||||
/* Mark that we have obtained the information, and that we are
|
/* is parent thread waiting for us and are we able to access conn members? */
|
||||||
* calling back with it.
|
if (acquire_thread_sync(&tsd)) {
|
||||||
*/
|
/* Mark that we have obtained the information, and that we are calling
|
||||||
|
back with it. */
|
||||||
SetEvent(td->event_resolved);
|
SetEvent(td->event_resolved);
|
||||||
|
|
||||||
if (rc == 0) {
|
if (rc == 0) {
|
||||||
@@ -288,10 +392,11 @@ static unsigned __stdcall getaddrinfo_thread (void *arg)
|
|||||||
rc = Curl_addrinfo6_callback(conn, (int)WSAGetLastError(), NULL);
|
rc = Curl_addrinfo6_callback(conn, (int)WSAGetLastError(), NULL);
|
||||||
TRACE(("Winsock-error %d, no address\n", conn->async.status));
|
TRACE(("Winsock-error %d, no address\n", conn->async.status));
|
||||||
}
|
}
|
||||||
|
release_thread_sync(&tsd);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* clean up */
|
/* clean up */
|
||||||
CloseHandle(mutex_waiting);
|
destroy_thread_sync_data(&tsd);
|
||||||
|
|
||||||
return (rc);
|
return (rc);
|
||||||
/* An implicit _endthreadex() here */
|
/* An implicit _endthreadex() here */
|
||||||
@@ -299,7 +404,7 @@ static unsigned __stdcall getaddrinfo_thread (void *arg)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Curl_destroy_thread_data() cleans up async resolver data.
|
* Curl_destroy_thread_data() cleans up async resolver data and thread handle.
|
||||||
* Complementary of ares_destroy.
|
* Complementary of ares_destroy.
|
||||||
*/
|
*/
|
||||||
void Curl_destroy_thread_data (struct Curl_async *async)
|
void Curl_destroy_thread_data (struct Curl_async *async)
|
||||||
@@ -311,6 +416,24 @@ void Curl_destroy_thread_data (struct Curl_async *async)
|
|||||||
struct thread_data *td = (struct thread_data*) async->os_specific;
|
struct thread_data *td = (struct thread_data*) async->os_specific;
|
||||||
curl_socket_t sock = td->dummy_sock;
|
curl_socket_t sock = td->dummy_sock;
|
||||||
|
|
||||||
|
if (td->mutex_terminate && td->event_terminate) {
|
||||||
|
/* Signaling resolver thread to terminate */
|
||||||
|
if (WaitForSingleObject(td->mutex_terminate, INFINITE) == WAIT_OBJECT_0) {
|
||||||
|
SetEvent(td->event_terminate);
|
||||||
|
ReleaseMutex(td->mutex_terminate);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* Something went wrong - just ignoring it */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (td->mutex_terminate)
|
||||||
|
CloseHandle(td->mutex_terminate);
|
||||||
|
if (td->event_terminate)
|
||||||
|
CloseHandle(td->event_terminate);
|
||||||
|
if (td->event_thread_started)
|
||||||
|
CloseHandle(td->event_thread_started);
|
||||||
|
|
||||||
if (sock != CURL_SOCKET_BAD)
|
if (sock != CURL_SOCKET_BAD)
|
||||||
sclose(sock);
|
sclose(sock);
|
||||||
|
|
||||||
@@ -321,6 +444,9 @@ void Curl_destroy_thread_data (struct Curl_async *async)
|
|||||||
if (td->event_resolved)
|
if (td->event_resolved)
|
||||||
CloseHandle(td->event_resolved);
|
CloseHandle(td->event_resolved);
|
||||||
|
|
||||||
|
if (td->thread_hnd)
|
||||||
|
CloseHandle(td->thread_hnd);
|
||||||
|
|
||||||
free(async->os_specific);
|
free(async->os_specific);
|
||||||
}
|
}
|
||||||
async->hostname = NULL;
|
async->hostname = NULL;
|
||||||
@@ -338,6 +464,7 @@ static bool init_resolve_thread (struct connectdata *conn,
|
|||||||
const Curl_addrinfo *hints)
|
const Curl_addrinfo *hints)
|
||||||
{
|
{
|
||||||
struct thread_data *td = calloc(sizeof(*td), 1);
|
struct thread_data *td = calloc(sizeof(*td), 1);
|
||||||
|
HANDLE thread_and_event[2] = {0};
|
||||||
|
|
||||||
if (!td) {
|
if (!td) {
|
||||||
SetLastError(ENOMEM);
|
SetLastError(ENOMEM);
|
||||||
@@ -378,6 +505,31 @@ static bool init_resolve_thread (struct connectdata *conn,
|
|||||||
SetLastError(EAGAIN);
|
SetLastError(EAGAIN);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
/* Create the mutex used to serialize access to event_terminated
|
||||||
|
* between us and resolver thread.
|
||||||
|
*/
|
||||||
|
td->mutex_terminate = CreateMutex(NULL, FALSE, NULL);
|
||||||
|
if (td->mutex_terminate == NULL) {
|
||||||
|
Curl_destroy_thread_data(&conn->async);
|
||||||
|
SetLastError(EAGAIN);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
/* Create the event used to signal thread that it should terminate.
|
||||||
|
*/
|
||||||
|
td->event_terminate = CreateEvent(NULL, TRUE, FALSE, NULL);
|
||||||
|
if (td->event_terminate == NULL) {
|
||||||
|
Curl_destroy_thread_data(&conn->async);
|
||||||
|
SetLastError(EAGAIN);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
/* Create the event used by thread to inform it has initialized its own data.
|
||||||
|
*/
|
||||||
|
td->event_thread_started = CreateEvent(NULL, TRUE, FALSE, NULL);
|
||||||
|
if (td->event_thread_started == NULL) {
|
||||||
|
Curl_destroy_thread_data(&conn->async);
|
||||||
|
SetLastError(EAGAIN);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
td->stderr_file = stderr;
|
td->stderr_file = stderr;
|
||||||
|
|
||||||
@@ -403,6 +555,15 @@ static bool init_resolve_thread (struct connectdata *conn,
|
|||||||
Curl_destroy_thread_data(&conn->async);
|
Curl_destroy_thread_data(&conn->async);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
/* Waiting until the thread will initialize its data or it will exit due errors.
|
||||||
|
*/
|
||||||
|
thread_and_event[0] = td->thread_hnd;
|
||||||
|
thread_and_event[1] = td->event_thread_started;
|
||||||
|
if (WaitForMultipleObjects(sizeof(thread_and_event) / sizeof(thread_and_event[0]), thread_and_event, FALSE, INFINITE) == WAIT_FAILED) {
|
||||||
|
/* The resolver thread has been created,
|
||||||
|
* most probably it works now - ignoring this "minor" error
|
||||||
|
*/
|
||||||
|
}
|
||||||
/* This socket is only to keep Curl_resolv_fdset() and select() happy;
|
/* This socket is only to keep Curl_resolv_fdset() and select() happy;
|
||||||
* should never become signalled for read/write since it's unbound but
|
* should never become signalled for read/write since it's unbound but
|
||||||
* Windows needs atleast 1 socket in select().
|
* Windows needs atleast 1 socket in select().
|
||||||
@@ -481,8 +642,6 @@ CURLcode Curl_wait_for_resolv(struct connectdata *conn,
|
|||||||
|
|
||||||
TRACE(("elapsed %lu ms\n", GetTickCount()-ticks));
|
TRACE(("elapsed %lu ms\n", GetTickCount()-ticks));
|
||||||
|
|
||||||
CloseHandle(td->thread_hnd);
|
|
||||||
|
|
||||||
if(entry)
|
if(entry)
|
||||||
*entry = conn->async.dns;
|
*entry = conn->async.dns;
|
||||||
|
|
||||||
|
57
lib/http.c
57
lib/http.c
@@ -96,6 +96,7 @@
|
|||||||
#include "memory.h"
|
#include "memory.h"
|
||||||
#include "select.h"
|
#include "select.h"
|
||||||
#include "parsedate.h" /* for the week day and month names */
|
#include "parsedate.h" /* for the week day and month names */
|
||||||
|
#include "strtoofft.h"
|
||||||
|
|
||||||
#define _MPRINTF_REPLACE /* use our functions only */
|
#define _MPRINTF_REPLACE /* use our functions only */
|
||||||
#include <curl/mprintf.h>
|
#include <curl/mprintf.h>
|
||||||
@@ -1053,10 +1054,9 @@ Curl_compareheader(char *headerline, /* line to check */
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ConnectHTTPProxyTunnel() requires that we're connected to a HTTP
|
* Curl_proxyCONNECT() requires that we're connected to a HTTP proxy. This
|
||||||
* proxy. This function will issue the necessary commands to get a seamless
|
* function will issue the necessary commands to get a seamless tunnel through
|
||||||
* tunnel through this proxy. After that, the socket can be used just as a
|
* this proxy. After that, the socket can be used just as a normal socket.
|
||||||
* normal socket.
|
|
||||||
*
|
*
|
||||||
* This badly needs to be rewritten. CONNECT should be sent and dealt with
|
* This badly needs to be rewritten. CONNECT should be sent and dealt with
|
||||||
* like any ordinary HTTP request, and not specially crafted like this. This
|
* like any ordinary HTTP request, and not specially crafted like this. This
|
||||||
@@ -1064,10 +1064,10 @@ Curl_compareheader(char *headerline, /* line to check */
|
|||||||
* much work to do at the moment.
|
* much work to do at the moment.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
CURLcode Curl_ConnectHTTPProxyTunnel(struct connectdata *conn,
|
CURLcode Curl_proxyCONNECT(struct connectdata *conn,
|
||||||
int sockindex,
|
int sockindex,
|
||||||
char *hostname,
|
char *hostname,
|
||||||
int remote_port)
|
int remote_port)
|
||||||
{
|
{
|
||||||
int subversion=0;
|
int subversion=0;
|
||||||
struct SessionHandle *data=conn->data;
|
struct SessionHandle *data=conn->data;
|
||||||
@@ -1076,7 +1076,7 @@ CURLcode Curl_ConnectHTTPProxyTunnel(struct connectdata *conn,
|
|||||||
int res;
|
int res;
|
||||||
size_t nread; /* total size read */
|
size_t nread; /* total size read */
|
||||||
int perline; /* count bytes per line */
|
int perline; /* count bytes per line */
|
||||||
bool keepon=TRUE;
|
int keepon=TRUE;
|
||||||
ssize_t gotbytes;
|
ssize_t gotbytes;
|
||||||
char *ptr;
|
char *ptr;
|
||||||
long timeout =
|
long timeout =
|
||||||
@@ -1085,6 +1085,7 @@ CURLcode Curl_ConnectHTTPProxyTunnel(struct connectdata *conn,
|
|||||||
char *host_port;
|
char *host_port;
|
||||||
curl_socket_t tunnelsocket = conn->sock[sockindex];
|
curl_socket_t tunnelsocket = conn->sock[sockindex];
|
||||||
send_buffer *req_buffer;
|
send_buffer *req_buffer;
|
||||||
|
curl_off_t cl=0;
|
||||||
|
|
||||||
#define SELECT_OK 0
|
#define SELECT_OK 0
|
||||||
#define SELECT_ERROR 1
|
#define SELECT_ERROR 1
|
||||||
@@ -1215,6 +1216,18 @@ CURLcode Curl_ConnectHTTPProxyTunnel(struct connectdata *conn,
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
nread += gotbytes;
|
nread += gotbytes;
|
||||||
|
|
||||||
|
if(keepon > TRUE) {
|
||||||
|
/* This means we are currently ignoring a response-body, so we
|
||||||
|
simply count down our counter and make sure to break out of the
|
||||||
|
loop when we're done! */
|
||||||
|
cl -= gotbytes;
|
||||||
|
if(cl<=0) {
|
||||||
|
keepon = FALSE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
for(i = 0; i < gotbytes; ptr++, i++) {
|
for(i = 0; i < gotbytes; ptr++, i++) {
|
||||||
perline++; /* amount of bytes in this line so far */
|
perline++; /* amount of bytes in this line so far */
|
||||||
if(*ptr=='\n') {
|
if(*ptr=='\n') {
|
||||||
@@ -1242,7 +1255,21 @@ CURLcode Curl_ConnectHTTPProxyTunnel(struct connectdata *conn,
|
|||||||
if(('\r' == line_start[0]) ||
|
if(('\r' == line_start[0]) ||
|
||||||
('\n' == line_start[0])) {
|
('\n' == line_start[0])) {
|
||||||
/* end of response-headers from the proxy */
|
/* end of response-headers from the proxy */
|
||||||
keepon=FALSE;
|
if(cl && (407 == k->httpcode) && !data->state.authproblem) {
|
||||||
|
/* If we get a 407 response code with content length when we
|
||||||
|
* have no auth problem, we must ignore the whole
|
||||||
|
* response-body */
|
||||||
|
keepon = 2;
|
||||||
|
infof(data, "Ignore %" FORMAT_OFF_T
|
||||||
|
" bytes of response-body\n", cl);
|
||||||
|
cl -= (gotbytes - i);/* remove the remaining chunk of what
|
||||||
|
we already read */
|
||||||
|
if(cl<=0)
|
||||||
|
/* if the whole thing was already read, we are done! */
|
||||||
|
keepon=FALSE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
keepon = FALSE;
|
||||||
break; /* breaks out of for-loop, not switch() */
|
break; /* breaks out of for-loop, not switch() */
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1257,6 +1284,10 @@ CURLcode Curl_ConnectHTTPProxyTunnel(struct connectdata *conn,
|
|||||||
if(result)
|
if(result)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
else if(checkprefix("Content-Length:", line_start)) {
|
||||||
|
cl = curlx_strtoofft(line_start + strlen("Content-Length:"),
|
||||||
|
NULL, 10);
|
||||||
|
}
|
||||||
else if(2 == sscanf(line_start, "HTTP/1.%d %d",
|
else if(2 == sscanf(line_start, "HTTP/1.%d %d",
|
||||||
&subversion,
|
&subversion,
|
||||||
&k->httpcode)) {
|
&k->httpcode)) {
|
||||||
@@ -1323,9 +1354,9 @@ CURLcode Curl_http_connect(struct connectdata *conn, bool *done)
|
|||||||
if(conn->bits.tunnel_proxy) {
|
if(conn->bits.tunnel_proxy) {
|
||||||
|
|
||||||
/* either SSL over proxy, or explicitly asked for */
|
/* either SSL over proxy, or explicitly asked for */
|
||||||
result = Curl_ConnectHTTPProxyTunnel(conn, FIRSTSOCKET,
|
result = Curl_proxyCONNECT(conn, FIRSTSOCKET,
|
||||||
conn->host.name,
|
conn->host.name,
|
||||||
conn->remote_port);
|
conn->remote_port);
|
||||||
if(CURLE_OK != result)
|
if(CURLE_OK != result)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@@ -29,9 +29,9 @@ bool Curl_compareheader(char *headerline, /* line to check */
|
|||||||
const char *content); /* content string to find */
|
const char *content); /* content string to find */
|
||||||
|
|
||||||
/* ftp can use this as well */
|
/* ftp can use this as well */
|
||||||
CURLcode Curl_ConnectHTTPProxyTunnel(struct connectdata *conn,
|
CURLcode Curl_proxyCONNECT(struct connectdata *conn,
|
||||||
int tunnelsocket,
|
int tunnelsocket,
|
||||||
char *hostname, int remote_port);
|
char *hostname, int remote_port);
|
||||||
|
|
||||||
/* protocol-specific functions set up to be called by the main engine */
|
/* protocol-specific functions set up to be called by the main engine */
|
||||||
CURLcode Curl_http(struct connectdata *conn, bool *done);
|
CURLcode Curl_http(struct connectdata *conn, bool *done);
|
||||||
|
@@ -153,10 +153,17 @@ CHUNKcode Curl_httpchunk_read(struct connectdata *conn,
|
|||||||
if(*datap == '\n') {
|
if(*datap == '\n') {
|
||||||
/* we're now expecting data to come, unless size was zero! */
|
/* we're now expecting data to come, unless size was zero! */
|
||||||
if(0 == ch->datasize) {
|
if(0 == ch->datasize) {
|
||||||
ch->state = CHUNK_STOP; /* stop reading! */
|
if (conn->bits.trailerHdrPresent!=TRUE) {
|
||||||
if(1 == length) {
|
/* No Trailer: header found - revert to original Curl processing */
|
||||||
/* This was the final byte, return right now */
|
ch->state = CHUNK_STOP;
|
||||||
return CHUNKE_STOP;
|
if (1 == length) {
|
||||||
|
/* This is the final byte, return right now */
|
||||||
|
return CHUNKE_STOP;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ch->state = CHUNK_TRAILER; /* attempt to read trailers */
|
||||||
|
conn->trlPos=0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -250,6 +257,64 @@ CHUNKcode Curl_httpchunk_read(struct connectdata *conn,
|
|||||||
return CHUNKE_BAD_CHUNK;
|
return CHUNKE_BAD_CHUNK;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case CHUNK_TRAILER:
|
||||||
|
/* conn->trailer is assumed to be freed in url.c on a
|
||||||
|
connection basis */
|
||||||
|
if (conn->trlPos >= conn->trlMax) {
|
||||||
|
char *ptr;
|
||||||
|
if(conn->trlMax) {
|
||||||
|
conn->trlMax *= 2;
|
||||||
|
ptr = (char*)realloc(conn->trailer,conn->trlMax);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
conn->trlMax=128;
|
||||||
|
ptr = (char*)malloc(conn->trlMax);
|
||||||
|
}
|
||||||
|
if(!ptr)
|
||||||
|
return CHUNKE_OUT_OF_MEMORY;
|
||||||
|
conn->trailer = ptr;
|
||||||
|
}
|
||||||
|
conn->trailer[conn->trlPos++]=*datap;
|
||||||
|
|
||||||
|
if(*datap == '\r')
|
||||||
|
ch->state = CHUNK_TRAILER_CR;
|
||||||
|
else {
|
||||||
|
datap++;
|
||||||
|
length--;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case CHUNK_TRAILER_CR:
|
||||||
|
if(*datap == '\r') {
|
||||||
|
ch->state = CHUNK_TRAILER_POSTCR;
|
||||||
|
datap++;
|
||||||
|
length--;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return CHUNKE_BAD_CHUNK;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case CHUNK_TRAILER_POSTCR:
|
||||||
|
if (*datap == '\n') {
|
||||||
|
conn->trailer[conn->trlPos++]='\n';
|
||||||
|
conn->trailer[conn->trlPos]=0;
|
||||||
|
if (conn->trlPos==2) {
|
||||||
|
ch->state = CHUNK_STOP;
|
||||||
|
return CHUNKE_STOP;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Curl_client_write(conn->data, CLIENTWRITE_HEADER,
|
||||||
|
conn->trailer, conn->trlPos);
|
||||||
|
}
|
||||||
|
ch->state = CHUNK_TRAILER;
|
||||||
|
conn->trlPos=0;
|
||||||
|
datap++;
|
||||||
|
length--;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return CHUNKE_BAD_CHUNK;
|
||||||
|
break;
|
||||||
|
|
||||||
case CHUNK_STOP:
|
case CHUNK_STOP:
|
||||||
/* If we arrive here, there is data left in the end of the buffer
|
/* If we arrive here, there is data left in the end of the buffer
|
||||||
even if there's no more chunks to read */
|
even if there's no more chunks to read */
|
||||||
|
@@ -52,8 +52,8 @@ typedef enum {
|
|||||||
/* POSTCR should get a CR and nothing else, then move to POSTLF */
|
/* POSTCR should get a CR and nothing else, then move to POSTLF */
|
||||||
CHUNK_POSTCR,
|
CHUNK_POSTCR,
|
||||||
|
|
||||||
/* POSTLF should get a LF and nothing else, then move back to HEX as
|
/* POSTLF should get a LF and nothing else, then move back to HEX as the
|
||||||
the CRLF combination marks the end of a chunk */
|
CRLF combination marks the end of a chunk */
|
||||||
CHUNK_POSTLF,
|
CHUNK_POSTLF,
|
||||||
|
|
||||||
/* This is mainly used to really mark that we're out of the game.
|
/* This is mainly used to really mark that we're out of the game.
|
||||||
@@ -62,7 +62,22 @@ typedef enum {
|
|||||||
buffer! */
|
buffer! */
|
||||||
CHUNK_STOP,
|
CHUNK_STOP,
|
||||||
|
|
||||||
|
/* At this point optional trailer headers can be found, unless the next line
|
||||||
|
is CRLF */
|
||||||
|
CHUNK_TRAILER,
|
||||||
|
|
||||||
|
/* A trailer CR has been found - next state is CHUNK_TRAILER_POSTCR.
|
||||||
|
Next char must be a LF */
|
||||||
|
CHUNK_TRAILER_CR,
|
||||||
|
|
||||||
|
/* A trailer LF must be found now, otherwise CHUNKE_BAD_CHUNK will be
|
||||||
|
signalled If this is an empty trailer CHUNKE_STOP will be signalled.
|
||||||
|
Otherwise the trailer will be broadcasted via Curl_client_write() and the
|
||||||
|
next state will be CHUNK_TRAILER */
|
||||||
|
CHUNK_TRAILER_POSTCR,
|
||||||
|
|
||||||
CHUNK_LAST /* never use */
|
CHUNK_LAST /* never use */
|
||||||
|
|
||||||
} ChunkyState;
|
} ChunkyState;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
@@ -74,6 +89,7 @@ typedef enum {
|
|||||||
CHUNKE_WRITE_ERROR,
|
CHUNKE_WRITE_ERROR,
|
||||||
CHUNKE_STATE_ERROR,
|
CHUNKE_STATE_ERROR,
|
||||||
CHUNKE_BAD_ENCODING,
|
CHUNKE_BAD_ENCODING,
|
||||||
|
CHUNKE_OUT_OF_MEMORY,
|
||||||
CHUNKE_LAST
|
CHUNKE_LAST
|
||||||
} CHUNKcode;
|
} CHUNKcode;
|
||||||
|
|
||||||
|
@@ -39,7 +39,8 @@ CURLntlm Curl_input_ntlm(struct connectdata *conn, bool proxy, char *header);
|
|||||||
CURLcode Curl_output_ntlm(struct connectdata *conn, bool proxy);
|
CURLcode Curl_output_ntlm(struct connectdata *conn, bool proxy);
|
||||||
|
|
||||||
void Curl_ntlm_cleanup(struct connectdata *conn);
|
void Curl_ntlm_cleanup(struct connectdata *conn);
|
||||||
#if !defined(USE_SSLEAY) && !defined(USE_WINDOWS_SSPI)
|
#if (!defined(USE_SSLEAY) && !defined(USE_WINDOWS_SSPI)) || \
|
||||||
|
defined(CURL_DISABLE_HTTP)
|
||||||
#define Curl_ntlm_cleanup(x)
|
#define Curl_ntlm_cleanup(x)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@@ -34,7 +34,8 @@
|
|||||||
#include "if2ip.h"
|
#include "if2ip.h"
|
||||||
|
|
||||||
#if !defined(WIN32) && !defined(__BEOS__) && !defined(__CYGWIN32__) && \
|
#if !defined(WIN32) && !defined(__BEOS__) && !defined(__CYGWIN32__) && \
|
||||||
!defined(__riscos__) && !defined(__INTERIX) && !defined(NETWARE)
|
!defined(__riscos__) && !defined(__INTERIX) && !defined(NETWARE) && \
|
||||||
|
!defined(_AMIGASF)
|
||||||
|
|
||||||
#ifdef HAVE_SYS_SOCKET_H
|
#ifdef HAVE_SYS_SOCKET_H
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
|
@@ -1,5 +1,27 @@
|
|||||||
#ifndef __INET_NTOA_R_H
|
#ifndef __INET_NTOA_R_H
|
||||||
#define __INET_NTOA_R_H
|
#define __INET_NTOA_R_H
|
||||||
|
/***************************************************************************
|
||||||
|
* _ _ ____ _
|
||||||
|
* Project ___| | | | _ \| |
|
||||||
|
* / __| | | | |_) | |
|
||||||
|
* | (__| |_| | _ <| |___
|
||||||
|
* \___|\___/|_| \_\_____|
|
||||||
|
*
|
||||||
|
* Copyright (C) 1998 - 2005, 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$
|
||||||
|
***************************************************************************/
|
||||||
|
|
||||||
#include "setup.h"
|
#include "setup.h"
|
||||||
|
|
||||||
|
@@ -1,3 +1,19 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 1996-2001 Internet Software Consortium.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM
|
||||||
|
* DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
|
||||||
|
* INTERNET SOFTWARE CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT,
|
||||||
|
* INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
|
||||||
|
* FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
|
||||||
|
* NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
|
||||||
|
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*/
|
||||||
/*
|
/*
|
||||||
* Original code by Paul Vixie. "curlified" by Gisle Vanem.
|
* Original code by Paul Vixie. "curlified" by Gisle Vanem.
|
||||||
*/
|
*/
|
||||||
|
@@ -49,4 +49,5 @@ EXPORTS
|
|||||||
curl_multi_strerror @ 41;
|
curl_multi_strerror @ 41;
|
||||||
curl_share_strerror @ 42;
|
curl_share_strerror @ 42;
|
||||||
curl_easy_reset @ 43;
|
curl_easy_reset @ 43;
|
||||||
|
curl_mvsnprintf @ 44 ;
|
||||||
|
|
||||||
|
@@ -23,6 +23,7 @@
|
|||||||
curl_msprintf,
|
curl_msprintf,
|
||||||
curl_msnprintf,
|
curl_msnprintf,
|
||||||
curl_mvfprintf,
|
curl_mvfprintf,
|
||||||
|
curl_mvsnprintf,
|
||||||
curl_strequal,
|
curl_strequal,
|
||||||
curl_strnequal,
|
curl_strnequal,
|
||||||
curl_easy_duphandle,
|
curl_easy_duphandle,
|
||||||
|
@@ -30,7 +30,7 @@ BEGIN
|
|||||||
VALUE "OriginalFilename", "libcurl.dll\0"
|
VALUE "OriginalFilename", "libcurl.dll\0"
|
||||||
VALUE "ProductName", "The cURL library\0"
|
VALUE "ProductName", "The cURL library\0"
|
||||||
VALUE "ProductVersion", LIBCURL_VERSION "\0"
|
VALUE "ProductVersion", LIBCURL_VERSION "\0"
|
||||||
VALUE "LegalCopyright", "Copyright 1996-2004 by Daniel Stenberg. http://curl.haxx.se/docs/copyright.html\0"
|
VALUE "LegalCopyright", "Copyright 1996-2005 by Daniel Stenberg. http://curl.haxx.se/docs/copyright.html\0"
|
||||||
END
|
END
|
||||||
END
|
END
|
||||||
|
|
||||||
|
@@ -7,8 +7,8 @@
|
|||||||
ATCPSDKI= /GG/netinclude
|
ATCPSDKI= /GG/netinclude
|
||||||
|
|
||||||
|
|
||||||
CC = gcc
|
CC = m68k-amigaos-gcc
|
||||||
CFLAGS = -I$(ATCPSDKI) -m68020-60 -noixemul -I. -I../include -W -Wall
|
CFLAGS = -I$(ATCPSDKI) -m68020-60 -O2 -msoft-float -noixemul -g -I. -I../include -W -Wall
|
||||||
|
|
||||||
OBJS = amigaos.c base64.c connect.c content_encoding.c cookie.c dict.c easy.c \
|
OBJS = amigaos.c base64.c connect.c content_encoding.c cookie.c dict.c easy.c \
|
||||||
escape.c file.c formdata.c ftp.c getenv.c getinfo.c hash.c hostip.c \
|
escape.c file.c formdata.c ftp.c getenv.c getinfo.c hash.c hostip.c \
|
||||||
@@ -17,7 +17,7 @@ OBJS = amigaos.c base64.c connect.c content_encoding.c cookie.c dict.c easy.c \
|
|||||||
ldap.c llist.c md5.c memdebug.c mprintf.c multi.c netrc.c parsedate.c \
|
ldap.c llist.c md5.c memdebug.c mprintf.c multi.c netrc.c parsedate.c \
|
||||||
progress.c security.c select.c sendf.c share.c speedcheck.c ssluse.c \
|
progress.c security.c select.c sendf.c share.c speedcheck.c ssluse.c \
|
||||||
strequal.c strtok.c telnet.c timeval.c transfer.c url.c version.c \
|
strequal.c strtok.c telnet.c timeval.c transfer.c url.c version.c \
|
||||||
sslgen.c gtls.c
|
sslgen.c gtls.c strerror.c
|
||||||
|
|
||||||
all: $(OBJS:.c=.o)
|
all: $(OBJS:.c=.o)
|
||||||
ar cru libcurl.a $(OBJS:.c=.o)
|
ar cru libcurl.a $(OBJS:.c=.o)
|
||||||
|
@@ -201,7 +201,7 @@ void *curl_dorealloc(void *ptr, size_t wantedsize,
|
|||||||
|
|
||||||
mem=(struct memdebug *)(Curl_crealloc)(mem, size);
|
mem=(struct memdebug *)(Curl_crealloc)(mem, size);
|
||||||
if(logfile)
|
if(logfile)
|
||||||
fprintf(logfile, "MEM %s:%d realloc(0x%x, %zd) = %p\n",
|
fprintf(logfile, "MEM %s:%d realloc(%p, %zd) = %p\n",
|
||||||
source, line, ptr, wantedsize, mem?mem->mem:NULL);
|
source, line, ptr, wantedsize, mem?mem->mem:NULL);
|
||||||
|
|
||||||
if(mem) {
|
if(mem) {
|
||||||
|
@@ -85,8 +85,16 @@ CURL_EXTERN int curl_fclose(FILE *file, int line, const char *source);
|
|||||||
#define accept(sock,addr,len)\
|
#define accept(sock,addr,len)\
|
||||||
curl_accept(sock,addr,len,__LINE__,__FILE__)
|
curl_accept(sock,addr,len,__LINE__,__FILE__)
|
||||||
|
|
||||||
|
#if defined(getaddrinfo) && defined(__osf__)
|
||||||
|
/* OSF/1 and Tru64 have getaddrinfo as a define already, so we cannot define
|
||||||
|
our macro as for other platforms. Instead, we redefine the new name they
|
||||||
|
define getaddrinfo to become! */
|
||||||
|
#define ogetaddrinfo(host,serv,hint,res) \
|
||||||
|
curl_dogetaddrinfo(host,serv,hint,res,__LINE__,__FILE__)
|
||||||
|
#else
|
||||||
#define getaddrinfo(host,serv,hint,res) \
|
#define getaddrinfo(host,serv,hint,res) \
|
||||||
curl_dogetaddrinfo(host,serv,hint,res,__LINE__,__FILE__)
|
curl_dogetaddrinfo(host,serv,hint,res,__LINE__,__FILE__)
|
||||||
|
#endif
|
||||||
#define getnameinfo(sa,salen,host,hostlen,serv,servlen,flags) \
|
#define getnameinfo(sa,salen,host,hostlen,serv,servlen,flags) \
|
||||||
curl_dogetnameinfo(sa,salen,host,hostlen,serv,servlen,flags, __LINE__, \
|
curl_dogetnameinfo(sa,salen,host,hostlen,serv,servlen,flags, __LINE__, \
|
||||||
__FILE__)
|
__FILE__)
|
||||||
|
@@ -75,6 +75,9 @@
|
|||||||
# define BOOL char
|
# define BOOL char
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef _AMIGASF
|
||||||
|
# undef FORMAT_INT
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Lower-case digits. */
|
/* Lower-case digits. */
|
||||||
static const char lower_digits[] = "0123456789abcdefghijklmnopqrstuvwxyz";
|
static const char lower_digits[] = "0123456789abcdefghijklmnopqrstuvwxyz";
|
||||||
|
@@ -42,8 +42,8 @@ RSC=rc.exe
|
|||||||
# PROP Intermediate_Dir "Release"
|
# PROP Intermediate_Dir "Release"
|
||||||
# PROP Ignore_Export_Lib 0
|
# PROP Ignore_Export_Lib 0
|
||||||
# PROP Target_Dir ""
|
# PROP Target_Dir ""
|
||||||
# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CURLLIB_EXPORTS" /YX /FD /c
|
# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "BUILDING_LIBCURL" /YX /FD /c
|
||||||
# ADD CPP /nologo /MT /W3 /GX /Zi /O2 /I "." /I "..\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CURLLIB_EXPORTS" /D "_WINDLL" /FR /FD /c
|
# ADD CPP /nologo /MT /W3 /GX /Zi /O2 /I "." /I "..\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "BUILDING_LIBCURL" /D "_WINDLL" /FR /FD /c
|
||||||
# SUBTRACT CPP /YX
|
# SUBTRACT CPP /YX
|
||||||
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
|
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
|
||||||
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
|
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
|
||||||
@@ -69,8 +69,8 @@ LINK32=link.exe
|
|||||||
# PROP Intermediate_Dir "Debug"
|
# PROP Intermediate_Dir "Debug"
|
||||||
# PROP Ignore_Export_Lib 0
|
# PROP Ignore_Export_Lib 0
|
||||||
# PROP Target_Dir ""
|
# PROP Target_Dir ""
|
||||||
# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CURLLIB_EXPORTS" /YX /FD /GZ /c
|
# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "BUILDING_LIBCURL" /YX /FD /GZ /c
|
||||||
# ADD CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /I "." /I "..\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CURLLIB_EXPORTS" /FR /FD /GZ /c
|
# ADD CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /I "." /I "..\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "BUILDING_LIBCURL" /FR /FD /GZ /c
|
||||||
# SUBTRACT CPP /WX /YX
|
# SUBTRACT CPP /WX /YX
|
||||||
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
||||||
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
||||||
|
100
lib/parsedate.c
100
lib/parsedate.c
@@ -102,50 +102,51 @@ struct tzinfo {
|
|||||||
|
|
||||||
/* Here's a bunch of frequently used time zone names. These were supported
|
/* Here's a bunch of frequently used time zone names. These were supported
|
||||||
by the old getdate parser. */
|
by the old getdate parser. */
|
||||||
|
#define tDAYZONE -60 /* offset for daylight savings time */
|
||||||
static const struct tzinfo tz[]= {
|
static const struct tzinfo tz[]= {
|
||||||
{"GMT", 0}, /* Greenwich Mean */
|
{"GMT", 0}, /* Greenwich Mean */
|
||||||
{"UTC", 0}, /* Universal (Coordinated) */
|
{"UTC", 0}, /* Universal (Coordinated) */
|
||||||
{"WET", 0}, /* Western European */
|
{"WET", 0}, /* Western European */
|
||||||
{"BST", 0}, /* British Summer */
|
{"BST", 0 tDAYZONE}, /* British Summer */
|
||||||
{"WAT", 60}, /* West Africa */
|
{"WAT", 60}, /* West Africa */
|
||||||
{"AST", 240}, /* Atlantic Standard */
|
{"AST", 240}, /* Atlantic Standard */
|
||||||
{"ADT", 240}, /* Atlantic Daylight */
|
{"ADT", 240 tDAYZONE}, /* Atlantic Daylight */
|
||||||
{"EST", 300}, /* Eastern Standard */
|
{"EST", 300}, /* Eastern Standard */
|
||||||
{"EDT", 300}, /* Eastern Daylight */
|
{"EDT", 300 tDAYZONE}, /* Eastern Daylight */
|
||||||
{"CST", 360}, /* Central Standard */
|
{"CST", 360}, /* Central Standard */
|
||||||
{"CDT", 360}, /* Central Daylight */
|
{"CDT", 360 tDAYZONE}, /* Central Daylight */
|
||||||
{"MST", 420}, /* Mountain Standard */
|
{"MST", 420}, /* Mountain Standard */
|
||||||
{"MDT", 420}, /* Mountain Daylight */
|
{"MDT", 420 tDAYZONE}, /* Mountain Daylight */
|
||||||
{"PST", 480}, /* Pacific Standard */
|
{"PST", 480}, /* Pacific Standard */
|
||||||
{"PDT", 480}, /* Pacific Daylight */
|
{"PDT", 480 tDAYZONE}, /* Pacific Daylight */
|
||||||
{"YST", 540}, /* Yukon Standard */
|
{"YST", 540}, /* Yukon Standard */
|
||||||
{"YDT", 540}, /* Yukon Daylight */
|
{"YDT", 540 tDAYZONE}, /* Yukon Daylight */
|
||||||
{"HST", 600}, /* Hawaii Standard */
|
{"HST", 600}, /* Hawaii Standard */
|
||||||
{"HDT", 600}, /* Hawaii Daylight */
|
{"HDT", 600 tDAYZONE}, /* Hawaii Daylight */
|
||||||
{"CAT", 600}, /* Central Alaska */
|
{"CAT", 600}, /* Central Alaska */
|
||||||
{"AHST", 600}, /* Alaska-Hawaii Standard */
|
{"AHST", 600}, /* Alaska-Hawaii Standard */
|
||||||
{"NT", 660}, /* Nome */
|
{"NT", 660}, /* Nome */
|
||||||
{"IDLW", 720}, /* International Date Line West */
|
{"IDLW", 720}, /* International Date Line West */
|
||||||
{"CET", -60}, /* Central European */
|
{"CET", -60}, /* Central European */
|
||||||
{"MET", -60}, /* Middle European */
|
{"MET", -60}, /* Middle European */
|
||||||
{"MEWT", -60}, /* Middle European Winter */
|
{"MEWT", -60}, /* Middle European Winter */
|
||||||
{"MEST", -120}, /* Middle European Summer */
|
{"MEST", -120 tDAYZONE}, /* Middle European Summer */
|
||||||
{"CEST", -120}, /* Central European Summer */
|
{"CEST", -120 tDAYZONE}, /* Central European Summer */
|
||||||
{"MESZ", -60}, /* Middle European Summer */
|
{"MESZ", -60 tDAYZONE}, /* Middle European Summer */
|
||||||
{"FWT", -60}, /* French Winter */
|
{"FWT", -60}, /* French Winter */
|
||||||
{"FST", -60}, /* French Summer */
|
{"FST", -60 tDAYZONE}, /* French Summer */
|
||||||
{"EET", -120}, /* Eastern Europe, USSR Zone 1 */
|
{"EET", -120}, /* Eastern Europe, USSR Zone 1 */
|
||||||
{"WAST", -420}, /* West Australian Standard */
|
{"WAST", -420}, /* West Australian Standard */
|
||||||
{"WADT", -420}, /* West Australian Daylight */
|
{"WADT", -420 tDAYZONE}, /* West Australian Daylight */
|
||||||
{"CCT", -480}, /* China Coast, USSR Zone 7 */
|
{"CCT", -480}, /* China Coast, USSR Zone 7 */
|
||||||
{"JST", -540}, /* Japan Standard, USSR Zone 8 */
|
{"JST", -540}, /* Japan Standard, USSR Zone 8 */
|
||||||
{"EAST", -600}, /* Eastern Australian Standard */
|
{"EAST", -600}, /* Eastern Australian Standard */
|
||||||
{"EADT", -600}, /* Eastern Australian Daylight */
|
{"EADT", -600 tDAYZONE}, /* Eastern Australian Daylight */
|
||||||
{"GST", -600}, /* Guam Standard, USSR Zone 9 */
|
{"GST", -600}, /* Guam Standard, USSR Zone 9 */
|
||||||
{"NZT", -720}, /* New Zealand */
|
{"NZT", -720}, /* New Zealand */
|
||||||
{"NZST", -720}, /* New Zealand Standard */
|
{"NZST", -720}, /* New Zealand Standard */
|
||||||
{"NZDT", -720}, /* New Zealand Daylight */
|
{"NZDT", -720 tDAYZONE}, /* New Zealand Daylight */
|
||||||
{"IDLE", -720}, /* International Date Line East */
|
{"IDLE", -720}, /* International Date Line East */
|
||||||
};
|
};
|
||||||
|
|
||||||
/* returns:
|
/* returns:
|
||||||
@@ -236,9 +237,20 @@ static time_t Curl_parsedate(const char *date)
|
|||||||
struct tm tm;
|
struct tm tm;
|
||||||
enum assume dignext = DATE_MDAY;
|
enum assume dignext = DATE_MDAY;
|
||||||
const char *indate = date; /* save the original pointer */
|
const char *indate = date; /* save the original pointer */
|
||||||
|
|
||||||
int part = 0; /* max 6 parts */
|
int part = 0; /* max 6 parts */
|
||||||
|
|
||||||
|
#ifdef WIN32
|
||||||
|
/*
|
||||||
|
* On Windows, we need an odd work-around for the case when no TZ variable
|
||||||
|
* is set. If it isn't set and "automatic DST adjustment" is enabled, the
|
||||||
|
* time functions below will return values one hour off! As reported and
|
||||||
|
* investigated in bug report #1230118.
|
||||||
|
*/
|
||||||
|
const char *env = getenv("TZ");
|
||||||
|
if(!env)
|
||||||
|
putenv("TZ=GMT");
|
||||||
|
#endif
|
||||||
|
|
||||||
while(*date && (part < 6)) {
|
while(*date && (part < 6)) {
|
||||||
bool found=FALSE;
|
bool found=FALSE;
|
||||||
|
|
||||||
|
@@ -473,8 +473,6 @@ int Curl_ssl_recv(struct connectdata *conn, /* connection data */
|
|||||||
#endif /* USE_GNUTLS */
|
#endif /* USE_GNUTLS */
|
||||||
#endif /* USE_SSLEAY */
|
#endif /* USE_SSLEAY */
|
||||||
if(nread == -1) {
|
if(nread == -1) {
|
||||||
infof(conn->data, "Curl_xxx_rcvs returned -1, block = %s\n",
|
|
||||||
block?"TRUE":"FALSE");
|
|
||||||
if(!block)
|
if(!block)
|
||||||
return 0; /* this is a true error, not EWOULDBLOCK */
|
return 0; /* this is a true error, not EWOULDBLOCK */
|
||||||
else
|
else
|
||||||
|
@@ -1098,8 +1098,8 @@ static void ssl_tls_trace(int direction, int ssl_ver, int content_type,
|
|||||||
msg_type = *(char*)buf;
|
msg_type = *(char*)buf;
|
||||||
msg_name = ssl_msg_type(ssl_ver, msg_type);
|
msg_name = ssl_msg_type(ssl_ver, msg_type);
|
||||||
|
|
||||||
txt_len = 1 + snprintf(ssl_buf, sizeof(ssl_buf), "SSLv%c, %s%s (%d):\n",
|
txt_len = snprintf(ssl_buf, sizeof(ssl_buf), "SSLv%c, %s%s (%d):\n",
|
||||||
ver, tls_rt_name, msg_name, msg_type);
|
ver, tls_rt_name, msg_name, msg_type);
|
||||||
Curl_debug(data, CURLINFO_TEXT, ssl_buf, txt_len, NULL);
|
Curl_debug(data, CURLINFO_TEXT, ssl_buf, txt_len, NULL);
|
||||||
|
|
||||||
Curl_debug(data, (direction == 1) ? CURLINFO_SSL_DATA_OUT :
|
Curl_debug(data, (direction == 1) ? CURLINFO_SSL_DATA_OUT :
|
||||||
|
@@ -22,6 +22,12 @@
|
|||||||
|
|
||||||
#include "setup.h"
|
#include "setup.h"
|
||||||
|
|
||||||
|
#ifdef HAVE_STRERROR_R
|
||||||
|
#if !defined(HAVE_POSIX_STRERROR_R) && !defined(HAVE_GLIBC_STRERROR_R)
|
||||||
|
#error "you MUST have either POSIX or glibc strerror_r if strerror_r is found"
|
||||||
|
#endif /* !POSIX && !glibc */
|
||||||
|
#endif /* HAVE_STRERROR_R */
|
||||||
|
|
||||||
#include <curl/curl.h>
|
#include <curl/curl.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@@ -63,10 +69,10 @@ curl_easy_strerror(CURLcode error)
|
|||||||
return "URL using bad/illegal format or missing URL";
|
return "URL using bad/illegal format or missing URL";
|
||||||
|
|
||||||
case CURLE_COULDNT_RESOLVE_PROXY:
|
case CURLE_COULDNT_RESOLVE_PROXY:
|
||||||
return "couldnt resolve proxy name";
|
return "couldn't resolve proxy name";
|
||||||
|
|
||||||
case CURLE_COULDNT_RESOLVE_HOST:
|
case CURLE_COULDNT_RESOLVE_HOST:
|
||||||
return "couldnt resolve host name";
|
return "couldn't resolve host name";
|
||||||
|
|
||||||
case CURLE_COULDNT_CONNECT:
|
case CURLE_COULDNT_CONNECT:
|
||||||
return "couldn't connect to server";
|
return "couldn't connect to server";
|
||||||
@@ -486,7 +492,7 @@ get_winsock_error (int err, char *buf, size_t len)
|
|||||||
p = "Winsock library is not ready";
|
p = "Winsock library is not ready";
|
||||||
break;
|
break;
|
||||||
case WSANOTINITIALISED:
|
case WSANOTINITIALISED:
|
||||||
p = "Winsock library not initalised";
|
p = "Winsock library not initialised";
|
||||||
break;
|
break;
|
||||||
case WSAVERNOTSUPPORTED:
|
case WSAVERNOTSUPPORTED:
|
||||||
p = "Winsock version not supported.";
|
p = "Winsock version not supported.";
|
||||||
|
@@ -24,6 +24,14 @@
|
|||||||
#include "setup.h"
|
#include "setup.h"
|
||||||
#include "strtoofft.h"
|
#include "strtoofft.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* NOTE:
|
||||||
|
*
|
||||||
|
* In the ISO C standard (IEEE Std 1003.1), there is a strtoimax() function we
|
||||||
|
* could use in case strtoll() doesn't exist... See
|
||||||
|
* http://www.opengroup.org/onlinepubs/009695399/functions/strtoimax.html
|
||||||
|
*/
|
||||||
|
|
||||||
#ifdef NEED_CURL_STRTOLL
|
#ifdef NEED_CURL_STRTOLL
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
@@ -360,7 +360,7 @@ CURLcode Curl_readwrite(struct connectdata *conn,
|
|||||||
/* str_start is start of line within buf */
|
/* str_start is start of line within buf */
|
||||||
k->str_start = k->str;
|
k->str_start = k->str;
|
||||||
|
|
||||||
k->end_ptr = strchr (k->str_start, '\n');
|
k->end_ptr = memchr(k->str_start, '\n', nread);
|
||||||
|
|
||||||
if (!k->end_ptr) {
|
if (!k->end_ptr) {
|
||||||
/* Not a complete header line within buffer, append the data to
|
/* Not a complete header line within buffer, append the data to
|
||||||
@@ -428,7 +428,7 @@ CURLcode Curl_readwrite(struct connectdata *conn,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* copy to end of line */
|
/* copy to end of line */
|
||||||
strncpy (k->hbufp, k->str_start, full_length);
|
memcpy(k->hbufp, k->str_start, full_length);
|
||||||
k->hbufp += full_length;
|
k->hbufp += full_length;
|
||||||
k->hbuflen += full_length;
|
k->hbuflen += full_length;
|
||||||
*k->hbufp = 0;
|
*k->hbufp = 0;
|
||||||
@@ -718,7 +718,7 @@ CURLcode Curl_readwrite(struct connectdata *conn,
|
|||||||
the header completely if we get a 416 response as then we're
|
the header completely if we get a 416 response as then we're
|
||||||
resuming a document that we don't get, and this header contains
|
resuming a document that we don't get, and this header contains
|
||||||
info about the true size of the document we didn't get now. */
|
info about the true size of the document we didn't get now. */
|
||||||
if (!k->ignorecl &&
|
if (!k->ignorecl && !data->set.ignorecl &&
|
||||||
checkprefix("Content-Length:", k->p)) {
|
checkprefix("Content-Length:", k->p)) {
|
||||||
contentlength = curlx_strtoofft(k->p+15, NULL, 10);
|
contentlength = curlx_strtoofft(k->p+15, NULL, 10);
|
||||||
if (data->set.max_filesize &&
|
if (data->set.max_filesize &&
|
||||||
@@ -833,6 +833,20 @@ CURLcode Curl_readwrite(struct connectdata *conn,
|
|||||||
/* init our chunky engine */
|
/* init our chunky engine */
|
||||||
Curl_httpchunk_init(conn);
|
Curl_httpchunk_init(conn);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
else if (checkprefix("Trailer:", k->p) ||
|
||||||
|
checkprefix("Trailers:", k->p)) {
|
||||||
|
/*
|
||||||
|
* This test helps Curl_httpchunk_read() to determine to look
|
||||||
|
* for well formed trailers after the zero chunksize record. In
|
||||||
|
* this case a CRLF is required after the zero chunksize record
|
||||||
|
* when no trailers are sent, or after the last trailer record.
|
||||||
|
*
|
||||||
|
* It seems both Trailer: and Trailers: occur in the wild.
|
||||||
|
*/
|
||||||
|
conn->bits.trailerHdrPresent = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
else if (checkprefix("Content-Encoding:", k->p) &&
|
else if (checkprefix("Content-Encoding:", k->p) &&
|
||||||
data->set.encoding) {
|
data->set.encoding) {
|
||||||
/*
|
/*
|
||||||
@@ -1074,6 +1088,7 @@ CURLcode Curl_readwrite(struct connectdata *conn,
|
|||||||
* the name says read, this function both reads and writes away
|
* the name says read, this function both reads and writes away
|
||||||
* the data. The returned 'nread' holds the number of actual
|
* the data. The returned 'nread' holds the number of actual
|
||||||
* data it wrote to the client. */
|
* data it wrote to the client. */
|
||||||
|
|
||||||
CHUNKcode res =
|
CHUNKcode res =
|
||||||
Curl_httpchunk_read(conn, k->str, nread, &nread);
|
Curl_httpchunk_read(conn, k->str, nread, &nread);
|
||||||
|
|
||||||
@@ -1119,6 +1134,8 @@ CURLcode Curl_readwrite(struct connectdata *conn,
|
|||||||
result = Curl_client_write(data, CLIENTWRITE_BODY,
|
result = Curl_client_write(data, CLIENTWRITE_BODY,
|
||||||
data->state.headerbuff,
|
data->state.headerbuff,
|
||||||
k->hbuflen);
|
k->hbuflen);
|
||||||
|
if(result)
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
if(k->badheader < HEADER_ALLBAD) {
|
if(k->badheader < HEADER_ALLBAD) {
|
||||||
/* This switch handles various content encodings. If there's an
|
/* This switch handles various content encodings. If there's an
|
||||||
@@ -1624,25 +1641,9 @@ CURLcode Curl_pretransfer(struct SessionHandle *data)
|
|||||||
data->state.authhost.want = data->set.httpauth;
|
data->state.authhost.want = data->set.httpauth;
|
||||||
data->state.authproxy.want = data->set.proxyauth;
|
data->state.authproxy.want = data->set.proxyauth;
|
||||||
|
|
||||||
#if !defined(CURL_DISABLE_HTTP) && !defined(CURL_DISABLE_COOKIES)
|
/* If there is a list of cookie files to read, do it now! */
|
||||||
/* If there was a list of cookie files to read and we haven't done it before,
|
if(data->change.cookielist)
|
||||||
do it now! */
|
Curl_cookie_loadfiles(data);
|
||||||
if(data->change.cookielist) {
|
|
||||||
struct curl_slist *list = data->change.cookielist;
|
|
||||||
Curl_share_lock(data, CURL_LOCK_DATA_COOKIE, CURL_LOCK_ACCESS_SINGLE);
|
|
||||||
while(list) {
|
|
||||||
data->cookies = Curl_cookie_init(data,
|
|
||||||
list->data,
|
|
||||||
data->cookies,
|
|
||||||
data->set.cookiesession);
|
|
||||||
list = list->next;
|
|
||||||
}
|
|
||||||
Curl_share_unlock(data, CURL_LOCK_DATA_COOKIE);
|
|
||||||
curl_slist_free_all(data->change.cookielist); /* clean up list */
|
|
||||||
data->change.cookielist = NULL; /* don't do this again! */
|
|
||||||
}
|
|
||||||
#endif /* CURL_DISABLE_HTTP */
|
|
||||||
|
|
||||||
|
|
||||||
/* Allow data->set.use_port to set which port to use. This needs to be
|
/* Allow data->set.use_port to set which port to use. This needs to be
|
||||||
* disabled for example when we follow Location: headers to URLs using
|
* disabled for example when we follow Location: headers to URLs using
|
||||||
|
256
lib/url.c
256
lib/url.c
@@ -227,16 +227,24 @@ CURLcode Curl_close(struct SessionHandle *data)
|
|||||||
Curl_safefree(data->state.headerbuff);
|
Curl_safefree(data->state.headerbuff);
|
||||||
|
|
||||||
#if !defined(CURL_DISABLE_HTTP) && !defined(CURL_DISABLE_COOKIES)
|
#if !defined(CURL_DISABLE_HTTP) && !defined(CURL_DISABLE_COOKIES)
|
||||||
if(data->change.cookielist) /* clean up list if any */
|
|
||||||
curl_slist_free_all(data->change.cookielist);
|
|
||||||
|
|
||||||
Curl_share_lock(data, CURL_LOCK_DATA_COOKIE, CURL_LOCK_ACCESS_SINGLE);
|
Curl_share_lock(data, CURL_LOCK_DATA_COOKIE, CURL_LOCK_ACCESS_SINGLE);
|
||||||
if(data->set.cookiejar) {
|
if(data->set.cookiejar) {
|
||||||
|
if(data->change.cookielist)
|
||||||
|
/* If there is a list of cookie files to read, do it first so that
|
||||||
|
we have all the told files read before we write the new jar */
|
||||||
|
Curl_cookie_loadfiles(data);
|
||||||
|
|
||||||
/* we have a "destination" for all the cookies to get dumped to */
|
/* we have a "destination" for all the cookies to get dumped to */
|
||||||
if(Curl_cookie_output(data->cookies, data->set.cookiejar))
|
if(Curl_cookie_output(data->cookies, data->set.cookiejar))
|
||||||
infof(data, "WARNING: failed to save cookies in %s\n",
|
infof(data, "WARNING: failed to save cookies in %s\n",
|
||||||
data->set.cookiejar);
|
data->set.cookiejar);
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
if(data->change.cookielist)
|
||||||
|
/* since nothing is written, we can just free the list of cookie file
|
||||||
|
names */
|
||||||
|
curl_slist_free_all(data->change.cookielist); /* clean up list */
|
||||||
|
}
|
||||||
|
|
||||||
if( !data->share || (data->cookies != data->share->cookies) ) {
|
if( !data->share || (data->cookies != data->share->cookies) ) {
|
||||||
Curl_cookie_cleanup(data->cookies);
|
Curl_cookie_cleanup(data->cookies);
|
||||||
@@ -372,14 +380,12 @@ CURLcode Curl_open(struct SessionHandle **curl)
|
|||||||
return CURLE_OK;
|
return CURLE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option, ...)
|
CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option,
|
||||||
|
va_list param)
|
||||||
{
|
{
|
||||||
va_list param;
|
|
||||||
char *argptr;
|
char *argptr;
|
||||||
CURLcode result = CURLE_OK;
|
CURLcode result = CURLE_OK;
|
||||||
|
|
||||||
va_start(param, option);
|
|
||||||
|
|
||||||
switch(option) {
|
switch(option) {
|
||||||
case CURLOPT_DNS_CACHE_TIMEOUT:
|
case CURLOPT_DNS_CACHE_TIMEOUT:
|
||||||
data->set.dns_cache_timeout = va_arg(param, int);
|
data->set.dns_cache_timeout = va_arg(param, int);
|
||||||
@@ -646,8 +652,10 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option, ...)
|
|||||||
/* Does this option serve a purpose anymore? Yes it does, when
|
/* Does this option serve a purpose anymore? Yes it does, when
|
||||||
CURLOPT_POSTFIELDS isn't used and the POST data is read off the
|
CURLOPT_POSTFIELDS isn't used and the POST data is read off the
|
||||||
callback! */
|
callback! */
|
||||||
if(va_arg(param, long))
|
if(va_arg(param, long)) {
|
||||||
data->set.httpreq = HTTPREQ_POST;
|
data->set.httpreq = HTTPREQ_POST;
|
||||||
|
data->set.opt_no_body = FALSE; /* this is implied */
|
||||||
|
}
|
||||||
else
|
else
|
||||||
data->set.httpreq = HTTPREQ_GET;
|
data->set.httpreq = HTTPREQ_GET;
|
||||||
break;
|
break;
|
||||||
@@ -682,6 +690,7 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option, ...)
|
|||||||
*/
|
*/
|
||||||
data->set.httppost = va_arg(param, struct curl_httppost *);
|
data->set.httppost = va_arg(param, struct curl_httppost *);
|
||||||
data->set.httpreq = HTTPREQ_POST_FORM;
|
data->set.httpreq = HTTPREQ_POST_FORM;
|
||||||
|
data->set.opt_no_body = FALSE; /* this is implied */
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CURLOPT_REFERER:
|
case CURLOPT_REFERER:
|
||||||
@@ -775,6 +784,43 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option, ...)
|
|||||||
*/
|
*/
|
||||||
data->set.cookiesession = (bool)va_arg(param, long);
|
data->set.cookiesession = (bool)va_arg(param, long);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case CURLOPT_COOKIELIST:
|
||||||
|
argptr = va_arg(param, char *);
|
||||||
|
|
||||||
|
if(argptr == NULL)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if(strequal(argptr, "ALL")) {
|
||||||
|
if(data->cookies) {
|
||||||
|
/* clear all cookies */
|
||||||
|
Curl_cookie_freelist(data->cookies->cookies);
|
||||||
|
data->cookies->cookies = NULL;
|
||||||
|
data->cookies->numcookies = 0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!data->cookies)
|
||||||
|
/* if cookie engine was not running, activate it */
|
||||||
|
data->cookies = Curl_cookie_init(data, NULL, NULL, TRUE);
|
||||||
|
|
||||||
|
argptr = strdup(argptr);
|
||||||
|
if(!argptr) {
|
||||||
|
result = CURLE_OUT_OF_MEMORY;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(checkprefix("Set-Cookie:", argptr))
|
||||||
|
/* HTTP Header format line */
|
||||||
|
Curl_cookie_add(data, data->cookies, TRUE, argptr + 11, NULL, NULL);
|
||||||
|
|
||||||
|
else
|
||||||
|
/* Netscape format line */
|
||||||
|
Curl_cookie_add(data, data->cookies, FALSE, argptr, NULL, NULL);
|
||||||
|
|
||||||
|
free(argptr);
|
||||||
|
break;
|
||||||
#endif /* CURL_DISABLE_COOKIES */
|
#endif /* CURL_DISABLE_COOKIES */
|
||||||
|
|
||||||
case CURLOPT_HTTPGET:
|
case CURLOPT_HTTPGET:
|
||||||
@@ -784,6 +830,7 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option, ...)
|
|||||||
if(va_arg(param, long)) {
|
if(va_arg(param, long)) {
|
||||||
data->set.httpreq = HTTPREQ_GET;
|
data->set.httpreq = HTTPREQ_GET;
|
||||||
data->set.upload = FALSE; /* switch off upload */
|
data->set.upload = FALSE; /* switch off upload */
|
||||||
|
data->set.opt_no_body = FALSE; /* this is implied */
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -1396,6 +1443,10 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option, ...)
|
|||||||
data->set.ftp_account = va_arg(param, char *);
|
data->set.ftp_account = va_arg(param, char *);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case CURLOPT_IGNORE_CONTENT_LENGTH:
|
||||||
|
data->set.ignorecl = va_arg(param, long)?TRUE:FALSE;
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
/* unknown tag and its companion, just ignore: */
|
/* unknown tag and its companion, just ignore: */
|
||||||
result = CURLE_FAILED_INIT; /* correct this */
|
result = CURLE_FAILED_INIT; /* correct this */
|
||||||
@@ -1496,6 +1547,7 @@ CURLcode Curl_disconnect(struct connectdata *conn)
|
|||||||
Curl_safefree(conn->allocptr.host);
|
Curl_safefree(conn->allocptr.host);
|
||||||
Curl_safefree(conn->allocptr.cookiehost);
|
Curl_safefree(conn->allocptr.cookiehost);
|
||||||
Curl_safefree(conn->ip_addr_str);
|
Curl_safefree(conn->ip_addr_str);
|
||||||
|
Curl_safefree(conn->trailer);
|
||||||
|
|
||||||
/* possible left-overs from the async name resolvers */
|
/* possible left-overs from the async name resolvers */
|
||||||
#if defined(USE_ARES)
|
#if defined(USE_ARES)
|
||||||
@@ -2382,8 +2434,8 @@ static CURLcode CreateConnection(struct SessionHandle *data,
|
|||||||
strcpy(conn->protostr, "file"); /* store protocol string lowercase */
|
strcpy(conn->protostr, "file"); /* store protocol string lowercase */
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* Set default path */
|
/* clear path */
|
||||||
strcpy(conn->path, "/");
|
conn->path[0]=0;
|
||||||
|
|
||||||
if (2 > sscanf(data->change.url,
|
if (2 > sscanf(data->change.url,
|
||||||
"%15[^\n:]://%[^\n/]%[^\n]",
|
"%15[^\n:]://%[^\n/]%[^\n]",
|
||||||
@@ -2444,15 +2496,32 @@ static CURLcode CreateConnection(struct SessionHandle *data,
|
|||||||
tmp = strchr(conn->host.name, '?');
|
tmp = strchr(conn->host.name, '?');
|
||||||
|
|
||||||
if(tmp) {
|
if(tmp) {
|
||||||
/* The right part of the ?-letter needs to be moved to prefix
|
/* We must insert a slash before the '?'-letter in the URL. If the URL had
|
||||||
the current path buffer! */
|
a slash after the '?', that is where the path currently begins and the
|
||||||
size_t len = strlen(tmp);
|
'?string' is still part of the host name.
|
||||||
/* move the existing path plus the zero byte */
|
|
||||||
memmove(conn->path+len+1, conn->path, strlen(conn->path)+1);
|
We must move the trailing part from the host name and put it first in
|
||||||
|
the path. And have it all prefixed with a slash.
|
||||||
|
*/
|
||||||
|
|
||||||
|
size_t hostlen = strlen(tmp);
|
||||||
|
size_t pathlen = strlen(conn->path);
|
||||||
|
|
||||||
|
/* move the existing path plus the zero byte forward, to make room for
|
||||||
|
the host-name part */
|
||||||
|
memmove(conn->path+hostlen+1, conn->path, pathlen+1);
|
||||||
|
|
||||||
|
/* now copy the trailing host part in front of the existing path */
|
||||||
|
memcpy(conn->path+1, tmp, hostlen);
|
||||||
|
|
||||||
conn->path[0]='/'; /* prepend the missing slash */
|
conn->path[0]='/'; /* prepend the missing slash */
|
||||||
memcpy(conn->path+1, tmp, len); /* now copy the prefix part */
|
|
||||||
*tmp=0; /* now cut off the hostname at the ? */
|
*tmp=0; /* now cut off the hostname at the ? */
|
||||||
}
|
}
|
||||||
|
else if(!conn->path[0]) {
|
||||||
|
/* if there's no path set, use a single slash */
|
||||||
|
strcpy(conn->path, "/");
|
||||||
|
}
|
||||||
|
|
||||||
/* If the URL is malformatted (missing a '/' after hostname before path) we
|
/* If the URL is malformatted (missing a '/' after hostname before path) we
|
||||||
* insert a slash here. The only letter except '/' we accept to start a path
|
* insert a slash here. The only letter except '/' we accept to start a path
|
||||||
@@ -2485,11 +2554,11 @@ static CURLcode CreateConnection(struct SessionHandle *data,
|
|||||||
"%" MAX_CURL_PASSWORD_LENGTH_TXT "[^\n]",
|
"%" MAX_CURL_PASSWORD_LENGTH_TXT "[^\n]",
|
||||||
proxyuser, proxypasswd);
|
proxyuser, proxypasswd);
|
||||||
|
|
||||||
conn->proxyuser = strdup(proxyuser);
|
conn->proxyuser = curl_unescape(proxyuser,0);
|
||||||
if(!conn->proxyuser)
|
if(!conn->proxyuser)
|
||||||
return CURLE_OUT_OF_MEMORY;
|
return CURLE_OUT_OF_MEMORY;
|
||||||
|
|
||||||
conn->proxypasswd = strdup(proxypasswd);
|
conn->proxypasswd = curl_unescape(proxypasswd,0);
|
||||||
if(!conn->proxypasswd)
|
if(!conn->proxypasswd)
|
||||||
return CURLE_OUT_OF_MEMORY;
|
return CURLE_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
@@ -2594,65 +2663,13 @@ static CURLcode CreateConnection(struct SessionHandle *data,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(proxy && *proxy) {
|
if(proxy && *proxy) {
|
||||||
/* we have a proxy here to set */
|
long bits = conn->protocol & (PROT_HTTPS|PROT_SSL);
|
||||||
char *ptr;
|
|
||||||
char proxyuser[MAX_CURL_USER_LENGTH];
|
|
||||||
char proxypasswd[MAX_CURL_PASSWORD_LENGTH];
|
|
||||||
|
|
||||||
char *fineptr;
|
|
||||||
|
|
||||||
/* skip the possible protocol piece */
|
|
||||||
ptr=strstr(proxy, "://");
|
|
||||||
if(ptr)
|
|
||||||
ptr += 3;
|
|
||||||
else
|
|
||||||
ptr = proxy;
|
|
||||||
|
|
||||||
fineptr = ptr;
|
|
||||||
|
|
||||||
/* check for an @-letter */
|
|
||||||
ptr = strchr(ptr, '@');
|
|
||||||
if(ptr && (2 == sscanf(fineptr,
|
|
||||||
"%" MAX_CURL_USER_LENGTH_TXT"[^:]:"
|
|
||||||
"%" MAX_CURL_PASSWORD_LENGTH_TXT "[^@]",
|
|
||||||
proxyuser, proxypasswd))) {
|
|
||||||
CURLcode res = CURLE_OK;
|
|
||||||
|
|
||||||
/* found user and password, rip them out */
|
|
||||||
Curl_safefree(conn->proxyuser);
|
|
||||||
conn->proxyuser = strdup(proxyuser);
|
|
||||||
|
|
||||||
if(!conn->proxyuser)
|
|
||||||
res = CURLE_OUT_OF_MEMORY;
|
|
||||||
else {
|
|
||||||
Curl_safefree(conn->proxypasswd);
|
|
||||||
conn->proxypasswd = strdup(proxypasswd);
|
|
||||||
|
|
||||||
if(!conn->proxypasswd)
|
|
||||||
res = CURLE_OUT_OF_MEMORY;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(CURLE_OK == res) {
|
|
||||||
conn->bits.proxy_user_passwd = TRUE; /* enable it */
|
|
||||||
ptr = strdup(ptr+1); /* the right side of the @-letter */
|
|
||||||
|
|
||||||
if(ptr) {
|
|
||||||
free(proxy); /* free the former proxy string */
|
|
||||||
proxy = ptr; /* now use this instead */
|
|
||||||
}
|
|
||||||
else
|
|
||||||
res = CURLE_OUT_OF_MEMORY;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(res) {
|
|
||||||
free(proxy); /* free the allocated proxy string */
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
data->change.proxy = proxy;
|
data->change.proxy = proxy;
|
||||||
data->change.proxy_alloc=TRUE; /* this needs to be freed later */
|
data->change.proxy_alloc=TRUE; /* this needs to be freed later */
|
||||||
conn->bits.httpproxy = TRUE;
|
conn->bits.httpproxy = TRUE;
|
||||||
|
|
||||||
|
/* force this to become HTTP */
|
||||||
|
conn->protocol = PROT_HTTP | bits;
|
||||||
}
|
}
|
||||||
} /* if (!nope) - it wasn't specified non-proxy */
|
} /* if (!nope) - it wasn't specified non-proxy */
|
||||||
} /* NO_PROXY wasn't specified or '*' */
|
} /* NO_PROXY wasn't specified or '*' */
|
||||||
@@ -2785,15 +2802,10 @@ static CURLcode CreateConnection(struct SessionHandle *data,
|
|||||||
!data->set.tunnel_thru_httpproxy) {
|
!data->set.tunnel_thru_httpproxy) {
|
||||||
/* Unless we have asked to tunnel ftp operations through the proxy, we
|
/* Unless we have asked to tunnel ftp operations through the proxy, we
|
||||||
switch and use HTTP operations only */
|
switch and use HTTP operations only */
|
||||||
if(conn->protocol & PROT_FTPS) {
|
|
||||||
/* FTPS is a hacked protocol and does not work through your
|
|
||||||
ordinary http proxy! */
|
|
||||||
failf(data, "ftps does not work through http proxy!");
|
|
||||||
return CURLE_UNSUPPORTED_PROTOCOL;
|
|
||||||
}
|
|
||||||
#ifndef CURL_DISABLE_HTTP
|
#ifndef CURL_DISABLE_HTTP
|
||||||
conn->curl_do = Curl_http;
|
conn->curl_do = Curl_http;
|
||||||
conn->curl_done = Curl_http_done;
|
conn->curl_done = Curl_http_done;
|
||||||
|
conn->protocol = PROT_HTTP; /* switch to HTTP */
|
||||||
#else
|
#else
|
||||||
failf(data, "FTP over http proxy requires HTTP support built-in!");
|
failf(data, "FTP over http proxy requires HTTP support built-in!");
|
||||||
return CURLE_UNSUPPORTED_PROTOCOL;
|
return CURLE_UNSUPPORTED_PROTOCOL;
|
||||||
@@ -2926,25 +2938,93 @@ static CURLcode CreateConnection(struct SessionHandle *data,
|
|||||||
|
|
||||||
/* We use 'proxyptr' to point to the proxy name from now on... */
|
/* We use 'proxyptr' to point to the proxy name from now on... */
|
||||||
char *proxyptr=proxydup;
|
char *proxyptr=proxydup;
|
||||||
|
char *portptr;
|
||||||
|
char *atsign;
|
||||||
|
|
||||||
if(NULL == proxydup) {
|
if(NULL == proxydup) {
|
||||||
failf(data, "memory shortage");
|
failf(data, "memory shortage");
|
||||||
return CURLE_OUT_OF_MEMORY;
|
return CURLE_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Daniel Dec 10, 1998:
|
/* We do the proxy host string parsing here. We want the host name and the
|
||||||
We do the proxy host string parsing here. We want the host name and the
|
* port name. Accept a protocol:// prefix, even though it should just be
|
||||||
port name. Accept a protocol:// prefix, even though it should just be
|
* ignored.
|
||||||
ignored. */
|
*/
|
||||||
|
|
||||||
/* 1. skip the protocol part if present */
|
/* Skip the protocol part if present */
|
||||||
endofprot=strstr(proxyptr, "://");
|
endofprot=strstr(proxyptr, "://");
|
||||||
if(endofprot) {
|
if(endofprot)
|
||||||
proxyptr = endofprot+3;
|
proxyptr = endofprot+3;
|
||||||
|
|
||||||
|
/* Is there a username and password given in this proxy url? */
|
||||||
|
atsign = strchr(proxyptr, '@');
|
||||||
|
if(atsign) {
|
||||||
|
char proxyuser[MAX_CURL_USER_LENGTH];
|
||||||
|
char proxypasswd[MAX_CURL_PASSWORD_LENGTH];
|
||||||
|
|
||||||
|
if(2 == sscanf(proxyptr,
|
||||||
|
"%" MAX_CURL_USER_LENGTH_TXT"[^:]:"
|
||||||
|
"%" MAX_CURL_PASSWORD_LENGTH_TXT "[^@]",
|
||||||
|
proxyuser, proxypasswd)) {
|
||||||
|
CURLcode res = CURLE_OK;
|
||||||
|
|
||||||
|
/* found user and password, rip them out. note that we are
|
||||||
|
unescaping them, as there is otherwise no way to have a
|
||||||
|
username or password with reserved characters like ':' in
|
||||||
|
them. */
|
||||||
|
Curl_safefree(conn->proxyuser);
|
||||||
|
conn->proxyuser = curl_unescape(proxyuser,0);
|
||||||
|
|
||||||
|
if(!conn->proxyuser)
|
||||||
|
res = CURLE_OUT_OF_MEMORY;
|
||||||
|
else {
|
||||||
|
Curl_safefree(conn->proxypasswd);
|
||||||
|
conn->proxypasswd = curl_unescape(proxypasswd,0);
|
||||||
|
|
||||||
|
if(!conn->proxypasswd)
|
||||||
|
res = CURLE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(CURLE_OK == res) {
|
||||||
|
conn->bits.proxy_user_passwd = TRUE; /* enable it */
|
||||||
|
atsign = strdup(atsign+1); /* the right side of the @-letter */
|
||||||
|
|
||||||
|
if(atsign) {
|
||||||
|
free(proxydup); /* free the former proxy string */
|
||||||
|
proxydup = proxyptr = atsign; /* now use this instead */
|
||||||
|
}
|
||||||
|
else
|
||||||
|
res = CURLE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(res) {
|
||||||
|
free(proxydup); /* free the allocated proxy string */
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* allow user to specify proxy.server.com:1080 if desired */
|
/* start scanning for port number at this point */
|
||||||
prox_portno = strchr (proxyptr, ':');
|
portptr = proxyptr;
|
||||||
|
|
||||||
|
/* detect and extract RFC2732-style IPv6-addresses */
|
||||||
|
if(*proxyptr == '[') {
|
||||||
|
char *ptr = ++proxyptr; /* advance beyond the initial bracket */
|
||||||
|
while(*ptr && (isxdigit((int)*ptr) || (*ptr == ':')))
|
||||||
|
ptr++;
|
||||||
|
if(*ptr == ']') {
|
||||||
|
/* yeps, it ended nicely with a bracket as well */
|
||||||
|
*ptr = 0;
|
||||||
|
portptr = ptr+1;
|
||||||
|
}
|
||||||
|
/* Note that if this didn't end with a bracket, we still advanced the
|
||||||
|
* proxyptr first, but I can't see anything wrong with that as no host
|
||||||
|
* name nor a numeric can legally start with a bracket.
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get port number off proxy.server.com:1080 */
|
||||||
|
prox_portno = strchr(portptr, ':');
|
||||||
if (prox_portno) {
|
if (prox_portno) {
|
||||||
*prox_portno = 0x0; /* cut off number from host name */
|
*prox_portno = 0x0; /* cut off number from host name */
|
||||||
prox_portno ++;
|
prox_portno ++;
|
||||||
|
@@ -23,12 +23,15 @@
|
|||||||
* $Id$
|
* $Id$
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
|
||||||
|
#include <stdarg.h> /* to make sure we have ap_list */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Prototypes for library-wide functions provided by url.c
|
* Prototypes for library-wide functions provided by url.c
|
||||||
*/
|
*/
|
||||||
|
|
||||||
CURLcode Curl_open(struct SessionHandle **curl);
|
CURLcode Curl_open(struct SessionHandle **curl);
|
||||||
CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option, ...);
|
CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option,
|
||||||
|
va_list arg);
|
||||||
CURLcode Curl_close(struct SessionHandle *data); /* opposite of curl_open() */
|
CURLcode Curl_close(struct SessionHandle *data); /* opposite of curl_open() */
|
||||||
CURLcode Curl_connect(struct SessionHandle *, struct connectdata **,
|
CURLcode Curl_connect(struct SessionHandle *, struct connectdata **,
|
||||||
bool *async, bool *protocol_connect);
|
bool *async, bool *protocol_connect);
|
||||||
|
@@ -98,12 +98,14 @@
|
|||||||
#include "hash.h"
|
#include "hash.h"
|
||||||
|
|
||||||
#ifdef HAVE_GSSAPI
|
#ifdef HAVE_GSSAPI
|
||||||
#ifdef HAVE_GSSMIT
|
# ifdef HAVE_GSSGNU
|
||||||
#include <gssapi/gssapi.h>
|
# include <gss.h>
|
||||||
#include <gssapi/gssapi_generic.h>
|
# elif defined HAVE_GSSMIT
|
||||||
#else
|
# include <gssapi/gssapi.h>
|
||||||
#include <gssapi.h>
|
# include <gssapi/gssapi_generic.h>
|
||||||
#endif
|
# else
|
||||||
|
# include <gssapi.h>
|
||||||
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Download buffer size, keep it fairly big for speed reasons */
|
/* Download buffer size, keep it fairly big for speed reasons */
|
||||||
@@ -421,6 +423,10 @@ struct ConnectBits {
|
|||||||
LPRT doesn't work we disable it for the forthcoming
|
LPRT doesn't work we disable it for the forthcoming
|
||||||
requests */
|
requests */
|
||||||
bool netrc; /* name+password provided by netrc */
|
bool netrc; /* name+password provided by netrc */
|
||||||
|
|
||||||
|
bool trailerHdrPresent; /* Set when Trailer: header found in HTTP response.
|
||||||
|
Required to determine whether to look for trailers
|
||||||
|
in case of Transfer-Encoding: chunking */
|
||||||
};
|
};
|
||||||
|
|
||||||
struct hostname {
|
struct hostname {
|
||||||
@@ -726,6 +732,12 @@ struct connectdata {
|
|||||||
transfer */
|
transfer */
|
||||||
|
|
||||||
enum { NORMAL, SOURCE3RD, TARGET3RD } xfertype;
|
enum { NORMAL, SOURCE3RD, TARGET3RD } xfertype;
|
||||||
|
|
||||||
|
/* These three are used for chunked-encoding trailer support */
|
||||||
|
char *trailer; /* allocated buffer to store trailer in */
|
||||||
|
int trlMax; /* allocated buffer size */
|
||||||
|
int trlPos; /* index of where to store data */
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/* The end of connectdata. */
|
/* The end of connectdata. */
|
||||||
@@ -1058,6 +1070,7 @@ struct UserDefined {
|
|||||||
bool global_dns_cache; /* subject for future removal */
|
bool global_dns_cache; /* subject for future removal */
|
||||||
bool tcp_nodelay; /* whether to enable TCP_NODELAY or not */
|
bool tcp_nodelay; /* whether to enable TCP_NODELAY or not */
|
||||||
|
|
||||||
|
bool ignorecl; /* ignore content length */
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@@ -13,15 +13,17 @@ NDKBASE = c:/novell
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
# Edit the path below to point to the base of your Zlib sources.
|
# Edit the path below to point to the base of your Zlib sources.
|
||||||
#ZLIB_PATH = ../../zlib-1.2.2
|
ifndef ZLIB_PATH
|
||||||
|
ZLIB_PATH = ../../zlib-1.2.3
|
||||||
|
endif
|
||||||
|
|
||||||
# Edit the path below to point to the base of your OpenSSL package.
|
# Edit the path below to point to the base of your OpenSSL package.
|
||||||
ifndef OPENSSL_PATH
|
ifndef OPENSSL_PATH
|
||||||
OPENSSL_PATH = ../../openssl-0.9.7g
|
OPENSSL_PATH = ../../openssl-0.9.8
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifndef INSTDIR
|
ifndef INSTDIR
|
||||||
INSTDIR = ../curl-$(LIBCURL_VERSION_STR)-bin-nw
|
INSTDIR = ..$(DS)curl-$(LIBCURL_VERSION_STR)-bin-nw
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# Edit the vars below to change NLM target settings.
|
# Edit the vars below to change NLM target settings.
|
||||||
@@ -32,8 +34,6 @@ DESCR = cURL $(LIBCURL_VERSION_STR) - http://curl.haxx.se
|
|||||||
MTSAFE = YES
|
MTSAFE = YES
|
||||||
STACK = 64000
|
STACK = 64000
|
||||||
SCREEN = $(TARGET) commandline utility
|
SCREEN = $(TARGET) commandline utility
|
||||||
MODULES = libcurl.nlm
|
|
||||||
IMPORTS = @../lib/libcurl.imp
|
|
||||||
# Comment the line below if you dont want to load protected automatically.
|
# Comment the line below if you dont want to load protected automatically.
|
||||||
LDRING = 3
|
LDRING = 3
|
||||||
|
|
||||||
@@ -75,7 +75,7 @@ CFLAGS = $(OPT) -D$(DB) -DNETWARE -DHAVE_CONFIG_H -nostdinc
|
|||||||
|
|
||||||
ifeq ($(CC),mwccnlm)
|
ifeq ($(CC),mwccnlm)
|
||||||
LD = mwldnlm
|
LD = mwldnlm
|
||||||
LDFLAGS = -nostdlib $(PRELUDE) $(OBJDIR)/*.o -o $(TARGET).nlm -commandfile
|
LDFLAGS = -nostdlib $(PRELUDE) $(LDLIBS) $(OBJS) $(OBJX) -o $(TARGET).nlm -commandfile
|
||||||
CFLAGS += -gccinc -inline off -opt nointrinsics -proc 586
|
CFLAGS += -gccinc -inline off -opt nointrinsics -proc 586
|
||||||
CFLAGS += -relax_pointers
|
CFLAGS += -relax_pointers
|
||||||
#CFLAGS += -w on
|
#CFLAGS += -w on
|
||||||
@@ -100,8 +100,6 @@ else
|
|||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
LDLIBS =
|
|
||||||
|
|
||||||
NDK_ROOT = $(NDKBASE)/ndk
|
NDK_ROOT = $(NDKBASE)/ndk
|
||||||
SDK_CLIB = $(NDK_ROOT)/nwsdk
|
SDK_CLIB = $(NDK_ROOT)/nwsdk
|
||||||
SDK_LIBC = $(NDK_ROOT)/libc
|
SDK_LIBC = $(NDK_ROOT)/libc
|
||||||
@@ -111,15 +109,26 @@ CURL_LIB = ../lib
|
|||||||
|
|
||||||
INCLUDES = -I$(CURL_INC) -I$(CURL_LIB)
|
INCLUDES = -I$(CURL_INC) -I$(CURL_LIB)
|
||||||
|
|
||||||
ifdef ZLIB_PATH
|
ifdef LINK_STATIC
|
||||||
|
LDLIBS = ../lib/libcurl.lib
|
||||||
|
IMPORTS = GetProcessSwitchCount RunningProcess
|
||||||
|
else
|
||||||
|
MODULES = libcurl.nlm
|
||||||
|
IMPORTS = @../lib/libcurl.imp
|
||||||
|
endif
|
||||||
|
ifdef WITH_ZLIB
|
||||||
INCLUDES += -I$(ZLIB_PATH)
|
INCLUDES += -I$(ZLIB_PATH)
|
||||||
IMPORTS += @$(ZLIB_PATH)/nw/zlib.imp
|
ifdef LINK_STATIC
|
||||||
|
LDLIBS += $(ZLIB_PATH)/nw/libz.lib
|
||||||
|
else
|
||||||
|
IMPORTS += @$(ZLIB_PATH)/nw/libz.imp
|
||||||
MODULES += libz.nlm
|
MODULES += libz.nlm
|
||||||
endif
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
ifeq ($(LIBARCH),LIBC)
|
ifeq ($(LIBARCH),LIBC)
|
||||||
INCLUDES += -I$(SDK_LIBC)/include -I$(SDK_LIBC)/include/nks
|
INCLUDES += -I$(SDK_LIBC)/include -I$(SDK_LIBC)/include/nks
|
||||||
INCLUDES += -I$(SDK_LIBC)/include/winsock
|
# INCLUDES += -I$(SDK_LIBC)/include/winsock
|
||||||
# INCLUDES += -I$(SDK_LDAP)/libc/inc
|
# INCLUDES += -I$(SDK_LDAP)/libc/inc
|
||||||
CFLAGS += -D_POSIX_SOURCE
|
CFLAGS += -D_POSIX_SOURCE
|
||||||
# CFLAGS += -D__ANSIC__
|
# CFLAGS += -D__ANSIC__
|
||||||
@@ -142,7 +151,10 @@ endif
|
|||||||
|
|
||||||
ifeq ($(findstring linux,$(OSTYPE)),linux)
|
ifeq ($(findstring linux,$(OSTYPE)),linux)
|
||||||
DL = '
|
DL = '
|
||||||
|
DS = /
|
||||||
#-include $(NDKBASE)/nlmconv/ncpfs.inc
|
#-include $(NDKBASE)/nlmconv/ncpfs.inc
|
||||||
|
else
|
||||||
|
DS = \\
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# Makefile.inc provides the CSOURCES and HHEADERS defines
|
# Makefile.inc provides the CSOURCES and HHEADERS defines
|
||||||
@@ -330,11 +342,11 @@ endif
|
|||||||
ifdef WITH_ARES
|
ifdef WITH_ARES
|
||||||
@echo $(DL)#define USE_ARES 1$(DL) >> $@
|
@echo $(DL)#define USE_ARES 1$(DL) >> $@
|
||||||
endif
|
endif
|
||||||
ifdef ZLIB_PATH
|
ifdef WITH_ZLIB
|
||||||
@echo $(DL)#define HAVE_ZLIB_H 1$(DL) >> $@
|
@echo $(DL)#define HAVE_ZLIB_H 1$(DL) >> $@
|
||||||
@echo $(DL)#define HAVE_LIBZ 1$(DL) >> $@
|
@echo $(DL)#define HAVE_LIBZ 1$(DL) >> $@
|
||||||
endif
|
endif
|
||||||
ifdef SSL
|
ifdef WITH_SSL
|
||||||
@echo $(DL)#define USE_SSLEAY 1$(DL) >> $@
|
@echo $(DL)#define USE_SSLEAY 1$(DL) >> $@
|
||||||
@echo $(DL)#define HAVE_OPENSSL_X509_H 1$(DL) >> $@
|
@echo $(DL)#define HAVE_OPENSSL_X509_H 1$(DL) >> $@
|
||||||
@echo $(DL)#define HAVE_OPENSSL_SSL_H 1$(DL) >> $@
|
@echo $(DL)#define HAVE_OPENSSL_SSL_H 1$(DL) >> $@
|
||||||
|
@@ -17,14 +17,20 @@
|
|||||||
#define HAVE_SYS_TIME_H 1
|
#define HAVE_SYS_TIME_H 1
|
||||||
#define HAVE_TIME_H 1
|
#define HAVE_TIME_H 1
|
||||||
#define TIME_WITH_SYS_TIME 1
|
#define TIME_WITH_SYS_TIME 1
|
||||||
#define HAVE_TERMIOS_H 1
|
|
||||||
#define HAVE_FTRUNCATE 1
|
#if 0
|
||||||
|
# define HAVE_TERMIOS_H 1
|
||||||
|
# define HAVE_FTRUNCATE 1
|
||||||
|
#endif
|
||||||
|
|
||||||
#define HAVE_PWD_H 1
|
#define HAVE_PWD_H 1
|
||||||
|
|
||||||
#ifndef F_OK
|
#ifndef F_OK
|
||||||
# define F_OK 0
|
# define F_OK 0
|
||||||
#endif
|
#endif
|
||||||
|
#ifndef O_RDONLY
|
||||||
|
# define O_RDONLY 0x0000 /* open for reading only */
|
||||||
|
#endif
|
||||||
#ifndef LONG_MAX
|
#ifndef LONG_MAX
|
||||||
# define LONG_MAX 0x7fffffffL /* max value for a long */
|
# define LONG_MAX 0x7fffffffL /* max value for a long */
|
||||||
#endif
|
#endif
|
||||||
|
566
src/main.c
566
src/main.c
@@ -243,213 +243,12 @@ static int ftruncate64 (int fd, curl_off_t where)
|
|||||||
#define ftruncate(fd,where) ftruncate64(fd,where)
|
#define ftruncate(fd,where) ftruncate64(fd,where)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
|
||||||
* This is the main global constructor for the app. Call this before
|
|
||||||
* _any_ libcurl usage. If this fails, *NO* libcurl functions may be
|
|
||||||
* used, or havoc may be the result.
|
|
||||||
*/
|
|
||||||
static CURLcode main_init(void)
|
|
||||||
{
|
|
||||||
return curl_global_init(CURL_GLOBAL_DEFAULT);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This is the main global destructor for the app. Call this after
|
|
||||||
* _all_ libcurl usage is done.
|
|
||||||
*/
|
|
||||||
static void main_free(void)
|
|
||||||
{
|
|
||||||
curl_global_cleanup();
|
|
||||||
}
|
|
||||||
|
|
||||||
static int SetHTTPrequest(HttpReq req, HttpReq *store)
|
|
||||||
{
|
|
||||||
if((*store == HTTPREQ_UNSPEC) ||
|
|
||||||
(*store == req)) {
|
|
||||||
*store = req;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
fprintf(stderr, "You can only select one HTTP request!\n");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void helpf(const char *fmt, ...)
|
|
||||||
{
|
|
||||||
va_list ap;
|
|
||||||
if(fmt) {
|
|
||||||
va_start(ap, fmt);
|
|
||||||
fputs("curl: ", stderr); /* prefix it */
|
|
||||||
vfprintf(stderr, fmt, ap);
|
|
||||||
va_end(ap);
|
|
||||||
}
|
|
||||||
fprintf(stderr, "curl: try 'curl --help' "
|
|
||||||
#ifdef USE_MANUAL
|
|
||||||
"or 'curl --manual' "
|
|
||||||
#endif
|
|
||||||
"for more information\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* A chain of these nodes contain URL to get and where to put the URL's
|
|
||||||
* contents.
|
|
||||||
*/
|
|
||||||
struct getout {
|
|
||||||
struct getout *next; /* next one */
|
|
||||||
char *url; /* the URL we deal with */
|
|
||||||
char *outfile; /* where to store the output */
|
|
||||||
char *infile; /* file to upload, if GETOUT_UPLOAD is set */
|
|
||||||
int flags; /* options */
|
|
||||||
};
|
|
||||||
#define GETOUT_OUTFILE (1<<0) /* set when outfile is deemed done */
|
|
||||||
#define GETOUT_URL (1<<1) /* set when URL is deemed done */
|
|
||||||
#define GETOUT_USEREMOTE (1<<2) /* use remote file name locally */
|
|
||||||
#define GETOUT_UPLOAD (1<<3) /* if set, -T has been used */
|
|
||||||
#define GETOUT_NOUPLOAD (1<<4) /* if set, -T "" has been used */
|
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
TRACE_BIN, /* tcpdump inspired look */
|
TRACE_BIN, /* tcpdump inspired look */
|
||||||
TRACE_ASCII, /* like *BIN but without the hex output */
|
TRACE_ASCII, /* like *BIN but without the hex output */
|
||||||
TRACE_PLAIN /* -v/--verbose type */
|
TRACE_PLAIN /* -v/--verbose type */
|
||||||
} trace;
|
} trace;
|
||||||
|
|
||||||
static void help(void)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
static const char * const helptext[]={
|
|
||||||
"Usage: curl [options...] <url>",
|
|
||||||
"Options: (H) means HTTP/HTTPS only, (F) means FTP only",
|
|
||||||
" -a/--append Append to target file when uploading (F)",
|
|
||||||
" -A/--user-agent <string> User-Agent to send to server (H)",
|
|
||||||
" --anyauth Tell curl to choose authentication method (H)",
|
|
||||||
" -b/--cookie <name=string/file> Cookie string or file to read cookies from (H)",
|
|
||||||
" --basic Enable HTTP Basic Authentication (H)",
|
|
||||||
" -B/--use-ascii Use ASCII/text transfer",
|
|
||||||
" -c/--cookie-jar <file> Write cookies to this file after operation (H)",
|
|
||||||
" -C/--continue-at <offset> Resumed transfer offset",
|
|
||||||
" -d/--data <data> HTTP POST data (H)",
|
|
||||||
" --data-ascii <data> HTTP POST ASCII data (H)",
|
|
||||||
" --data-binary <data> HTTP POST binary data (H)",
|
|
||||||
" --negotiate Enable HTTP Negotiate Authentication (H)",
|
|
||||||
" --digest Enable HTTP Digest Authentication (H)",
|
|
||||||
" --disable-eprt Prevent curl from using EPRT or LPRT (F)",
|
|
||||||
" --disable-epsv Prevent curl from using EPSV (F)",
|
|
||||||
" -D/--dump-header <file> Write the headers to this file",
|
|
||||||
" --egd-file <file> EGD socket path for random data (SSL)",
|
|
||||||
" --tcp-nodelay Set the TCP_NODELAY option",
|
|
||||||
#ifdef USE_ENVIRONMENT
|
|
||||||
" --environment Write result codes to environment variables (RISC OS)",
|
|
||||||
#endif
|
|
||||||
" -e/--referer Referer URL (H)",
|
|
||||||
" -E/--cert <cert[:passwd]> Client certificate file and password (SSL)",
|
|
||||||
" --cert-type <type> Certificate file type (DER/PEM/ENG) (SSL)",
|
|
||||||
" --key <key> Private key file name (SSL)",
|
|
||||||
" --key-type <type> Private key file type (DER/PEM/ENG) (SSL)",
|
|
||||||
" --pass <pass> Pass phrase for the private key (SSL)",
|
|
||||||
" --engine <eng> Crypto engine to use (SSL). \"--engine list\" for list",
|
|
||||||
" --cacert <file> CA certificate to verify peer against (SSL)",
|
|
||||||
" --capath <directory> CA directory (made using c_rehash) to verify",
|
|
||||||
" peer against (SSL)",
|
|
||||||
" --ciphers <list> SSL ciphers to use (SSL)",
|
|
||||||
" --compressed Request compressed response (using deflate or gzip)",
|
|
||||||
" --connect-timeout <seconds> Maximum time allowed for connection",
|
|
||||||
" --create-dirs Create necessary local directory hierarchy",
|
|
||||||
" --crlf Convert LF to CRLF in upload",
|
|
||||||
" -f/--fail Fail silently (no output at all) on errors (H)",
|
|
||||||
" --ftp-create-dirs Create the remote dirs if not present (F)",
|
|
||||||
" --ftp-pasv Use PASV instead of PORT (F)",
|
|
||||||
" --ftp-ssl Enable SSL/TLS for the ftp transfer (F)",
|
|
||||||
" -F/--form <name=content> Specify HTTP multipart POST data (H)",
|
|
||||||
" --form-string <name=string> Specify HTTP multipart POST data (H)",
|
|
||||||
" -g/--globoff Disable URL sequences and ranges using {} and []",
|
|
||||||
" -G/--get Send the -d data with a HTTP GET (H)",
|
|
||||||
" -h/--help This help text",
|
|
||||||
" -H/--header <line> Custom header to pass to server (H)",
|
|
||||||
" -i/--include Include protocol headers in the output (H/F)",
|
|
||||||
" -I/--head Show document info only",
|
|
||||||
" -j/--junk-session-cookies Ignore session cookies read from file (H)",
|
|
||||||
" --interface <interface> Specify network interface to use",
|
|
||||||
" --krb4 <level> Enable krb4 with specified security level (F)",
|
|
||||||
" -k/--insecure Allow curl to connect to SSL sites without certs (H)",
|
|
||||||
" -K/--config Specify which config file to read",
|
|
||||||
" -l/--list-only List only names of an FTP directory (F)",
|
|
||||||
" --limit-rate <rate> Limit transfer speed to this rate",
|
|
||||||
" -L/--location Follow Location: hints (H)",
|
|
||||||
" --location-trusted Follow Location: and send authentication even ",
|
|
||||||
" to other hostnames (H)",
|
|
||||||
" -m/--max-time <seconds> Maximum time allowed for the transfer",
|
|
||||||
" --max-redirs <num> Maximum number of redirects allowed (H)",
|
|
||||||
" --max-filesize <bytes> Maximum file size to download (H/F)",
|
|
||||||
" -M/--manual Display the full manual",
|
|
||||||
" -n/--netrc Must read .netrc for user name and password",
|
|
||||||
" --netrc-optional Use either .netrc or URL; overrides -n",
|
|
||||||
" --ntlm Enable HTTP NTLM authentication (H)",
|
|
||||||
" -N/--no-buffer Disable buffering of the output stream",
|
|
||||||
" -o/--output <file> Write output to <file> instead of stdout",
|
|
||||||
" -O/--remote-name Write output to a file named as the remote file",
|
|
||||||
" -p/--proxytunnel Operate through a HTTP proxy tunnel (using CONNECT)",
|
|
||||||
" --proxy-anyauth Let curl pick proxy authentication method (H)",
|
|
||||||
" --proxy-basic Enable Basic authentication on the proxy (H)",
|
|
||||||
" --proxy-digest Enable Digest authentication on the proxy (H)",
|
|
||||||
" --proxy-ntlm Enable NTLM authentication on the proxy (H)",
|
|
||||||
" -P/--ftp-port <address> Use PORT with address instead of PASV (F)",
|
|
||||||
" -q If used as the first parameter disables .curlrc",
|
|
||||||
" -Q/--quote <cmd> Send command(s) to server before file transfer (F)",
|
|
||||||
" -r/--range <range> Retrieve a byte range from a HTTP/1.1 or FTP server",
|
|
||||||
" --random-file <file> File for reading random data from (SSL)",
|
|
||||||
" -R/--remote-time Set the remote file's time on the local output",
|
|
||||||
" --retry <num> Retry request <num> times if transient problems occur",
|
|
||||||
" --retry-delay <seconds> When retrying, wait this many seconds between each",
|
|
||||||
" --retry-max-time <seconds> Retry only within this period",
|
|
||||||
" -s/--silent Silent mode. Don't output anything",
|
|
||||||
" -S/--show-error Show error. With -s, make curl show errors when they occur",
|
|
||||||
" --socks <host[:port]> Use SOCKS5 proxy on given host + port",
|
|
||||||
" --stderr <file> Where to redirect stderr. - means stdout",
|
|
||||||
" -t/--telnet-option <OPT=val> Set telnet option",
|
|
||||||
" --trace <file> Write a debug trace to the given file",
|
|
||||||
" --trace-ascii <file> Like --trace but without the hex output",
|
|
||||||
" --trace-time Add time stamps to trace/verbose output",
|
|
||||||
" -T/--upload-file <file> Transfer <file> to remote site",
|
|
||||||
" --url <URL> Spet URL to work with",
|
|
||||||
" -u/--user <user[:password]> Set server user and password",
|
|
||||||
" -U/--proxy-user <user[:password]> Set proxy user and password",
|
|
||||||
" -v/--verbose Make the operation more talkative",
|
|
||||||
" -V/--version Show version number and quit",
|
|
||||||
#ifdef __DJGPP__
|
|
||||||
" --wdebug Turn on Watt-32 debugging under DJGPP",
|
|
||||||
#endif
|
|
||||||
" -w/--write-out [format] What to output after completion",
|
|
||||||
" -x/--proxy <host[:port]> Use HTTP proxy on given port",
|
|
||||||
" -X/--request <command> Specify request command to use",
|
|
||||||
" -y/--speed-time Time needed to trig speed-limit abort. Defaults to 30",
|
|
||||||
" -Y/--speed-limit Stop transfer if below speed-limit for 'speed-time' secs",
|
|
||||||
" -z/--time-cond <time> Transfer based on a time condition",
|
|
||||||
" -0/--http1.0 Use HTTP 1.0 (H)",
|
|
||||||
" -1/--tlsv1 Use TLSv1 (SSL)",
|
|
||||||
" -2/--sslv2 Use SSLv2 (SSL)",
|
|
||||||
" -3/--sslv3 Use SSLv3 (SSL)",
|
|
||||||
" --3p-quote like -Q for the source URL for 3rd party transfer (F)",
|
|
||||||
" --3p-url source URL to activate 3rd party transfer (F)",
|
|
||||||
" --3p-user user and password for source 3rd party transfer (F)",
|
|
||||||
" -4/--ipv4 Resolve name to IPv4 address",
|
|
||||||
" -6/--ipv6 Resolve name to IPv6 address",
|
|
||||||
" -#/--progress-bar Display transfer progress as a progress bar",
|
|
||||||
NULL
|
|
||||||
};
|
|
||||||
for(i=0; helptext[i]; i++) {
|
|
||||||
puts(helptext[i]);
|
|
||||||
#ifdef __NOVELL_LIBC__
|
|
||||||
if (i && ((i % 23) == 0))
|
|
||||||
pressanykey();
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct LongShort {
|
|
||||||
const char *letter;
|
|
||||||
const char *lname;
|
|
||||||
bool extraparam;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct Configurable {
|
struct Configurable {
|
||||||
bool remote_time;
|
bool remote_time;
|
||||||
char *random_file;
|
char *random_file;
|
||||||
@@ -557,6 +356,251 @@ struct Configurable {
|
|||||||
struct curl_slist *tp_postquote;
|
struct curl_slist *tp_postquote;
|
||||||
struct curl_slist *tp_prequote;
|
struct curl_slist *tp_prequote;
|
||||||
char *ftp_account; /* for ACCT */
|
char *ftp_account; /* for ACCT */
|
||||||
|
|
||||||
|
bool ignorecl; /* --ignore-content-length */
|
||||||
|
};
|
||||||
|
|
||||||
|
#define WARN_PREFIX "Warning: "
|
||||||
|
#define WARN_TEXTWIDTH (79 - strlen(WARN_PREFIX))
|
||||||
|
/* produce this text message to the user unless mute was selected */
|
||||||
|
static void warnf(struct Configurable *config, const char *fmt, ...)
|
||||||
|
{
|
||||||
|
if(!(config->conf & CONF_MUTE)) {
|
||||||
|
va_list ap;
|
||||||
|
int len;
|
||||||
|
char *ptr;
|
||||||
|
char print_buffer[256];
|
||||||
|
|
||||||
|
va_start(ap, fmt);
|
||||||
|
va_start(ap, fmt);
|
||||||
|
len = vsnprintf(print_buffer, sizeof(print_buffer), fmt, ap);
|
||||||
|
va_end(ap);
|
||||||
|
|
||||||
|
ptr = print_buffer;
|
||||||
|
while(len > 0) {
|
||||||
|
fputs(WARN_PREFIX, config->errors);
|
||||||
|
|
||||||
|
if(len > (int)WARN_TEXTWIDTH) {
|
||||||
|
int cut = WARN_TEXTWIDTH-1;
|
||||||
|
|
||||||
|
while(!isspace((int)ptr[cut]) && cut) {
|
||||||
|
cut--;
|
||||||
|
}
|
||||||
|
|
||||||
|
fwrite(ptr, cut + 1, 1, config->errors);
|
||||||
|
fputs("\n", config->errors);
|
||||||
|
ptr += cut+1; /* skip the space too */
|
||||||
|
len -= cut;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
fputs(ptr, config->errors);
|
||||||
|
len = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This is the main global constructor for the app. Call this before
|
||||||
|
* _any_ libcurl usage. If this fails, *NO* libcurl functions may be
|
||||||
|
* used, or havoc may be the result.
|
||||||
|
*/
|
||||||
|
static CURLcode main_init(void)
|
||||||
|
{
|
||||||
|
return curl_global_init(CURL_GLOBAL_DEFAULT);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This is the main global destructor for the app. Call this after
|
||||||
|
* _all_ libcurl usage is done.
|
||||||
|
*/
|
||||||
|
static void main_free(void)
|
||||||
|
{
|
||||||
|
curl_global_cleanup();
|
||||||
|
}
|
||||||
|
|
||||||
|
static int SetHTTPrequest(struct Configurable *config,
|
||||||
|
HttpReq req, HttpReq *store)
|
||||||
|
{
|
||||||
|
if((*store == HTTPREQ_UNSPEC) ||
|
||||||
|
(*store == req)) {
|
||||||
|
*store = req;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
warnf(config, "You can only select one HTTP request!\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void helpf(const char *fmt, ...)
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
if(fmt) {
|
||||||
|
va_start(ap, fmt);
|
||||||
|
fputs("curl: ", stderr); /* prefix it */
|
||||||
|
vfprintf(stderr, fmt, ap);
|
||||||
|
va_end(ap);
|
||||||
|
}
|
||||||
|
fprintf(stderr, "curl: try 'curl --help' "
|
||||||
|
#ifdef USE_MANUAL
|
||||||
|
"or 'curl --manual' "
|
||||||
|
#endif
|
||||||
|
"for more information\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* A chain of these nodes contain URL to get and where to put the URL's
|
||||||
|
* contents.
|
||||||
|
*/
|
||||||
|
struct getout {
|
||||||
|
struct getout *next; /* next one */
|
||||||
|
char *url; /* the URL we deal with */
|
||||||
|
char *outfile; /* where to store the output */
|
||||||
|
char *infile; /* file to upload, if GETOUT_UPLOAD is set */
|
||||||
|
int flags; /* options */
|
||||||
|
};
|
||||||
|
#define GETOUT_OUTFILE (1<<0) /* set when outfile is deemed done */
|
||||||
|
#define GETOUT_URL (1<<1) /* set when URL is deemed done */
|
||||||
|
#define GETOUT_USEREMOTE (1<<2) /* use remote file name locally */
|
||||||
|
#define GETOUT_UPLOAD (1<<3) /* if set, -T has been used */
|
||||||
|
#define GETOUT_NOUPLOAD (1<<4) /* if set, -T "" has been used */
|
||||||
|
|
||||||
|
static void help(void)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
static const char * const helptext[]={
|
||||||
|
"Usage: curl [options...] <url>",
|
||||||
|
"Options: (H) means HTTP/HTTPS only, (F) means FTP only",
|
||||||
|
" -a/--append Append to target file when uploading (F)",
|
||||||
|
" -A/--user-agent <string> User-Agent to send to server (H)",
|
||||||
|
" --anyauth Tell curl to choose authentication method (H)",
|
||||||
|
" -b/--cookie <name=string/file> Cookie string or file to read cookies from (H)",
|
||||||
|
" --basic Enable HTTP Basic Authentication (H)",
|
||||||
|
" -B/--use-ascii Use ASCII/text transfer",
|
||||||
|
" -c/--cookie-jar <file> Write cookies to this file after operation (H)",
|
||||||
|
" -C/--continue-at <offset> Resumed transfer offset",
|
||||||
|
" -d/--data <data> HTTP POST data (H)",
|
||||||
|
" --data-ascii <data> HTTP POST ASCII data (H)",
|
||||||
|
" --data-binary <data> HTTP POST binary data (H)",
|
||||||
|
" --negotiate Enable HTTP Negotiate Authentication (H)",
|
||||||
|
" --digest Enable HTTP Digest Authentication (H)",
|
||||||
|
" --disable-eprt Prevent curl from using EPRT or LPRT (F)",
|
||||||
|
" --disable-epsv Prevent curl from using EPSV (F)",
|
||||||
|
" -D/--dump-header <file> Write the headers to this file",
|
||||||
|
" --egd-file <file> EGD socket path for random data (SSL)",
|
||||||
|
" --tcp-nodelay Set the TCP_NODELAY option",
|
||||||
|
#ifdef USE_ENVIRONMENT
|
||||||
|
" --environment Write result codes to environment variables (RISC OS)",
|
||||||
|
#endif
|
||||||
|
" -e/--referer Referer URL (H)",
|
||||||
|
" -E/--cert <cert[:passwd]> Client certificate file and password (SSL)",
|
||||||
|
" --cert-type <type> Certificate file type (DER/PEM/ENG) (SSL)",
|
||||||
|
" --key <key> Private key file name (SSL)",
|
||||||
|
" --key-type <type> Private key file type (DER/PEM/ENG) (SSL)",
|
||||||
|
" --pass <pass> Pass phrase for the private key (SSL)",
|
||||||
|
" --engine <eng> Crypto engine to use (SSL). \"--engine list\" for list",
|
||||||
|
" --cacert <file> CA certificate to verify peer against (SSL)",
|
||||||
|
" --capath <directory> CA directory (made using c_rehash) to verify",
|
||||||
|
" peer against (SSL)",
|
||||||
|
" --ciphers <list> SSL ciphers to use (SSL)",
|
||||||
|
" --compressed Request compressed response (using deflate or gzip)",
|
||||||
|
" --connect-timeout <seconds> Maximum time allowed for connection",
|
||||||
|
" --create-dirs Create necessary local directory hierarchy",
|
||||||
|
" --crlf Convert LF to CRLF in upload",
|
||||||
|
" -f/--fail Fail silently (no output at all) on errors (H)",
|
||||||
|
" --ftp-create-dirs Create the remote dirs if not present (F)",
|
||||||
|
" --ftp-pasv Use PASV instead of PORT (F)",
|
||||||
|
" --ftp-ssl Enable SSL/TLS for the ftp transfer (F)",
|
||||||
|
" -F/--form <name=content> Specify HTTP multipart POST data (H)",
|
||||||
|
" --form-string <name=string> Specify HTTP multipart POST data (H)",
|
||||||
|
" -g/--globoff Disable URL sequences and ranges using {} and []",
|
||||||
|
" -G/--get Send the -d data with a HTTP GET (H)",
|
||||||
|
" -h/--help This help text",
|
||||||
|
" -H/--header <line> Custom header to pass to server (H)",
|
||||||
|
" --ignore-content-length Ignore the HTTP Content-Length header",
|
||||||
|
" -i/--include Include protocol headers in the output (H/F)",
|
||||||
|
" -I/--head Show document info only",
|
||||||
|
" -j/--junk-session-cookies Ignore session cookies read from file (H)",
|
||||||
|
" --interface <interface> Specify network interface to use",
|
||||||
|
" --krb4 <level> Enable krb4 with specified security level (F)",
|
||||||
|
" -k/--insecure Allow curl to connect to SSL sites without certs (H)",
|
||||||
|
" -K/--config Specify which config file to read",
|
||||||
|
" -l/--list-only List only names of an FTP directory (F)",
|
||||||
|
" --limit-rate <rate> Limit transfer speed to this rate",
|
||||||
|
" -L/--location Follow Location: hints (H)",
|
||||||
|
" --location-trusted Follow Location: and send authentication even ",
|
||||||
|
" to other hostnames (H)",
|
||||||
|
" -m/--max-time <seconds> Maximum time allowed for the transfer",
|
||||||
|
" --max-redirs <num> Maximum number of redirects allowed (H)",
|
||||||
|
" --max-filesize <bytes> Maximum file size to download (H/F)",
|
||||||
|
" -M/--manual Display the full manual",
|
||||||
|
" -n/--netrc Must read .netrc for user name and password",
|
||||||
|
" --netrc-optional Use either .netrc or URL; overrides -n",
|
||||||
|
" --ntlm Enable HTTP NTLM authentication (H)",
|
||||||
|
" -N/--no-buffer Disable buffering of the output stream",
|
||||||
|
" -o/--output <file> Write output to <file> instead of stdout",
|
||||||
|
" -O/--remote-name Write output to a file named as the remote file",
|
||||||
|
" -p/--proxytunnel Operate through a HTTP proxy tunnel (using CONNECT)",
|
||||||
|
" --proxy-anyauth Let curl pick proxy authentication method (H)",
|
||||||
|
" --proxy-basic Enable Basic authentication on the proxy (H)",
|
||||||
|
" --proxy-digest Enable Digest authentication on the proxy (H)",
|
||||||
|
" --proxy-ntlm Enable NTLM authentication on the proxy (H)",
|
||||||
|
" -P/--ftp-port <address> Use PORT with address instead of PASV (F)",
|
||||||
|
" -q If used as the first parameter disables .curlrc",
|
||||||
|
" -Q/--quote <cmd> Send command(s) to server before file transfer (F)",
|
||||||
|
" -r/--range <range> Retrieve a byte range from a HTTP/1.1 or FTP server",
|
||||||
|
" --random-file <file> File for reading random data from (SSL)",
|
||||||
|
" -R/--remote-time Set the remote file's time on the local output",
|
||||||
|
" --retry <num> Retry request <num> times if transient problems occur",
|
||||||
|
" --retry-delay <seconds> When retrying, wait this many seconds between each",
|
||||||
|
" --retry-max-time <seconds> Retry only within this period",
|
||||||
|
" -s/--silent Silent mode. Don't output anything",
|
||||||
|
" -S/--show-error Show error. With -s, make curl show errors when they occur",
|
||||||
|
" --socks <host[:port]> Use SOCKS5 proxy on given host + port",
|
||||||
|
" --stderr <file> Where to redirect stderr. - means stdout",
|
||||||
|
" -t/--telnet-option <OPT=val> Set telnet option",
|
||||||
|
" --trace <file> Write a debug trace to the given file",
|
||||||
|
" --trace-ascii <file> Like --trace but without the hex output",
|
||||||
|
" --trace-time Add time stamps to trace/verbose output",
|
||||||
|
" -T/--upload-file <file> Transfer <file> to remote site",
|
||||||
|
" --url <URL> Spet URL to work with",
|
||||||
|
" -u/--user <user[:password]> Set server user and password",
|
||||||
|
" -U/--proxy-user <user[:password]> Set proxy user and password",
|
||||||
|
" -v/--verbose Make the operation more talkative",
|
||||||
|
" -V/--version Show version number and quit",
|
||||||
|
#ifdef __DJGPP__
|
||||||
|
" --wdebug Turn on Watt-32 debugging under DJGPP",
|
||||||
|
#endif
|
||||||
|
" -w/--write-out [format] What to output after completion",
|
||||||
|
" -x/--proxy <host[:port]> Use HTTP proxy on given port",
|
||||||
|
" -X/--request <command> Specify request command to use",
|
||||||
|
" -y/--speed-time Time needed to trig speed-limit abort. Defaults to 30",
|
||||||
|
" -Y/--speed-limit Stop transfer if below speed-limit for 'speed-time' secs",
|
||||||
|
" -z/--time-cond <time> Transfer based on a time condition",
|
||||||
|
" -0/--http1.0 Use HTTP 1.0 (H)",
|
||||||
|
" -1/--tlsv1 Use TLSv1 (SSL)",
|
||||||
|
" -2/--sslv2 Use SSLv2 (SSL)",
|
||||||
|
" -3/--sslv3 Use SSLv3 (SSL)",
|
||||||
|
" --3p-quote like -Q for the source URL for 3rd party transfer (F)",
|
||||||
|
" --3p-url source URL to activate 3rd party transfer (F)",
|
||||||
|
" --3p-user user and password for source 3rd party transfer (F)",
|
||||||
|
" -4/--ipv4 Resolve name to IPv4 address",
|
||||||
|
" -6/--ipv6 Resolve name to IPv6 address",
|
||||||
|
" -#/--progress-bar Display transfer progress as a progress bar",
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
for(i=0; helptext[i]; i++) {
|
||||||
|
puts(helptext[i]);
|
||||||
|
#ifdef __NOVELL_LIBC__
|
||||||
|
if (i && ((i % 23) == 0))
|
||||||
|
pressanykey();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct LongShort {
|
||||||
|
const char *letter;
|
||||||
|
const char *lname;
|
||||||
|
bool extraparam;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* global variable to hold info about libcurl */
|
/* global variable to hold info about libcurl */
|
||||||
@@ -814,7 +858,8 @@ static void list_engines (const struct curl_slist *engines)
|
|||||||
#define FORM_FILE_SEPARATOR ','
|
#define FORM_FILE_SEPARATOR ','
|
||||||
#define FORM_TYPE_SEPARATOR ';'
|
#define FORM_TYPE_SEPARATOR ';'
|
||||||
|
|
||||||
static int formparse(char *input,
|
static int formparse(struct Configurable *config,
|
||||||
|
char *input,
|
||||||
struct curl_httppost **httppost,
|
struct curl_httppost **httppost,
|
||||||
struct curl_httppost **last_post,
|
struct curl_httppost **last_post,
|
||||||
bool literal_value)
|
bool literal_value)
|
||||||
@@ -890,7 +935,7 @@ static int formparse(char *input,
|
|||||||
/* verify that this is a fine type specifier */
|
/* verify that this is a fine type specifier */
|
||||||
if(2 != sscanf(type, "%127[^/]/%127[^;,\n]",
|
if(2 != sscanf(type, "%127[^/]/%127[^;,\n]",
|
||||||
major, minor)) {
|
major, minor)) {
|
||||||
fprintf(stderr, "Illegally formatted content-type field!\n");
|
warnf(config, "Illegally formatted content-type field!\n");
|
||||||
free(contents);
|
free(contents);
|
||||||
FreeMultiInfo (multi_start);
|
FreeMultiInfo (multi_start);
|
||||||
return 2; /* illegal content-type syntax! */
|
return 2; /* illegal content-type syntax! */
|
||||||
@@ -939,7 +984,7 @@ static int formparse(char *input,
|
|||||||
|
|
||||||
if (!AddMultiFiles (contp, type, filename, &multi_start,
|
if (!AddMultiFiles (contp, type, filename, &multi_start,
|
||||||
&multi_current)) {
|
&multi_current)) {
|
||||||
fprintf(stderr, "Error building form post!\n");
|
warnf(config, "Error building form post!\n");
|
||||||
free(contents);
|
free(contents);
|
||||||
FreeMultiInfo (multi_start);
|
FreeMultiInfo (multi_start);
|
||||||
return 3;
|
return 3;
|
||||||
@@ -976,7 +1021,7 @@ static int formparse(char *input,
|
|||||||
if (curl_formadd(httppost, last_post,
|
if (curl_formadd(httppost, last_post,
|
||||||
CURLFORM_COPYNAME, name,
|
CURLFORM_COPYNAME, name,
|
||||||
CURLFORM_ARRAY, forms, CURLFORM_END) != 0) {
|
CURLFORM_ARRAY, forms, CURLFORM_END) != 0) {
|
||||||
fprintf(stderr, "curl_formadd failed!\n");
|
warnf(config, "curl_formadd failed!\n");
|
||||||
free(forms);
|
free(forms);
|
||||||
free(contents);
|
free(contents);
|
||||||
return 5;
|
return 5;
|
||||||
@@ -1008,8 +1053,8 @@ static int formparse(char *input,
|
|||||||
|
|
||||||
if (curl_formadd(httppost, last_post,
|
if (curl_formadd(httppost, last_post,
|
||||||
CURLFORM_ARRAY, info, CURLFORM_END ) != 0) {
|
CURLFORM_ARRAY, info, CURLFORM_END ) != 0) {
|
||||||
fprintf(stderr, "curl_formadd failed, possibly the file %s is bad!\n",
|
warnf(config, "curl_formadd failed, possibly the file %s is bad!\n",
|
||||||
contp+1);
|
contp+1);
|
||||||
free(contents);
|
free(contents);
|
||||||
return 6;
|
return 6;
|
||||||
}
|
}
|
||||||
@@ -1021,7 +1066,7 @@ static int formparse(char *input,
|
|||||||
info[i].option = CURLFORM_END;
|
info[i].option = CURLFORM_END;
|
||||||
if (curl_formadd(httppost, last_post,
|
if (curl_formadd(httppost, last_post,
|
||||||
CURLFORM_ARRAY, info, CURLFORM_END) != 0) {
|
CURLFORM_ARRAY, info, CURLFORM_END) != 0) {
|
||||||
fprintf(stderr, "curl_formadd failed!\n");
|
warnf(config, "curl_formadd failed!\n");
|
||||||
free(contents);
|
free(contents);
|
||||||
return 7;
|
return 7;
|
||||||
}
|
}
|
||||||
@@ -1030,7 +1075,7 @@ static int formparse(char *input,
|
|||||||
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
fprintf(stderr, "Illegally formatted input field!\n");
|
warnf(config, "Illegally formatted input field!\n");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
free(contents);
|
free(contents);
|
||||||
@@ -1267,6 +1312,7 @@ static ParameterError getparameter(char *flag, /* f or -long-flag */
|
|||||||
{"$m", "ftp-account", TRUE},
|
{"$m", "ftp-account", TRUE},
|
||||||
{"$n", "proxy-anyauth", FALSE},
|
{"$n", "proxy-anyauth", FALSE},
|
||||||
{"$o", "trace-time", FALSE},
|
{"$o", "trace-time", FALSE},
|
||||||
|
{"$p", "ignore-content-length", FALSE},
|
||||||
|
|
||||||
{"0", "http1.0", FALSE},
|
{"0", "http1.0", FALSE},
|
||||||
{"1", "tlsv1", FALSE},
|
{"1", "tlsv1", FALSE},
|
||||||
@@ -1387,9 +1433,6 @@ static ParameterError getparameter(char *flag, /* f or -long-flag */
|
|||||||
}
|
}
|
||||||
*usedarg = FALSE; /* default is that we don't use the arg */
|
*usedarg = FALSE; /* default is that we don't use the arg */
|
||||||
|
|
||||||
#if 0
|
|
||||||
fprintf(stderr, "OPTION: %c %s\n", letter, nextarg?nextarg:"<null>");
|
|
||||||
#endif
|
|
||||||
if(hit < 0) {
|
if(hit < 0) {
|
||||||
for(j=0; j< sizeof(aliases)/sizeof(aliases[0]); j++) {
|
for(j=0; j< sizeof(aliases)/sizeof(aliases[0]); j++) {
|
||||||
if(letter == aliases[j].letter[0]) {
|
if(letter == aliases[j].letter[0]) {
|
||||||
@@ -1533,8 +1576,13 @@ static ParameterError getparameter(char *flag, /* f or -long-flag */
|
|||||||
|
|
||||||
case 'v': /* --stderr */
|
case 'v': /* --stderr */
|
||||||
if(strcmp(nextarg, "-")) {
|
if(strcmp(nextarg, "-")) {
|
||||||
config->errors = fopen(nextarg, "wt");
|
FILE *newfile = fopen(nextarg, "wt");
|
||||||
config->errors_fopened = TRUE;
|
if(!config->errors)
|
||||||
|
warnf(config, "Failed to open %s!\n", nextarg);
|
||||||
|
else {
|
||||||
|
config->errors = newfile;
|
||||||
|
config->errors_fopened = TRUE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
config->errors = stdout;
|
config->errors = stdout;
|
||||||
@@ -1658,6 +1706,9 @@ static ParameterError getparameter(char *flag, /* f or -long-flag */
|
|||||||
case 'o': /* --trace-time */
|
case 'o': /* --trace-time */
|
||||||
config->tracetime ^= TRUE;
|
config->tracetime ^= TRUE;
|
||||||
break;
|
break;
|
||||||
|
case 'p': /* --ignore-content-length */
|
||||||
|
config->ignorecl ^= TRUE;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case '#': /* --progress-bar */
|
case '#': /* --progress-bar */
|
||||||
@@ -1742,15 +1793,26 @@ static ParameterError getparameter(char *flag, /* f or -long-flag */
|
|||||||
|
|
||||||
if(curlx_strequal("-", nextarg))
|
if(curlx_strequal("-", nextarg))
|
||||||
file = stdin;
|
file = stdin;
|
||||||
else
|
else {
|
||||||
file = fopen(nextarg, "rb");
|
file = fopen(nextarg, "rb");
|
||||||
|
if(!file)
|
||||||
|
warnf(config, "Couldn't read data from file \"%s\", this makes "
|
||||||
|
"an empty POST.\n", nextarg);
|
||||||
|
}
|
||||||
|
|
||||||
if(subletter == 'b') /* forced binary */
|
if(subletter == 'b') /* forced binary */
|
||||||
postdata = file2memory(file, &config->postfieldsize);
|
postdata = file2memory(file, &config->postfieldsize);
|
||||||
else
|
else
|
||||||
postdata = file2string(file);
|
postdata = file2string(file);
|
||||||
|
|
||||||
if(file && (file != stdin))
|
if(file && (file != stdin))
|
||||||
fclose(file);
|
fclose(file);
|
||||||
|
|
||||||
|
if(!postdata) {
|
||||||
|
/* no data from the file, point to a zero byte string to make this
|
||||||
|
get sent as a POST anyway */
|
||||||
|
postdata=strdup("");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
GetStr(&postdata, nextarg);
|
GetStr(&postdata, nextarg);
|
||||||
@@ -1856,12 +1918,13 @@ static ParameterError getparameter(char *flag, /* f or -long-flag */
|
|||||||
case 'F':
|
case 'F':
|
||||||
/* "form data" simulation, this is a little advanced so lets do our best
|
/* "form data" simulation, this is a little advanced so lets do our best
|
||||||
to sort this out slowly and carefully */
|
to sort this out slowly and carefully */
|
||||||
if(formparse(nextarg,
|
if(formparse(config,
|
||||||
|
nextarg,
|
||||||
&config->httppost,
|
&config->httppost,
|
||||||
&config->last_post,
|
&config->last_post,
|
||||||
subletter=='s')) /* 's' means literal string */
|
subletter=='s')) /* 's' means literal string */
|
||||||
return PARAM_BAD_USE;
|
return PARAM_BAD_USE;
|
||||||
if(SetHTTPrequest(HTTPREQ_POST, &config->httpreq))
|
if(SetHTTPrequest(config, HTTPREQ_POST, &config->httpreq))
|
||||||
return PARAM_BAD_USE;
|
return PARAM_BAD_USE;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -1897,13 +1960,13 @@ static ParameterError getparameter(char *flag, /* f or -long-flag */
|
|||||||
(config->conf&(CONF_HEADER|CONF_NOBODY)) ) {
|
(config->conf&(CONF_HEADER|CONF_NOBODY)) ) {
|
||||||
/* one of them weren't set, set both */
|
/* one of them weren't set, set both */
|
||||||
config->conf |= (CONF_HEADER|CONF_NOBODY);
|
config->conf |= (CONF_HEADER|CONF_NOBODY);
|
||||||
if(SetHTTPrequest(HTTPREQ_HEAD, &config->httpreq))
|
if(SetHTTPrequest(config, HTTPREQ_HEAD, &config->httpreq))
|
||||||
return PARAM_BAD_USE;
|
return PARAM_BAD_USE;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* both were set, clear both */
|
/* both were set, clear both */
|
||||||
config->conf &= ~(CONF_HEADER|CONF_NOBODY);
|
config->conf &= ~(CONF_HEADER|CONF_NOBODY);
|
||||||
if(SetHTTPrequest(HTTPREQ_GET, &config->httpreq))
|
if(SetHTTPrequest(config, HTTPREQ_GET, &config->httpreq))
|
||||||
return PARAM_BAD_USE;
|
return PARAM_BAD_USE;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -1936,8 +1999,8 @@ static ParameterError getparameter(char *flag, /* f or -long-flag */
|
|||||||
hugehelp();
|
hugehelp();
|
||||||
return PARAM_HELP_REQUESTED;
|
return PARAM_HELP_REQUESTED;
|
||||||
#else
|
#else
|
||||||
fprintf(stderr,
|
warnf(config,
|
||||||
"curl: built-in manual was disabled at build-time!\n");
|
"built-in manual was disabled at build-time!\n");
|
||||||
return PARAM_OPTION_UNKNOWN;
|
return PARAM_OPTION_UNKNOWN;
|
||||||
#endif
|
#endif
|
||||||
case 'n':
|
case 'n':
|
||||||
@@ -2150,6 +2213,8 @@ static ParameterError getparameter(char *flag, /* f or -long-flag */
|
|||||||
else
|
else
|
||||||
file = fopen(nextarg, "r");
|
file = fopen(nextarg, "r");
|
||||||
config->writeout = file2string(file);
|
config->writeout = file2string(file);
|
||||||
|
if(!config->writeout)
|
||||||
|
warnf(config, "Failed to read %s", file);
|
||||||
if(file && (file != stdin))
|
if(file && (file != stdin))
|
||||||
fclose(file);
|
fclose(file);
|
||||||
}
|
}
|
||||||
@@ -2205,10 +2270,10 @@ static ParameterError getparameter(char *flag, /* f or -long-flag */
|
|||||||
if(-1 == stat(nextarg, &statbuf)) {
|
if(-1 == stat(nextarg, &statbuf)) {
|
||||||
/* failed, remove time condition */
|
/* failed, remove time condition */
|
||||||
config->timecond = CURL_TIMECOND_NONE;
|
config->timecond = CURL_TIMECOND_NONE;
|
||||||
fprintf(stderr,
|
warnf(config,
|
||||||
"Warning: Illegal date format for -z/--timecond and not "
|
"Illegal date format for -z/--timecond (and not "
|
||||||
"a file name.\n"
|
"a file name). Disabling time condition. "
|
||||||
" See curl_getdate(3) for valid date syntax.\n");
|
"See curl_getdate(3) for valid date syntax.\n");
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* pull the time out from the file */
|
/* pull the time out from the file */
|
||||||
@@ -2421,8 +2486,8 @@ static void parseconfig(const char *filename,
|
|||||||
}
|
}
|
||||||
if(PARAM_HELP_REQUESTED != res) {
|
if(PARAM_HELP_REQUESTED != res) {
|
||||||
const char *reason = param2text(res);
|
const char *reason = param2text(res);
|
||||||
fprintf(stderr, "%s:%d: warning: '%s' %s\n",
|
warnf(config, "%s:%d: warning: '%s' %s\n",
|
||||||
filename, lineno, option, reason);
|
filename, lineno, option, reason);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2485,8 +2550,10 @@ static int my_fwrite(void *buffer, size_t sz, size_t nmemb, void *stream)
|
|||||||
if(out && !out->stream) {
|
if(out && !out->stream) {
|
||||||
/* open file for writing */
|
/* open file for writing */
|
||||||
out->stream=fopen(out->filename, "wb");
|
out->stream=fopen(out->filename, "wb");
|
||||||
if(!out->stream)
|
if(!out->stream) {
|
||||||
|
warnf(config, "Failed to create the file %s\n", out->filename);
|
||||||
return -1; /* failure */
|
return -1; /* failure */
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(config->recvpersecond) {
|
if(config->recvpersecond) {
|
||||||
@@ -2817,16 +2884,15 @@ int my_trace(CURL *handle, curl_infotype type,
|
|||||||
const char *text;
|
const char *text;
|
||||||
struct timeval tv;
|
struct timeval tv;
|
||||||
struct tm *now;
|
struct tm *now;
|
||||||
char timebuf[15];
|
char timebuf[20];
|
||||||
|
|
||||||
(void)handle; /* prevent compiler warning */
|
(void)handle; /* prevent compiler warning */
|
||||||
|
|
||||||
tv = curlx_tvnow();
|
tv = curlx_tvnow();
|
||||||
now = localtime(&tv.tv_sec); /* not multithread safe but we don't care */
|
now = localtime(&tv.tv_sec); /* not multithread safe but we don't care */
|
||||||
if(config->tracetime)
|
if(config->tracetime)
|
||||||
snprintf(timebuf, sizeof(timebuf), "%02d:%02d:%02d.%02d ",
|
snprintf(timebuf, sizeof(timebuf), "%02d:%02d:%02d.%06d ",
|
||||||
now->tm_hour, now->tm_min, now->tm_sec,
|
now->tm_hour, now->tm_min, now->tm_sec, tv.tv_usec);
|
||||||
tv.tv_usec/10000);
|
|
||||||
else
|
else
|
||||||
timebuf[0]=0;
|
timebuf[0]=0;
|
||||||
|
|
||||||
@@ -3234,14 +3300,15 @@ operate(struct Configurable *config, int argc, char *argv[])
|
|||||||
httpgetfields = strdup(config->postfields);
|
httpgetfields = strdup(config->postfields);
|
||||||
free(config->postfields);
|
free(config->postfields);
|
||||||
config->postfields = NULL;
|
config->postfields = NULL;
|
||||||
if(SetHTTPrequest((config->conf&CONF_NOBODY?HTTPREQ_HEAD:HTTPREQ_GET),
|
if(SetHTTPrequest(config,
|
||||||
|
(config->conf&CONF_NOBODY?HTTPREQ_HEAD:HTTPREQ_GET),
|
||||||
&config->httpreq)) {
|
&config->httpreq)) {
|
||||||
free(httpgetfields);
|
free(httpgetfields);
|
||||||
return PARAM_BAD_USE;
|
return PARAM_BAD_USE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if(SetHTTPrequest(HTTPREQ_SIMPLEPOST, &config->httpreq))
|
if(SetHTTPrequest(config, HTTPREQ_SIMPLEPOST, &config->httpreq))
|
||||||
return PARAM_BAD_USE;
|
return PARAM_BAD_USE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3408,7 +3475,7 @@ operate(struct Configurable *config, int argc, char *argv[])
|
|||||||
free(storefile);
|
free(storefile);
|
||||||
if(!outfile) {
|
if(!outfile) {
|
||||||
/* bad globbing */
|
/* bad globbing */
|
||||||
fprintf(stderr, "bad output glob!\n");
|
warnf(config, "bad output glob!\n");
|
||||||
free(url);
|
free(url);
|
||||||
res = CURLE_FAILED_INIT;
|
res = CURLE_FAILED_INIT;
|
||||||
break;
|
break;
|
||||||
@@ -3836,6 +3903,8 @@ operate(struct Configurable *config, int argc, char *argv[])
|
|||||||
curl_easy_setopt(curl, CURLOPT_SOURCE_QUOTE, config->tp_quote);
|
curl_easy_setopt(curl, CURLOPT_SOURCE_QUOTE, config->tp_quote);
|
||||||
curl_easy_setopt(curl, CURLOPT_FTP_ACCOUNT, config->ftp_account);
|
curl_easy_setopt(curl, CURLOPT_FTP_ACCOUNT, config->ftp_account);
|
||||||
|
|
||||||
|
curl_easy_setopt(curl, CURLOPT_IGNORE_CONTENT_LENGTH, config->ignorecl);
|
||||||
|
|
||||||
retry_numretries = config->req_retry;
|
retry_numretries = config->req_retry;
|
||||||
|
|
||||||
retrystart = curlx_tvnow();
|
retrystart = curlx_tvnow();
|
||||||
@@ -3902,19 +3971,18 @@ operate(struct Configurable *config, int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(retry) {
|
if(retry) {
|
||||||
if(!(config->conf&CONF_MUTE)) {
|
static const char * const m[]={NULL,
|
||||||
static const char * const m[]={NULL,
|
"timeout",
|
||||||
"timeout",
|
"HTTP error",
|
||||||
"HTTP error",
|
"FTP error"
|
||||||
"FTP error"
|
};
|
||||||
};
|
warnf(config, "Transient problem: %s "
|
||||||
fprintf(stderr, "Transient problem: %s\n"
|
"Will retry in %ld seconds. "
|
||||||
"Will retry in %ld seconds. "
|
"%ld retries left.\n",
|
||||||
"%ld retries left.\n",
|
m[retry],
|
||||||
m[retry],
|
retry_sleep/1000,
|
||||||
retry_sleep/1000,
|
retry_numretries);
|
||||||
retry_numretries);
|
|
||||||
}
|
|
||||||
go_sleep(retry_sleep);
|
go_sleep(retry_sleep);
|
||||||
retry_numretries--;
|
retry_numretries--;
|
||||||
if(!config->retry_delay) {
|
if(!config->retry_delay) {
|
||||||
@@ -4128,6 +4196,8 @@ int main(int argc, char *argv[])
|
|||||||
struct Configurable config;
|
struct Configurable config;
|
||||||
memset(&config, 0, sizeof(struct Configurable));
|
memset(&config, 0, sizeof(struct Configurable));
|
||||||
|
|
||||||
|
config.errors = stderr; /* default errors to stderr */
|
||||||
|
|
||||||
checkfds();
|
checkfds();
|
||||||
|
|
||||||
res = operate(&config, argc, argv);
|
res = operate(&config, argc, argv);
|
||||||
|
@@ -7,9 +7,9 @@
|
|||||||
ATCPSDKI= /GG/netinclude
|
ATCPSDKI= /GG/netinclude
|
||||||
|
|
||||||
|
|
||||||
CC = gcc
|
CC = m68k-amigaos-gcc
|
||||||
CFLAGS = -I$(ATCPSDKI) -m68020-60 -noixemul -I. -I../include -W -Wall
|
CFLAGS = -I$(ATCPSDKI) -m68020-60 -O2 -msoft-float -noixemul -g -I. -I../include -W -Wall
|
||||||
LIBS = ../lib/libcurl.a -lsslnix -lcryptonix -lz
|
LIBS = ../lib/libcurl.a -lssl -lcrypto -lz
|
||||||
MANPAGE = ../docs/curl.1
|
MANPAGE = ../docs/curl.1
|
||||||
README = ../docs/MANUAL
|
README = ../docs/MANUAL
|
||||||
MKHELP = ../src/mkhelp.pl
|
MKHELP = ../src/mkhelp.pl
|
||||||
@@ -18,7 +18,7 @@ OBJS = getpass.c hugehelp.c main.c urlglob.c writeenv.c writeout.c
|
|||||||
|
|
||||||
|
|
||||||
all: hugehelp.c $(OBJS:.c=.o)
|
all: hugehelp.c $(OBJS:.c=.o)
|
||||||
$(CC) $(CFLAGS) -s -o cURL $(OBJS:.c=.o) $(LIBS)
|
$(CC) $(CFLAGS) -o cURL $(OBJS:.c=.o) $(LIBS) -Wl,-Map,cURL.map,--cref
|
||||||
|
|
||||||
hugehelp.c: $(README) $(MANPAGE) mkhelp.pl
|
hugehelp.c: $(README) $(MANPAGE) mkhelp.pl
|
||||||
rm -f hugehelp.c
|
rm -f hugehelp.c
|
||||||
|
@@ -197,11 +197,17 @@ the protocol dump curl should transmit, if 'nonewline' is set, we will cut
|
|||||||
off the trailing newline of this given data before comparing with the one
|
off the trailing newline of this given data before comparing with the one
|
||||||
actually sent by the client
|
actually sent by the client
|
||||||
</protocol>
|
</protocol>
|
||||||
<stdout>
|
<stdout [mode=text]>
|
||||||
This verfies that this data was passed to stdout.
|
This verfies that this data was passed to stdout.
|
||||||
|
|
||||||
|
Use the "mode=text" attribute if the output is in text mode on platforms that
|
||||||
|
have a text/binary difference.
|
||||||
</stdout>
|
</stdout>
|
||||||
<file name="log/filename">
|
<file name="log/filename" [mode=text]>
|
||||||
the file's contents must be identical to this
|
The file's contents must be identical to this after the test is complete.
|
||||||
|
|
||||||
|
Use the "mode=text" attribute if the output is in text mode on platforms that
|
||||||
|
have a text/binary difference.
|
||||||
</file>
|
</file>
|
||||||
<stripfile>
|
<stripfile>
|
||||||
One perl op per line that operates on the file before being compared. This is
|
One perl op per line that operates on the file before being compared. This is
|
||||||
|
@@ -32,4 +32,5 @@ EXTRA_DIST = test1 test108 test117 test127 test20 test27 test34 test46 \
|
|||||||
test231 test232 test228 test229 test233 test234 test235 test236 test520 \
|
test231 test232 test228 test229 test233 test234 test235 test236 test520 \
|
||||||
test237 test238 test239 test243 test245 test246 test247 test248 test249 \
|
test237 test238 test239 test243 test245 test246 test247 test248 test249 \
|
||||||
test250 test251 test252 test253 test254 test255 test521 test522 test523 \
|
test250 test251 test252 test253 test254 test255 test521 test522 test523 \
|
||||||
test256 test257 test258 test259
|
test256 test257 test258 test259 test260 test261 test262 test263 test264 \
|
||||||
|
test265 test266 test267 test268 test269
|
||||||
|
@@ -38,7 +38,7 @@ Accept: */*
|
|||||||
Proxy-Connection: Keep-Alive
|
Proxy-Connection: Keep-Alive
|
||||||
|
|
||||||
</protocol>
|
</protocol>
|
||||||
<file name="log/jar171">
|
<file name="log/jar171" mode=text>
|
||||||
# Netscape HTTP Cookie File
|
# Netscape HTTP Cookie File
|
||||||
# http://www.netscape.com/newsref/std/cookie_spec.html
|
# http://www.netscape.com/newsref/std/cookie_spec.html
|
||||||
# This file was generated by libcurl! Edit at your own risk.
|
# This file was generated by libcurl! Edit at your own risk.
|
||||||
|
@@ -1,3 +1,10 @@
|
|||||||
|
<info>
|
||||||
|
<keywords>
|
||||||
|
HTTP
|
||||||
|
HTTP GET
|
||||||
|
compressed
|
||||||
|
</keywords>
|
||||||
|
</info>
|
||||||
#
|
#
|
||||||
# Server-side
|
# Server-side
|
||||||
<reply>
|
<reply>
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user