Compare commits
206 Commits
curl-7_15_
...
curl-7_15_
Author | SHA1 | Date | |
---|---|---|---|
![]() |
8548c2fc61 | ||
![]() |
dc4fbd2e97 | ||
![]() |
60b029869f | ||
![]() |
f592ea6c30 | ||
![]() |
a39ac3d94a | ||
![]() |
4b23ddc002 | ||
![]() |
4486d336a6 | ||
![]() |
45e4b811b0 | ||
![]() |
0e6a1a4420 | ||
![]() |
b8bf708db9 | ||
![]() |
6fdbb01194 | ||
![]() |
d29147565c | ||
![]() |
75c9430559 | ||
![]() |
9ac99a80c3 | ||
![]() |
a15d107dde | ||
![]() |
09897b8146 | ||
![]() |
29e446e508 | ||
![]() |
10beb36b1c | ||
![]() |
a65a888866 | ||
![]() |
98180b5cc7 | ||
![]() |
92009181af | ||
![]() |
831bdb9f63 | ||
![]() |
50a4dbbb5e | ||
![]() |
ad6511c313 | ||
![]() |
7a37fa4aef | ||
![]() |
dcee24191f | ||
![]() |
87bcb6f377 | ||
![]() |
b0bc2f00d2 | ||
![]() |
3b19c7d0d9 | ||
![]() |
12f5c67bf5 | ||
![]() |
d7a83d8995 | ||
![]() |
7725729d90 | ||
![]() |
e96445bd02 | ||
![]() |
da2c124675 | ||
![]() |
8cb695a963 | ||
![]() |
54cbd7e154 | ||
![]() |
5994b62930 | ||
![]() |
2fbf94b0f3 | ||
![]() |
32bc30e210 | ||
![]() |
f3bc8e6ce1 | ||
![]() |
16f3a32bec | ||
![]() |
c44d2498e3 | ||
![]() |
2aed209efa | ||
![]() |
b55b780d7b | ||
![]() |
8d4eb2bc1f | ||
![]() |
67bf4f28ff | ||
![]() |
803582f8ac | ||
![]() |
03603f392a | ||
![]() |
fcfd6d9504 | ||
![]() |
c31451cf13 | ||
![]() |
5deff1a179 | ||
![]() |
e236a1c99b | ||
![]() |
a2f3094eb0 | ||
![]() |
65afc576ea | ||
![]() |
8971f656b4 | ||
![]() |
394ce9ee39 | ||
![]() |
67a83c1b34 | ||
![]() |
1e8d094274 | ||
![]() |
4c35a40858 | ||
![]() |
802b2aaf6a | ||
![]() |
0e79a8944b | ||
![]() |
bebf70667d | ||
![]() |
d9bd5de0b1 | ||
![]() |
31c7aa0ba4 | ||
![]() |
fc2388189f | ||
![]() |
4431338691 | ||
![]() |
bda1e9aeab | ||
![]() |
4969ca768d | ||
![]() |
2acd1c1642 | ||
![]() |
e1e753179a | ||
![]() |
f4cc8153ae | ||
![]() |
e4d8cb4ee0 | ||
![]() |
723a78ae3f | ||
![]() |
cd9d0d7dec | ||
![]() |
665d4f08c8 | ||
![]() |
00c7780fcb | ||
![]() |
15ab13dc42 | ||
![]() |
8a0ca3066e | ||
![]() |
ea01755bb4 | ||
![]() |
69c2084a18 | ||
![]() |
99c0a1a7d0 | ||
![]() |
5acf997e69 | ||
![]() |
dd87e4ed39 | ||
![]() |
2f8c26ba8a | ||
![]() |
81b9793807 | ||
![]() |
7278f17e8f | ||
![]() |
66c7427df0 | ||
![]() |
c1a06d858d | ||
![]() |
53b5fdbe9e | ||
![]() |
687cf0235e | ||
![]() |
b6e9229cf0 | ||
![]() |
089e4848d8 | ||
![]() |
58d2e7c6d1 | ||
![]() |
fa18d6fb76 | ||
![]() |
4dcb930247 | ||
![]() |
74a299fd08 | ||
![]() |
532a560d87 | ||
![]() |
0040a60559 | ||
![]() |
cc34342790 | ||
![]() |
bdbf6e9d19 | ||
![]() |
db86f765eb | ||
![]() |
b11dec5dd5 | ||
![]() |
86becc7591 | ||
![]() |
8922bc038b | ||
![]() |
009f5790a4 | ||
![]() |
0536b6c459 | ||
![]() |
0e3ebd9841 | ||
![]() |
598965a606 | ||
![]() |
d7a2938849 | ||
![]() |
a683658675 | ||
![]() |
25169f68b7 | ||
![]() |
e5247ae65d | ||
![]() |
a718cb05ff | ||
![]() |
b466ef2581 | ||
![]() |
c7a634641f | ||
![]() |
e4388643f1 | ||
![]() |
bc4208201c | ||
![]() |
a0d69d52a1 | ||
![]() |
c23a1be139 | ||
![]() |
9799f7afb0 | ||
![]() |
6358b24fac | ||
![]() |
b58634316f | ||
![]() |
e3657644d6 | ||
![]() |
7d1e3ebeed | ||
![]() |
9e61dfe85e | ||
![]() |
7b51aafa86 | ||
![]() |
5f487123df | ||
![]() |
f1f32477e3 | ||
![]() |
df2b1251a0 | ||
![]() |
02c7cf6fa5 | ||
![]() |
60006ff993 | ||
![]() |
f3af5d7b8e | ||
![]() |
d551412a32 | ||
![]() |
6de67a134e | ||
![]() |
8ec31398e0 | ||
![]() |
fd0d560b47 | ||
![]() |
cc542269a1 | ||
![]() |
7b488a3bef | ||
![]() |
f448168501 | ||
![]() |
80a8fb98db | ||
![]() |
898bb397b1 | ||
![]() |
74ed5b5ebd | ||
![]() |
178afd81a9 | ||
![]() |
d6eb1a7b98 | ||
![]() |
4ff56b15e9 | ||
![]() |
e6b98d3152 | ||
![]() |
5fd8dd2dce | ||
![]() |
0ad3e046a4 | ||
![]() |
d6c5d24af3 | ||
![]() |
8a3280a2de | ||
![]() |
450a0a647a | ||
![]() |
676c0cf123 | ||
![]() |
a731319321 | ||
![]() |
81b06a09b7 | ||
![]() |
23b34744d9 | ||
![]() |
bc8590aa12 | ||
![]() |
939d368d5f | ||
![]() |
336e3b8baf | ||
![]() |
47c06fa308 | ||
![]() |
b7f447f8d8 | ||
![]() |
03af76b631 | ||
![]() |
e105d5c28f | ||
![]() |
d6ffb4c177 | ||
![]() |
6dbfce1031 | ||
![]() |
fea5ddf585 | ||
![]() |
b9f39c2711 | ||
![]() |
5acac0309a | ||
![]() |
78febad718 | ||
![]() |
a6a5bba0a9 | ||
![]() |
51581c034d | ||
![]() |
8f25a95b47 | ||
![]() |
7f5d092223 | ||
![]() |
2e5cccd1b6 | ||
![]() |
2645782f89 | ||
![]() |
9533092511 | ||
![]() |
6005a461bb | ||
![]() |
e2df946eee | ||
![]() |
d14588120f | ||
![]() |
ab31cfa664 | ||
![]() |
af1c397969 | ||
![]() |
947f9deed5 | ||
![]() |
ce95eee903 | ||
![]() |
b15f3bb969 | ||
![]() |
998e8cba19 | ||
![]() |
e3f523ab2a | ||
![]() |
36485e56ed | ||
![]() |
b4113360f6 | ||
![]() |
2d71e22f08 | ||
![]() |
2ae67c431c | ||
![]() |
4b1a91b64f | ||
![]() |
4f69318e12 | ||
![]() |
1cc98ab50f | ||
![]() |
a6494602fd | ||
![]() |
50ec78b488 | ||
![]() |
7d044d14f9 | ||
![]() |
df03d5a8b2 | ||
![]() |
6a0ed81e67 | ||
![]() |
c94f3e8188 | ||
![]() |
1e5f6cc1dc | ||
![]() |
b1fece74e3 | ||
![]() |
fdbe0df6e7 | ||
![]() |
93d59520e4 | ||
![]() |
b68d3a073b | ||
![]() |
2100311f41 | ||
![]() |
e1269e3156 | ||
![]() |
c88d61b044 |
210
CHANGES
210
CHANGES
@@ -6,7 +6,217 @@
|
||||
|
||||
Changelog
|
||||
|
||||
Version 7.15.2 (27 February 2005)
|
||||
|
||||
Daniel (22 February 2006)
|
||||
- Lots of work and analysis by "xbx___" in bug #1431750
|
||||
(http://curl.haxx.se/bug/view.cgi?id=1431750) helped me identify and fix two
|
||||
different but related bugs:
|
||||
|
||||
1) Removing an easy handle from a multi handle before the transfer is done
|
||||
could leave a connection in the connection cache for that handle that is
|
||||
in a state that isn't suitable for re-use. A subsequent re-use could then
|
||||
read from a NULL pointer and segfault.
|
||||
|
||||
2) When an easy handle was removed from the multi handle, there could be an
|
||||
outstanding c-ares DNS name resolve request. When the response arrived,
|
||||
it caused havoc since the connection struct it "belonged" to could've
|
||||
been freed already.
|
||||
|
||||
Now Curl_done() is called when an easy handle is removed from a multi handle
|
||||
pre-maturely (that is, before the transfer was complteted). Curl_done() also
|
||||
makes sure to cancel all (if any) outstanding c-ares requests.
|
||||
|
||||
Daniel (21 February 2006)
|
||||
- Peter Su added support for SOCKS4 proxies. Enable this by setting the proxy
|
||||
type to the already provided type CURLPROXY_SOCKS4.
|
||||
|
||||
I added a --socks4 option that works like the current --socks5 option but
|
||||
instead use the socks4 protocol.
|
||||
|
||||
Daniel (20 February 2006)
|
||||
- Shmulik Regev fixed an issue with multi-pass authentication and compressed
|
||||
content when libcurl didn't honor the internal ignorebody flag.
|
||||
|
||||
Daniel (18 February 2006)
|
||||
- Ulf H<>rnhammar fixed a format string (printf style) problem in the Negotiate
|
||||
code. It should however not be the cause of any troubles. He also fixed a
|
||||
few similar problems in the HTTP test server code.
|
||||
|
||||
Daniel (17 February 2006)
|
||||
- Shmulik Regev provided a fix for the DNS cache when using short life times,
|
||||
as previously it could be holding on to old cached entries longer than
|
||||
requested.
|
||||
|
||||
Daniel (11 February 2006)
|
||||
- Karl Moerder added the CURLOPT_CONNECT_ONLY and CURLINFO_LASTSOCKET options
|
||||
that an app can use to let libcurl only connect to a remote host and then
|
||||
extract the socket from libcurl. libcurl will then not attempt to do any
|
||||
transfer at all after the connect is done.
|
||||
|
||||
- Kent Boortz improved the configure check for GnuTLS to properly set LIBS
|
||||
instead of LDFLAGS.
|
||||
|
||||
Daniel (8 February 2006)
|
||||
- Philippe Vaucher provided a brilliant piece of test code that show a problem
|
||||
with re-used FTP connections. If the second request on the same connection
|
||||
was set not to fetch a "body", libcurl could get confused and consider it an
|
||||
attempt to use a dead connection and would go acting mighty strange.
|
||||
|
||||
Daniel (2 February 2006)
|
||||
- Make --limit-rate [num] mean bytes. It used to be that but it broke in my
|
||||
change done in November 2005.
|
||||
|
||||
Daniel (30 January 2006)
|
||||
- Added CURLOPT_LOCALPORT and CURLOPT_LOCALPORTRANGE to libcurl. Set with the
|
||||
curl tool with --local-port. Plain and simply set the range of ports to bind
|
||||
the local end of connections to. Implemented on to popular demand.
|
||||
|
||||
- Based on an error report by Philippe Vaucher, we no longer count a retried
|
||||
connection setup as a follow-redirect. It turns out 1) this fails when a FTP
|
||||
connection is re-setup and 2) it does make the max-redirs counter behave
|
||||
wrong.
|
||||
|
||||
Daniel (24 January 2006)
|
||||
- Michal Marek provided a patch for FTP that makes libcurl continue to try
|
||||
PASV even after EPSV returned a positive response code, if libcurl failed to
|
||||
connect to the port number the EPSV response said. Obviously some people are
|
||||
going through protocol-sensitive firewalls (or similar) that don't
|
||||
understand EPSV and then they don't allow the second connection unless PASV
|
||||
was used. This also called for a minor fix of test case 238.
|
||||
|
||||
Daniel (20 January 2006)
|
||||
- Duane Cathey was one of our friends who reported that curl -P [IP]
|
||||
(CURLOPT_FTPPORT) didn't work for ipv6-enabed curls if the IP wasn't a
|
||||
"native" IP while it works fine for ipv6-disabled builds!
|
||||
|
||||
In the process of fixing this, I removed the support for LPRT since I can't
|
||||
think of many reasons to keep doing it and asking on the mailing list didn't
|
||||
reveal anyone else that could either. The code that sends EPRT and PORT is
|
||||
now also a lot simpler than before (IMHO).
|
||||
|
||||
Daniel (19 January 2006)
|
||||
- Jon Turner pointed out that doing -P [hostname] (CURLOPT_FTPPORT) with curl
|
||||
(built ipv4-only) didn't work.
|
||||
|
||||
Daniel (18 January 2006)
|
||||
- As reported in bug #1408742 (http://curl.haxx.se/bug/view.cgi?id=1408742),
|
||||
the configure script complained about a missing "missing" script if you ran
|
||||
configure within a path whose name included one or more spaces. This is due
|
||||
to a flaw in automake (1.9.6 and earlier). I've now worked around it by
|
||||
including an "overloaded" version of the AM_MISSING_HAS_RUN script that'll
|
||||
be used instead of the one automake ships with. This kludge needs to be
|
||||
removed once we get an automake version with this problem corrected.
|
||||
Possibly we'll then need to convert this into a kludge depending on what
|
||||
automake version that is used and that is gonna be painful and I don't even
|
||||
want to think about that now...!
|
||||
|
||||
Daniel (17 January 2006)
|
||||
- David Shaw: Here is the latest libcurl.m4 autoconf tests. It is updated with
|
||||
the latest features and protocols that libcurl supports and has a minor fix
|
||||
to better deal with the obscure case where someone has more than one libcurl
|
||||
installed at the same time.
|
||||
|
||||
Daniel (16 January 2006)
|
||||
- David Shaw finally removed all traces of Gopher and we are now officially
|
||||
not supporting it. It hasn't been functioning for years anyway, so this is
|
||||
just finally stating what already was true. And a cleanup at the same time.
|
||||
|
||||
- Bryan Henderson turned the 'initialized' variable for curl_global_init()
|
||||
into a counter, and thus you can now do multiple curl_global_init() and you
|
||||
are then supposed to do the same amount of calls to curl_global_cleanup().
|
||||
Bryan has also updated the docs accordingly.
|
||||
|
||||
Daniel (13 January 2006)
|
||||
- Andrew Benham fixed a race condition in the test suite that could cause the
|
||||
test script to kill all processes in the current process group!
|
||||
|
||||
Daniel (12 January 2006)
|
||||
- Michael Jahn:
|
||||
|
||||
Fixed FTP_SKIP_PASV_IP and FTP_USE_EPSV to "do right" when used on FTP thru
|
||||
HTTP proxy.
|
||||
|
||||
Fixed PROXYTUNNEL to work fine when you do ftp through a proxy. It would
|
||||
previously overwrite internal memory and cause unpredicted behaviour!
|
||||
|
||||
Daniel (11 January 2006)
|
||||
- I decided to document the "secret option" here now, as I've received *NO*
|
||||
feedback at all on my mailing list requests from November 2005:
|
||||
|
||||
I'm looking for feedback and comments. I added some experimental code the
|
||||
other day, that allows a libcurl user to select what method libcurl should
|
||||
use to reach a file on a FTP(S) server.
|
||||
|
||||
This functionality is available in CVS code and in recent daily snapshots.
|
||||
|
||||
Let me explain...
|
||||
|
||||
The current name for the option is CURLOPT_FTP_FILEMETHOD (--ftp-method for
|
||||
the command line tool) and you set it to a long (there are currenly no
|
||||
defines for the argument values, just plain numericals). You can set three
|
||||
different "methods" that do this:
|
||||
|
||||
1 multicwd - like today, curl will do a single CWD operation for each path
|
||||
part in the given URL. For deep hierarchies this means very many
|
||||
commands. This is how RFC1738 says it should be done. This is the
|
||||
default.
|
||||
|
||||
2 nocwd - no CWD at all is done, curl will do SIZE, RETR, STOR etc and give
|
||||
a full path to the server.
|
||||
|
||||
3 singlecwd - make one CWD with the full target directory and then operate
|
||||
on the file "normally".
|
||||
|
||||
(With the command line tool you do --ftp-method [METHOD], where [METHOD] is
|
||||
one of "multicwd", "nocwd" or "singlecwd".)
|
||||
|
||||
What feedback I'm interested in:
|
||||
|
||||
1 - Do they work at all? Do you find servers where one of these don't work?
|
||||
|
||||
2 - What would proper names for the option and its arguments be, if we
|
||||
consider this feature good enough to get included and documented in
|
||||
upcoming releases?
|
||||
|
||||
3 - Should we make libcurl able to "walk through" these options in case of
|
||||
(path related) failures, or should it fail and let the user redo any
|
||||
possible retries?
|
||||
|
||||
(This option is not documented in any man page just yet since I'm not sure
|
||||
these names will be used or if the functionality will end up exactly like
|
||||
this. And for the same reasons we have no test cases for these yet.)
|
||||
|
||||
Daniel (10 January 2006)
|
||||
- When using a bad path over FTP, as in when libcurl couldn't CWD into all
|
||||
given subdirs, libcurl would still "remember" the full path as if it is the
|
||||
current directory libcurl is in so that the next curl_easy_perform() would
|
||||
get really confused if it tried the same path again - as it would not issue
|
||||
any CWD commands at all, assuming it is already in the "proper" dir.
|
||||
|
||||
Starting now, a failed CWD command sets a flag that prevents the path to be
|
||||
"remembered" after returning.
|
||||
|
||||
Daniel (7 January 2006)
|
||||
- Michael Jahn fixed so that the second CONNECT when doing FTP over a HTTP
|
||||
proxy actually used a new connection and not sent the second request on the
|
||||
first socket!
|
||||
|
||||
Daniel (6 January 2006)
|
||||
- Alexander Lazic made the buildconf run the buildconf in the ares dir if that
|
||||
is present instead of trying to mimic that script in curl's buildconf
|
||||
script.
|
||||
|
||||
Daniel (3 January 2006)
|
||||
- Andres Garcia made the TFTP test server build with mingw.
|
||||
|
||||
Daniel (16 December 2005)
|
||||
- Jean Jacques Drouin pointed out that you could only have a user name or
|
||||
password of 127 bytes or less embedded in a URL, where actually the code
|
||||
uses a 255 byte buffer for it! Modified now to use the full buffer size.
|
||||
|
||||
Daniel (12 December 2005)
|
||||
- Dov Murik corrected the HTTP_ONLY define to disable the TFTP support properly
|
||||
|
||||
Version 7.15.1 (7 December 2005)
|
||||
|
||||
|
2
COPYING
2
COPYING
@@ -1,6 +1,6 @@
|
||||
COPYRIGHT AND PERMISSION NOTICE
|
||||
|
||||
Copyright (c) 1996 - 2005, Daniel Stenberg, <daniel@haxx.se>.
|
||||
Copyright (c) 1996 - 2006, Daniel Stenberg, <daniel@haxx.se>.
|
||||
|
||||
All rights reserved.
|
||||
|
||||
|
14
README
14
README
@@ -37,28 +37,30 @@ WEB SITE
|
||||
Austria http://curl.gds.tuwien.ac.at/
|
||||
Denmark http://curl.cofman.dk/
|
||||
France http://curl.fastmirror.net/
|
||||
Germany http://curl.miscellaneousmirror.org/
|
||||
Germany http://curl.freemirror.de/
|
||||
Germany http://curl.mirror-server.net/
|
||||
Germany http://curl.mirror.at.stealer.net/
|
||||
Germany http://curl.mirroring.de/
|
||||
Germany http://curl.miscellaneousmirror.org/
|
||||
Germany http://curl.mons-new-media.de/
|
||||
Germany http://curl.storemypix.com/
|
||||
Germany http://curl.triplemind.com/
|
||||
Germany http://curl.freemirror.de/
|
||||
Hong Kong http://curl.hkmirror.org/
|
||||
Japan http://curl.s-lines.net/
|
||||
Netherlands http://curl.nedmirror.nl/
|
||||
Russia http://curl.tsuren.net/
|
||||
Taiwan http://curl.cs.pu.edu.tw/
|
||||
Thailand http://curl.siamu.ac.th/
|
||||
US (AZ) http://curl.islandofpoker.com/
|
||||
US (CA) http://curl.meulie.net/
|
||||
US (CA) http://curl.mirror.redwire.net/
|
||||
US (CA) http://curl.mirrormonster.com/
|
||||
US (CA) http://curl.signal42.com/
|
||||
US (CA) http://curl.tolix.org/
|
||||
US (CA) http://curl.webhosting76.com/
|
||||
US (CA) http://curl.meulie.net/
|
||||
US (FL) http://curl.hoxt.com/
|
||||
US (TX) http://curl.109k.com/
|
||||
US (TX) http://curl.hostingzero.com/
|
||||
US (TX) http://curl.mirrors.cyberservers.net/
|
||||
US (TX) http://curl.seekmeup.com/
|
||||
US (TX) http://curl.hostingzero.com/
|
||||
|
||||
CVS
|
||||
|
||||
|
100
RELEASE-NOTES
100
RELEASE-NOTES
@@ -1,61 +1,73 @@
|
||||
Curl and libcurl 7.15.1
|
||||
Curl and libcurl 7.15.2
|
||||
|
||||
Public curl release number: 91
|
||||
Releases counted from the very beginning: 118
|
||||
Available command line options: 109
|
||||
Available curl_easy_setopt() options: 125
|
||||
Public curl release number: 92
|
||||
Releases counted from the very beginning: 119
|
||||
Available command line options: 112
|
||||
Available curl_easy_setopt() options: 129
|
||||
Number of public functions in libcurl: 46
|
||||
Amount of public web site mirrors: 27
|
||||
Amount of public web site mirrors: 31
|
||||
Number of known libcurl bindings: 32
|
||||
Number of contributors: 459
|
||||
Number of contributors: 474
|
||||
|
||||
This release includes the following changes:
|
||||
|
||||
o the libcurl.pc pkgconfig file now gets installed on make install
|
||||
o URL globbing now offers "range steps": [1-100:10]
|
||||
o LDAPv3 is now the preferred LDAP protocol version
|
||||
o --max-redirs and CURLOPT_MAXREDIRS set to 0 limits redirects
|
||||
o improved MSVC makefile
|
||||
o Support for SOCKS4 proxies (added --socks4)
|
||||
o CURLOPT_CONNECT_ONLY and CURLINFO_LASTSOCKET added
|
||||
o CURLOPT_LOCALPORT and CURLOPT_LOCALPORTRANGE (--local-port) added
|
||||
o Dropped support for the LPRT ftp command
|
||||
o Gopher is now officially abandoned as a protocol (lib)curl tries to support
|
||||
o curl_global_init() and curl_global_cleanup() are now using a refcount so
|
||||
that it is now legal to call them multiple times. See updated info for
|
||||
details
|
||||
|
||||
This release includes the following bugfixes:
|
||||
|
||||
o buffer overflow problem: http://curl.haxx.se/docs/adv_20051207.html
|
||||
o using file:// on non-existing files are properly handled
|
||||
o builds fine on DJGPP
|
||||
o CURLOPT_ERRORBUFFER is now always filled in on errors
|
||||
o curl outputs error on bad --limit-rate units
|
||||
o fixed libcurl's use of poll() on cygwin
|
||||
o the GnuTLS code didn't support client certificates
|
||||
o TFTP over IPv6 works
|
||||
o no reverse lookups on IP addresses when ipv6-enabled
|
||||
o SSPI compatibility fix: using the proper DLLs
|
||||
o binary LDAP properties are now shown base64 encoded
|
||||
o Windows uploads from stdin using curl can now contain ctrl-Z bytes
|
||||
o -r [num] would produce an invalid HTTP Range: header
|
||||
o multi interface with multi IP hosts could leak socket descriptors
|
||||
o the GnuTLS code didn't handle rehandshakes
|
||||
o re-use of a dead FTP connection
|
||||
o name resolve error codes fixed for Windows builds
|
||||
o double WWW-Authenticate Digest headers are now handled
|
||||
o curl-config --vernum fixed
|
||||
o two bugs concerning using curl_multi_remove_handle() before the transfer
|
||||
was complete
|
||||
o multi-pass authentication and compressed content
|
||||
o minor format string mistake in the GSS/Negotiate code
|
||||
o cached DNS entries could remain in the cache too long
|
||||
o improved GnuTLS check in configure
|
||||
o re-used FTP connections when the second request didn't do a transfer
|
||||
o plain --limit-rate [num] means bytes
|
||||
o re-creating a dead connection is no longer counted internally as a followed
|
||||
redirect and thus prevents a weird error that would occur if a FTP
|
||||
connection died on an attempted re-use
|
||||
o Try PASV after failing to connect to the port the EPSV response contained
|
||||
o -P [IP] with non-local address with ipv6-enabled curl
|
||||
o -P [hostname] with ipv6-disabled curl
|
||||
o libcurl.m4 was updated
|
||||
o configure no longer warns if the current path contains a space
|
||||
o test suite kill race condition
|
||||
o FTP_SKIP_PASV_IP and FTP_USE_EPSV when doing FTP over HTTP proxy
|
||||
o Doing a second request with FTP on the same bath path, would make libcurl
|
||||
confuse what current working directory it had
|
||||
o FTP over HTTP proxy now sends the second CONNECT properly
|
||||
o numerous compiler warnings and build quirks for various compilers have
|
||||
been addressed
|
||||
o supports name and passwords up to 255 bytes long, embedded in URLs
|
||||
o the HTTP_ONLY define disables the TFTP support
|
||||
|
||||
Other curl-related news since the previous public release:
|
||||
|
||||
o FTP-SSL is now RFC4217
|
||||
o CurlPas 2005-11-05 was released: http://curlpas.sf.net/
|
||||
o pycurl 7.15.0 was released http://pycurl.sf.net
|
||||
o New web mirrors:
|
||||
http://curl.triplemind.com/ located in Mannheim, Germany
|
||||
http://curl.nedmirror.nl located in Amsterdam, the Netherlands
|
||||
http://curl.hoxt.com located in Florida, US
|
||||
o http://curlm.haxx.se/ is new service that automatically redirects you to a
|
||||
curl web mirror that is close to you!
|
||||
|
||||
o http://curl.hkmirror.org/ is a new curl web mirror in Hong Kong
|
||||
o http://curl.storemypix.com/ is a new curl web mirror in Germany
|
||||
o http://curl.s-lines.net/ is a new curl web mirror in Japan
|
||||
o http://curl.oss-mirror.org/ is a new curl web mirror in Ireland
|
||||
o http://curl.linux-mirror.org/ is a new curl web mirror in Germany
|
||||
o pycurl 7.15.1 was released: http://pycurl.sf.net/
|
||||
o TclCurl 0.15.1 was released:
|
||||
http://personal1.iddeo.es/andresgarci/tclcurl/english/
|
||||
|
||||
This release would not have looked like this without help, code, reports and
|
||||
advice from friends like these:
|
||||
|
||||
Dave Dribin, Bradford Bruce, Temprimus, Ofer, Dima Barsky, Amol Pattekar, Jaz
|
||||
Fresh, tommink[at]post.pl, Gisle Vanem, Nis Jorgensen, Vilmos Nebehaj, Dmitry
|
||||
Bartsevich, David Lang, Eugene Kotlyarov, Jan Kunder, Yang Tse, Quagmire,
|
||||
Albert Chin, David Shaw, Doug Kaufman, Bryan Henderson, Jamie Newton, Stefan
|
||||
Esser
|
||||
|
||||
Dov Murik, Jean Jacques Drouin, Andres Garcia, Yang Tse, Gisle Vanem, Dan
|
||||
Fandrich, Alexander Lazic, Michael Jahn, Andrew Benham, Bryan Henderson,
|
||||
David Shaw, Jon Turner, Duane Cathey, Michal Marek, Philippe Vaucher, Kent
|
||||
Boortz, Karl Moerder, Shmulik Regev, Ulf H<>rnhammar, Peter Su
|
||||
|
||||
Thanks! (and sorry if I forgot to mention someone)
|
||||
|
@@ -1,7 +1,4 @@
|
||||
To get fixed in 7.15.0 (planned release: November 2005)
|
||||
To get fixed in 7.15.2 (planned release: Febrary 2006)
|
||||
======================
|
||||
|
||||
60 - CONNECT 407 responses that kills the connection (not very likely though)
|
||||
|
||||
63 -
|
||||
|
||||
65 -
|
||||
|
558
acinclude.m4
558
acinclude.m4
@@ -1,3 +1,393 @@
|
||||
#***************************************************************************
|
||||
# _ _ ____ _
|
||||
# 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$
|
||||
###########################################################################
|
||||
|
||||
dnl CURL_CHECK_HEADER_WINDOWS
|
||||
dnl -------------------------------------------------
|
||||
dnl Check for compilable and valid windows.h header
|
||||
|
||||
AC_DEFUN([CURL_CHECK_HEADER_WINDOWS], [
|
||||
AC_CACHE_CHECK([for windows.h], [ac_cv_header_windows_h], [
|
||||
AC_COMPILE_IFELSE([
|
||||
AC_LANG_PROGRAM([
|
||||
#undef inline
|
||||
#ifndef WIN32_LEAN_AND_MEAN
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#endif
|
||||
#include <windows.h>
|
||||
],[
|
||||
int dummy=2*WINVER;
|
||||
])
|
||||
],[
|
||||
ac_cv_header_windows_h="yes"
|
||||
],[
|
||||
ac_cv_header_windows_h="no"
|
||||
])
|
||||
])
|
||||
if test "x$ac_cv_header_windows_h" = "xyes"; then
|
||||
AC_DEFINE_UNQUOTED(HAVE_WINDOWS_H, 1,
|
||||
[Define to 1 if you have the windows.h header file.])
|
||||
AC_DEFINE_UNQUOTED(WIN32_LEAN_AND_MEAN, 1,
|
||||
[Define to avoid automatic inclusion of winsock.h])
|
||||
fi
|
||||
])
|
||||
|
||||
|
||||
dnl CURL_CHECK_HEADER_WINSOCK
|
||||
dnl -------------------------------------------------
|
||||
dnl Check for compilable and valid winsock.h header
|
||||
|
||||
AC_DEFUN([CURL_CHECK_HEADER_WINSOCK], [
|
||||
AC_REQUIRE([CURL_CHECK_HEADER_WINDOWS])dnl
|
||||
AC_CACHE_CHECK([for winsock.h], [ac_cv_header_winsock_h], [
|
||||
AC_COMPILE_IFELSE([
|
||||
AC_LANG_PROGRAM([
|
||||
#undef inline
|
||||
#ifndef WIN32_LEAN_AND_MEAN
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#endif
|
||||
#include <windows.h>
|
||||
#include <winsock.h>
|
||||
],[
|
||||
int dummy=WSACleanup();
|
||||
])
|
||||
],[
|
||||
ac_cv_header_winsock_h="yes"
|
||||
],[
|
||||
ac_cv_header_winsock_h="no"
|
||||
])
|
||||
])
|
||||
if test "x$ac_cv_header_winsock_h" = "xyes"; then
|
||||
AC_DEFINE_UNQUOTED(HAVE_WINSOCK_H, 1,
|
||||
[Define to 1 if you have the winsock.h header file.])
|
||||
fi
|
||||
])
|
||||
|
||||
|
||||
dnl CURL_CHECK_HEADER_WINSOCK2
|
||||
dnl -------------------------------------------------
|
||||
dnl Check for compilable and valid winsock2.h header
|
||||
|
||||
AC_DEFUN([CURL_CHECK_HEADER_WINSOCK2], [
|
||||
AC_REQUIRE([CURL_CHECK_HEADER_WINDOWS])dnl
|
||||
AC_CACHE_CHECK([for winsock2.h], [ac_cv_header_winsock2_h], [
|
||||
AC_COMPILE_IFELSE([
|
||||
AC_LANG_PROGRAM([
|
||||
#undef inline
|
||||
#ifndef WIN32_LEAN_AND_MEAN
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#endif
|
||||
#include <windows.h>
|
||||
#include <winsock2.h>
|
||||
],[
|
||||
int dummy=2*IPPROTO_ESP;
|
||||
])
|
||||
],[
|
||||
ac_cv_header_winsock2_h="yes"
|
||||
],[
|
||||
ac_cv_header_winsock2_h="no"
|
||||
])
|
||||
])
|
||||
if test "x$ac_cv_header_winsock2_h" = "xyes"; then
|
||||
AC_DEFINE_UNQUOTED(HAVE_WINSOCK2_H, 1,
|
||||
[Define to 1 if you have the winsock2.h header file.])
|
||||
fi
|
||||
])
|
||||
|
||||
|
||||
dnl CURL_CHECK_HEADER_WS2TCPIP
|
||||
dnl -------------------------------------------------
|
||||
dnl Check for compilable and valid ws2tcpip.h header
|
||||
|
||||
AC_DEFUN([CURL_CHECK_HEADER_WS2TCPIP], [
|
||||
AC_REQUIRE([CURL_CHECK_HEADER_WINSOCK2])dnl
|
||||
AC_CACHE_CHECK([for ws2tcpip.h], [ac_cv_header_ws2tcpip_h], [
|
||||
AC_COMPILE_IFELSE([
|
||||
AC_LANG_PROGRAM([
|
||||
#undef inline
|
||||
#ifndef WIN32_LEAN_AND_MEAN
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#endif
|
||||
#include <windows.h>
|
||||
#include <winsock2.h>
|
||||
#include <ws2tcpip.h>
|
||||
],[
|
||||
int dummy=2*IP_PKTINFO;
|
||||
])
|
||||
],[
|
||||
ac_cv_header_ws2tcpip_h="yes"
|
||||
],[
|
||||
ac_cv_header_ws2tcpip_h="no"
|
||||
])
|
||||
])
|
||||
if test "x$ac_cv_header_ws2tcpip_h" = "xyes"; then
|
||||
AC_DEFINE_UNQUOTED(HAVE_WS2TCPIP_H, 1,
|
||||
[Define to 1 if you have the ws2tcpip.h header file.])
|
||||
fi
|
||||
])
|
||||
|
||||
|
||||
dnl CURL_CHECK_TYPE_SOCKLEN_T
|
||||
dnl -------------------------------------------------
|
||||
dnl Check for existing socklen_t type, and provide
|
||||
dnl an equivalent type if socklen_t not available
|
||||
|
||||
AC_DEFUN([CURL_CHECK_TYPE_SOCKLEN_T], [
|
||||
AC_REQUIRE([CURL_CHECK_HEADER_WS2TCPIP])dnl
|
||||
AC_CHECK_TYPE([socklen_t], ,[
|
||||
AC_CACHE_CHECK([for socklen_t equivalent],
|
||||
[curl_cv_socklen_t_equiv], [
|
||||
curl_cv_socklen_t_equiv="unknown"
|
||||
for arg2 in "struct sockaddr" void; do
|
||||
for t in int size_t unsigned long "unsigned long"; do
|
||||
AC_COMPILE_IFELSE([
|
||||
AC_LANG_PROGRAM([
|
||||
#undef inline
|
||||
#ifdef HAVE_WINDOWS_H
|
||||
#ifndef WIN32_LEAN_AND_MEAN
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#endif
|
||||
#include <windows.h>
|
||||
#ifdef HAVE_WINSOCK2_H
|
||||
#include <winsock2.h>
|
||||
#else
|
||||
#ifdef HAVE_WINSOCK_H
|
||||
#include <winsock.h>
|
||||
#endif
|
||||
#endif
|
||||
#else
|
||||
#ifdef HAVE_SYS_TYPES_H
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
#ifdef HAVE_SYS_SOCKET_H
|
||||
#include <sys/socket.h>
|
||||
#endif
|
||||
#endif
|
||||
int getpeername (int, $arg2 *, $t *);
|
||||
],[
|
||||
$t len=0;
|
||||
getpeername(0,0,&len);
|
||||
])
|
||||
],[
|
||||
curl_cv_socklen_t_equiv="$t"
|
||||
break 2
|
||||
])
|
||||
done
|
||||
done
|
||||
])
|
||||
if test "$curl_cv_socklen_t_equiv" = "unknown"; then
|
||||
AC_MSG_ERROR([Cannot find a type to use in place of socklen_t])
|
||||
else
|
||||
AC_DEFINE_UNQUOTED(socklen_t, $curl_cv_socklen_t_equiv,
|
||||
[type to use in place of socklen_t if not defined])
|
||||
fi
|
||||
],[
|
||||
#undef inline
|
||||
#ifdef HAVE_WINDOWS_H
|
||||
#ifndef WIN32_LEAN_AND_MEAN
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#endif
|
||||
#include <windows.h>
|
||||
#ifdef HAVE_WINSOCK2_H
|
||||
#include <winsock2.h>
|
||||
#ifdef HAVE_WS2TCPIP_H
|
||||
#include <ws2tcpip.h>
|
||||
#endif
|
||||
#endif
|
||||
#else
|
||||
#ifdef HAVE_SYS_TYPES_H
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
#ifdef HAVE_SYS_SOCKET_H
|
||||
#include <sys/socket.h>
|
||||
#endif
|
||||
#endif
|
||||
])
|
||||
])
|
||||
|
||||
|
||||
dnl CURL_CHECK_FUNC_GETNAMEINFO
|
||||
dnl -------------------------------------------------
|
||||
dnl Test if the getnameinfo function is available,
|
||||
dnl and check the types of five of its arguments.
|
||||
dnl If the function succeeds HAVE_GETNAMEINFO will be
|
||||
dnl defined, defining the types of the arguments in
|
||||
dnl GETNAMEINFO_TYPE_ARG1, GETNAMEINFO_TYPE_ARG2,
|
||||
dnl GETNAMEINFO_TYPE_ARG46 and GETNAMEINFO_TYPE_ARG7.
|
||||
dnl This function is experimental and its results shall
|
||||
dnl not be trusted while this notice is in place ------
|
||||
|
||||
AC_DEFUN([CURL_CHECK_FUNC_GETNAMEINFO], [
|
||||
AC_REQUIRE([CURL_CHECK_HEADER_WS2TCPIP])dnl
|
||||
AC_REQUIRE([CURL_CHECK_TYPE_SOCKLEN_T])dnl
|
||||
AC_CHECK_HEADERS(sys/types.h sys/socket.h netdb.h)
|
||||
#
|
||||
AC_MSG_CHECKING([for getnameinfo])
|
||||
AC_LINK_IFELSE([
|
||||
AC_LANG_FUNC_LINK_TRY([getnameinfo])
|
||||
],[
|
||||
AC_MSG_RESULT([yes])
|
||||
curl_cv_getnameinfo="yes"
|
||||
],[
|
||||
AC_MSG_RESULT([no])
|
||||
curl_cv_getnameinfo="no"
|
||||
])
|
||||
#
|
||||
if test "$curl_cv_getnameinfo" != "yes"; then
|
||||
AC_MSG_CHECKING([deeper for getnameinfo])
|
||||
AC_TRY_LINK([
|
||||
],[
|
||||
getnameinfo();
|
||||
],[
|
||||
AC_MSG_RESULT([yes])
|
||||
curl_cv_getnameinfo="yes"
|
||||
],[
|
||||
AC_MSG_RESULT([but still no])
|
||||
curl_cv_getnameinfo="no"
|
||||
])
|
||||
fi
|
||||
#
|
||||
if test "$curl_cv_getnameinfo" != "yes"; then
|
||||
AC_MSG_CHECKING([deeper and deeper for getnameinfo])
|
||||
AC_TRY_LINK([
|
||||
#undef inline
|
||||
#ifdef HAVE_WINDOWS_H
|
||||
#ifndef WIN32_LEAN_AND_MEAN
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#endif
|
||||
#include <windows.h>
|
||||
#ifdef HAVE_WINSOCK2_H
|
||||
#include <winsock2.h>
|
||||
#ifdef HAVE_WS2TCPIP_H
|
||||
#include <ws2tcpip.h>
|
||||
#endif
|
||||
#endif
|
||||
#else
|
||||
#ifdef HAVE_SYS_TYPES_H
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
#ifdef HAVE_SYS_SOCKET_H
|
||||
#include <sys/socket.h>
|
||||
#endif
|
||||
#ifdef HAVE_NETDB_H
|
||||
#include <netdb.h>
|
||||
#endif
|
||||
#endif
|
||||
],[
|
||||
getnameinfo(0, 0, 0, 0, 0, 0, 0);
|
||||
],[
|
||||
AC_MSG_RESULT([yes])
|
||||
curl_cv_getnameinfo="yes"
|
||||
],[
|
||||
AC_MSG_RESULT([but still no])
|
||||
curl_cv_getnameinfo="no"
|
||||
])
|
||||
fi
|
||||
#
|
||||
if test "$curl_cv_getnameinfo" = "yes"; then
|
||||
AC_CACHE_CHECK([types of arguments for getnameinfo],
|
||||
[curl_cv_func_getnameinfo_args], [
|
||||
curl_cv_func_getnameinfo_args="unknown"
|
||||
for gni_arg1 in 'struct sockaddr *' 'const struct sockaddr *' 'void *'; do
|
||||
for gni_arg2 in 'socklen_t' 'size_t' 'int'; do
|
||||
for gni_arg46 in 'size_t' 'int' 'socklen_t' 'unsigned int' 'DWORD'; do
|
||||
for gni_arg7 in 'int' 'unsigned int'; do
|
||||
AC_COMPILE_IFELSE([
|
||||
AC_LANG_PROGRAM([
|
||||
#undef inline
|
||||
#ifdef HAVE_WINDOWS_H
|
||||
#ifndef WIN32_LEAN_AND_MEAN
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#endif
|
||||
#if (!defined(_WIN32_WINNT)) || (_WIN32_WINNT < 0x0501)
|
||||
#undef _WIN32_WINNT
|
||||
#define _WIN32_WINNT 0x0501
|
||||
#endif
|
||||
#include <windows.h>
|
||||
#ifdef HAVE_WINSOCK2_H
|
||||
#include <winsock2.h>
|
||||
#ifdef HAVE_WS2TCPIP_H
|
||||
#include <ws2tcpip.h>
|
||||
#endif
|
||||
#endif
|
||||
#define GNICALLCONV WSAAPI
|
||||
#else
|
||||
#ifdef HAVE_SYS_TYPES_H
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
#ifdef HAVE_SYS_SOCKET_H
|
||||
#include <sys/socket.h>
|
||||
#endif
|
||||
#ifdef HAVE_NETDB_H
|
||||
#include <netdb.h>
|
||||
#endif
|
||||
#define GNICALLCONV
|
||||
#endif
|
||||
extern int GNICALLCONV getnameinfo($gni_arg1, $gni_arg2,
|
||||
char *, $gni_arg46,
|
||||
char *, $gni_arg46,
|
||||
$gni_arg7);
|
||||
],[
|
||||
$gni_arg2 salen=0;
|
||||
$gni_arg46 hostlen=0;
|
||||
$gni_arg46 servlen=0;
|
||||
$gni_arg7 flags=0;
|
||||
int res = getnameinfo(0, salen, 0, hostlen, 0, servlen, flags);
|
||||
])
|
||||
],[
|
||||
curl_cv_func_getnameinfo_args="$gni_arg1,$gni_arg2,$gni_arg46,$gni_arg7"
|
||||
break 4
|
||||
])
|
||||
done
|
||||
done
|
||||
done
|
||||
done
|
||||
]) # AC_CACHE_CHECK
|
||||
if test "$curl_cv_func_getnameinfo_args" = "unknown"; then
|
||||
AC_MSG_WARN([Cannot find proper types to use for getnameinfo args])
|
||||
AC_MSG_WARN([HAVE_GETNAMEINFO will not be defined])
|
||||
else
|
||||
gni_prev_IFS=$IFS; IFS=','
|
||||
set dummy `echo "$curl_cv_func_getnameinfo_args" | sed 's/\*/\*/g'`
|
||||
IFS=$gni_prev_IFS
|
||||
shift
|
||||
AC_DEFINE_UNQUOTED(GETNAMEINFO_TYPE_ARG1, $[1],
|
||||
[Define to the type of arg 1 for getnameinfo.])
|
||||
AC_DEFINE_UNQUOTED(GETNAMEINFO_TYPE_ARG2, $[2],
|
||||
[Define to the type of arg 2 for getnameinfo.])
|
||||
AC_DEFINE_UNQUOTED(GETNAMEINFO_TYPE_ARG46, $[3],
|
||||
[Define to the type of args 4 and 6 for getnameinfo.])
|
||||
AC_DEFINE_UNQUOTED(GETNAMEINFO_TYPE_ARG7, $[4],
|
||||
[Define to the type of arg 7 for getnameinfo.])
|
||||
AC_DEFINE_UNQUOTED(HAVE_GETNAMEINFO, 1,
|
||||
[Define to 1 if you have the getnameinfo function.])
|
||||
ac_cv_func_getnameinfo="yes"
|
||||
fi
|
||||
fi
|
||||
]) # AC_DEFUN
|
||||
|
||||
|
||||
dnl CURL_CHECK_NONBLOCKING_SOCKET
|
||||
dnl -------------------------------------------------
|
||||
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,
|
||||
@@ -59,12 +449,27 @@ 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?) */
|
||||
/* headers for ioctlsocket test (Windows) */
|
||||
#undef inline
|
||||
#ifdef HAVE_WINDOWS_H
|
||||
#ifndef WIN32_LEAN_AND_MEAN
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#endif
|
||||
#include <windows.h>
|
||||
#ifdef HAVE_WINSOCK2_H
|
||||
#include <winsock2.h>
|
||||
#else
|
||||
#ifdef HAVE_WINSOCK_H
|
||||
#include <winsock.h>
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
],[
|
||||
/* ioctlsocket source code */
|
||||
int socket;
|
||||
unsigned long flags = ioctlsocket(socket, FIONBIO, &flags);
|
||||
SOCKET sd;
|
||||
unsigned long flags = 0;
|
||||
sd = socket(0, 0, 0);
|
||||
ioctlsocket(sd, FIONBIO, &flags);
|
||||
],[
|
||||
dnl ioctlsocket test was good
|
||||
nonblock="ioctlsocket"
|
||||
@@ -122,6 +527,9 @@ dnl end of non-blocking try-compile test
|
||||
fi
|
||||
])
|
||||
|
||||
|
||||
dnl TYPE_SOCKADDR_STORAGE
|
||||
dnl -------------------------------------------------
|
||||
dnl Check for struct sockaddr_storage. Most IPv6-enabled hosts have it, but
|
||||
dnl AIX 4.3 is one known exception.
|
||||
AC_DEFUN([TYPE_SOCKADDR_STORAGE],
|
||||
@@ -130,6 +538,16 @@ AC_DEFUN([TYPE_SOCKADDR_STORAGE],
|
||||
AC_DEFINE(HAVE_STRUCT_SOCKADDR_STORAGE, 1,
|
||||
[if struct sockaddr_storage is defined]), ,
|
||||
[
|
||||
#undef inline
|
||||
#ifdef HAVE_WINDOWS_H
|
||||
#ifndef WIN32_LEAN_AND_MEAN
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#endif
|
||||
#include <windows.h>
|
||||
#ifdef HAVE_WINSOCK2_H
|
||||
#include <winsock2.h>
|
||||
#endif
|
||||
#else
|
||||
#ifdef HAVE_SYS_TYPES_H
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
@@ -142,58 +560,13 @@ AC_DEFUN([TYPE_SOCKADDR_STORAGE],
|
||||
#ifdef HAVE_ARPA_INET_H
|
||||
#include <arpa/inet.h>
|
||||
#endif
|
||||
#ifdef HAVE_WINSOCK2_H
|
||||
#include <winsock2.h>
|
||||
#endif
|
||||
])
|
||||
|
||||
])
|
||||
|
||||
dnl Check for socklen_t: historically on BSD it is an int, and in
|
||||
dnl POSIX 1g it is a type of its own, but some platforms use different
|
||||
dnl types for the argument to getsockopt, getpeername, etc. So we
|
||||
dnl have to test to find something that will work.
|
||||
AC_DEFUN([TYPE_SOCKLEN_T],
|
||||
[
|
||||
AC_CHECK_TYPE([socklen_t], ,[
|
||||
AC_MSG_CHECKING([for socklen_t equivalent])
|
||||
AC_CACHE_VAL([curl_cv_socklen_t_equiv],
|
||||
[
|
||||
# Systems have either "struct sockaddr *" or
|
||||
# "void *" as the second argument to getpeername
|
||||
curl_cv_socklen_t_equiv=
|
||||
for arg2 in "struct sockaddr" void; do
|
||||
for t in int size_t unsigned long "unsigned long"; do
|
||||
AC_TRY_COMPILE([
|
||||
#ifdef HAVE_SYS_TYPES_H
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
#ifdef HAVE_SYS_SOCKET_H
|
||||
#include <sys/socket.h>
|
||||
#endif
|
||||
|
||||
int getpeername (int, $arg2 *, $t *);
|
||||
],[
|
||||
$t len;
|
||||
getpeername(0,0,&len);
|
||||
],[
|
||||
curl_cv_socklen_t_equiv="$t"
|
||||
break
|
||||
])
|
||||
done
|
||||
done
|
||||
|
||||
if test "x$curl_cv_socklen_t_equiv" = x; then
|
||||
AC_MSG_ERROR([Cannot find a type to use in place of socklen_t])
|
||||
fi
|
||||
])
|
||||
AC_MSG_RESULT($curl_cv_socklen_t_equiv)
|
||||
AC_DEFINE_UNQUOTED(socklen_t, $curl_cv_socklen_t_equiv,
|
||||
[type to use in place of socklen_t if not defined])],
|
||||
[#include <sys/types.h>
|
||||
#include <sys/socket.h>])
|
||||
])
|
||||
|
||||
dnl TYPE_IN_ADDR_T
|
||||
dnl -------------------------------------------------
|
||||
dnl Check for in_addr_t: it is used to receive the return code of inet_addr()
|
||||
dnl and a few other things.
|
||||
AC_DEFUN([TYPE_IN_ADDR_T],
|
||||
@@ -205,15 +578,33 @@ AC_DEFUN([TYPE_IN_ADDR_T],
|
||||
curl_cv_in_addr_t_equiv=
|
||||
for t in "unsigned long" int size_t unsigned long; do
|
||||
AC_TRY_COMPILE([
|
||||
#ifdef HAVE_SYS_TYPES_H
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
#ifdef HAVE_SYS_SOCKET_H
|
||||
#include <sys/socket.h>
|
||||
#endif
|
||||
#ifdef HAVE_ARPA_INET_H
|
||||
#include <arpa/inet.h>
|
||||
#endif
|
||||
#undef inline
|
||||
#ifdef HAVE_WINDOWS_H
|
||||
#ifndef WIN32_LEAN_AND_MEAN
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#endif
|
||||
#include <windows.h>
|
||||
#ifdef HAVE_WINSOCK2_H
|
||||
#include <winsock2.h>
|
||||
#else
|
||||
#ifdef HAVE_WINSOCK_H
|
||||
#include <winsock.h>
|
||||
#endif
|
||||
#endif
|
||||
#else
|
||||
#ifdef HAVE_SYS_TYPES_H
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
#ifdef HAVE_SYS_SOCKET_H
|
||||
#include <sys/socket.h>
|
||||
#endif
|
||||
#ifdef HAVE_NETINET_IN_H
|
||||
#include <netinet/in.h>
|
||||
#endif
|
||||
#ifdef HAVE_ARPA_INET_H
|
||||
#include <arpa/inet.h>
|
||||
#endif
|
||||
#endif
|
||||
],[
|
||||
$t data = inet_addr ("1.2.3.4");
|
||||
],[
|
||||
@@ -229,10 +620,36 @@ AC_DEFUN([TYPE_IN_ADDR_T],
|
||||
AC_MSG_RESULT($curl_cv_in_addr_t_equiv)
|
||||
AC_DEFINE_UNQUOTED(in_addr_t, $curl_cv_in_addr_t_equiv,
|
||||
[type to use in place of in_addr_t if not defined])],
|
||||
[#include <sys/types.h>
|
||||
[
|
||||
#undef inline
|
||||
#ifdef HAVE_WINDOWS_H
|
||||
#ifndef WIN32_LEAN_AND_MEAN
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#endif
|
||||
#include <windows.h>
|
||||
#ifdef HAVE_WINSOCK2_H
|
||||
#include <winsock2.h>
|
||||
#else
|
||||
#ifdef HAVE_WINSOCK_H
|
||||
#include <winsock.h>
|
||||
#endif
|
||||
#endif
|
||||
#else
|
||||
#ifdef HAVE_SYS_TYPES_H
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
#ifdef HAVE_SYS_SOCKET_H
|
||||
#include <sys/socket.h>
|
||||
#include <arpa/inet.h>])
|
||||
])
|
||||
#endif
|
||||
#ifdef HAVE_NETINET_IN_H
|
||||
#include <netinet/in.h>
|
||||
#endif
|
||||
#ifdef HAVE_ARPA_INET_H
|
||||
#include <arpa/inet.h>
|
||||
#endif
|
||||
#endif
|
||||
]) dnl AC_CHECK_TYPE
|
||||
]) dnl AC_DEFUN
|
||||
|
||||
dnl ************************************************************
|
||||
dnl check for "localhost", if it doesn't exist, we can't do the
|
||||
@@ -687,6 +1104,7 @@ if test "$ac_cv_func_gethostbyname_r" = "yes"; then
|
||||
fi
|
||||
])
|
||||
|
||||
|
||||
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 options are only used for debug-builds.
|
||||
@@ -884,3 +1302,19 @@ else
|
||||
AC_MSG_RESULT($DLFOUNDFILE)
|
||||
fi
|
||||
])
|
||||
|
||||
# This is only a temporary fix. This macro is here to replace the broken one
|
||||
# delivered by the automake project (including the 1.9.6 release). As soon as
|
||||
# they ship a working version we SHOULD remove this work-around.
|
||||
|
||||
AC_DEFUN([AM_MISSING_HAS_RUN],
|
||||
[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
|
||||
test x"${MISSING+set}" = xset || MISSING="\${SHELL} \"$am_aux_dir/missing\""
|
||||
# Use eval to expand $SHELL
|
||||
if eval "$MISSING --run true"; then
|
||||
am_missing_run="$MISSING --run "
|
||||
else
|
||||
am_missing_run=
|
||||
AC_MSG_WARN([`missing' script is too old or missing])
|
||||
fi
|
||||
])
|
||||
|
@@ -11,3 +11,4 @@ Dan Fandrich
|
||||
Gisle Vanem
|
||||
Gunter Knauf
|
||||
Henrik Stoerner
|
||||
Yang Tse
|
||||
|
20
ares/CHANGES
20
ares/CHANGES
@@ -1,5 +1,25 @@
|
||||
Changelog for the c-ares project
|
||||
|
||||
* January 9, 2006
|
||||
|
||||
- Alexander Lazic improved the getservbyport_r() configure check.
|
||||
|
||||
* January 6, 2006
|
||||
|
||||
- Alexander Lazic pointed out that the buildconf should use the ACLOCAL_FLAGS
|
||||
variable for easier controlling what it does and how it runs.
|
||||
|
||||
* January 5, 2006
|
||||
|
||||
- James Bursa fixed c-ares to find the hosts file on RISC OS, and made it
|
||||
build with newer gcc versions that no longer defines "riscos".
|
||||
|
||||
* December 22
|
||||
|
||||
- Daniel Stenberg added ares_getsock() that extracts the set of sockets to
|
||||
wait for action on. Similar to ares_fds() but not restricted to using
|
||||
select() for the waiting.
|
||||
|
||||
* November 25
|
||||
|
||||
- Yang Tse fixed some send() / recv() compiler warnings
|
||||
|
@@ -1,11 +1,11 @@
|
||||
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_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_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 \
|
||||
ares_parse_aaaa_reply.c ares_getnameinfo.c inet_net_pton.c bitncmp.c \
|
||||
inet_ntop.c
|
||||
CSOURCES = ares_fds.c ares_getsock.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_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_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 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 inet_net_pton.h inet_ntop.h ares_ipv6.h bitncmp.h
|
||||
|
@@ -19,8 +19,8 @@ USE_WATT32 = 0
|
||||
|
||||
CC = cl
|
||||
|
||||
CFLAGS = -nologo -$(CFG_MODEL)$(DEBUG_MODEL) -W2 -Yd -Zi
|
||||
LDFLAGS = -machine:i386 -map -warn:2
|
||||
CFLAGS = -nologo -$(CFG_MODEL)$(DEBUG_MODEL) -W3 -Yd -Zi
|
||||
LDFLAGS = -machine:i386 -map
|
||||
|
||||
OBJ_DIR = VC6_obj
|
||||
DEF_FILE = cares.def
|
||||
@@ -36,7 +36,7 @@ EX_LIBS = advapi32.lib ws2_32.lib
|
||||
|
||||
!if "$(DEBUG_MODEL)" == "d"
|
||||
CFLAGS = $(CFLAGS) -D_DEBUG -GZ
|
||||
LDFLAGS = $(LDFLAGS) -debug -debugtype:coff -fixed:no
|
||||
LDFLAGS = $(LDFLAGS) -debug -fixed:no
|
||||
|
||||
!else
|
||||
CFLAGS = $(CFLAGS) -O2 -Og
|
||||
@@ -52,6 +52,7 @@ OBJECTS = $(OBJ_DIR)\ares_fds.obj \
|
||||
$(OBJ_DIR)\ares_search.obj \
|
||||
$(OBJ_DIR)\ares__get_hostent.obj \
|
||||
$(OBJ_DIR)\ares_gethostbyaddr.obj \
|
||||
$(OBJ_DIR)\ares_getsock.obj \
|
||||
$(OBJ_DIR)\ares_send.obj \
|
||||
$(OBJ_DIR)\ares__read_line.obj \
|
||||
$(OBJ_DIR)\ares_gethostbyname.obj \
|
||||
@@ -78,10 +79,10 @@ all: $(OBJ_DIR) cares.lib cares.dll cares_imp.lib ahost.exe adig.exe
|
||||
$(OBJ_DIR):
|
||||
mkdir $(OBJ_DIR)
|
||||
|
||||
cares.lib: $(OBJECTS)
|
||||
cares.lib: $(OBJ_DIR) $(OBJECTS)
|
||||
lib -nologo -out:$@ $(OBJECTS)
|
||||
|
||||
cares_imp.lib cares.dll: $(DEF_FILE) $(OBJECTS)
|
||||
cares_imp.lib cares.dll: $(OBJ_DIR) $(DEF_FILE) $(OBJECTS)
|
||||
link $(LDFLAGS) -dll -implib:cares_imp.lib -out:cares.dll \
|
||||
-def:$(DEF_FILE) $(OBJECTS) $(EX_LIBS)
|
||||
|
||||
@@ -98,6 +99,7 @@ $(DEF_FILE): $(OBJECTS) Makefile.VC6
|
||||
@echo ares_free_string >> $@
|
||||
@echo ares_gethostbyaddr >> $@
|
||||
@echo ares_gethostbyname >> $@
|
||||
@echo ares_getsock >> $@
|
||||
@echo ares_init >> $@
|
||||
@echo ares_init_options >> $@
|
||||
@echo ares_mkquery >> $@
|
||||
@@ -119,10 +121,10 @@ $(DEF_FILE): $(OBJECTS) Makefile.VC6
|
||||
@echo ares_gettimeofday >> $@
|
||||
@echo ares_parse_aaaa_reply >> $@
|
||||
|
||||
ahost.exe: $(OBJ_DIR)\ahost.obj cares_imp.lib
|
||||
ahost.exe: $(OBJ_DIR) $(OBJ_DIR)\ahost.obj cares_imp.lib
|
||||
link $(LDFLAGS) -out:$@ $(OBJ_DIR)\ahost.obj cares_imp.lib $(EX_LIBS)
|
||||
|
||||
adig.exe: $(OBJ_DIR)\adig.obj $(OBJ_DIR)\getopt.obj cares_imp.lib
|
||||
adig.exe: $(OBJ_DIR) $(OBJ_DIR)\adig.obj $(OBJ_DIR)\getopt.obj cares_imp.lib
|
||||
link $(LDFLAGS) -out:$@ $(OBJ_DIR)\adig.obj $(OBJ_DIR)\getopt.obj cares_imp.lib $(EX_LIBS)
|
||||
|
||||
clean:
|
||||
|
@@ -1,3 +1,372 @@
|
||||
|
||||
|
||||
dnl CURL_CHECK_HEADER_WINDOWS
|
||||
dnl -------------------------------------------------
|
||||
dnl Check for compilable and valid windows.h header
|
||||
|
||||
AC_DEFUN([CURL_CHECK_HEADER_WINDOWS], [
|
||||
AC_CACHE_CHECK([for windows.h], [ac_cv_header_windows_h], [
|
||||
AC_COMPILE_IFELSE([
|
||||
AC_LANG_PROGRAM([
|
||||
#undef inline
|
||||
#ifndef WIN32_LEAN_AND_MEAN
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#endif
|
||||
#include <windows.h>
|
||||
],[
|
||||
int dummy=2*WINVER;
|
||||
])
|
||||
],[
|
||||
ac_cv_header_windows_h="yes"
|
||||
],[
|
||||
ac_cv_header_windows_h="no"
|
||||
])
|
||||
])
|
||||
if test "x$ac_cv_header_windows_h" = "xyes"; then
|
||||
AC_DEFINE_UNQUOTED(HAVE_WINDOWS_H, 1,
|
||||
[Define to 1 if you have the windows.h header file.])
|
||||
AC_DEFINE_UNQUOTED(WIN32_LEAN_AND_MEAN, 1,
|
||||
[Define to avoid automatic inclusion of winsock.h])
|
||||
fi
|
||||
])
|
||||
|
||||
|
||||
dnl CURL_CHECK_HEADER_WINSOCK
|
||||
dnl -------------------------------------------------
|
||||
dnl Check for compilable and valid winsock.h header
|
||||
|
||||
AC_DEFUN([CURL_CHECK_HEADER_WINSOCK], [
|
||||
AC_REQUIRE([CURL_CHECK_HEADER_WINDOWS])dnl
|
||||
AC_CACHE_CHECK([for winsock.h], [ac_cv_header_winsock_h], [
|
||||
AC_COMPILE_IFELSE([
|
||||
AC_LANG_PROGRAM([
|
||||
#undef inline
|
||||
#ifndef WIN32_LEAN_AND_MEAN
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#endif
|
||||
#include <windows.h>
|
||||
#include <winsock.h>
|
||||
],[
|
||||
int dummy=WSACleanup();
|
||||
])
|
||||
],[
|
||||
ac_cv_header_winsock_h="yes"
|
||||
],[
|
||||
ac_cv_header_winsock_h="no"
|
||||
])
|
||||
])
|
||||
if test "x$ac_cv_header_winsock_h" = "xyes"; then
|
||||
AC_DEFINE_UNQUOTED(HAVE_WINSOCK_H, 1,
|
||||
[Define to 1 if you have the winsock.h header file.])
|
||||
fi
|
||||
])
|
||||
|
||||
|
||||
dnl CURL_CHECK_HEADER_WINSOCK2
|
||||
dnl -------------------------------------------------
|
||||
dnl Check for compilable and valid winsock2.h header
|
||||
|
||||
AC_DEFUN([CURL_CHECK_HEADER_WINSOCK2], [
|
||||
AC_REQUIRE([CURL_CHECK_HEADER_WINDOWS])dnl
|
||||
AC_CACHE_CHECK([for winsock2.h], [ac_cv_header_winsock2_h], [
|
||||
AC_COMPILE_IFELSE([
|
||||
AC_LANG_PROGRAM([
|
||||
#undef inline
|
||||
#ifndef WIN32_LEAN_AND_MEAN
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#endif
|
||||
#include <windows.h>
|
||||
#include <winsock2.h>
|
||||
],[
|
||||
int dummy=2*IPPROTO_ESP;
|
||||
])
|
||||
],[
|
||||
ac_cv_header_winsock2_h="yes"
|
||||
],[
|
||||
ac_cv_header_winsock2_h="no"
|
||||
])
|
||||
])
|
||||
if test "x$ac_cv_header_winsock2_h" = "xyes"; then
|
||||
AC_DEFINE_UNQUOTED(HAVE_WINSOCK2_H, 1,
|
||||
[Define to 1 if you have the winsock2.h header file.])
|
||||
fi
|
||||
])
|
||||
|
||||
|
||||
dnl CURL_CHECK_HEADER_WS2TCPIP
|
||||
dnl -------------------------------------------------
|
||||
dnl Check for compilable and valid ws2tcpip.h header
|
||||
|
||||
AC_DEFUN([CURL_CHECK_HEADER_WS2TCPIP], [
|
||||
AC_REQUIRE([CURL_CHECK_HEADER_WINSOCK2])dnl
|
||||
AC_CACHE_CHECK([for ws2tcpip.h], [ac_cv_header_ws2tcpip_h], [
|
||||
AC_COMPILE_IFELSE([
|
||||
AC_LANG_PROGRAM([
|
||||
#undef inline
|
||||
#ifndef WIN32_LEAN_AND_MEAN
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#endif
|
||||
#include <windows.h>
|
||||
#include <winsock2.h>
|
||||
#include <ws2tcpip.h>
|
||||
],[
|
||||
int dummy=2*IP_PKTINFO;
|
||||
])
|
||||
],[
|
||||
ac_cv_header_ws2tcpip_h="yes"
|
||||
],[
|
||||
ac_cv_header_ws2tcpip_h="no"
|
||||
])
|
||||
])
|
||||
if test "x$ac_cv_header_ws2tcpip_h" = "xyes"; then
|
||||
AC_DEFINE_UNQUOTED(HAVE_WS2TCPIP_H, 1,
|
||||
[Define to 1 if you have the ws2tcpip.h header file.])
|
||||
fi
|
||||
])
|
||||
|
||||
|
||||
dnl CURL_CHECK_TYPE_SOCKLEN_T
|
||||
dnl -------------------------------------------------
|
||||
dnl Check for existing socklen_t type, and provide
|
||||
dnl an equivalent type if socklen_t not available
|
||||
|
||||
AC_DEFUN([CURL_CHECK_TYPE_SOCKLEN_T], [
|
||||
AC_REQUIRE([CURL_CHECK_HEADER_WS2TCPIP])dnl
|
||||
AC_CHECK_TYPE([socklen_t], ,[
|
||||
AC_CACHE_CHECK([for socklen_t equivalent],
|
||||
[curl_cv_socklen_t_equiv], [
|
||||
curl_cv_socklen_t_equiv="unknown"
|
||||
for arg2 in "struct sockaddr" void; do
|
||||
for t in int size_t unsigned long "unsigned long"; do
|
||||
AC_COMPILE_IFELSE([
|
||||
AC_LANG_PROGRAM([
|
||||
#undef inline
|
||||
#ifdef HAVE_WINDOWS_H
|
||||
#ifndef WIN32_LEAN_AND_MEAN
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#endif
|
||||
#include <windows.h>
|
||||
#ifdef HAVE_WINSOCK2_H
|
||||
#include <winsock2.h>
|
||||
#else
|
||||
#ifdef HAVE_WINSOCK_H
|
||||
#include <winsock.h>
|
||||
#endif
|
||||
#endif
|
||||
#else
|
||||
#ifdef HAVE_SYS_TYPES_H
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
#ifdef HAVE_SYS_SOCKET_H
|
||||
#include <sys/socket.h>
|
||||
#endif
|
||||
#endif
|
||||
int getpeername (int, $arg2 *, $t *);
|
||||
],[
|
||||
$t len=0;
|
||||
getpeername(0,0,&len);
|
||||
])
|
||||
],[
|
||||
curl_cv_socklen_t_equiv="$t"
|
||||
break 2
|
||||
])
|
||||
done
|
||||
done
|
||||
])
|
||||
if test "$curl_cv_socklen_t_equiv" = "unknown"; then
|
||||
AC_MSG_ERROR([Cannot find a type to use in place of socklen_t])
|
||||
else
|
||||
AC_DEFINE_UNQUOTED(socklen_t, $curl_cv_socklen_t_equiv,
|
||||
[type to use in place of socklen_t if not defined])
|
||||
fi
|
||||
],[
|
||||
#undef inline
|
||||
#ifdef HAVE_WINDOWS_H
|
||||
#ifndef WIN32_LEAN_AND_MEAN
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#endif
|
||||
#include <windows.h>
|
||||
#ifdef HAVE_WINSOCK2_H
|
||||
#include <winsock2.h>
|
||||
#ifdef HAVE_WS2TCPIP_H
|
||||
#include <ws2tcpip.h>
|
||||
#endif
|
||||
#endif
|
||||
#else
|
||||
#ifdef HAVE_SYS_TYPES_H
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
#ifdef HAVE_SYS_SOCKET_H
|
||||
#include <sys/socket.h>
|
||||
#endif
|
||||
#endif
|
||||
])
|
||||
])
|
||||
|
||||
|
||||
dnl CURL_CHECK_FUNC_GETNAMEINFO
|
||||
dnl -------------------------------------------------
|
||||
dnl Test if the getnameinfo function is available,
|
||||
dnl and check the types of five of its arguments.
|
||||
dnl If the function succeeds HAVE_GETNAMEINFO will be
|
||||
dnl defined, defining the types of the arguments in
|
||||
dnl GETNAMEINFO_TYPE_ARG1, GETNAMEINFO_TYPE_ARG2,
|
||||
dnl GETNAMEINFO_TYPE_ARG46 and GETNAMEINFO_TYPE_ARG7.
|
||||
dnl This function is experimental and its results shall
|
||||
dnl not be trusted while this notice is in place ------
|
||||
|
||||
AC_DEFUN([CURL_CHECK_FUNC_GETNAMEINFO], [
|
||||
AC_REQUIRE([CURL_CHECK_HEADER_WS2TCPIP])dnl
|
||||
AC_REQUIRE([CURL_CHECK_TYPE_SOCKLEN_T])dnl
|
||||
AC_CHECK_HEADERS(sys/types.h sys/socket.h netdb.h)
|
||||
#
|
||||
AC_MSG_CHECKING([for getnameinfo])
|
||||
AC_LINK_IFELSE([
|
||||
AC_LANG_FUNC_LINK_TRY([getnameinfo])
|
||||
],[
|
||||
AC_MSG_RESULT([yes])
|
||||
curl_cv_getnameinfo="yes"
|
||||
],[
|
||||
AC_MSG_RESULT([no])
|
||||
curl_cv_getnameinfo="no"
|
||||
])
|
||||
#
|
||||
if test "$curl_cv_getnameinfo" != "yes"; then
|
||||
AC_MSG_CHECKING([deeper for getnameinfo])
|
||||
AC_TRY_LINK([
|
||||
],[
|
||||
getnameinfo();
|
||||
],[
|
||||
AC_MSG_RESULT([yes])
|
||||
curl_cv_getnameinfo="yes"
|
||||
],[
|
||||
AC_MSG_RESULT([but still no])
|
||||
curl_cv_getnameinfo="no"
|
||||
])
|
||||
fi
|
||||
#
|
||||
if test "$curl_cv_getnameinfo" != "yes"; then
|
||||
AC_MSG_CHECKING([deeper and deeper for getnameinfo])
|
||||
AC_TRY_LINK([
|
||||
#undef inline
|
||||
#ifdef HAVE_WINDOWS_H
|
||||
#ifndef WIN32_LEAN_AND_MEAN
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#endif
|
||||
#include <windows.h>
|
||||
#ifdef HAVE_WINSOCK2_H
|
||||
#include <winsock2.h>
|
||||
#ifdef HAVE_WS2TCPIP_H
|
||||
#include <ws2tcpip.h>
|
||||
#endif
|
||||
#endif
|
||||
#else
|
||||
#ifdef HAVE_SYS_TYPES_H
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
#ifdef HAVE_SYS_SOCKET_H
|
||||
#include <sys/socket.h>
|
||||
#endif
|
||||
#ifdef HAVE_NETDB_H
|
||||
#include <netdb.h>
|
||||
#endif
|
||||
#endif
|
||||
],[
|
||||
getnameinfo(0, 0, 0, 0, 0, 0, 0);
|
||||
],[
|
||||
AC_MSG_RESULT([yes])
|
||||
curl_cv_getnameinfo="yes"
|
||||
],[
|
||||
AC_MSG_RESULT([but still no])
|
||||
curl_cv_getnameinfo="no"
|
||||
])
|
||||
fi
|
||||
#
|
||||
if test "$curl_cv_getnameinfo" = "yes"; then
|
||||
AC_CACHE_CHECK([types of arguments for getnameinfo],
|
||||
[curl_cv_func_getnameinfo_args], [
|
||||
curl_cv_func_getnameinfo_args="unknown"
|
||||
for gni_arg1 in 'struct sockaddr *' 'const struct sockaddr *' 'void *'; do
|
||||
for gni_arg2 in 'socklen_t' 'size_t' 'int'; do
|
||||
for gni_arg46 in 'size_t' 'int' 'socklen_t' 'unsigned int' 'DWORD'; do
|
||||
for gni_arg7 in 'int' 'unsigned int'; do
|
||||
AC_COMPILE_IFELSE([
|
||||
AC_LANG_PROGRAM([
|
||||
#undef inline
|
||||
#ifdef HAVE_WINDOWS_H
|
||||
#ifndef WIN32_LEAN_AND_MEAN
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#endif
|
||||
#if (!defined(_WIN32_WINNT)) || (_WIN32_WINNT < 0x0501)
|
||||
#undef _WIN32_WINNT
|
||||
#define _WIN32_WINNT 0x0501
|
||||
#endif
|
||||
#include <windows.h>
|
||||
#ifdef HAVE_WINSOCK2_H
|
||||
#include <winsock2.h>
|
||||
#ifdef HAVE_WS2TCPIP_H
|
||||
#include <ws2tcpip.h>
|
||||
#endif
|
||||
#endif
|
||||
#define GNICALLCONV WSAAPI
|
||||
#else
|
||||
#ifdef HAVE_SYS_TYPES_H
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
#ifdef HAVE_SYS_SOCKET_H
|
||||
#include <sys/socket.h>
|
||||
#endif
|
||||
#ifdef HAVE_NETDB_H
|
||||
#include <netdb.h>
|
||||
#endif
|
||||
#define GNICALLCONV
|
||||
#endif
|
||||
extern int GNICALLCONV getnameinfo($gni_arg1, $gni_arg2,
|
||||
char *, $gni_arg46,
|
||||
char *, $gni_arg46,
|
||||
$gni_arg7);
|
||||
],[
|
||||
$gni_arg2 salen=0;
|
||||
$gni_arg46 hostlen=0;
|
||||
$gni_arg46 servlen=0;
|
||||
$gni_arg7 flags=0;
|
||||
int res = getnameinfo(0, salen, 0, hostlen, 0, servlen, flags);
|
||||
])
|
||||
],[
|
||||
curl_cv_func_getnameinfo_args="$gni_arg1,$gni_arg2,$gni_arg46,$gni_arg7"
|
||||
break 4
|
||||
])
|
||||
done
|
||||
done
|
||||
done
|
||||
done
|
||||
]) # AC_CACHE_CHECK
|
||||
if test "$curl_cv_func_getnameinfo_args" = "unknown"; then
|
||||
AC_MSG_WARN([Cannot find proper types to use for getnameinfo args])
|
||||
AC_MSG_WARN([HAVE_GETNAMEINFO will not be defined])
|
||||
else
|
||||
gni_prev_IFS=$IFS; IFS=','
|
||||
set dummy `echo "$curl_cv_func_getnameinfo_args" | sed 's/\*/\*/g'`
|
||||
IFS=$gni_prev_IFS
|
||||
shift
|
||||
AC_DEFINE_UNQUOTED(GETNAMEINFO_TYPE_ARG1, $[1],
|
||||
[Define to the type of arg 1 for getnameinfo.])
|
||||
AC_DEFINE_UNQUOTED(GETNAMEINFO_TYPE_ARG2, $[2],
|
||||
[Define to the type of arg 2 for getnameinfo.])
|
||||
AC_DEFINE_UNQUOTED(GETNAMEINFO_TYPE_ARG46, $[3],
|
||||
[Define to the type of args 4 and 6 for getnameinfo.])
|
||||
AC_DEFINE_UNQUOTED(GETNAMEINFO_TYPE_ARG7, $[4],
|
||||
[Define to the type of arg 7 for getnameinfo.])
|
||||
AC_DEFINE_UNQUOTED(HAVE_GETNAMEINFO, 1,
|
||||
[Define to 1 if you have the getnameinfo function.])
|
||||
ac_cv_func_getnameinfo="yes"
|
||||
fi
|
||||
fi
|
||||
]) # AC_DEFUN
|
||||
|
||||
|
||||
dnl CURL_CHECK_NONBLOCKING_SOCKET
|
||||
dnl -------------------------------------------------
|
||||
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,
|
||||
@@ -59,12 +428,27 @@ 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?) */
|
||||
/* headers for ioctlsocket test (Windows) */
|
||||
#undef inline
|
||||
#ifdef HAVE_WINDOWS_H
|
||||
#ifndef WIN32_LEAN_AND_MEAN
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#endif
|
||||
#include <windows.h>
|
||||
#ifdef HAVE_WINSOCK2_H
|
||||
#include <winsock2.h>
|
||||
#else
|
||||
#ifdef HAVE_WINSOCK_H
|
||||
#include <winsock.h>
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
],[
|
||||
/* ioctlsocket source code */
|
||||
int socket;
|
||||
unsigned long flags = ioctlsocket(socket, FIONBIO, &flags);
|
||||
SOCKET sd;
|
||||
unsigned long flags = 0;
|
||||
sd = socket(0, 0, 0);
|
||||
ioctlsocket(sd, FIONBIO, &flags);
|
||||
],[
|
||||
dnl ioctlsocket test was good
|
||||
nonblock="ioctlsocket"
|
||||
@@ -122,6 +506,132 @@ dnl end of non-blocking try-compile test
|
||||
fi
|
||||
])
|
||||
|
||||
|
||||
dnl TYPE_SOCKADDR_STORAGE
|
||||
dnl -------------------------------------------------
|
||||
dnl Check for struct sockaddr_storage. Most IPv6-enabled hosts have it, but
|
||||
dnl AIX 4.3 is one known exception.
|
||||
AC_DEFUN([TYPE_SOCKADDR_STORAGE],
|
||||
[
|
||||
AC_CHECK_TYPE([struct sockaddr_storage],
|
||||
AC_DEFINE(HAVE_STRUCT_SOCKADDR_STORAGE, 1,
|
||||
[if struct sockaddr_storage is defined]), ,
|
||||
[
|
||||
#undef inline
|
||||
#ifdef HAVE_WINDOWS_H
|
||||
#ifndef WIN32_LEAN_AND_MEAN
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#endif
|
||||
#include <windows.h>
|
||||
#ifdef HAVE_WINSOCK2_H
|
||||
#include <winsock2.h>
|
||||
#endif
|
||||
#else
|
||||
#ifdef HAVE_SYS_TYPES_H
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
#ifdef HAVE_SYS_SOCKET_H
|
||||
#include <sys/socket.h>
|
||||
#endif
|
||||
#ifdef HAVE_NETINET_IN_H
|
||||
#include <netinet/in.h>
|
||||
#endif
|
||||
#ifdef HAVE_ARPA_INET_H
|
||||
#include <arpa/inet.h>
|
||||
#endif
|
||||
#endif
|
||||
])
|
||||
])
|
||||
|
||||
|
||||
dnl TYPE_IN_ADDR_T
|
||||
dnl -------------------------------------------------
|
||||
dnl Check for in_addr_t: it is used to receive the return code of inet_addr()
|
||||
dnl and a few other things.
|
||||
AC_DEFUN([TYPE_IN_ADDR_T],
|
||||
[
|
||||
AC_CHECK_TYPE([in_addr_t], ,[
|
||||
AC_MSG_CHECKING([for in_addr_t equivalent])
|
||||
AC_CACHE_VAL([curl_cv_in_addr_t_equiv],
|
||||
[
|
||||
curl_cv_in_addr_t_equiv=
|
||||
for t in "unsigned long" int size_t unsigned long; do
|
||||
AC_TRY_COMPILE([
|
||||
#undef inline
|
||||
#ifdef HAVE_WINDOWS_H
|
||||
#ifndef WIN32_LEAN_AND_MEAN
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#endif
|
||||
#include <windows.h>
|
||||
#ifdef HAVE_WINSOCK2_H
|
||||
#include <winsock2.h>
|
||||
#else
|
||||
#ifdef HAVE_WINSOCK_H
|
||||
#include <winsock.h>
|
||||
#endif
|
||||
#endif
|
||||
#else
|
||||
#ifdef HAVE_SYS_TYPES_H
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
#ifdef HAVE_SYS_SOCKET_H
|
||||
#include <sys/socket.h>
|
||||
#endif
|
||||
#ifdef HAVE_NETINET_IN_H
|
||||
#include <netinet/in.h>
|
||||
#endif
|
||||
#ifdef HAVE_ARPA_INET_H
|
||||
#include <arpa/inet.h>
|
||||
#endif
|
||||
#endif
|
||||
],[
|
||||
$t data = inet_addr ("1.2.3.4");
|
||||
],[
|
||||
curl_cv_in_addr_t_equiv="$t"
|
||||
break
|
||||
])
|
||||
done
|
||||
|
||||
if test "x$curl_cv_in_addr_t_equiv" = x; then
|
||||
AC_MSG_ERROR([Cannot find a type to use in place of in_addr_t])
|
||||
fi
|
||||
])
|
||||
AC_MSG_RESULT($curl_cv_in_addr_t_equiv)
|
||||
AC_DEFINE_UNQUOTED(in_addr_t, $curl_cv_in_addr_t_equiv,
|
||||
[type to use in place of in_addr_t if not defined])],
|
||||
[
|
||||
#undef inline
|
||||
#ifdef HAVE_WINDOWS_H
|
||||
#ifndef WIN32_LEAN_AND_MEAN
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#endif
|
||||
#include <windows.h>
|
||||
#ifdef HAVE_WINSOCK2_H
|
||||
#include <winsock2.h>
|
||||
#else
|
||||
#ifdef HAVE_WINSOCK_H
|
||||
#include <winsock.h>
|
||||
#endif
|
||||
#endif
|
||||
#else
|
||||
#ifdef HAVE_SYS_TYPES_H
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
#ifdef HAVE_SYS_SOCKET_H
|
||||
#include <sys/socket.h>
|
||||
#endif
|
||||
#ifdef HAVE_NETINET_IN_H
|
||||
#include <netinet/in.h>
|
||||
#endif
|
||||
#ifdef HAVE_ARPA_INET_H
|
||||
#include <arpa/inet.h>
|
||||
#endif
|
||||
|
||||
#endif
|
||||
]) dnl AC_CHECK_TYPE
|
||||
]) dnl AC_DEFUN
|
||||
|
||||
|
||||
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 options are only used for debug-builds.
|
||||
@@ -272,7 +782,7 @@ AC_DEFUN([CARES_CHECK_CONSTANT], [
|
||||
dnl This macro determines how many parameters getservbyport_r takes
|
||||
AC_DEFUN([CARES_CHECK_GETSERVBYPORT_R], [
|
||||
AC_MSG_CHECKING([how many arguments getservbyport_r takes])
|
||||
AC_TRY_COMPILE(
|
||||
AC_TRY_LINK(
|
||||
[#include <netdb.h>],
|
||||
[
|
||||
int p1, p5;
|
||||
@@ -280,7 +790,7 @@ AC_DEFUN([CARES_CHECK_GETSERVBYPORT_R], [
|
||||
struct servent *p3, *p6;
|
||||
getservbyport_r(p1, p2, p3, p4, p5, &p6);
|
||||
], ac_func_getservbyport_r=6,
|
||||
[AC_TRY_COMPILE(
|
||||
[AC_TRY_LINK(
|
||||
[#include <netdb.h>],
|
||||
[
|
||||
int p1, p5;
|
||||
@@ -288,7 +798,7 @@ AC_DEFUN([CARES_CHECK_GETSERVBYPORT_R], [
|
||||
struct servent *p3;
|
||||
getservbyport_r(p1, p2, p3, p4, p5);
|
||||
], ac_func_getservbyport_r=5,
|
||||
[AC_TRY_COMPILE(
|
||||
[AC_TRY_LINK(
|
||||
[#include <netdb.h>],
|
||||
[
|
||||
int p1;
|
||||
|
@@ -227,7 +227,7 @@ int main(int argc, char **argv)
|
||||
/* Set the TCP port number. */
|
||||
if (!isdigit((unsigned char)*optarg))
|
||||
usage();
|
||||
options.tcp_port = strtol(optarg, NULL, 0);
|
||||
options.tcp_port = (unsigned short)strtol(optarg, NULL, 0);
|
||||
optmask |= ARES_OPT_TCP_PORT;
|
||||
break;
|
||||
|
||||
@@ -235,7 +235,7 @@ int main(int argc, char **argv)
|
||||
/* Set the UDP port number. */
|
||||
if (!isdigit((unsigned char)*optarg))
|
||||
usage();
|
||||
options.udp_port = strtol(optarg, NULL, 0);
|
||||
options.udp_port = (unsigned short)strtol(optarg, NULL, 0);
|
||||
optmask |= ARES_OPT_UDP_PORT;
|
||||
break;
|
||||
}
|
||||
|
43
ares/ares.h
43
ares/ares.h
@@ -70,8 +70,8 @@ extern "C" {
|
||||
#define ARES_EBADFLAGS 18
|
||||
|
||||
/* ares_getaddrinfo error codes */
|
||||
#define ARES_ENONAME 19
|
||||
#define ARES_EBADHINTS 20
|
||||
#define ARES_ENONAME 19
|
||||
#define ARES_EBADHINTS 20
|
||||
|
||||
/* Flag values */
|
||||
#define ARES_FLAG_USEVC (1 << 0)
|
||||
@@ -108,27 +108,32 @@ extern "C" {
|
||||
#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_IDN_ALLOW_UNASSIGNED (1 << 11)
|
||||
#define ARES_NI_IDN (1 << 10)
|
||||
#define ARES_NI_IDN_ALLOW_UNASSIGNED (1 << 11)
|
||||
#define ARES_NI_IDN_USE_STD3_ASCII_RULES (1 << 12)
|
||||
|
||||
/* Addrinfo flag values */
|
||||
#define ARES_AI_CANONNAME (1 << 0)
|
||||
#define ARES_AI_NUMERICHOST (1 << 1)
|
||||
#define ARES_AI_PASSIVE (1 << 2)
|
||||
#define ARES_AI_NUMERICSERV (1 << 3)
|
||||
#define ARES_AI_V4MAPPED (1 << 4)
|
||||
#define ARES_AI_ALL (1 << 5)
|
||||
#define ARES_AI_ADDRCONFIG (1 << 6)
|
||||
#define ARES_AI_CANONNAME (1 << 0)
|
||||
#define ARES_AI_NUMERICHOST (1 << 1)
|
||||
#define ARES_AI_PASSIVE (1 << 2)
|
||||
#define ARES_AI_NUMERICSERV (1 << 3)
|
||||
#define ARES_AI_V4MAPPED (1 << 4)
|
||||
#define ARES_AI_ALL (1 << 5)
|
||||
#define ARES_AI_ADDRCONFIG (1 << 6)
|
||||
/* Reserved for future use */
|
||||
#define ARES_AI_IDN (1 << 10)
|
||||
#define ARES_AI_IDN_ALLOW_UNASSIGNED (1 << 11)
|
||||
#define ARES_AI_IDN (1 << 10)
|
||||
#define ARES_AI_IDN_ALLOW_UNASSIGNED (1 << 11)
|
||||
#define ARES_AI_IDN_USE_STD3_ASCII_RULES (1 << 12)
|
||||
#define ARES_AI_CANONIDN (1 << 13)
|
||||
#define ARES_AI_CANONIDN (1 << 13)
|
||||
|
||||
#define ARES_AI_MASK (ARES_AI_CANONNAME|ARES_AI_NUMERICHOST|ARES_AI_PASSIVE| \
|
||||
ARES_AI_NUMERICSERV|ARES_AI_V4MAPPED|ARES_AI_ALL| \
|
||||
ARES_AI_ADDRCONFIG)
|
||||
#define ARES_AI_MASK (ARES_AI_CANONNAME|ARES_AI_NUMERICHOST|ARES_AI_PASSIVE| \
|
||||
ARES_AI_NUMERICSERV|ARES_AI_V4MAPPED|ARES_AI_ALL| \
|
||||
ARES_AI_ADDRCONFIG)
|
||||
#define ARES_GETSOCK_MAXNUM 16 /* ares_getsock() can return info about this
|
||||
many sockets */
|
||||
#define ARES_GETSOCK_READABLE(bits,num) (bits & (1<< (num)))
|
||||
#define ARES_GETSOCK_WRITABLE(bits,num) (bits & (1 << ((num) + \
|
||||
ARES_GETSOCK_MAXNUM)))
|
||||
|
||||
struct ares_options {
|
||||
int flags;
|
||||
@@ -172,9 +177,11 @@ void ares_gethostbyname(ares_channel channel, const char *name, int family,
|
||||
void ares_gethostbyaddr(ares_channel channel, const void *addr, int addrlen,
|
||||
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,
|
||||
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_getsock(ares_channel channel, int *socks, int numsocks);
|
||||
struct timeval *ares_timeout(ares_channel channel, struct timeval *maxtv,
|
||||
struct timeval *tv);
|
||||
void ares_process(ares_channel channel, fd_set *read_fds, fd_set *write_fds);
|
||||
|
@@ -50,7 +50,7 @@ int ares__read_line(FILE *fp, char **buf, int *bufsize)
|
||||
if ((*buf)[len - 1] == '\n')
|
||||
{
|
||||
(*buf)[len - 1] = 0;
|
||||
return ARES_SUCCESS;
|
||||
break;
|
||||
}
|
||||
offset = len;
|
||||
|
||||
@@ -61,4 +61,5 @@ int ares__read_line(FILE *fp, char **buf, int *bufsize)
|
||||
*buf = newbuf;
|
||||
*bufsize *= 2;
|
||||
}
|
||||
return ARES_SUCCESS;
|
||||
}
|
||||
|
@@ -34,6 +34,6 @@ might have been stored in their arguments.
|
||||
.BR ares_init (3)
|
||||
.BR ares_destroy (3)
|
||||
.SH NOTES
|
||||
This function is not compatible with ares.
|
||||
This function was added in c-ares 1.2.0
|
||||
.SH AUTHOR
|
||||
Dirk Manske
|
||||
|
@@ -70,7 +70,8 @@ struct nameinfo_query {
|
||||
#endif
|
||||
|
||||
static void nameinfo_callback(void *arg, int status, struct hostent *host);
|
||||
static char *lookup_service(unsigned short port, int flags, char *buf);
|
||||
static char *lookup_service(unsigned short port, int flags,
|
||||
char *buf, size_t buflen);
|
||||
#ifdef HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID
|
||||
static void append_scopeid(struct sockaddr_in6 *addr6, unsigned int scopeid,
|
||||
char *buf, size_t buflen);
|
||||
@@ -109,7 +110,7 @@ void ares_getnameinfo(ares_channel channel, const struct sockaddr *sa, socklen_t
|
||||
port = addr->sin_port;
|
||||
else
|
||||
port = addr6->sin6_port;
|
||||
service = lookup_service(port, flags, buf);
|
||||
service = lookup_service(port, flags, buf, sizeof(buf));
|
||||
callback(arg, ARES_SUCCESS, NULL, service);
|
||||
return;
|
||||
}
|
||||
@@ -122,7 +123,7 @@ void ares_getnameinfo(ares_channel channel, const struct sockaddr *sa, socklen_t
|
||||
{
|
||||
unsigned int port = 0;
|
||||
char ipbuf[IPBUFSIZ];
|
||||
char srvbuf[32];
|
||||
char srvbuf[33];
|
||||
char *service = NULL;
|
||||
ipbuf[0] = 0;
|
||||
|
||||
@@ -150,7 +151,7 @@ void ares_getnameinfo(ares_channel channel, const struct sockaddr *sa, socklen_t
|
||||
}
|
||||
/* They also want a service */
|
||||
if (flags & ARES_NI_LOOKUPSERVICE)
|
||||
service = lookup_service(port, flags, srvbuf);
|
||||
service = lookup_service(port, flags, srvbuf, sizeof(srvbuf));
|
||||
callback(arg, ARES_SUCCESS, ipbuf, service);
|
||||
return;
|
||||
}
|
||||
@@ -198,10 +199,10 @@ static void nameinfo_callback(void *arg, int status, struct hostent *host)
|
||||
{
|
||||
if (niquery->family == AF_INET)
|
||||
service = lookup_service(niquery->addr.addr4.sin_port,
|
||||
niquery->flags, srvbuf);
|
||||
niquery->flags, srvbuf, sizeof(srvbuf));
|
||||
else
|
||||
service = lookup_service(niquery->addr.addr6.sin6_port,
|
||||
niquery->flags, srvbuf);
|
||||
niquery->flags, srvbuf, sizeof(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
|
||||
@@ -240,10 +241,10 @@ static void nameinfo_callback(void *arg, int status, struct hostent *host)
|
||||
{
|
||||
if (niquery->family == AF_INET)
|
||||
service = lookup_service(niquery->addr.addr4.sin_port,
|
||||
niquery->flags, srvbuf);
|
||||
niquery->flags, srvbuf, sizeof(srvbuf));
|
||||
else
|
||||
service = lookup_service(niquery->addr.addr6.sin6_port,
|
||||
niquery->flags, srvbuf);
|
||||
niquery->flags, srvbuf, sizeof(srvbuf));
|
||||
}
|
||||
niquery->callback(niquery->arg, ARES_SUCCESS, ipbuf, service);
|
||||
return;
|
||||
@@ -253,30 +254,21 @@ static void nameinfo_callback(void *arg, int status, struct hostent *host)
|
||||
}
|
||||
|
||||
static char *lookup_service(unsigned short port, int flags,
|
||||
char *buf) /* 33 bytes buffer */
|
||||
char *buf, size_t buflen)
|
||||
{
|
||||
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;
|
||||
const char *proto;
|
||||
struct servent *sep;
|
||||
#ifdef HAVE_GETSERVBYPORT_R
|
||||
#if GETSERVBYPORT_R_ARGS == 6
|
||||
struct servent ret;
|
||||
char buf[4096];
|
||||
int len = 4096;
|
||||
#elif GETSERVBYPORT_R_ARGS == 5
|
||||
char buf[4096];
|
||||
int len = 4096;
|
||||
#elif GETSERVBYPORT_R_ARGS == 4
|
||||
struct servent ret;
|
||||
struct servent_data sed;
|
||||
struct servent se;
|
||||
#endif
|
||||
#endif /* HAVE_GETSERVBYPORT_R */
|
||||
char tmpbuf[4096];
|
||||
|
||||
if (port)
|
||||
{
|
||||
if (flags & ARES_NI_NUMERICSERV)
|
||||
sep = NULL;
|
||||
else
|
||||
{
|
||||
if (flags & ARES_NI_UDP)
|
||||
proto = "udp";
|
||||
else if (flags & ARES_NI_SCTP)
|
||||
@@ -286,38 +278,40 @@ static char *lookup_service(unsigned short port, int flags,
|
||||
else
|
||||
proto = "tcp";
|
||||
#ifdef HAVE_GETSERVBYPORT_R
|
||||
sep = &se;
|
||||
memset(tmpbuf, 0, sizeof(tmpbuf));
|
||||
#if GETSERVBYPORT_R_ARGS == 6
|
||||
se = &ret;
|
||||
if (getservbyport_r(port, proto, se, buf, len, &ret))
|
||||
se = NULL;
|
||||
if (getservbyport_r(port, proto, &se, (void *)tmpbuf, sizeof(tmpbuf), &sep) != 0)
|
||||
sep = NULL;
|
||||
#elif GETSERVBYPORT_R_ARGS == 5
|
||||
se = getservbyport_r(port, proto, se, buf, len);
|
||||
sep = getservbyport_r(port, proto, &se, (void *)tmpbuf, sizeof(tmpbuf));
|
||||
#elif GETSERVBYPORT_R_ARGS == 4
|
||||
se = &ret;
|
||||
if (getservbyport_r(port, proto, se, &sed) == -1)
|
||||
se = NULL;
|
||||
#else
|
||||
if (getservbyport_r(port, proto, &se, (void *)tmpbuf) != 0)
|
||||
sep = NULL;
|
||||
#else
|
||||
/* Lets just hope the OS uses TLS! */
|
||||
se = getservbyport(port, proto);
|
||||
#endif
|
||||
#else
|
||||
sep = getservbyport(port, proto);
|
||||
#endif
|
||||
#else
|
||||
/* Lets just hope the OS uses TLS! */
|
||||
se = getservbyport(port, proto);
|
||||
#endif
|
||||
if (se && se->s_name) {
|
||||
size_t len = strlen(se->s_name);
|
||||
if(len < 33) {
|
||||
strcpy(buf, se->s_name);
|
||||
}
|
||||
else
|
||||
/* too big name to fit the buffer */
|
||||
buf[0]=0;
|
||||
}
|
||||
else
|
||||
sprintf(buf, "%u", ntohs(port));
|
||||
}
|
||||
sep = getservbyport(port, proto);
|
||||
#endif
|
||||
}
|
||||
if (sep && sep->s_name)
|
||||
/* get service name */
|
||||
strcpy(tmpbuf, sep->s_name);
|
||||
else
|
||||
/* get port as a string */
|
||||
sprintf(tmpbuf, "%u", ntohs(port));
|
||||
if (strlen(tmpbuf) < buflen)
|
||||
/* return it if buffer big enough */
|
||||
strcpy(buf, tmpbuf);
|
||||
else
|
||||
/* avoid reusing previous one */
|
||||
buf[0] = '\0';
|
||||
return buf;
|
||||
}
|
||||
buf[0] = '\0';
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
58
ares/ares_getsock.3
Normal file
58
ares/ares_getsock.3
Normal file
@@ -0,0 +1,58 @@
|
||||
.\" $Id$
|
||||
.\"
|
||||
.\" Copyright 1998 by Daniel Stenberg
|
||||
.\"
|
||||
.\" 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_GETSOCK 3 "22 December 2005"
|
||||
.SH NAME
|
||||
ares_getsock \- get file descriptors to wait on
|
||||
.SH SYNOPSIS
|
||||
.nf
|
||||
.B #include <ares.h>
|
||||
.PP
|
||||
.B int ares_getsock(ares_channel \fIchannel\fP, int *\fIsocks\fP,
|
||||
.B int \fInumsocks\fP);
|
||||
.fi
|
||||
.SH DESCRIPTION
|
||||
The
|
||||
.B ares_getsock
|
||||
function retrieves the set of file descriptors which the calling
|
||||
application should wait on for reading and/or writing for the
|
||||
processing of name service queries pending on the name service channel
|
||||
identified by
|
||||
.IR channel .
|
||||
File descriptors will be set in the integer array pointed to by
|
||||
\fIsocks\fP.
|
||||
\fInumsocks\fP is the size of the given array in number of ints.
|
||||
|
||||
This function can only return information about up to 16 sockets. If more are
|
||||
in use (however unlikely that is), they are simply not reported back.
|
||||
.SH RETURN VALUES
|
||||
\fBares_getsock\fP returns a bitmask for what actions to wait for on the
|
||||
different sockets. The ares.h header file provides these convenience macros to
|
||||
extract the information appropriately:
|
||||
|
||||
.nf
|
||||
#define ARES_GETSOCK_MAXNUM 16 /* ares_getsock() can return info about
|
||||
this many sockets */
|
||||
#define ARES_GETSOCK_READABLE(bits,num) (bits & (1<< (num)))
|
||||
#define ARES_GETSOCK_WRITABLE(bits,num) (bits & (1 << ((num) + \
|
||||
ARES_GETSOCK_MAXNUM)))
|
||||
.fi
|
||||
.SH NOTES
|
||||
This function was added in c-ares 1.3.1
|
||||
.SH SEE ALSO
|
||||
.BR ares_timeout (3),
|
||||
.BR ares_fds (3),
|
||||
.BR ares_process (3)
|
71
ares/ares_getsock.c
Normal file
71
ares/ares_getsock.c
Normal file
@@ -0,0 +1,71 @@
|
||||
/* $Id$ */
|
||||
|
||||
/* Copyright 2005 by Daniel Stenberg.
|
||||
*
|
||||
* 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>
|
||||
|
||||
#ifdef HAVE_SYS_TIME_H
|
||||
#include <sys/time.h>
|
||||
#endif
|
||||
|
||||
#include "ares.h"
|
||||
#include "ares_private.h"
|
||||
|
||||
int ares_getsock(ares_channel channel,
|
||||
int *s,
|
||||
int numsocks) /* size of the 'socks' array */
|
||||
{
|
||||
struct server_state *server;
|
||||
ares_socket_t nfds;
|
||||
int i;
|
||||
int sockindex=0;
|
||||
int bitmap = 0;
|
||||
unsigned int setbits = 0xffffffff;
|
||||
|
||||
ares_socket_t *socks = (ares_socket_t *)s;
|
||||
|
||||
/* No queries, no file descriptors. */
|
||||
if (!channel->queries)
|
||||
return 0;
|
||||
|
||||
nfds = 0;
|
||||
for (i = 0; i < channel->nservers; i++)
|
||||
{
|
||||
server = &channel->servers[i];
|
||||
if (server->udp_socket != ARES_SOCKET_BAD)
|
||||
{
|
||||
if(sockindex >= numsocks)
|
||||
break;
|
||||
socks[sockindex] = server->udp_socket;
|
||||
bitmap |= ARES_GETSOCK_READABLE(setbits, sockindex);
|
||||
sockindex++;
|
||||
}
|
||||
if (server->tcp_socket != ARES_SOCKET_BAD)
|
||||
{
|
||||
if(sockindex >= numsocks)
|
||||
break;
|
||||
socks[sockindex] = server->tcp_socket;
|
||||
bitmap |= ARES_GETSOCK_READABLE(setbits, sockindex);
|
||||
sockindex++;
|
||||
|
||||
if (server->qhead) {
|
||||
/* then the tcp socket is also writable! */
|
||||
bitmap |= ARES_GETSOCK_WRITABLE(setbits, sockindex-1);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
return (int)nfds;
|
||||
}
|
@@ -504,7 +504,7 @@ DhcpNameServer
|
||||
if (status == ARES_SUCCESS)
|
||||
status = ARES_EOF;
|
||||
|
||||
#elif defined(riscos)
|
||||
#elif defined(__riscos__)
|
||||
|
||||
/* Under RISC OS, name servers are listed in the
|
||||
system variable Inet$Resolvers, space separated. */
|
||||
|
@@ -62,6 +62,10 @@
|
||||
#define PATH_RESOLV_CONF "sys:/etc/resolv.cfg"
|
||||
#define PATH_HOSTS "sys:/etc/hosts"
|
||||
|
||||
#elif defined(__riscos__)
|
||||
|
||||
#define PATH_HOSTS "InetDBase:Hosts"
|
||||
|
||||
#else
|
||||
|
||||
#define PATH_RESOLV_CONF "/etc/resolv.conf"
|
||||
|
@@ -30,6 +30,8 @@
|
||||
#ifdef HAVE_ARPA_NAMESER_COMPAT_H
|
||||
#include <arpa/nameser_compat.h>
|
||||
#endif
|
||||
#endif /* WIN32 && !WATT32 */
|
||||
|
||||
#ifdef HAVE_UNISTD_H
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
@@ -39,7 +41,6 @@
|
||||
#ifdef NETWARE
|
||||
#include <sys/filio.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
@@ -103,7 +104,7 @@ static void write_tcp_data(ares_channel channel, fd_set *write_fds, time_t now)
|
||||
struct iovec *vec;
|
||||
int i;
|
||||
ssize_t scount;
|
||||
int wcount;
|
||||
ssize_t wcount;
|
||||
size_t n;
|
||||
|
||||
for (i = 0; i < channel->nservers; i++)
|
||||
|
@@ -5,11 +5,11 @@
|
||||
|
||||
#define ARES_VERSION_MAJOR 1
|
||||
#define ARES_VERSION_MINOR 3
|
||||
#define ARES_VERSION_PATCH 0
|
||||
#define ARES_VERSION_PATCH 1
|
||||
#define ARES_VERSION ((ARES_VERSION_MAJOR<<16)|\
|
||||
(ARES_VERSION_MINOR<<8)|\
|
||||
(ARES_VERSION_PATCH))
|
||||
#define ARES_VERSION_STR "1.3.0"
|
||||
#define ARES_VERSION_STR "1.3.1"
|
||||
|
||||
const char *ares_version(int *version);
|
||||
|
||||
|
@@ -1,7 +1,7 @@
|
||||
#!/bin/sh
|
||||
|
||||
${LIBTOOLIZE:-libtoolize} --copy --automake --force
|
||||
${ACLOCAL:-aclocal}
|
||||
${ACLOCAL:-aclocal} $ACLOCAL_FLAGS
|
||||
${AUTOHEADER:-autoheader}
|
||||
${AUTOCONF:-autoconf}
|
||||
${AUTOMAKE:-automake} --add-missing
|
||||
|
@@ -1,3 +1,6 @@
|
||||
#ifndef __ARES_CONFIG_WIN32_H
|
||||
#define __ARES_CONFIG_WIN32_H
|
||||
|
||||
/* $Id$ */
|
||||
|
||||
/* Copyright (C) 2004 - 2005 by Daniel Stenberg et al
|
||||
@@ -13,23 +16,72 @@
|
||||
* without express or implied warranty.
|
||||
*/
|
||||
|
||||
#ifndef __CONFIG_WIN32_H
|
||||
#define __CONFIG_WIN32_H
|
||||
/* ================================================================ */
|
||||
/* ares/config-win32.h - Hand crafted config file for windows */
|
||||
/* ================================================================ */
|
||||
|
||||
/* ---------------------------------------------------------------- */
|
||||
/* HEADER FILES */
|
||||
/* ---------------------------------------------------------------- */
|
||||
|
||||
/* Define if you have the <getopt.h> header file. */
|
||||
#if defined(__MINGW32__)
|
||||
#define HAVE_GETOPT_H
|
||||
#define HAVE_GETOPT_H 1
|
||||
#endif
|
||||
|
||||
#if defined(__MINGW32__) || defined(__WATCOMC__)
|
||||
#define HAVE_UNISTD_H
|
||||
/* Define if you have the <unistd.h> header file. */
|
||||
#if defined(__MINGW32__) || defined(__WATCOMC__) || defined(__LCC__) || \
|
||||
defined(__POCC__)
|
||||
#define HAVE_UNISTD_H 1
|
||||
#endif
|
||||
|
||||
#define HAVE_AF_INET6
|
||||
#define HAVE_PF_INET6
|
||||
#define HAVE_IOCTLSOCKET
|
||||
#define HAVE_STRUCT_IN6_ADDR
|
||||
#define HAVE_STRUCT_SOCKADDR_IN6
|
||||
#define HAVE_STRUCT_ADDRINFO
|
||||
#define HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID
|
||||
/* Define if you have the <windows.h> header file. */
|
||||
#define HAVE_WINDOWS_H 1
|
||||
|
||||
#endif /* __CONFIG_WIN32_H */
|
||||
/* Define if you have the <winsock.h> header file. */
|
||||
#define HAVE_WINSOCK_H 1
|
||||
|
||||
/* Define if you have the <winsock2.h> header file. */
|
||||
#define HAVE_WINSOCK2_H 1
|
||||
|
||||
/* Define if you have the <ws2tcpip.h> header file. */
|
||||
#define HAVE_WS2TCPIP_H 1
|
||||
|
||||
/* ---------------------------------------------------------------- */
|
||||
/* FUNCTIONS */
|
||||
/* ---------------------------------------------------------------- */
|
||||
|
||||
/* Define if you have the ioctlsocket function. */
|
||||
#define HAVE_IOCTLSOCKET 1
|
||||
|
||||
/* ---------------------------------------------------------------- */
|
||||
/* STRUCT RELATED */
|
||||
/* ---------------------------------------------------------------- */
|
||||
|
||||
/* Define this if you have struct addrinfo */
|
||||
#define HAVE_STRUCT_ADDRINFO 1
|
||||
|
||||
/* Define this if you have struct sockaddr_storage */
|
||||
#define HAVE_STRUCT_SOCKADDR_STORAGE 1
|
||||
|
||||
/* ---------------------------------------------------------------- */
|
||||
/* IPV6 COMPATIBILITY */
|
||||
/* ---------------------------------------------------------------- */
|
||||
|
||||
/* Define this if you have address family AF_INET6 */
|
||||
#define HAVE_AF_INET6 1
|
||||
|
||||
/* Define this if you have protocol family PF_INET6 */
|
||||
#define HAVE_PF_INET6 1
|
||||
|
||||
/* Define this if you have struct in6_addr */
|
||||
#define HAVE_STRUCT_IN6_ADDR 1
|
||||
|
||||
/* Define this if you have struct sockaddr_in6 */
|
||||
#define HAVE_STRUCT_SOCKADDR_IN6 1
|
||||
|
||||
/* Define this if you have sockaddr_in6 with scopeid */
|
||||
#define HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID 1
|
||||
|
||||
|
||||
#endif /* __ARES_CONFIG_WIN32_H */
|
||||
|
@@ -1,5 +1,8 @@
|
||||
|
||||
dnl Process this file with autoconf to produce a configure script.
|
||||
AC_PREREQ(2.57)
|
||||
AC_INIT(ares_init.c)
|
||||
AC_CONFIG_SRCDIR([ares_ipv6.h])
|
||||
AM_CONFIG_HEADER(config.h)
|
||||
AM_MAINTAINER_MODE
|
||||
AM_INIT_AUTOMAKE(c-ares, CVS)
|
||||
@@ -13,13 +16,12 @@ solaris*)
|
||||
;;
|
||||
esac
|
||||
|
||||
# check for ssize_t
|
||||
AC_CHECK_TYPE(ssize_t, ,
|
||||
AC_DEFINE(ssize_t, int, [the signed version of size_t]))
|
||||
|
||||
AC_SEARCH_LIBS(gethostbyname, nsl)
|
||||
AC_SEARCH_LIBS(socket, socket)
|
||||
|
||||
dnl check for cygwin stuff
|
||||
AC_LIBTOOL_WIN32_DLL
|
||||
|
||||
dnl ************************************************************
|
||||
dnl Option to switch on debug options. This makes an assumption that
|
||||
dnl this is built as an 'ares' subdir in the curl source tree. Subject for
|
||||
@@ -38,9 +40,6 @@ AC_HELP_STRING([--disable-debug],[Disable debug options]),
|
||||
dnl when doing the debug stuff, use static library only
|
||||
AC_DISABLE_SHARED
|
||||
|
||||
dnl Checks for standard header files, to make memdebug.h inclusions bettter
|
||||
AC_HEADER_STDC
|
||||
|
||||
dnl the entire --enable-debug is a hack that lives and runs on top of
|
||||
dnl libcurl stuff so this BUILDING_LIBCURL is not THAT much uglier
|
||||
AC_DEFINE(BUILDING_LIBCURL, 1, [when building as static part of libcurl])
|
||||
@@ -57,8 +56,24 @@ AC_HELP_STRING([--disable-debug],[Disable debug options]),
|
||||
AC_MSG_RESULT(no)
|
||||
)
|
||||
|
||||
dnl libtool setup
|
||||
AC_PROG_LIBTOOL
|
||||
|
||||
dnl Checks for header files.
|
||||
AC_HEADER_STDC
|
||||
|
||||
dnl **********************************************************************
|
||||
dnl Make sure that our checks for headers windows.h winsock.h winsock2.h
|
||||
dnl and ws2tcpip.h take precedence over any other further checks which
|
||||
dnl could be done later using AC_CHECK_HEADER or AC_CHECK_HEADERS for
|
||||
dnl this specific header files. And do them before its results are used.
|
||||
dnl **********************************************************************
|
||||
|
||||
CURL_CHECK_HEADER_WINDOWS
|
||||
CURL_CHECK_HEADER_WINSOCK
|
||||
CURL_CHECK_HEADER_WINSOCK2
|
||||
CURL_CHECK_HEADER_WS2TCPIP
|
||||
|
||||
dnl check for a few basic system headers we need
|
||||
AC_CHECK_HEADERS(
|
||||
sys/types.h \
|
||||
@@ -67,17 +82,23 @@ AC_CHECK_HEADERS(
|
||||
sys/socket.h \
|
||||
sys/ioctl.h \
|
||||
netdb.h \
|
||||
winsock2.h \
|
||||
ws2tcpip.h \
|
||||
netinet/in.h \
|
||||
net/if.h \
|
||||
arpa/nameser.h \
|
||||
arpa/nameser_compat.h \
|
||||
arpa/inet.h, , ,
|
||||
arpa/inet.h,
|
||||
dnl to do if not found
|
||||
[],
|
||||
dnl to do if found
|
||||
[],
|
||||
dnl default includes
|
||||
[
|
||||
#ifdef HAVE_SYS_TYPES_H
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
#ifdef HAVE_SYS_TIME_H
|
||||
#include <sys/time.h>
|
||||
#endif
|
||||
dnl We do this default-include simply to make sure that the nameser_compat.h
|
||||
dnl header *REALLY* can be include after the new nameser.h. It seems AIX 5.1
|
||||
dnl (and others?) is not designed to allow this.
|
||||
@@ -89,39 +110,72 @@ 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_WINSOCK2_H
|
||||
#include <winsock2.h>
|
||||
#ifdef HAVE_NETINET_IN_H
|
||||
#include <netinet/in.h>
|
||||
#endif
|
||||
]
|
||||
)
|
||||
)
|
||||
|
||||
dnl Checks for typedefs, structures, and compiler characteristics.
|
||||
AC_C_CONST
|
||||
AC_TYPE_SIZE_T
|
||||
AC_HEADER_TIME
|
||||
|
||||
AC_CHECK_SIZEOF(curl_off_t, ,[
|
||||
#include <stdio.h>
|
||||
#include "$srcdir/include/curl/curl.h"
|
||||
])
|
||||
AC_CHECK_SIZEOF(size_t)
|
||||
AC_CHECK_SIZEOF(long)
|
||||
AC_CHECK_SIZEOF(time_t)
|
||||
|
||||
AC_CHECK_TYPE(long long,
|
||||
[AC_DEFINE(HAVE_LONGLONG, 1, [if your compiler supports long long])]
|
||||
longlong="yes"
|
||||
)
|
||||
|
||||
if test "xyes" = "x$longlong"; then
|
||||
AC_MSG_CHECKING([if numberLL works])
|
||||
AC_COMPILE_IFELSE([long long val = 1000LL;],
|
||||
[AC_DEFINE(HAVE_LL, 1, [if your compiler supports LL])]
|
||||
AC_MSG_RESULT(yes),
|
||||
AC_MSG_RESULT(no)
|
||||
)
|
||||
fi
|
||||
|
||||
|
||||
# check for ssize_t
|
||||
AC_CHECK_TYPE(ssize_t, ,
|
||||
AC_DEFINE(ssize_t, int, [the signed version of size_t]))
|
||||
|
||||
# Check for socklen_t or equivalent
|
||||
CURL_CHECK_TYPE_SOCKLEN_T
|
||||
|
||||
TYPE_IN_ADDR_T
|
||||
|
||||
TYPE_SOCKADDR_STORAGE
|
||||
|
||||
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_WINSOCK2_H
|
||||
#include <winsock2.h>
|
||||
#endif
|
||||
])
|
||||
|
||||
dnl check for AF_INET6
|
||||
CARES_CHECK_CONSTANT(
|
||||
[
|
||||
#undef inline
|
||||
#ifdef HAVE_WINDOWS_H
|
||||
#ifndef WIN32_LEAN_AND_MEAN
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#endif
|
||||
#include <windows.h>
|
||||
#ifdef HAVE_WINSOCK2_H
|
||||
#include <winsock2.h>
|
||||
#endif
|
||||
#else
|
||||
#ifdef HAVE_SYS_TYPES_H
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
#ifdef HAVE_SYS_SOCKET_H
|
||||
#include <sys/socket.h>
|
||||
#endif
|
||||
#ifdef HAVE_WINSOCK2_H
|
||||
#include <winsock2.h>
|
||||
#endif
|
||||
|
||||
], [PF_INET6],
|
||||
AC_DEFINE_UNQUOTED(HAVE_PF_INET6,1,[Define to 1 if you have PF_INET6.])
|
||||
)
|
||||
@@ -129,16 +183,23 @@ CARES_CHECK_CONSTANT(
|
||||
dnl check for PF_INET6
|
||||
CARES_CHECK_CONSTANT(
|
||||
[
|
||||
#undef inline
|
||||
#ifdef HAVE_WINDOWS_H
|
||||
#ifndef WIN32_LEAN_AND_MEAN
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#endif
|
||||
#include <windows.h>
|
||||
#ifdef HAVE_WINSOCK2_H
|
||||
#include <winsock2.h>
|
||||
#endif
|
||||
#else
|
||||
#ifdef HAVE_SYS_TYPES_H
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
#ifdef HAVE_SYS_SOCKET_H
|
||||
#include <sys/socket.h>
|
||||
#endif
|
||||
#ifdef HAVE_WINSOCK2_H
|
||||
#include <winsock2.h>
|
||||
#endif
|
||||
|
||||
], [AF_INET6],
|
||||
AC_DEFINE_UNQUOTED(HAVE_AF_INET6,1,[Define to 1 if you have AF_INET6.])
|
||||
)
|
||||
@@ -147,17 +208,25 @@ CARES_CHECK_CONSTANT(
|
||||
dnl check for the in6_addr structure
|
||||
CARES_CHECK_STRUCT(
|
||||
[
|
||||
#ifdef HAVE_SYS_TYPES_H
|
||||
#include <sys/types.h>
|
||||
#undef inline
|
||||
#ifdef HAVE_WINDOWS_H
|
||||
#ifndef WIN32_LEAN_AND_MEAN
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#endif
|
||||
#include <windows.h>
|
||||
#ifdef HAVE_WINSOCK2_H
|
||||
#include <winsock2.h>
|
||||
#endif
|
||||
#ifdef HAVE_WS2TCPIP_H
|
||||
#include <ws2tcpip.h>
|
||||
#endif
|
||||
#endif
|
||||
#else
|
||||
#ifdef HAVE_SYS_TYPES_H
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
#ifdef HAVE_NETINET_IN_H
|
||||
#include <netinet/in.h>
|
||||
#endif
|
||||
#endif
|
||||
], [in6_addr],
|
||||
AC_DEFINE_UNQUOTED(HAVE_STRUCT_IN6_ADDR,1,[Define to 1 if you have struct in6_addr.])
|
||||
@@ -166,17 +235,25 @@ CARES_CHECK_STRUCT(
|
||||
dnl check for the sockaddr_in6 structure
|
||||
CARES_CHECK_STRUCT(
|
||||
[
|
||||
#ifdef HAVE_SYS_TYPES_H
|
||||
#include <sys/types.h>
|
||||
#undef inline
|
||||
#ifdef HAVE_WINDOWS_H
|
||||
#ifndef WIN32_LEAN_AND_MEAN
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#endif
|
||||
#include <windows.h>
|
||||
#ifdef HAVE_WINSOCK2_H
|
||||
#include <winsock2.h>
|
||||
#endif
|
||||
#ifdef HAVE_WS2TCPIP_H
|
||||
#include <ws2tcpip.h>
|
||||
#endif
|
||||
#endif
|
||||
#else
|
||||
#ifdef HAVE_SYS_TYPES_H
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
#ifdef HAVE_NETINET_IN_H
|
||||
#include <netinet/in.h>
|
||||
#endif
|
||||
#endif
|
||||
], [sockaddr_in6],
|
||||
AC_DEFINE_UNQUOTED(HAVE_STRUCT_SOCKADDR_IN6,1,
|
||||
@@ -188,17 +265,25 @@ AC_CHECK_MEMBER(struct sockaddr_in6.sin6_scope_id,
|
||||
[Define to 1 if your struct sockaddr_in6 has sin6_scope_id.])
|
||||
, ,
|
||||
[
|
||||
#ifdef HAVE_SYS_TYPES_H
|
||||
#include <sys/types.h>
|
||||
#undef inline
|
||||
#ifdef HAVE_WINDOWS_H
|
||||
#ifndef WIN32_LEAN_AND_MEAN
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#endif
|
||||
#include <windows.h>
|
||||
#ifdef HAVE_WINSOCK2_H
|
||||
#include <winsock2.h>
|
||||
#endif
|
||||
#ifdef HAVE_WS2TCPIP_H
|
||||
#include <ws2tcpip.h>
|
||||
#endif
|
||||
#endif
|
||||
#else
|
||||
#ifdef HAVE_SYS_TYPES_H
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
#ifdef HAVE_NETINET_IN_H
|
||||
#include <netinet/in.h>
|
||||
#endif
|
||||
#endif
|
||||
])
|
||||
|
||||
@@ -207,15 +292,22 @@ AC_CHECK_MEMBER(struct addrinfo.ai_flags,
|
||||
AC_DEFINE_UNQUOTED(HAVE_STRUCT_ADDRINFO,1,
|
||||
[Define to 1 if you have struct addrinfo.]),,
|
||||
[
|
||||
#ifdef HAVE_SYS_TYPES_H
|
||||
#include <sys/types.h>
|
||||
#undef inline
|
||||
#ifdef HAVE_WINDOWS_H
|
||||
#ifndef WIN32_LEAN_AND_MEAN
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#endif
|
||||
#ifdef HAVE_WINSOCaK2_H
|
||||
#include <windows.h>
|
||||
#ifdef HAVE_WINSOCK2_H
|
||||
#include <winsock2.h>
|
||||
#endif
|
||||
#ifdef HAVE_WS2TCPIP_H
|
||||
#include <ws2tcpip.h>
|
||||
#endif
|
||||
#endif
|
||||
#else
|
||||
#ifdef HAVE_SYS_TYPES_H
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
#ifdef HAVE_NETINET_IN_H
|
||||
#include <netinet/in.h>
|
||||
#endif
|
||||
@@ -224,10 +316,30 @@ AC_CHECK_MEMBER(struct addrinfo.ai_flags,
|
||||
#endif
|
||||
#ifdef HAVE_NETDB_H
|
||||
#include <netdb.h>
|
||||
#endif
|
||||
#endif
|
||||
]
|
||||
)
|
||||
|
||||
|
||||
AC_CHECK_FUNCS( bitncmp \
|
||||
if_indextoname,
|
||||
dnl if found
|
||||
[],
|
||||
dnl if not found, $ac_func is the name we check for
|
||||
func="$ac_func"
|
||||
AC_MSG_CHECKING([deeper for $func])
|
||||
AC_TRY_LINK( [],
|
||||
[ $func ();],
|
||||
AC_MSG_RESULT(yes!)
|
||||
eval "ac_cv_func_$func=yes"
|
||||
def=`echo "HAVE_$func" | tr 'a-z' 'A-Z'`
|
||||
AC_DEFINE_UNQUOTED($def, 1, [If you have $func]),
|
||||
AC_MSG_RESULT(but still no)
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
dnl check for inet_pton
|
||||
AC_CHECK_FUNCS(inet_pton)
|
||||
dnl Some systems have it, but not IPv6
|
||||
@@ -241,9 +353,6 @@ AC_TRY_RUN(
|
||||
#ifdef HAVE_SYS_SOCKET_H
|
||||
#include <sys/socket.h>
|
||||
#endif
|
||||
#ifdef HAVE_WINSOCK_H
|
||||
#include <winsock.h>
|
||||
#endif
|
||||
#ifdef HAVE_NETINET_IN_H
|
||||
#include <netinet/in.h>
|
||||
#endif
|
||||
@@ -273,9 +382,6 @@ AC_TRY_RUN(
|
||||
#ifdef HAVE_SYS_SOCKET_H
|
||||
#include <sys/socket.h>
|
||||
#endif
|
||||
#ifdef HAVE_WINSOCK_H
|
||||
#include <winsock.h>
|
||||
#endif
|
||||
#ifdef HAVE_NETINET_IN_H
|
||||
#include <netinet/in.h>
|
||||
#endif
|
||||
@@ -307,9 +413,6 @@ AC_TRY_RUN(
|
||||
#ifdef HAVE_SYS_SOCKET_H
|
||||
#include <sys/socket.h>
|
||||
#endif
|
||||
#ifdef HAVE_WINSOCK_H
|
||||
#include <winsock.h>
|
||||
#endif
|
||||
#ifdef HAVE_NETINET_IN_H
|
||||
#include <netinet/in.h>
|
||||
#endif
|
||||
@@ -331,38 +434,65 @@ fi
|
||||
|
||||
AC_CHECK_SIZEOF(struct in6_addr, ,
|
||||
[
|
||||
#undef inline
|
||||
#ifdef HAVE_WINDOWS_H
|
||||
#ifndef WIN32_LEAN_AND_MEAN
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#endif
|
||||
#include <windows.h>
|
||||
#ifdef HAVE_WINSOCK2_H
|
||||
#include <winsock2.h>
|
||||
#ifdef HAVE_WS2TCPIP_H
|
||||
#include <ws2tcpip.h>
|
||||
#endif
|
||||
#endif
|
||||
#else
|
||||
#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
|
||||
#ifdef HAVE_NETINET_IN_H
|
||||
#include <netinet/in.h>
|
||||
#endif
|
||||
]
|
||||
)
|
||||
AC_CHECK_SIZEOF(struct in_addr, ,
|
||||
[
|
||||
#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
|
||||
#ifdef HAVE_NETINET_IN_H
|
||||
#include <netinet/in.h>
|
||||
#endif
|
||||
]
|
||||
)
|
||||
|
||||
AC_CHECK_FUNCS([bitncmp if_indextoname])
|
||||
AC_CHECK_SIZEOF(struct in_addr, ,
|
||||
[
|
||||
#undef inline
|
||||
#ifdef HAVE_WINDOWS_H
|
||||
#ifndef WIN32_LEAN_AND_MEAN
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#endif
|
||||
#include <windows.h>
|
||||
#ifdef HAVE_WINSOCK2_H
|
||||
#include <winsock2.h>
|
||||
#ifdef HAVE_WS2TCPIP_H
|
||||
#include <ws2tcpip.h>
|
||||
#endif
|
||||
#endif
|
||||
#else
|
||||
#ifdef HAVE_SYS_TYPES_H
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
#ifdef HAVE_SYS_SOCKET_H
|
||||
#include <sys/socket.h>
|
||||
#endif
|
||||
#ifdef HAVE_NETINET_IN_H
|
||||
#include <netinet/in.h>
|
||||
#endif
|
||||
#endif
|
||||
]
|
||||
)
|
||||
|
||||
|
||||
dnl Check if the getnameinfo function is available
|
||||
dnl and get the types of five of its arguments.
|
||||
CURL_CHECK_FUNC_GETNAMEINFO
|
||||
|
||||
|
||||
dnl God bless non-standardized functions! We need to see which getservbyport_r variant is available
|
||||
CARES_CHECK_GETSERVBYPORT_R
|
||||
|
84
ares/setup.h
84
ares/setup.h
@@ -1,5 +1,5 @@
|
||||
#ifndef ARES_SETUP_H
|
||||
#define ARES_SETUP_H
|
||||
#ifndef __ARES_SETUP_H
|
||||
#define __ARES_SETUP_H
|
||||
|
||||
/* Copyright (C) 2004 - 2005 by Daniel Stenberg et al
|
||||
*
|
||||
@@ -14,6 +14,21 @@
|
||||
* without express or implied warranty.
|
||||
*/
|
||||
|
||||
#if !defined(WIN32) && defined(__WIN32__)
|
||||
/* Borland fix */
|
||||
#define WIN32
|
||||
#endif
|
||||
|
||||
#if !defined(WIN32) && defined(_WIN32)
|
||||
/* VS2005 on x64 fix */
|
||||
#define WIN32
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Include configuration script results or hand-crafted
|
||||
* configuration file for platforms which lack config tool.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#else
|
||||
@@ -22,18 +37,56 @@
|
||||
#include "config-win32.h"
|
||||
#endif
|
||||
|
||||
/* simple work-around for now, for systems without configure support */
|
||||
#ifndef __DJGPP__
|
||||
#endif /* HAVE_CONFIG_H */
|
||||
|
||||
/*
|
||||
* Include header files for windows builds before redefining anything.
|
||||
* Use this preproessor block only to include or exclude windows.h,
|
||||
* winsock2.h, ws2tcpip.h or winsock.h. Any other windows thing belongs
|
||||
* to any other further and independant block.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_WINDOWS_H
|
||||
# ifndef WIN32_LEAN_AND_MEAN
|
||||
# define WIN32_LEAN_AND_MEAN
|
||||
# endif
|
||||
# include <windows.h>
|
||||
# ifdef HAVE_WINSOCK2_H
|
||||
# include <winsock2.h>
|
||||
# ifdef HAVE_WS2TCPIP_H
|
||||
# include <ws2tcpip.h>
|
||||
# endif
|
||||
# else
|
||||
# ifdef HAVE_WINSOCK_H
|
||||
# include <winsock.h>
|
||||
# endif
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Work-arounds for systems without configure support
|
||||
*/
|
||||
|
||||
#ifndef HAVE_CONFIG_H
|
||||
|
||||
#if defined(__DJGPP__) || (defined(__WATCOMC__) && (__WATCOMC__ >= 1240)) || \
|
||||
defined(__POCC__)
|
||||
#else
|
||||
#define ssize_t int
|
||||
#endif
|
||||
#ifndef _MSC_VER
|
||||
|
||||
#ifndef HAVE_WS2TCPIP_H
|
||||
#define socklen_t int
|
||||
#endif
|
||||
#endif /* HAVE_CONFIG_H */
|
||||
|
||||
/* Recent autoconf versions define these symbols in config.h. We don't want
|
||||
them (since they collide with the libcurl ones when we build
|
||||
--enable-debug) so we undef them again here. */
|
||||
#endif /* HAVE_CONFIG_H */
|
||||
|
||||
/*
|
||||
* Recent autoconf versions define these symbols in config.h. We don't
|
||||
* want them (since they collide with the libcurl ones when we build
|
||||
* --enable-debug) so we undef them again here.
|
||||
*/
|
||||
|
||||
#undef PACKAGE_STRING
|
||||
#undef PACKAGE_TARNAME
|
||||
#undef PACKAGE_VERSION
|
||||
@@ -42,10 +95,11 @@
|
||||
#undef VERSION
|
||||
#undef PACKAGE
|
||||
|
||||
/* now typedef our socket type */
|
||||
/*
|
||||
* Typedef our socket type
|
||||
*/
|
||||
|
||||
#if defined(WIN32) && !defined(WATT32)
|
||||
#include <winsock2.h>
|
||||
#include <ws2tcpip.h>
|
||||
typedef SOCKET ares_socket_t;
|
||||
#define ARES_SOCKET_BAD INVALID_SOCKET
|
||||
#else
|
||||
@@ -53,8 +107,10 @@ typedef int ares_socket_t;
|
||||
#define ARES_SOCKET_BAD -1
|
||||
#endif
|
||||
|
||||
/* Assume a few thing unless they're set by configure
|
||||
/*
|
||||
* Assume a few thing unless they're set by configure
|
||||
*/
|
||||
|
||||
#if !defined(HAVE_SYS_TIME_H) && !defined(_MSC_VER)
|
||||
#define HAVE_SYS_TIME_H
|
||||
#endif
|
||||
@@ -89,4 +145,4 @@ int ares_strcasecmp(const char *s1, const char *s2);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#endif /* ARES_SETUP_H */
|
||||
#endif /* __ARES_SETUP_H */
|
||||
|
51
buildconf
51
buildconf
@@ -1,4 +1,26 @@
|
||||
#!/bin/sh
|
||||
#***************************************************************************
|
||||
# _ _ ____ _
|
||||
# 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$
|
||||
###########################################################################
|
||||
|
||||
die(){
|
||||
echo "$@"
|
||||
@@ -13,6 +35,7 @@ findtool(){
|
||||
IFS=":"
|
||||
for path in $PATH
|
||||
do
|
||||
# echo "checks for $file in $path" >&2
|
||||
if test -f "$path/$file"; then
|
||||
echo "$path/$file"
|
||||
return
|
||||
@@ -85,8 +108,7 @@ fi
|
||||
|
||||
echo "buildconf: automake version $am_version (ok)"
|
||||
|
||||
ac=`findtool aclocal`
|
||||
|
||||
ac=`findtool ${ACLOCAL:-aclocal}`
|
||||
if test -z "$ac"; then
|
||||
echo "buildconf: aclocal not found. Weird automake installation!"
|
||||
exit 1
|
||||
@@ -107,11 +129,16 @@ LIBTOOL_WANTED_VERSION=1.4.2
|
||||
# glibtool, with 'libtool' being something completely different.
|
||||
libtool=`findtool glibtool 2>/dev/null`
|
||||
if test ! -x "$libtool"; then
|
||||
libtool=`findtool libtool`
|
||||
libtool=`findtool ${LIBTOOL:-libtool}`
|
||||
fi
|
||||
|
||||
# set the LIBTOOLIZE here so that glibtoolize is used if glibtool was found
|
||||
LIBTOOLIZE="${libtool}ize"
|
||||
if test -z "$LIBTOOLIZE"; then
|
||||
# set the LIBTOOLIZE here so that glibtoolize is used if glibtool was found
|
||||
# $libtool is already the full path
|
||||
libtoolize="${libtool}ize"
|
||||
else
|
||||
libtoolize=`findtool $LIBTOOLIZE`
|
||||
fi
|
||||
|
||||
lt_pversion=`$libtool --version 2>/dev/null|head -n 1|sed -e 's/^[^0-9]*//g' -e 's/[- ].*//'`
|
||||
if test -z "$lt_pversion"; then
|
||||
@@ -150,7 +177,7 @@ fi
|
||||
|
||||
echo "buildconf: libtool version $lt_version (ok)"
|
||||
|
||||
if test -f "$LIBTOOLIZE"; then
|
||||
if test -f "$libtoolize"; then
|
||||
echo "buildconf: libtoolize found"
|
||||
else
|
||||
echo "buildconf: libtoolize not found. Weird libtool installation!"
|
||||
@@ -173,14 +200,14 @@ fi
|
||||
#--------------------------------------------------------------------------
|
||||
# perl check
|
||||
#
|
||||
PERL=`findtool perl`
|
||||
PERL=`findtool ${PERL:-perl}`
|
||||
|
||||
# ------------------------------------------------------------
|
||||
|
||||
# run the correct scripts now
|
||||
|
||||
echo "buildconf: running libtoolize"
|
||||
${LIBTOOLIZE:-libtoolize} --copy --automake --force || die "The libtool command failed"
|
||||
$libtoolize --copy --automake --force || die "The libtoolize command failed"
|
||||
echo "buildconf: running aclocal"
|
||||
${ACLOCAL:-aclocal} $ACLOCAL_FLAGS || die "The aclocal command line failed"
|
||||
if test -n "$PERL"; then
|
||||
@@ -199,12 +226,8 @@ ${AUTOCONF:-autoconf} || die "The autoconf command failed"
|
||||
|
||||
if test -d ares; then
|
||||
cd ares
|
||||
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"
|
||||
echo "buildconf: running ares/autoconf"
|
||||
${AUTOCONF:-autoconf} || die "The ares autoconf command failed"
|
||||
echo "buildconf: running in ares"
|
||||
./buildconf
|
||||
cd ..
|
||||
fi
|
||||
|
||||
|
116
configure.ac
116
configure.ac
@@ -1,4 +1,25 @@
|
||||
dnl $Id$
|
||||
#***************************************************************************
|
||||
# _ _ ____ _
|
||||
# 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$
|
||||
###########################################################################
|
||||
dnl Process this file with autoconf to produce a configure script.
|
||||
|
||||
AC_PREREQ(2.57)
|
||||
@@ -140,6 +161,19 @@ dnl The install stuff has already been taken care of by the automake stuff
|
||||
dnl AC_PROG_INSTALL
|
||||
AC_PROG_MAKE_SET
|
||||
|
||||
dnl **********************************************************************
|
||||
dnl Make sure that our checks for headers windows.h winsock.h winsock2.h
|
||||
dnl and ws2tcpip.h take precedence over any other further checks which
|
||||
dnl could be done later using AC_CHECK_HEADER or AC_CHECK_HEADERS for
|
||||
dnl this specific header files. And do them before its results are used.
|
||||
dnl **********************************************************************
|
||||
|
||||
CURL_CHECK_HEADER_WINDOWS
|
||||
CURL_CHECK_HEADER_WINSOCK
|
||||
CURL_CHECK_HEADER_WINSOCK2
|
||||
CURL_CHECK_HEADER_WS2TCPIP
|
||||
|
||||
|
||||
dnl ************************************************************
|
||||
dnl switch off particular protocols
|
||||
dnl
|
||||
@@ -151,10 +185,8 @@ AC_HELP_STRING([--disable-http],[Disable HTTP support]),
|
||||
no)
|
||||
AC_MSG_RESULT(no)
|
||||
AC_DEFINE(CURL_DISABLE_HTTP, 1, [to disable HTTP])
|
||||
AC_MSG_WARN([disable HTTP disables FTP over proxy and GOPHER too])
|
||||
AC_DEFINE(CURL_DISABLE_GOPHER, 1, [to disable GOPHER])
|
||||
AC_MSG_WARN([disable HTTP disables FTP over proxy])
|
||||
AC_SUBST(CURL_DISABLE_HTTP, [1])
|
||||
AC_SUBST(CURL_DISABLE_GOPHER, [1])
|
||||
;;
|
||||
*) AC_MSG_RESULT(yes)
|
||||
;;
|
||||
@@ -176,21 +208,6 @@ AC_HELP_STRING([--disable-ftp],[Disable FTP support]),
|
||||
esac ],
|
||||
AC_MSG_RESULT(yes)
|
||||
)
|
||||
AC_MSG_CHECKING([whether to support gopher])
|
||||
AC_ARG_ENABLE(gopher,
|
||||
AC_HELP_STRING([--enable-gopher],[Enable GOPHER support])
|
||||
AC_HELP_STRING([--disable-gopher],[Disable GOPHER support]),
|
||||
[ case "$enableval" in
|
||||
no)
|
||||
AC_MSG_RESULT(no)
|
||||
AC_DEFINE(CURL_DISABLE_GOPHER, 1, [to disable GOPHER])
|
||||
AC_SUBST(CURL_DISABLE_GOPHER, [1])
|
||||
;;
|
||||
*) AC_MSG_RESULT(yes)
|
||||
;;
|
||||
esac ],
|
||||
AC_MSG_RESULT(yes)
|
||||
)
|
||||
AC_MSG_CHECKING([whether to support file])
|
||||
AC_ARG_ENABLE(file,
|
||||
AC_HELP_STRING([--enable-file],[Enable FILE support])
|
||||
@@ -289,7 +306,6 @@ AC_HELP_STRING([--disable-manual],[Disable built-in manual]),
|
||||
dnl The actual use of the USE_MANUAL variable is done much later in this
|
||||
dnl script to allow other actions to disable it as well.
|
||||
|
||||
|
||||
dnl **********************************************************************
|
||||
dnl Checks for libraries.
|
||||
dnl **********************************************************************
|
||||
@@ -795,7 +811,7 @@ OPT_SSL=off
|
||||
dnl Default to no CA bundle
|
||||
ca="no"
|
||||
AC_ARG_WITH(ssl,dnl
|
||||
AC_HELP_STRING([--with-ssl=PATH],[where to look for SSL, PATH points to the SSL installation (default: /usr/local/ssl)])
|
||||
AC_HELP_STRING([--with-ssl=PATH],[Where to look for OpenSSL, PATH points to the SSL installation (default: /usr/local/ssl); when possible, set the PKG_CONFIG_PATH environment variable instead of using this option])
|
||||
AC_HELP_STRING([--without-ssl], [disable SSL]),
|
||||
OPT_SSL=$withval)
|
||||
|
||||
@@ -1047,10 +1063,10 @@ if test "$OPENSSL_ENABLED" != "1"; then
|
||||
fi
|
||||
if test -n "$addlib"; then
|
||||
|
||||
CLEANLDFLAGS="$LDFLAGS"
|
||||
CLEANLIBS="$LIBS"
|
||||
CLEANCPPFLAGS="$CPPFLAGS"
|
||||
|
||||
LDFLAGS="$LDFLAGS $addlib"
|
||||
LIBS="$LIBS $addlib"
|
||||
if test "$addcflags" != "-I/usr/include"; then
|
||||
CPPFLAGS="$CPPFLAGS $addcflags"
|
||||
fi
|
||||
@@ -1063,7 +1079,7 @@ if test "$OPENSSL_ENABLED" != "1"; then
|
||||
curl_ssl_msg="enabled (GnuTLS)"
|
||||
],
|
||||
[
|
||||
LDFLAGS="$CLEANLDFLAGS"
|
||||
LIBS="$CLEANLIBS"
|
||||
CPPFLAGS="$CLEANCPPFLAGS"
|
||||
])
|
||||
|
||||
@@ -1288,8 +1304,8 @@ AC_HELP_STRING([--enable-thread],[look for thread-safe functions]),
|
||||
|
||||
if test X"$OPT_THREAD" = Xoff
|
||||
then
|
||||
AC_DEFINE(DISABLED_THREADSAFE, 1, \
|
||||
Set to explicitly specify we don't want to use thread-safe functions)
|
||||
AC_DEFINE(DISABLED_THREADSAFE, 1,
|
||||
[Set to explicitly specify we don't want to use thread-safe functions])
|
||||
else
|
||||
if test "$ipv6" != "yes"; then
|
||||
dnl dig around for gethostbyname_r()
|
||||
@@ -1395,7 +1411,8 @@ dnl **********************************************************************
|
||||
dnl Checks for header files.
|
||||
AC_HEADER_STDC
|
||||
|
||||
dnl First check for the very most basic headers. Then we can use these
|
||||
|
||||
dnl Now check for the very most basic headers. Then we can use these
|
||||
dnl ones as default-headers when checking for the rest!
|
||||
AC_CHECK_HEADERS(
|
||||
sys/types.h \
|
||||
@@ -1422,8 +1439,6 @@ AC_CHECK_HEADERS(
|
||||
fcntl.h \
|
||||
dlfcn.h \
|
||||
alloca.h \
|
||||
winsock.h \
|
||||
winsock2.h \
|
||||
time.h \
|
||||
io.h \
|
||||
pwd.h \
|
||||
@@ -1493,7 +1508,9 @@ fi
|
||||
AC_CHECK_TYPE(ssize_t, ,
|
||||
AC_DEFINE(ssize_t, int, [the signed version of size_t]))
|
||||
|
||||
TYPE_SOCKLEN_T
|
||||
# Check for socklen_t or equivalent
|
||||
CURL_CHECK_TYPE_SOCKLEN_T
|
||||
|
||||
TYPE_IN_ADDR_T
|
||||
|
||||
TYPE_SOCKADDR_STORAGE
|
||||
@@ -1565,16 +1582,33 @@ fi
|
||||
|
||||
dnl For some reason, the check above doesn't properly detect select() with
|
||||
dnl Msys/Mingw
|
||||
if test "$ac_cv_func_select" != "yes"; then
|
||||
if test "$ac_cv_func_select" = "no"; then
|
||||
AC_MSG_CHECKING([for select in ws2_32])
|
||||
AC_TRY_LINK([#include <winsock2.h>],
|
||||
[select(0,(fd_set *)NULL,(fd_set *)NULL,(fd_set *)NULL,(struct timeval *)NULL);],
|
||||
[ dnl worked!
|
||||
AC_MSG_RESULT([yes])
|
||||
HAVE_SELECT="1"
|
||||
AC_DEFINE_UNQUOTED(HAVE_SELECT,1)],
|
||||
[AC_MSG_ERROR(You can't compile without a select)]
|
||||
)
|
||||
AC_TRY_LINK([
|
||||
#undef inline
|
||||
#ifdef HAVE_WINDOWS_H
|
||||
#ifndef WIN32_LEAN_AND_MEAN
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#endif
|
||||
#include <windows.h>
|
||||
#ifdef HAVE_WINSOCK2_H
|
||||
#include <winsock2.h>
|
||||
#else
|
||||
#ifdef HAVE_WINSOCK_H
|
||||
#include <winsock.h>
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
],[
|
||||
select(0,(fd_set *)NULL,(fd_set *)NULL,(fd_set *)NULL,(struct timeval *)NULL);
|
||||
],[
|
||||
AC_MSG_RESULT([yes])
|
||||
HAVE_SELECT="1"
|
||||
AC_DEFINE_UNQUOTED(HAVE_SELECT, 1,
|
||||
[Define to 1 if you have the select function.])
|
||||
],[
|
||||
AC_MSG_ERROR([You can't compile without a select])
|
||||
])
|
||||
fi
|
||||
|
||||
dnl sigsetjmp() might be a macro and no function so if it isn't found already
|
||||
@@ -1613,6 +1647,10 @@ AC_CHECK_DECL(inet_pton, ,
|
||||
]
|
||||
)
|
||||
|
||||
dnl Check if the getnameinfo function is available
|
||||
dnl and get the types of five of its arguments.
|
||||
CURL_CHECK_FUNC_GETNAMEINFO
|
||||
|
||||
AC_MSG_CHECKING([if we are Mac OS X (to disable poll)])
|
||||
disable_poll=no
|
||||
case $host in
|
||||
|
@@ -101,9 +101,6 @@ while test $# -gt 0; do
|
||||
echo "FTPS"
|
||||
fi
|
||||
fi
|
||||
if test "@CURL_DISABLE_GOPHER@" != "1"; then
|
||||
echo "GOPHER"
|
||||
fi
|
||||
if test "@CURL_DISABLE_FILE@" != "1"; then
|
||||
echo "FILE"
|
||||
fi
|
||||
|
5
docs/FAQ
5
docs/FAQ
@@ -114,7 +114,7 @@ FAQ
|
||||
libcurl
|
||||
|
||||
A free and easy-to-use client-side URL transfer library, supporting FTP,
|
||||
FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE and LDAP. libcurl supports
|
||||
FTPS, HTTP, HTTPS, TELNET, DICT, FILE and LDAP. libcurl supports
|
||||
HTTPS certificates, HTTP POST, HTTP PUT, FTP uploading, kerberos, HTTP
|
||||
form based upload, proxies, cookies, user+password authentication, file
|
||||
transfer resume, http proxy tunneling and more!
|
||||
@@ -132,8 +132,7 @@ FAQ
|
||||
A command line tool for getting or sending files using URL syntax.
|
||||
|
||||
Since curl uses libcurl, it supports a range of common Internet protocols,
|
||||
currently including HTTP, HTTPS, FTP, FTPS, GOPHER, LDAP, DICT, TELNET and
|
||||
FILE.
|
||||
currently including HTTP, HTTPS, FTP, FTPS, LDAP, DICT, TELNET and FILE.
|
||||
|
||||
We pronounce curl and cURL with an initial k sound: [kurl].
|
||||
|
||||
|
@@ -109,10 +109,6 @@ LDAP (*2)
|
||||
DICT
|
||||
- extended DICT URL support
|
||||
|
||||
GOPHER
|
||||
- GET
|
||||
- via http-proxy
|
||||
|
||||
FILE
|
||||
- URL support
|
||||
- "uploads"
|
||||
|
@@ -260,7 +260,6 @@ Win32
|
||||
CURL_DISABLE_TELNET disables TELNET
|
||||
CURL_DISABLE_DICT disables DICT
|
||||
CURL_DISABLE_FILE disables FILE
|
||||
CURL_DISABLE_GOPHER disables GOPHER
|
||||
|
||||
If you want to set any of these defines you have the following
|
||||
possibilities:
|
||||
|
@@ -3,6 +3,33 @@ join in and help us correct one or more of these! Also be sure to check the
|
||||
changelog of the current development status, as one or more of these problems
|
||||
may have been fixed since this was written!
|
||||
|
||||
33. Doing FTP upload and specifying a URL that ends with a slash will cause
|
||||
a filed named "(nil)" get created. The proper fix should most likely be to
|
||||
reject the upload early since there's no target file name specified.
|
||||
|
||||
32. (At least on Windows) If libcurl is built with c-ares and there's no DNS
|
||||
server configured in the system, the ares_init() call fails and thus
|
||||
curl_easy_init() fails as well. This causes weird effects for people who use
|
||||
numerical IP addresses only.
|
||||
|
||||
31. "curl-config --libs" will include details set in LDFLAGS when configure is
|
||||
run that might be needed only for building libcurl. Similarly, it might
|
||||
include options that perhaps aren't suitable both for static and dynamic
|
||||
linking. Further, curl-config --cflags suffers from the same effects with
|
||||
CFLAGS/CPPFLAGS.
|
||||
|
||||
30. You need to use -g to the command line tool in order to use RFC2732-style
|
||||
IPv6 numerical addresses in URLs.
|
||||
|
||||
29. IPv6 URLs with zone ID is not supported.
|
||||
http://www.ietf.org/internet-drafts/draft-fenner-literal-zone-02.txt
|
||||
specifies the use of a plus sign instead of a percent when specifying zone
|
||||
IDs in URLs to get around the problem of percent signs being
|
||||
special. According to the reporter, Firefox deals with the URL _with_ a
|
||||
percent letter (which seems like a blatant URL spec violation).
|
||||
|
||||
See http://curl.haxx.se/bug/view.cgi?id=1371118
|
||||
|
||||
28. The TFTP code is not portable and will fail on some architectures.
|
||||
|
||||
26. NTLM authentication using SSPI (on Windows) when (lib)curl is running in
|
||||
@@ -23,7 +50,9 @@ may have been fixed since this was written!
|
||||
|
||||
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.
|
||||
bugs and lack of features when a SOCKS proxy is used. And there seem to be a
|
||||
problem with SOCKS when doing FTP: See
|
||||
http://curl.haxx.se/bug/view.cgi?id=1371540
|
||||
|
||||
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
|
||||
@@ -43,9 +72,6 @@ may have been fixed since this was written!
|
||||
19. FTP 3rd party transfers with the multi interface doesn't work. Test:
|
||||
define CURL_MULTIEASY, rebuild curl, run test case 230 - 232.
|
||||
|
||||
18. test case 57 has </test> that should be </client> but when corrected, the
|
||||
test case fails!
|
||||
|
||||
16. FTP URLs passed to curl may contain NUL (0x00) in the RFC 1738 <user>,
|
||||
<password>, and <fpath> components, encoded as "%00". The problem is that
|
||||
curl_unescape does not detect this, but instead returns a shortened C
|
||||
@@ -103,8 +129,6 @@ may have been fixed since this was written!
|
||||
libcurl thinks of it as the *compressed* length. Some explanations are here:
|
||||
http://curl.haxx.se/mail/lib-2003-06/0146.html
|
||||
|
||||
3. GOPHER transfers seem broken
|
||||
|
||||
2. If a HTTP server responds to a HEAD request and includes a body (thus
|
||||
violating the RFC2616), curl won't wait to read the response but just stop
|
||||
reading and return back. If a second request (let's assume a GET) is then
|
||||
|
@@ -56,9 +56,9 @@ krb4
|
||||
|
||||
While nothing in particular says that a Kerberos4 library must use any
|
||||
particular license, the one I've tried and used successfully so far
|
||||
(kth-krb4) is Original BSD-licensed with the announcement clause. Some
|
||||
of the code in libcurl that is written to deal with Kerberos4 likewise
|
||||
have such a license.
|
||||
(kth-krb4) is partly Original BSD-licensed with the announcement
|
||||
clause. Some of the code in libcurl that is written to deal with
|
||||
Kerberos4 is Modified BSD-licensed.
|
||||
|
||||
MIT Kerberos http://web.mit.edu/kerberos/www/dist/
|
||||
|
||||
|
10
docs/MANUAL
10
docs/MANUAL
@@ -23,10 +23,6 @@ SIMPLE USAGE
|
||||
|
||||
curl ftp://cool.haxx.se/
|
||||
|
||||
Get a gopher document from funet's gopher server:
|
||||
|
||||
curl gopher://gopher.funet.fi
|
||||
|
||||
Get the definition of curl from a dictionary:
|
||||
|
||||
curl dict://dict.org/m:curl
|
||||
@@ -94,10 +90,6 @@ USING PASSWORDS
|
||||
|
||||
Probably most commonly used with private certificates, as explained below.
|
||||
|
||||
GOPHER
|
||||
|
||||
Curl features no password support for gopher.
|
||||
|
||||
PROXY
|
||||
|
||||
Get an ftp file using a proxy named my-proxy that uses port 888:
|
||||
@@ -748,7 +740,7 @@ ENVIRONMENT VARIABLES
|
||||
|
||||
Curl reads and understands the following environment variables:
|
||||
|
||||
http_proxy, HTTPS_PROXY, FTP_PROXY, GOPHER_PROXY
|
||||
http_proxy, HTTPS_PROXY, FTP_PROXY
|
||||
|
||||
They should be set for protocol-specific proxies. General proxy should be
|
||||
set with
|
||||
|
17
docs/THANKS
17
docs/THANKS
@@ -16,6 +16,7 @@ Alexander Kourakos
|
||||
Alexander Krasnostavsky
|
||||
Alexander Zhuravlev
|
||||
Alexis Carvalho
|
||||
Amol Pattekar
|
||||
Andi Jahja
|
||||
Andreas Damm
|
||||
Andreas Olsson
|
||||
@@ -41,11 +42,11 @@ Bjorn Reese
|
||||
Bj<EFBFBD>rn Stenberg
|
||||
Bob Schader
|
||||
Brad Burdick
|
||||
Bradford Bruce
|
||||
Brent Beardsley
|
||||
Brian Akins
|
||||
Brian R Duffy
|
||||
Bruce Mitchener
|
||||
Bryan Henderson
|
||||
Bryan Henderson
|
||||
Bryan Kemp
|
||||
Caolan McNamara
|
||||
@@ -91,6 +92,7 @@ David Hull
|
||||
David J Meyer
|
||||
David James
|
||||
David Kimdon
|
||||
David Lang
|
||||
David LeBlanc
|
||||
David Odin
|
||||
David Phillips
|
||||
@@ -100,6 +102,7 @@ David Thiel
|
||||
David Yan
|
||||
Detlef Schmier
|
||||
Diego Casorran
|
||||
Dima Barsky
|
||||
Dimitris Sarris
|
||||
Dinar
|
||||
Dirk Eddelbuettel
|
||||
@@ -131,6 +134,7 @@ Eric Young
|
||||
Erick Nuwendam
|
||||
Erwan Legrand
|
||||
Erwin Authried
|
||||
Eugene Kotlyarov
|
||||
Evan Jordan
|
||||
Fabrizio Ammollo
|
||||
Fedor Karpelevitch
|
||||
@@ -191,8 +195,11 @@ James Gallagher
|
||||
James Griffiths
|
||||
James MacMillan
|
||||
Jamie Lokier
|
||||
Jamie Newton
|
||||
Jamie Wilkinson
|
||||
Jan Kunder
|
||||
Jason S. Priebe
|
||||
Jaz Fresh
|
||||
Jean-Claude Chauve
|
||||
Jean-Louis Lemaire
|
||||
Jean-Marc Ranger
|
||||
@@ -321,8 +328,10 @@ Nicolas Croiset
|
||||
Nicolas Fran<61>ois
|
||||
Niels van Tongeren
|
||||
Nikita Schmidt
|
||||
Nis Jorgensen
|
||||
Nodak Sodak
|
||||
Norbert Novotny
|
||||
Ofer
|
||||
Oren Tirosh
|
||||
P R Schaffner
|
||||
Patrick Bihan-Faou
|
||||
@@ -350,6 +359,7 @@ Philippe Hameau
|
||||
Philippe Raoult
|
||||
Pierre
|
||||
Puneet Pawaia
|
||||
Quagmire
|
||||
Rafael Sagula
|
||||
Ralph Beckmann
|
||||
Ralph Mitchell
|
||||
@@ -405,6 +415,7 @@ Simon Josefsson
|
||||
Simon Liu
|
||||
Spiridonoff A.V
|
||||
Stadler Stephan
|
||||
Stefan Esser
|
||||
Stefan Ulrich
|
||||
Stephan Bergmann
|
||||
Stephen Kick
|
||||
@@ -421,6 +432,7 @@ Sven Neuhaus
|
||||
S<EFBFBD>bastien Willemijns
|
||||
T. Bharath
|
||||
T. Yamada
|
||||
Temprimus
|
||||
Thomas Schwinge
|
||||
Thomas Tonino
|
||||
Tim Baker
|
||||
@@ -447,6 +459,7 @@ Troels Walsted Hansen
|
||||
Troy Engel
|
||||
Tupone Alfredo
|
||||
Ulrich Zadow
|
||||
Vilmos Nebehaj
|
||||
Vincent Bronner
|
||||
Vincent Penquerc'h
|
||||
Vincent Sanders
|
||||
@@ -459,7 +472,9 @@ Wesley Laxton
|
||||
Wez Furlong
|
||||
Wilfredo Sanchez
|
||||
Wojciech Zwiefka
|
||||
Yang Tse
|
||||
Yarram Sunil
|
||||
Zvi Har'El
|
||||
nk
|
||||
swalkaus at yahoo.com
|
||||
tommink[at]post.pl
|
||||
|
19
docs/TODO
19
docs/TODO
@@ -43,6 +43,25 @@ TODO
|
||||
* Add option that changes the interval in which the progress callback is
|
||||
called at most.
|
||||
|
||||
* Make libcurl built with c-ares use c-ares' IPv6 abilities. They weren't
|
||||
present when we first added c-ares support but they have been added since!
|
||||
When this is done and works, we can actually start considering making c-ares
|
||||
powered libcurl the default build (which of course would require that we'd
|
||||
bundle the c-ares source code in the libcurl source code releases).
|
||||
|
||||
* Support CONNECT 407 responses that kill the connection and expect the
|
||||
client to reconnect to complete the authentication. Currently libcurl
|
||||
assumes that a proxy connection will be kept alive.
|
||||
|
||||
* Make the curl/*.h headers include the proper system includes based on what
|
||||
was present at the time when configure was run. Currently, the sys/select.h
|
||||
header is for example included by curl/multi.h only on specific platforms
|
||||
we know MUST have it. This is error-prone. We therefore want the header
|
||||
files to adapt to configure results. Those results must be stored in a new
|
||||
header and they must use a curl name space, i.e not be HAVE_* prefix (as
|
||||
that would risk collide with other apps that use libcurl and that runs
|
||||
configure).
|
||||
|
||||
LIBCURL - multi interface
|
||||
|
||||
* Add a curl_multi_fdset() alternative. this allows apps to avoid the
|
||||
|
@@ -53,10 +53,10 @@ in $prefix/lib and its header files are installed in $prefix/include and so
|
||||
on. The prefix is set with "configure --prefix".
|
||||
.IP "--protocols"
|
||||
Lists what particular protocols the installed libcurl was built to support. At
|
||||
the time of writing, this list may include HTTP, HTTPS, FTP, FTPS, GOPHER,
|
||||
FILE, TELNET, LDAP, DICT. Do not assume any particular order. The protocols
|
||||
will be listed using uppercase and are separated by newlines. There may be
|
||||
none, one or several protocols in the list. (Added in 7.13.0)
|
||||
the time of writing, this list may include HTTP, HTTPS, FTP, FTPS, FILE,
|
||||
TELNET, LDAP, DICT. Do not assume any particular order. The protocols will
|
||||
be listed using uppercase and are separated by newlines. There may be none,
|
||||
one or several protocols in the list. (Added in 7.13.0)
|
||||
.IP "--version"
|
||||
Outputs version information about the installed libcurl.
|
||||
.IP "--vernum"
|
||||
|
138
docs/curl.1
138
docs/curl.1
@@ -5,7 +5,7 @@
|
||||
.\" * | (__| |_| | _ <| |___
|
||||
.\" * \___|\___/|_| \_\_____|
|
||||
.\" *
|
||||
.\" * Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
.\" * Copyright (C) 1998 - 2006, 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
|
||||
@@ -21,7 +21,7 @@
|
||||
.\" * $Id$
|
||||
.\" **************************************************************************
|
||||
.\"
|
||||
.TH curl 1 "24 Nov 2005" "Curl 7.15.1" "Curl Manual"
|
||||
.TH curl 1 "21 Feb 2006" "Curl 7.15.2" "Curl Manual"
|
||||
.SH NAME
|
||||
curl \- transfer a URL
|
||||
.SH SYNOPSIS
|
||||
@@ -30,8 +30,8 @@ curl \- transfer a URL
|
||||
.SH DESCRIPTION
|
||||
.B curl
|
||||
is a tool to transfer data from or to a server, using one of the supported
|
||||
protocols (HTTP, HTTPS, FTP, FTPS, TFTP, GOPHER, DICT, TELNET, LDAP or
|
||||
FILE). The command is designed to work without user interaction.
|
||||
protocols (HTTP, HTTPS, FTP, FTPS, TFTP, DICT, TELNET, LDAP or FILE).
|
||||
The command is designed to work without user interaction.
|
||||
|
||||
curl offers a busload of useful tricks like proxy support, user
|
||||
authentication, ftp upload, HTTP post, SSL (https:) connections, cookies, file
|
||||
@@ -100,7 +100,7 @@ most secure one the remote site claims it supports. This is done by first
|
||||
doing a request and checking the response-headers, thus inducing an extra
|
||||
network round-trip. This is used instead of setting a specific authentication
|
||||
method, which you can do with \fI--basic\fP, \fI--digest\fP, \fI--ntlm\fP, and
|
||||
\fI--negotiate\fP. (Added in 7.10.6)
|
||||
\fI--negotiate\fP.
|
||||
|
||||
Note that using --anyauth is not recommended if you do uploads from stdin,
|
||||
since it may require data to be sent twice and then the client must be able to
|
||||
@@ -140,7 +140,7 @@ If this option is used twice, the second one will disable ASCII usage.
|
||||
(HTTP) Tells curl to use HTTP Basic authentication. This is the default and
|
||||
this option is usually pointless, unless you use it to override a previously
|
||||
set option that sets a different authentication method (such as \fI--ntlm\fP,
|
||||
\fI--digest\fP and \fI--negotiate\fP). (Added in 7.10.6)
|
||||
\fI--digest\fP and \fI--negotiate\fP).
|
||||
|
||||
If this option is used several times, the following occurrences make no
|
||||
difference.
|
||||
@@ -198,7 +198,8 @@ To create remote directories when using FTP, try \fI--ftp-create-dirs\fP.
|
||||
.IP "--crlf"
|
||||
(FTP) Convert LF to CRLF in upload. Useful for MVS (OS/390).
|
||||
|
||||
If this option is used twice, the second will again disable crlf converting.
|
||||
If this option is used several times, the following occurrences make no
|
||||
difference.
|
||||
.IP "-d/--data <data>"
|
||||
(HTTP) Sends the specified data in a POST request to the HTTP server, in a way
|
||||
that can emulate as if a user has filled in a HTML form and pressed the submit
|
||||
@@ -242,7 +243,7 @@ append data.
|
||||
prevents the password from being sent over the wire in clear text. Use this in
|
||||
combination with the normal \fI-u/--user\fP option to set user name and
|
||||
password. See also \fI--ntlm\fP, \fI--negotiate\fP and \fI--anyauth\fP for
|
||||
related options. (Added in curl 7.10.6)
|
||||
related options.
|
||||
|
||||
If this option is used several times, the following occurrences make no
|
||||
difference.
|
||||
@@ -252,7 +253,7 @@ active FTP transfers. Curl will normally always first attempt to use EPRT,
|
||||
then LPRT before using PORT, but with this option, it will use PORT right
|
||||
away. EPRT and LPRT are extensions to the original FTP protocol, may not work
|
||||
on all servers but enable more functionality in a better way than the
|
||||
traditional PORT command. (Added in 7.10.5)
|
||||
traditional PORT command.
|
||||
|
||||
If this option is used several times, each occurrence will toggle this on/off.
|
||||
.IP "--disable-epsv"
|
||||
@@ -276,9 +277,9 @@ If this option is used several times, the last one will be used.
|
||||
.IP "-e/--referer <URL>"
|
||||
(HTTP) Sends the "Referer Page" information to the HTTP server. This can also
|
||||
be set with the \fI-H/--header\fP flag of course. When used with
|
||||
\fI-L/--location\fP you can append ";auto" to the referer URL to make curl
|
||||
\fI-L/--location\fP you can append ";auto" to the --referer URL to make curl
|
||||
automatically set the previous URL when it follows a Location: header. The
|
||||
\&";auto" string can be used alone, even if you don't set an initial referer.
|
||||
\&";auto" string can be used alone, even if you don't set an initial --referer.
|
||||
|
||||
If this option is used several times, the last one will be used.
|
||||
.IP "--engine <name>"
|
||||
@@ -350,15 +351,17 @@ If this option is used twice, the second will override the previous use.
|
||||
.IP "--ftp-create-dirs"
|
||||
(FTP) When an FTP URL/operation uses a path that doesn't currently exist on
|
||||
the server, the standard behavior of curl is to fail. Using this option, curl
|
||||
will instead attempt to create missing directories. (Added in 7.10.7)
|
||||
will instead attempt to create missing directories.
|
||||
|
||||
If this option is used twice, the second will again disable silent failure.
|
||||
If this option is used twice, the second will again disable directory creation.
|
||||
.IP "--ftp-pasv"
|
||||
(FTP) Use PASV when transferring. PASV is the internal default behavior, but
|
||||
using this option can be used to override a previous --ftp-port option. (Added
|
||||
in 7.11.0)
|
||||
|
||||
If this option is used twice, the second will again disable silent failure.
|
||||
If this option is used several times, the following occurrences make no
|
||||
difference.
|
||||
|
||||
.IP "--ftp-skip-pasv-ip"
|
||||
(FTP) Tell curl to not use the IP address the server suggests in its response
|
||||
to curl's PASV command when curl connects the data connection. Instead curl
|
||||
@@ -367,7 +370,8 @@ connection. (Added in 7.14.2)
|
||||
|
||||
This option has no effect if PORT, EPRT or EPSV is used instead of PASV.
|
||||
|
||||
If this option is used twice, the second will again disable silent failure.
|
||||
If this option is used twice, the second will again use the server's suggested
|
||||
address.
|
||||
.IP "--ftp-ssl"
|
||||
(FTP) Make the FTP connection switch to use SSL/TLS. (Added in 7.11.0)
|
||||
|
||||
@@ -428,7 +432,8 @@ with a '?' separator.
|
||||
If used in combination with -I, the POST data will instead be appended to the
|
||||
URL with a HEAD request.
|
||||
|
||||
If used multiple times, nothing special happens.
|
||||
If this option is used several times, the following occurrences make no
|
||||
difference.
|
||||
.IP "-h/--help"
|
||||
Usage help.
|
||||
.IP "-H/--header <header>"
|
||||
@@ -479,15 +484,14 @@ If this option is used twice, the second will again disable header only.
|
||||
(HTTP) When curl is told to read cookies from a given file, this option will
|
||||
make it discard all "session cookies". This will basically have the same effect
|
||||
as if a new session is started. Typical browsers always discard session
|
||||
cookies when they're closed down. (Added in 7.9.7)
|
||||
cookies when they're closed down.
|
||||
|
||||
If this option is used several times, each occurrence will toggle this on/off.
|
||||
.IP "-k/--insecure"
|
||||
(SSL) This option explicitly allows curl to perform "insecure" SSL connections
|
||||
and transfers. Starting with curl 7.10, all SSL connections will be attempted
|
||||
to be made secure by using the CA certificate bundle installed by
|
||||
default. This makes all connections considered "insecure" to fail unless
|
||||
\fI-k/--insecure\fP is used.
|
||||
and transfers. All SSL connections are attempted to be made secure by using
|
||||
the CA certificate bundle installed by default. This makes all connections
|
||||
considered "insecure" to fail unless \fI-k/--insecure\fP is used.
|
||||
|
||||
If this option is used twice, the second time will again disable it.
|
||||
.IP "--key <key>"
|
||||
@@ -514,7 +518,7 @@ Specify which config file to read curl arguments from. The config file is a
|
||||
text file in which command line arguments can be written which then will be
|
||||
used as if they were written on the actual command line. Options and their
|
||||
parameters must be specified on the same config file line. If the parameter is
|
||||
to contain white spaces, the parameter must be inclosed within quotes. If the
|
||||
to contain white spaces, the parameter must be enclosed within quotes. If the
|
||||
first column of a config line is a '#' character, the rest of the line will be
|
||||
treated as a comment.
|
||||
|
||||
@@ -554,8 +558,6 @@ If you are also using the \fI-Y/--speed-limit\fP option, that option will take
|
||||
precedence and might cripple the rate-limiting slightly, to help keeping the
|
||||
speed-limit logic working.
|
||||
|
||||
This option was introduced in curl 7.10.
|
||||
|
||||
If this option is used several times, the last one will be used.
|
||||
.IP "-l/--list-only"
|
||||
(FTP)
|
||||
@@ -569,15 +571,21 @@ list only files in their response to NLST; they do not include
|
||||
subdirectories and symbolic links.
|
||||
|
||||
If this option is used twice, the second will again disable list only.
|
||||
.IP "--local-port <num>[-num]"
|
||||
Set a prefered number or range of local port numbers to use for the
|
||||
connection(s). Note that port numbers by nature is a scarce resource that
|
||||
will be busy at times so setting this range to something too narrow might
|
||||
cause unnecessary connection setup failures. (Added in 7.15.2)
|
||||
.IP "-L/--location"
|
||||
(HTTP/HTTPS) If the server reports that the requested page has a different
|
||||
location (indicated with the header line Location:) this flag will let curl
|
||||
attempt to reattempt the get on the new place. If used together with
|
||||
\fI-i/--include\fP or \fI-I/--head\fP, headers from all requested pages will
|
||||
be shown. If authentication is used, curl will only send its credentials to
|
||||
the initial host, so if a redirect takes curl to a different host, it won't
|
||||
intercept the user+password. See also \fI--location-trusted\fP on how to
|
||||
change this.
|
||||
(HTTP/HTTPS) If the server reports that the requested page has moved to a
|
||||
different location (indicated with a Location: header and a 3XX response code)
|
||||
this option will make curl redo the request on the new place. If used together
|
||||
with \fI-i/--include\fP or \fI-I/--head\fP, headers from all requested pages
|
||||
will be shown. When authentication is used, curl only sends its credentials to
|
||||
the initial host. If a redirect takes curl to a different host, it won't be
|
||||
able to intercept the user+password. See also \fI--location-trusted\fP on how
|
||||
to change this. You can limit the amount of redirects to follow by using the
|
||||
\fI--max-redirs\fP option.
|
||||
|
||||
If this option is used twice, the second will again disable location following.
|
||||
.IP "--location-trusted"
|
||||
@@ -631,7 +639,7 @@ Very similar to \fI--netrc\fP, but this option makes the .netrc usage
|
||||
designed by Microsoft and is used in their web applications. It is primarily
|
||||
meant as a support for Kerberos5 authentication but may be also used along
|
||||
with another authentication methods. For more information see IETF draft
|
||||
draft-brezak-spnego-http-04.txt. (Added in 7.10.6)
|
||||
draft-brezak-spnego-http-04.txt.
|
||||
|
||||
This option requires that the library was built with GSSAPI support. This is
|
||||
not very common. Use \fI-V/--version\fP to see if your version supports
|
||||
@@ -656,7 +664,7 @@ designed by Microsoft and is used by IIS web servers. It is a proprietary
|
||||
protocol, reversed engineered by clever people and implemented in curl based
|
||||
on their efforts. This kind of behavior should not be endorsed, you should
|
||||
encourage everyone who uses NTLM to switch to a public and documented
|
||||
authentication method instead. Such as Digest. (Added in 7.10.6)
|
||||
authentication method instead. Such as Digest.
|
||||
|
||||
If you want to enable NTLM for your proxy authentication, then use
|
||||
\fI--proxy-ntlm\fP.
|
||||
@@ -686,8 +694,8 @@ dynamically.
|
||||
Write output to a local file named like the remote file we get. (Only the file
|
||||
part of the remote file is used, the path is cut off.)
|
||||
|
||||
The remote file name to use for saving is extracted from the given URL.
|
||||
Nothing else
|
||||
The remote file name to use for saving is extracted from the given URL,
|
||||
nothing else.
|
||||
|
||||
You may use this option as many times as you have number of URLs.
|
||||
.IP "--pass <phrase>"
|
||||
@@ -696,8 +704,8 @@ You may use this option as many times as you have number of URLs.
|
||||
If this option is used several times, the last one will be used.
|
||||
.IP "--proxy-anyauth"
|
||||
Tells curl to pick a suitable authentication method when communicating with
|
||||
the given proxy. This will cause an extra request/response round-trip. Added
|
||||
in curl 7.13.2.
|
||||
the given proxy. This will cause an extra request/response round-trip. (Added
|
||||
in 7.13.2)
|
||||
|
||||
If this option is used twice, the second will again disable the proxy use-any
|
||||
authentication.
|
||||
@@ -740,7 +748,8 @@ i.e "192.168.10.1" to specify exact IP number
|
||||
.IP "host name"
|
||||
i.e "my.host.domain" to specify machine
|
||||
.IP "-"
|
||||
(any single-letter string) to make it pick the machine's default
|
||||
make curl pick the same IP address that is already used for the control
|
||||
connection
|
||||
.RE
|
||||
|
||||
If this option is used several times, the last one will be used. Disable the
|
||||
@@ -821,7 +830,7 @@ for all forthcoming retries it will double the waiting time until it reaches
|
||||
10 minutes which then will be the delay between the rest of the retries. By
|
||||
using \fI--retry-delay\fP you disable this exponential backoff algorithm. See
|
||||
also \fI--retry-max-time\fP to limit the total time allowed for
|
||||
retries. (Option added in 7.12.3)
|
||||
retries. (Added in 7.12.3)
|
||||
|
||||
If this option is used multiple times, the last occurrence decide the amount.
|
||||
.IP "--retry-delay <seconds>"
|
||||
@@ -829,7 +838,7 @@ Make curl sleep this amount of time between each retry when a transfer has
|
||||
failed with a transient error (it changes the default backoff time algorithm
|
||||
between retries). This option is only interesting if \fI--retry\fP is also
|
||||
used. Setting this delay to zero will make curl use the default backoff time.
|
||||
(Option added in 7.12.3)
|
||||
(Added in 7.12.3)
|
||||
|
||||
If this option is used multiple times, the last occurrence decide the amount.
|
||||
.IP "--retry-max-time <seconds>"
|
||||
@@ -838,26 +847,36 @@ done as usual (see \fI--retry\fP) as long as the timer hasn't reached this
|
||||
given limit. Notice that if the timer hasn't reached the limit, the request
|
||||
will be made and while performing, it may take longer than this given time
|
||||
period. To limit a single request\'s maximum time, use \fI-m/--max-time\fP.
|
||||
Set this option to zero to not timeout retries. (Option added in 7.12.3)
|
||||
Set this option to zero to not timeout retries. (Added in 7.12.3)
|
||||
|
||||
If this option is used multiple times, the last occurrence decide the amount.
|
||||
.IP "-s/--silent"
|
||||
Silent mode. Don't show progress meter or error messages. Makes
|
||||
Curl mute.
|
||||
|
||||
If this option is used twice, the second will again disable mute.
|
||||
If this option is used twice, the second will again disable silent mode.
|
||||
.IP "-S/--show-error"
|
||||
When used with -s it makes curl show error message if it fails.
|
||||
|
||||
If this option is used twice, the second will again disable show error.
|
||||
.IP "--socks <host[:port]>"
|
||||
Use the specified SOCKS5 proxy. If the port number is not specified, it is
|
||||
assumed at port 1080. (Option added in 7.11.1)
|
||||
.IP "--socks4 <host[:port]>"
|
||||
Use the specified SOCKS4 proxy. If the port number is not specified, it is
|
||||
assumed at port 1080. (Added in 7.15.2)
|
||||
|
||||
This option overrides any previous use of \fI-x/--proxy\fP, as they are
|
||||
mutually exclusive.
|
||||
|
||||
If this option is used several times, the last one will be used.
|
||||
.IP "--socks5 <host[:port]>"
|
||||
Use the specified SOCKS5 proxy. If the port number is not specified, it is
|
||||
assumed at port 1080. (Added in 7.11.1)
|
||||
|
||||
This option overrides any previous use of \fI-x/--proxy\fP, as they are
|
||||
mutually exclusive.
|
||||
|
||||
If this option is used several times, the last one will be used. (This option
|
||||
was previously wrongly documented and used as --socks without the number
|
||||
appended.)
|
||||
.IP "--stderr <file>"
|
||||
Redirect all writes to stderr to the specified file instead. If the file name
|
||||
is a plain '-', it is instead written to stdout. This option has no point when
|
||||
@@ -887,13 +906,10 @@ this is used on a http(s) server, the PUT command will be used.
|
||||
|
||||
Use the file name "-" (a single dash) to use stdin instead of a given file.
|
||||
|
||||
Before 7.10.8, when this option was used several times, the last one was used.
|
||||
|
||||
In curl 7.10.8 and later, you can specify one -T for each URL on the command
|
||||
line. Each -T + URL pair specifies what to upload and to where. curl also
|
||||
supports "globbing" of the -T argument, meaning that you can upload multiple
|
||||
files to a single URL by using the same URL globbing style supported in the
|
||||
URL, like this:
|
||||
You can specify one -T for each URL on the command line. Each -T + URL pair
|
||||
specifies what to upload and to where. curl also supports "globbing" of the -T
|
||||
argument, meaning that you can upload multiple files to a single URL by using
|
||||
the same URL globbing style supported in the URL, like this:
|
||||
|
||||
curl -T "{file1,file2}" http://www.uploadtothissite.com
|
||||
|
||||
@@ -905,8 +921,7 @@ Enables a full trace dump of all incoming and outgoing data, including
|
||||
descriptive information, to the given output file. Use "-" as filename to have
|
||||
the output sent to stdout.
|
||||
|
||||
If this option is used several times, the last one will be used. (Added in
|
||||
7.9.7)
|
||||
If this option is used several times, the last one will be used.
|
||||
.IP "--trace-ascii <file>"
|
||||
Enables a full trace dump of all incoming and outgoing data, including
|
||||
descriptive information, to the given output file. Use "-" as filename to have
|
||||
@@ -916,13 +931,12 @@ This is very similar to \fI--trace\fP, but leaves out the hex part and only
|
||||
shows the ASCII part of the dump. It makes smaller output that might be easier
|
||||
to read for untrained humans.
|
||||
|
||||
If this option is used several times, the last one will be used. (Added in
|
||||
7.9.7)
|
||||
If this option is used several times, the last one will be used.
|
||||
.IP "--trace-time"
|
||||
Prepends a time stamp to each trace or verbose line that curl displays.
|
||||
(Added in 7.14.0)
|
||||
|
||||
If this option is used several times, each occurrence will toggle it on/off.
|
||||
(Added in 7.14.0 )
|
||||
.IP "-u/--user <user:password>"
|
||||
Specify user and password to use for server authentication. Overrides
|
||||
\fI-n/--netrc\fP and \fI--netrc-optional\fP.
|
||||
@@ -1076,7 +1090,7 @@ The average download speed that curl measured for the complete download.
|
||||
The average upload speed that curl measured for the complete upload.
|
||||
.TP
|
||||
.B content_type
|
||||
The Content-Type of the requested document, if there was any. (Added in 7.9.5)
|
||||
The Content-Type of the requested document, if there was any.
|
||||
.TP
|
||||
.B num_connects
|
||||
Number of new connects made in the recent transfer. (Added in 7.12.3)
|
||||
@@ -1175,11 +1189,11 @@ Note that not all FTP server allow 3rd party transfers. (Added in 7.13.0)
|
||||
.IP "-4/--ipv4"
|
||||
If libcurl is capable of resolving an address to multiple IP versions (which
|
||||
it is if it is ipv6-capable), this option tells libcurl to resolve names to
|
||||
IPv4 addresses only. (Added in 7.10.8)
|
||||
IPv4 addresses only.
|
||||
.IP "-6/--ipv6"
|
||||
If libcurl is capable of resolving an address to multiple IP versions (which
|
||||
it is if it is ipv6-capable), this option tells libcurl to resolve names to
|
||||
IPv6 addresses only. (Added in 7.10.8)
|
||||
IPv6 addresses only.
|
||||
.IP "-#/--progress-bar"
|
||||
Make curl display progress information as a progress bar instead of the
|
||||
default statistics.
|
||||
@@ -1197,8 +1211,6 @@ Sets proxy server to use for HTTP.
|
||||
Sets proxy server to use for HTTPS.
|
||||
.IP "FTP_PROXY [protocol://]<host>[:port]"
|
||||
Sets proxy server to use for FTP.
|
||||
.IP "GOPHER_PROXY [protocol://]<host>[:port]"
|
||||
Sets proxy server to use for GOPHER.
|
||||
.IP "ALL_PROXY [protocol://]<host>[:port]"
|
||||
Sets proxy server to use if no protocol-specific proxy is set.
|
||||
.IP "NO_PROXY <comma-separated list of hosts>"
|
||||
|
@@ -11,7 +11,7 @@ EXTRA_DIST = README curlgtk.c sepheaders.c simple.c postit2.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 \
|
||||
anyauthput.c htmltitle.cc htmltidy.c opensslthreadlock.c \
|
||||
cookie_interface.c cacertinmem.c
|
||||
cookie_interface.c cacertinmem.c synctime.c
|
||||
|
||||
all:
|
||||
@echo "done"
|
||||
|
@@ -33,6 +33,8 @@ we expect you to actually torture our web site with your tests! Thanks.
|
||||
EXAMPLES
|
||||
|
||||
anyauthput.c - HTTP PUT using "any" authentication method
|
||||
cacertinmem.c - Use a built-in PEM certificate to retrieve a https page
|
||||
cookie_interface.c - shows usage of simple cookie interface
|
||||
curlgtk.c - download using a GTK progress bar
|
||||
curlx.c - getting file info from the remote cert data
|
||||
debug.c - showing how to use the debug callback
|
||||
@@ -55,6 +57,7 @@ multi-double.c - a multi-interface app doing two simultaneous transfers
|
||||
multi-post.c - a multi-interface app doing a multipart formpost
|
||||
multi-single.c - a multi-interface app getting a single file
|
||||
multithread.c - an example using multi-treading transfering multiple files
|
||||
opensslthreadlock.c - show how to do locking when using OpenSSL multi-threaded
|
||||
persistant.c - request two URLs with a persistant connection
|
||||
post-callback.c - send a HTTP POST using a callback
|
||||
postit2.c - send a HTTP multipart formpost
|
||||
@@ -62,3 +65,4 @@ sepheaders.c - download headers to a separate file
|
||||
simple.c - the most simple download a URL source
|
||||
simplepost.c - HTTP POST
|
||||
simplessl.c - HTTPS example with certificates many options set
|
||||
synctime.c - Sync local time by extracing date from remote HTTP servers
|
||||
|
@@ -78,7 +78,7 @@ int main(void)
|
||||
curl_slist *chunk = NULL;
|
||||
|
||||
chunk = curl_slist_append(chunk, "Transfer-Encoding: chunked");
|
||||
res = curl_easy_setopt(curl, CURLOPT_HTTPHEADER);
|
||||
res = curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk);
|
||||
/* use curl_slist_free_all() after the *perform() call to free this
|
||||
list again */
|
||||
}
|
||||
@@ -101,7 +101,7 @@ int main(void)
|
||||
curl_slist *chunk = NULL;
|
||||
|
||||
chunk = curl_slist_append(chunk, "Expect:");
|
||||
res = curl_easy_setopt(curl, CURLOPT_HTTPHEADER);
|
||||
res = curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk);
|
||||
/* use curl_slist_free_all() after the *perform() call to free this
|
||||
list again */
|
||||
}
|
||||
|
339
docs/examples/synctime.c
Normal file
339
docs/examples/synctime.c
Normal file
@@ -0,0 +1,339 @@
|
||||
/*****************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
* / __| | | | |_) | |
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
* This example code only builds as-is on Windows.
|
||||
*
|
||||
* Synchronising your computer clock via Internet time server usually relies
|
||||
* on DAYTIME, TIME, or NTP protocols. These protocols provide good accurate
|
||||
* time synchronisation but it does not work very well through a
|
||||
* firewall/proxy. Some adjustment has to be made to the firewall/proxy for
|
||||
* these protocols to work properly.
|
||||
*
|
||||
* There is an indirect method. Since most webserver provide server time in
|
||||
* their HTTP header, therefore you could synchronise your computer clock
|
||||
* using HTTP protocol which has no problem with firewall/proxy.
|
||||
*
|
||||
* For this software to work, you should take note of these items.
|
||||
* 1. Your firewall/proxy must allow your computer to surf internet.
|
||||
* 2. Webserver system time must in sync with the NTP time server,
|
||||
* or at least provide an accurate time keeping.
|
||||
* 3. Webserver HTTP header does not provide the milliseconds units,
|
||||
* so there is no way to get very accurate time.
|
||||
* 4. This software could only provide an accuracy of +- a few seconds,
|
||||
* as Round-Trip delay time is not taken into consideration.
|
||||
* Compensation of network, firewall/proxy delay cannot be simply divide
|
||||
* the Round-Trip delay time by half.
|
||||
* 5. Win32 SetSystemTime() API will set your computer clock according to
|
||||
* GMT/UTC time. Therefore your computer timezone must be properly set.
|
||||
* 6. Webserver data should not be cached by the proxy server. Some
|
||||
* webserver provide Cache-Control to prevent caching.
|
||||
*
|
||||
* References:
|
||||
* http://tf.nist.gov/timefreq/service/its.htm
|
||||
* http://tf.nist.gov/timefreq/service/firewall.htm
|
||||
*
|
||||
* Usage:
|
||||
* This software will synchronise your computer clock only when you issue
|
||||
* it with --synctime. By default, it only display the webserver's clock.
|
||||
*
|
||||
* Written by: Frank (contributed to libcurl)
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
|
||||
* WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
* IN NO EVENT SHALL THE AUTHOR OF THIS SOFTWARE BE LIABLE FOR
|
||||
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
|
||||
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
||||
* WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
|
||||
* LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
||||
* OF THIS SOFTWARE.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <time.h>
|
||||
#include <windows.h>
|
||||
#include <curl/curl.h>
|
||||
|
||||
|
||||
#define MAX_STRING 256
|
||||
#define MAX_STRING1 MAX_STRING+1
|
||||
|
||||
typedef struct
|
||||
{
|
||||
char http_proxy[MAX_STRING1];
|
||||
char proxy_user[MAX_STRING1];
|
||||
char timeserver[MAX_STRING1];
|
||||
} conf_t;
|
||||
|
||||
char DefaultTimeServer[4][MAX_STRING1] =
|
||||
{
|
||||
"http://nist.time.gov/timezone.cgi?UTC/s/0",
|
||||
"http://www.google.com/",
|
||||
"http://www.worldtimeserver.com/current_time_in_UTC.aspx",
|
||||
"http://www.worldtime.com/cgi-bin/wt.cgi"
|
||||
};
|
||||
|
||||
char *DayStr[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
|
||||
char *MthStr[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
|
||||
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
|
||||
|
||||
int ShowAllHeader;
|
||||
int AutoSyncTime;
|
||||
SYSTEMTIME SYSTime;
|
||||
SYSTEMTIME LOCALTime;
|
||||
|
||||
#define HTTP_COMMAND_HEAD 0
|
||||
#define HTTP_COMMAND_GET 1
|
||||
|
||||
|
||||
size_t SyncTime_CURL_WriteOutput(void *ptr, size_t size, size_t nmemb,
|
||||
void *stream)
|
||||
{
|
||||
fwrite(ptr, size, nmemb, stream);
|
||||
return(nmemb*size);
|
||||
}
|
||||
|
||||
size_t SyncTime_CURL_WriteHeader(void *ptr, size_t size, size_t nmemb,
|
||||
void *stream)
|
||||
{
|
||||
int i, RetVal;
|
||||
char TmpStr1[26], TmpStr2[26];
|
||||
|
||||
if (ShowAllHeader == 1)
|
||||
fprintf(stderr, "%s", (char *)(ptr));
|
||||
|
||||
if (strncmp((char *)(ptr), "Date:", 5) == 0) {
|
||||
if (ShowAllHeader == 0)
|
||||
fprintf(stderr, "HTTP Server. %s", (char *)(ptr));
|
||||
|
||||
if (AutoSyncTime == 1) {
|
||||
*TmpStr1 = 0;
|
||||
*TmpStr2 = 0;
|
||||
if (strlen((char *)(ptr)) > 50) /* Can prevent buffer overflow to
|
||||
TmpStr1 & 2? */
|
||||
AutoSyncTime = 0;
|
||||
else {
|
||||
RetVal = sscanf ((char *)(ptr), "Date: %s %d %s %d %d:%d:%d",
|
||||
TmpStr1, &SYSTime.wDay, TmpStr2, &SYSTime.wYear,
|
||||
&SYSTime.wHour, &SYSTime.wMinute, &SYSTime.wSecond);
|
||||
|
||||
if (RetVal == 7) {
|
||||
|
||||
SYSTime.wMilliseconds = 500; /* adjust to midpoint, 0.5 sec */
|
||||
for (i=0; i<12; i++) {
|
||||
if (strcmp(MthStr[i], TmpStr2) == 0) {
|
||||
SYSTime.wMonth = i+1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
AutoSyncTime = 3; /* Computer clock will be adjusted */
|
||||
}
|
||||
else {
|
||||
AutoSyncTime = 0; /* Error in sscanf() fields conversion */
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (strncmp((char *)(ptr), "X-Cache: HIT", 12) == 0) {
|
||||
fprintf(stderr, "ERROR: HTTP Server data is cached."
|
||||
" Server Date is no longer valid.\n");
|
||||
AutoSyncTime = 0;
|
||||
}
|
||||
return(nmemb*size);
|
||||
}
|
||||
|
||||
void SyncTime_CURL_Init(CURL *curl, char *proxy_port,
|
||||
char *proxy_user_password)
|
||||
{
|
||||
if (strlen(proxy_port) > 0)
|
||||
curl_easy_setopt(curl, CURLOPT_PROXY, proxy_port);
|
||||
|
||||
if (strlen(proxy_user_password) > 0)
|
||||
curl_easy_setopt(curl, CURLOPT_PROXYUSERPWD, proxy_user_password);
|
||||
|
||||
/* Trick Webserver by claiming that you are using Microsoft WinXP SP2, IE6 */
|
||||
curl_easy_setopt(curl, CURLOPT_USERAGENT,
|
||||
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, *SyncTime_CURL_WriteOutput);
|
||||
curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, *SyncTime_CURL_WriteHeader);
|
||||
}
|
||||
|
||||
int SyncTime_CURL_Fetch(CURL *curl, char *URL_Str, char *OutFileName,
|
||||
int HttpGetBody)
|
||||
{
|
||||
FILE *outfile;
|
||||
CURLcode res;
|
||||
|
||||
outfile = NULL;
|
||||
if (HttpGetBody == HTTP_COMMAND_HEAD)
|
||||
curl_easy_setopt(curl, CURLOPT_NOBODY, 1);
|
||||
else {
|
||||
outfile = fopen(OutFileName, "wb");
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEDATA, outfile);
|
||||
}
|
||||
|
||||
curl_easy_setopt(curl, CURLOPT_URL, URL_Str);
|
||||
res = curl_easy_perform(curl);
|
||||
if (outfile != NULL)
|
||||
fclose(outfile);
|
||||
return res; /* (CURLE_OK) */
|
||||
}
|
||||
|
||||
void showUsage(void)
|
||||
{
|
||||
fprintf(stderr, "SYNCTIME: Synchronising computer clock with time server"
|
||||
" using HTTP protocol.\n");
|
||||
fprintf(stderr, "Usage : SYNCTIME [Option]\n");
|
||||
fprintf(stderr, "Options :\n");
|
||||
fprintf(stderr, " --server=WEBSERVER Use this time server instead"
|
||||
" of default.\n");
|
||||
fprintf(stderr, " --showall Show all HTTP header.\n");
|
||||
fprintf(stderr, " --synctime Synchronising computer clock"
|
||||
" with time server.\n");
|
||||
fprintf(stderr, " --proxy-user=USER[:PASS] Set proxy username and"
|
||||
" password.\n");
|
||||
fprintf(stderr, " --proxy=HOST[:PORT] Use HTTP proxy on given"
|
||||
" port.\n");
|
||||
fprintf(stderr, " --help Print this help.\n");
|
||||
fprintf(stderr, "\n");
|
||||
return;
|
||||
}
|
||||
|
||||
int conf_init(conf_t *conf)
|
||||
{
|
||||
int i;
|
||||
|
||||
*conf->http_proxy = 0;
|
||||
for (i=0; i<MAX_STRING1; i++)
|
||||
conf->proxy_user[i] = 0; /* Clean up password from memory */
|
||||
*conf->timeserver = 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
CURL *curl;
|
||||
conf_t conf[1];
|
||||
int OptionIndex;
|
||||
struct tm *lt;
|
||||
struct tm *gmt;
|
||||
time_t tt;
|
||||
time_t tt_local;
|
||||
time_t tt_gmt;
|
||||
double tzonediffFloat;
|
||||
int tzonediffWord;
|
||||
char timeBuf[61];
|
||||
char tzoneBuf[16];
|
||||
int RetValue;
|
||||
|
||||
OptionIndex = 0;
|
||||
ShowAllHeader = 0; /* Do not show HTTP Header */
|
||||
AutoSyncTime = 0; /* Do not synchronise computer clock */
|
||||
RetValue = 0; /* Successful Exit */
|
||||
conf_init(conf);
|
||||
|
||||
if (argc > 1) {
|
||||
while (OptionIndex < argc) {
|
||||
if (strncmp(argv[OptionIndex], "--server=", 9) == 0)
|
||||
snprintf(conf->timeserver, MAX_STRING, "%s", &argv[OptionIndex][9]);
|
||||
|
||||
if (strcmp(argv[OptionIndex], "--showall") == 0)
|
||||
ShowAllHeader = 1;
|
||||
|
||||
if (strcmp(argv[OptionIndex], "--synctime") == 0)
|
||||
AutoSyncTime = 1;
|
||||
|
||||
if (strncmp(argv[OptionIndex], "--proxy-user=", 13) == 0)
|
||||
snprintf(conf->proxy_user, MAX_STRING, "%s", &argv[OptionIndex][13]);
|
||||
|
||||
if (strncmp(argv[OptionIndex], "--proxy=", 8) == 0)
|
||||
snprintf(conf->http_proxy, MAX_STRING, "%s", &argv[OptionIndex][8]);
|
||||
|
||||
if ((strcmp(argv[OptionIndex], "--help") == 0) ||
|
||||
(strcmp(argv[OptionIndex], "/?") == 0)) {
|
||||
showUsage();
|
||||
return 0;
|
||||
}
|
||||
OptionIndex++;
|
||||
}
|
||||
}
|
||||
|
||||
if (*conf->timeserver == 0) /* Use default server for time information */
|
||||
snprintf(conf->timeserver, MAX_STRING, "%s", DefaultTimeServer[0]);
|
||||
|
||||
/* Init CURL before usage */
|
||||
curl_global_init(CURL_GLOBAL_ALL);
|
||||
curl = curl_easy_init();
|
||||
if (curl) {
|
||||
SyncTime_CURL_Init(curl, conf->http_proxy, conf->proxy_user);
|
||||
|
||||
/* Calculating time diff between GMT and localtime */
|
||||
tt = time(0);
|
||||
lt = localtime(&tt);
|
||||
tt_local = mktime(lt);
|
||||
gmt = gmtime(&tt);
|
||||
tt_gmt = mktime(gmt);
|
||||
tzonediffFloat = difftime(tt_local, tt_gmt);
|
||||
tzonediffWord = (int)(tzonediffFloat/3600.0);
|
||||
|
||||
if ((double)(tzonediffWord * 3600) == tzonediffFloat)
|
||||
snprintf(tzoneBuf, 15, "%+03d'00'", tzonediffWord);
|
||||
else
|
||||
snprintf(tzoneBuf, 15, "%+03d'30'", tzonediffWord);
|
||||
|
||||
/* Get current system time and local time */
|
||||
GetSystemTime(&SYSTime);
|
||||
GetLocalTime(&LOCALTime);
|
||||
snprintf(timeBuf, 60, "%s, %02d %s %04d %02d:%02d:%02d.%03d, ",
|
||||
DayStr[LOCALTime.wDayOfWeek], LOCALTime.wDay,
|
||||
MthStr[LOCALTime.wMonth-1], LOCALTime.wYear,
|
||||
LOCALTime.wHour, LOCALTime.wMinute, LOCALTime.wSecond,
|
||||
LOCALTime.wMilliseconds);
|
||||
fprintf(stderr, "\nBefore HTTP. Date: %s%s\n\n", timeBuf, tzoneBuf);
|
||||
|
||||
/* HTTP HEAD command to the Webserver */
|
||||
fprintf(stderr, "Fetch: %s\n", conf->timeserver);
|
||||
SyncTime_CURL_Fetch(curl, conf->timeserver, "index.htm",
|
||||
HTTP_COMMAND_HEAD);
|
||||
|
||||
GetLocalTime(&LOCALTime);
|
||||
snprintf(timeBuf, 60, "%s, %02d %s %04d %02d:%02d:%02d.%03d, ",
|
||||
DayStr[LOCALTime.wDayOfWeek], LOCALTime.wDay,
|
||||
MthStr[LOCALTime.wMonth-1], LOCALTime.wYear,
|
||||
LOCALTime.wHour, LOCALTime.wMinute, LOCALTime.wSecond,
|
||||
LOCALTime.wMilliseconds);
|
||||
fprintf(stderr, "\nAfter HTTP. Date: %s%s\n", timeBuf, tzoneBuf);
|
||||
|
||||
if (AutoSyncTime == 3) {
|
||||
/* Synchronising computer clock */
|
||||
if (!SetSystemTime(&SYSTime)) { /* Set system time */
|
||||
fprintf(stderr, "ERROR: Unable to set system time.\n");
|
||||
RetValue = 1;
|
||||
}
|
||||
else {
|
||||
/* Successfully re-adjusted computer clock */
|
||||
GetLocalTime(&LOCALTime);
|
||||
snprintf(timeBuf, 60, "%s, %02d %s %04d %02d:%02d:%02d.%03d, ",
|
||||
DayStr[LOCALTime.wDayOfWeek], LOCALTime.wDay,
|
||||
MthStr[LOCALTime.wMonth-1], LOCALTime.wYear,
|
||||
LOCALTime.wHour, LOCALTime.wMinute, LOCALTime.wSecond,
|
||||
LOCALTime.wMilliseconds);
|
||||
fprintf(stderr, "\nNew System's Date: %s%s\n", timeBuf, tzoneBuf);
|
||||
}
|
||||
}
|
||||
|
||||
/* Cleanup before exit */
|
||||
conf_init(conf);
|
||||
curl_easy_cleanup(curl);
|
||||
}
|
||||
return RetValue;
|
||||
}
|
@@ -141,6 +141,13 @@ cookies cURL knows (expired ones, too). Don't forget to
|
||||
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)
|
||||
.IP CURLINFO_LASTSOCKET
|
||||
Pass a pointer to a long to receive the last socket used by this curl
|
||||
session. If the socket is no longer valid, -1 is returned. When you finish
|
||||
working with the socket, you must call curl_easy_cleanup() as usual and let
|
||||
libcurl close the socket and cleanup other resources associated with the
|
||||
handle. This is typically used in combination with \fICURLOPT_CONNECT_ONLY\fP.
|
||||
(Added in 7.15.2)
|
||||
.SH TIMES
|
||||
.NF
|
||||
An overview of the six time values available from curl_easy_getinfo()
|
||||
|
@@ -14,6 +14,17 @@ handle that you must use as input to other easy-functions. curl_easy_init
|
||||
initializes curl and this call \fBMUST\fP have a corresponding call to
|
||||
\fIcurl_easy_cleanup(3)\fP when the operation is complete.
|
||||
|
||||
If you did not already call \fIcurl_global_init(3)\fP,
|
||||
\fIcurl_easy_init(3)\fP does it automatically.
|
||||
This may be lethal in multi-threaded cases, since \fIcurl_global_init(3)\fP is
|
||||
not thread-safe, and it may result in resource problems because there is
|
||||
no corresponding cleanup.
|
||||
|
||||
You are strongly advised to not allow this automatic behaviour, by
|
||||
calling \fIcurl_global_init(3)\fP yourself properly.
|
||||
See the description in \fBlibcurl\fP(3) of global environment
|
||||
requirements for details of how to use this function.
|
||||
|
||||
.SH RETURN VALUE
|
||||
If this function returns NULL, something went wrong and you cannot use the
|
||||
other curl functions.
|
||||
|
@@ -15,8 +15,8 @@ it was just created with \fIcurl_easy_init(3)\fP.
|
||||
|
||||
It does not change the following information kept in the handle: live
|
||||
connections, the Session ID cache, the DNS cache, the cookies and shares.
|
||||
|
||||
This function was added in libcurl 7.12.1.
|
||||
.SH AVAILABILITY
|
||||
This function was added in libcurl 7.12.1
|
||||
.SH RETURN VALUE
|
||||
Nothing
|
||||
.SH "SEE ALSO"
|
||||
|
@@ -5,7 +5,7 @@
|
||||
.\" * | (__| |_| | _ <| |___
|
||||
.\" * \___|\___/|_| \_\_____|
|
||||
.\" *
|
||||
.\" * Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
.\" * Copyright (C) 1998 - 2006, 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
|
||||
@@ -21,9 +21,9 @@
|
||||
.\" * $Id$
|
||||
.\" **************************************************************************
|
||||
.\"
|
||||
.TH curl_easy_setopt 3 "27 Oct 2005" "libcurl 7.14.2" "libcurl Manual"
|
||||
.TH curl_easy_setopt 3 "21 Feb 2006" "libcurl 7.15.2" "libcurl Manual"
|
||||
.SH NAME
|
||||
curl_easy_setopt - set options for a curl easy handle
|
||||
curl_easy_setopt \- set options for a curl easy handle
|
||||
.SH SYNOPSIS
|
||||
#include <curl/curl.h>
|
||||
|
||||
@@ -169,11 +169,16 @@ added in 7.12.3)
|
||||
.IP CURLOPT_PROGRESSFUNCTION
|
||||
Function pointer that should match the \fIcurl_progress_callback\fP prototype
|
||||
found in \fI<curl/curl.h>\fP. This function gets called by libcurl instead of
|
||||
its internal equivalent with a frequent interval during data transfer.
|
||||
Unknown/unused argument values will be set to zero (like if you only download
|
||||
data, the upload size will remain 0). Returning a non-zero value from this
|
||||
callback will cause libcurl to abort the transfer and return
|
||||
\fICURLE_ABORTED_BY_CALLBACK\fP.
|
||||
its internal equivalent with a frequent interval during data transfer (roughly
|
||||
once per second). Unknown/unused argument values pass to the callback will be
|
||||
set to zero (like if you only download data, the upload size will remain
|
||||
0). Returning a non-zero value from this callback will cause libcurl to abort
|
||||
the transfer and return \fICURLE_ABORTED_BY_CALLBACK\fP.
|
||||
|
||||
If you transfer data with the multi interface, this function will not be
|
||||
called during periods of idleness unless you call the appropriate libcurl
|
||||
function that performs transfers. Usage of the \fBCURLOPT_PROGRESSFUNCTION\fP
|
||||
callback is not recommended when using the multi interface.
|
||||
|
||||
\fICURLOPT_NOPROGRESS\fP must be set to FALSE to make this function actually
|
||||
get called.
|
||||
@@ -275,7 +280,7 @@ Pass a FILE * as parameter. Tell libcurl to use this stream instead of stderr
|
||||
when showing the progress meter and displaying \fICURLOPT_VERBOSE\fP data.
|
||||
.IP CURLOPT_FAILONERROR
|
||||
A non-zero parameter tells the library to fail silently if the HTTP code
|
||||
returned is equal to or larger than 300. The default action would be to return
|
||||
returned is equal to or larger than 400. The default action would be to return
|
||||
the page normally, ignoring that code.
|
||||
.SH NETWORK OPTIONS
|
||||
.IP CURLOPT_URL
|
||||
@@ -319,8 +324,8 @@ 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.
|
||||
.IP CURLOPT_PROXYTYPE
|
||||
Pass a long with this option to set type of the proxy. Available options for
|
||||
this are \fICURLPROXY_HTTP\fP and \fICURLPROXY_SOCKS5\fP, with the HTTP one
|
||||
being default. (Added in 7.10)
|
||||
this are \fICURLPROXY_HTTP\fP, \fICURLPROXY_SOCKS4\fP (added in 7.15.2)
|
||||
\fICURLPROXY_SOCKS5\fP. The HTTP type is default. (Added in 7.10)
|
||||
.IP CURLOPT_HTTPPROXYTUNNEL
|
||||
Set the parameter to non-zero to get the library to tunnel all operations
|
||||
through a given HTTP proxy. There is a big difference between using a proxy
|
||||
@@ -330,6 +335,19 @@ don't want this tunneling option.
|
||||
Pass a char * as parameter. This set the interface name to use as outgoing
|
||||
network interface. The name can be an interface name, an IP address or a host
|
||||
name.
|
||||
.IP CURLOPT_LOCALPORT
|
||||
Pass a long. This sets the local port number of the socket used for
|
||||
connection. This can be used in combination with \fICURLOPT_INTERFACE\fP and
|
||||
you are recommended to use \fICURLOPT_LOCALPORTRANGE\fP as well when this is
|
||||
set. Note that port numbers are only valid 1 - 65535. (Added in 7.15.2)
|
||||
.IP CURLOPT_LOCALPORTRANGE
|
||||
Pass a long. This is the number of attempts libcurl should do to find a
|
||||
working local port number. It starts with the given \fICURLOPT_LOCALPORT\fP
|
||||
and adds one to the number for each retry. Setting this value to 1 or below
|
||||
will make libcurl do only one try for exact port number. Note that port
|
||||
numbers by nature is a scarce resource that will be busy at times so setting
|
||||
this value to something too low might cause unnecessary connection setup
|
||||
failures. (Added in 7.15.2)
|
||||
.IP CURLOPT_DNS_CACHE_TIMEOUT
|
||||
Pass a long, this sets the timeout in seconds. Name resolves will be kept in
|
||||
memory for this number of seconds. Set to zero (0) to completely disable
|
||||
@@ -615,15 +633,17 @@ list. If you add a header that is otherwise generated and used by libcurl
|
||||
internally, your added one will be used instead. If you add a header with no
|
||||
contents as in 'Accept:' (no data on the right side of the colon), the
|
||||
internally used header will get disabled. Thus, using this option you can add
|
||||
new headers, replace internal headers and remove internal headers. The
|
||||
headers included in the linked list must not be CRLF-terminated, because
|
||||
curl adds CRLF after each header item. Failure to comply with this will
|
||||
result in strange bugs because the server will most likely ignore part
|
||||
of the headers you specified.
|
||||
new headers, replace internal headers and remove internal headers. To add a
|
||||
header with no contents, make the contents be two quotes: \&"". The headers
|
||||
included in the linked list must not be CRLF-terminated, because curl adds
|
||||
CRLF after each header item. Failure to comply with this will result in
|
||||
strange bugs because the server will most likely ignore part of the headers
|
||||
you specified.
|
||||
|
||||
The first line in a request (usually containing a GET or POST) is not a header
|
||||
and cannot be replaced using this option. Only the lines following the
|
||||
request-line are headers.
|
||||
The first line in a request (containing the method, usually a GET or POST) is
|
||||
not a header and cannot be replaced using this option. Only the lines
|
||||
following the request-line are headers. Adding this method line in this list
|
||||
of headers will only cause your request to send an invalid header.
|
||||
|
||||
Pass a NULL to this to reset back to no custom headers.
|
||||
|
||||
@@ -1024,6 +1044,14 @@ Resolve to ipv4 addresses.
|
||||
.IP CURL_IPRESOLVE_V6
|
||||
Resolve to ipv6 addresses.
|
||||
.RE
|
||||
.SH CURLOPT_CONNECT_ONLY
|
||||
Pass a long. A non-zero parameter tells the library to perform any required
|
||||
proxy authentication and connection setup, but no data transfer.
|
||||
|
||||
This option is useful with the \fICURLINFO_LASTSOCKET\fP option to
|
||||
\fIcurl_easy_getinfo(3)\fP. The library can set up the connection and then the
|
||||
application can obtain the most recently used socket for special data
|
||||
transfers. (Added in 7.15.2)
|
||||
.SH SSL and SECURITY OPTIONS
|
||||
.IP CURLOPT_SSLCERT
|
||||
Pass a pointer to a zero terminated string as parameter. The string should be
|
||||
|
@@ -12,7 +12,7 @@ curl_easy_strerror - return string describing error code
|
||||
.SH DESCRIPTION
|
||||
The curl_easy_strerror() function returns a string describing the CURLcode
|
||||
error code passed in the argument \fIerrornum\fP.
|
||||
|
||||
.SH AVAILABILITY
|
||||
This function was added in libcurl 7.12.0
|
||||
.SH RETURN VALUE
|
||||
A pointer to a zero terminated string.
|
||||
|
@@ -2,7 +2,7 @@
|
||||
.\" nroff -man [file]
|
||||
.\" $Id$
|
||||
.\"
|
||||
.TH curl_global_cleanup 3 "28 May 2001" "libcurl 7.8" "libcurl Manual"
|
||||
.TH curl_global_cleanup 3 "17 Feb 2006" "libcurl 7.8" "libcurl Manual"
|
||||
.SH NAME
|
||||
curl_global_cleanup - global libcurl cleanup
|
||||
.SH SYNOPSIS
|
||||
@@ -11,13 +11,22 @@ curl_global_cleanup - global libcurl cleanup
|
||||
.BI "void curl_global_cleanup(void);"
|
||||
.ad
|
||||
.SH DESCRIPTION
|
||||
curl_global_cleanup must be called once (no matter how many threads or libcurl
|
||||
sessions that'll be used) by every application that uses libcurl, after all
|
||||
uses of libcurl is complete.
|
||||
This function releases resources acquired by \fBcurl_global_init(3)\fP.
|
||||
|
||||
This is the opposite of \fIcurl_global_init(3)\fP.
|
||||
You should call \fIcurl_global_cleanup(3)\fP once for each call you make to
|
||||
\fIcurl_global_init(3)\fP, after you are done using libcurl.
|
||||
|
||||
\fBThis function is not thread safe.\fP You must not call it when any other
|
||||
thread in the program (i.e. a thread sharing the same memory) is running.
|
||||
This doesn't just mean no other thread that is using libcurl. Because
|
||||
\fBcurl_global_cleanup(3)\fP calls functions of other libraries that are
|
||||
similarly thread unsafe, it could conflict with any other thread that uses
|
||||
these other libraries.
|
||||
|
||||
See the description in \fBlibcurl(3)\fP of global environment requirements for
|
||||
details of how to use this function.
|
||||
|
||||
Not calling this function may result in memory leaks.
|
||||
.SH "SEE ALSO"
|
||||
.BR curl_global_init "(3), "
|
||||
.BR libcurl "(3), "
|
||||
|
||||
|
@@ -11,19 +11,30 @@ curl_global_init - Global libcurl initialisation
|
||||
.BI "CURLcode curl_global_init(long " flags ");"
|
||||
.ad
|
||||
.SH DESCRIPTION
|
||||
This function should only be called once (no matter how many threads or
|
||||
libcurl sessions that'll be used) by every application that uses libcurl.
|
||||
This function sets up the program environment that libcurl needs. Think
|
||||
of it as an extension of the library loader.
|
||||
|
||||
If this function hasn't been invoked when \fIcurl_easy_init(3)\fP is called,
|
||||
it will be done automatically by libcurl.
|
||||
This function must be called at least once within a program (a program is
|
||||
all the code that shares a memory space) before the program calls any other
|
||||
function in libcurl. The environment it sets up is constant for the life
|
||||
of the program and is the same for every program, so multiple calls have
|
||||
the same effect as one call.
|
||||
|
||||
The flags option is a bit pattern that tells libcurl exact what features to
|
||||
The flags option is a bit pattern that tells libcurl exactly what features to
|
||||
init, as described below. Set the desired bits by ORing the values together.
|
||||
In normal operation, you must specify CURL_GLOBAL_ALL. Don't use any other
|
||||
value unless you are familiar with and mean to control internal operations
|
||||
of libcurl.
|
||||
|
||||
You must however \fBalways\fP use the \fIcurl_global_cleanup(3)\fP function,
|
||||
as that cannot be called automatically for you by libcurl.
|
||||
\fBThis function is not thread safe.\fP You must not call it when any
|
||||
other thread in the program (i.e. a thread sharing the same memory) is
|
||||
running. This doesn't just mean no other thread that is using
|
||||
libcurl. Because \fIcurl_global_init()\fP calls functions of other
|
||||
libraries that are similarly thread unsafe, it could conflict with any
|
||||
other thread that uses these other libraries.
|
||||
|
||||
Calling this function more than once will cause unpredictable results.
|
||||
See the description in \fBlibcurl\fP(3) of global environment
|
||||
requirements for details of how to use this function.
|
||||
|
||||
.SH FLAGS
|
||||
.TP 5
|
||||
@@ -44,3 +55,5 @@ other curl functions.
|
||||
.SH "SEE ALSO"
|
||||
.BR curl_global_init_mem "(3), "
|
||||
.BR curl_global_cleanup "(3), "
|
||||
.BR curl_easy_init "(3) "
|
||||
.BR libcurl "(3) "
|
||||
|
@@ -1,6 +1,6 @@
|
||||
.\" $Id$
|
||||
.\"
|
||||
.TH curl_multi_fdset 3 "25 Apr 2005" "libcurl 7.9.5" "libcurl Manual"
|
||||
.TH curl_multi_fdset 3 "2 Jan 2006" "libcurl 7.16.0" "libcurl Manual"
|
||||
.SH NAME
|
||||
curl_multi_fdset - extracts file descriptor information from a multi handle
|
||||
.SH SYNOPSIS
|
||||
@@ -30,8 +30,12 @@ rather small (single-digit number of seconds) timeout and call
|
||||
\fIcurl_multi_perform\fP regularly - even if no activity has been seen on the
|
||||
fd_sets - as otherwise libcurl-internal retries and timeouts may not work as
|
||||
you'd think and want.
|
||||
|
||||
Starting with libcurl 7.16.0, you should use \fBcurl_multi_timeout\fP to
|
||||
figure out how long to wait for action.
|
||||
.SH RETURN VALUE
|
||||
CURLMcode type, general libcurl multi interface error code. See
|
||||
\fIlibcurl-errors(3)\fP
|
||||
.SH "SEE ALSO"
|
||||
.BR curl_multi_cleanup "(3)," curl_multi_init "(3)"
|
||||
.BR curl_multi_cleanup "(3)," curl_multi_init "(3), "
|
||||
.BR curl_multi_timeout "(3) "
|
||||
|
@@ -36,9 +36,9 @@ NOTE that this only returns errors etc regarding the whole multi stack. There
|
||||
might still have occurred problems on individual transfers even when this
|
||||
function returns OK.
|
||||
.SH "TYPICAL USAGE"
|
||||
Most application will use \fIcurl_multi_fdset(3)\fP to get the multi_handle's
|
||||
file descriptors, then it'll wait for action on them using select() and as
|
||||
soon as one or more of them are ready, \fIcurl_multi_perform(3)\fP gets
|
||||
Most applications will use \fIcurl_multi_fdset(3)\fP to get the multi_handle's
|
||||
file descriptors, then it'll wait for action on them using \fBselect(3)\fP and
|
||||
as soon as one or more of them are ready, \fIcurl_multi_perform(3)\fP gets
|
||||
called.
|
||||
.SH "SEE ALSO"
|
||||
.BR curl_multi_cleanup "(3), " curl_multi_init "(3), "
|
||||
|
42
docs/libcurl/curl_multi_setopt.3
Normal file
42
docs/libcurl/curl_multi_setopt.3
Normal file
@@ -0,0 +1,42 @@
|
||||
.\" $Id$
|
||||
.\"
|
||||
.TH curl_multi_setopt 3 "8 Jan 2006" "libcurl 7.16.0" "libcurl Manual"
|
||||
.SH NAME
|
||||
curl_multi_setopt \- set options for a curl multi handle
|
||||
.SH SYNOPSIS
|
||||
#include <curl/curl.h>
|
||||
|
||||
CURLMcode curl_multi_setopt(CURLM * multi_handle, CURLMoption option, param);
|
||||
.SH DESCRIPTION
|
||||
curl_multi_setopt() is used to tell a libcurl multi handle how to behave. By
|
||||
using the appropriate options to \fIcurl_multi_setopt\fP, you can change
|
||||
libcurl's behaviour when using that multi handle. All options are set with
|
||||
the \fIoption\fP followed by the parameter \fIparam\fP. That parameter can be
|
||||
a \fBlong\fP, a \fBfunction pointer\fP, an \fBobject pointer\fP or a
|
||||
\fBcurl_off_t\fP type, depending on what the specific option expects. Read
|
||||
this manual carefully as bad input values may cause libcurl to behave badly!
|
||||
You can only set one option in each function call.
|
||||
|
||||
.SH OPTIONS
|
||||
.IP CURLMOPT_SOCKETFUNCTION
|
||||
Pass a pointer to a function matching the curl_socket_callback prototype. The
|
||||
\fIcurl_multi_socket(3)\fP functions inform the application about updates in
|
||||
the socket (file descriptor) status by doing none, one or multiple calls to
|
||||
the curl_socket_callback given in the \fBparam\fP argument. They update the
|
||||
status with changes since the previous time a \fIcurl_multi_socket(3)\fP
|
||||
function was called. If the given callback pointer is NULL, no callback will
|
||||
be called. Set the callback's fourth argument with \fICURLMOPT_SOCKETDATA\fP.
|
||||
See \fIcurl_multi_socket(3)\fP for more callback details.
|
||||
.IP CURLMOPT_SOCKETDATA
|
||||
Pass a pointer to whatever you want passed to the curl_socket_callback's forth
|
||||
argument, the userp pointer. This is not used by libcurl but only passed-thru
|
||||
as-is. Set the callback pointer with \fICURLMOPT_SOCKETFUNCTION\fP.
|
||||
.SH RETURNS
|
||||
The standard CURLMcode for multi interface error codes. Note that it returns a
|
||||
CURLM_UNKNOWN_OPTION if you try setting an option that this version of libcurl
|
||||
doesn't know of.
|
||||
.SH AVAILABILITY
|
||||
This function was added in libcurl 7.16.0
|
||||
.SH "SEE ALSO"
|
||||
.BR curl_multi_cleanup "(3), " curl_multi_init "(3), "
|
||||
.BR curl_multi_socket "(3), " curl_multi_info_read "(3)"
|
96
docs/libcurl/curl_multi_socket.3
Normal file
96
docs/libcurl/curl_multi_socket.3
Normal file
@@ -0,0 +1,96 @@
|
||||
.\" $Id$
|
||||
.\"
|
||||
.TH curl_multi_socket 3 "21 Dec 2005" "libcurl 7.16.0" "libcurl Manual"
|
||||
.SH NAME
|
||||
curl_multi_socket \- reads/writes available data
|
||||
.SH SYNOPSIS
|
||||
#include <curl/curl.h>
|
||||
|
||||
CURLMcode curl_multi_socket(CURLM * multi_handle, curl_socket_t sockfd);
|
||||
|
||||
CURLMcode curl_multi_socket_all(CURLM *multi_handle);
|
||||
.SH DESCRIPTION
|
||||
Alternative versions of \fIcurl_multi_perform()\fP that allows the application
|
||||
to pass in one of the file descriptors/sockets that have been detected to have
|
||||
\&"action" on them and let libcurl perform. This allows libcurl to not have to
|
||||
scan through all possible file descriptors to check for action. When the
|
||||
application has detected action on a socket handled by libcurl, it should call
|
||||
\fIcurl_multi_perform()\fP with the \fBsockfd\fP argument set to the socket
|
||||
with the action.
|
||||
|
||||
These functions inform the application about updates in the socket (file
|
||||
descriptor) status by doing none, one or multiple calls to the
|
||||
curl_socket_callback given with the CURLMOPT_SOCKETFUNCTION option to
|
||||
\fIcurl_multi_setopt(3)\fP. They update the status with changes since the
|
||||
previous time this function was called.
|
||||
|
||||
If you want to force libcurl to (re-)check all its internal sockets and
|
||||
transfers instead of just a single one, you call
|
||||
\fBcurl_multi_socket_all(3)\fP instead.
|
||||
|
||||
An application should call \fBcurl_multi_timeout(3)\fP to figure out how long
|
||||
it should wait for socket actions \- at most \- before doing the timeout
|
||||
action: call the \fBcurl_multi_socket(3)\fP function with the \fBsockfd\fP
|
||||
argument set to CURL_SOCKET_TIMEOUT.
|
||||
|
||||
The socket \fBcallback\fP function uses a prototype like this
|
||||
.nf
|
||||
|
||||
int curl_socket_callback(CURL *easy, /* easy handle */
|
||||
curl_socket_t s, /* socket */
|
||||
int action, /* see values below */
|
||||
void *userp); /* "private" pointer */
|
||||
|
||||
.fi
|
||||
The callback MUST return 0.
|
||||
|
||||
The \fIaction\fP (third) argument to the callback has one of five values:
|
||||
.RS
|
||||
.IP "CURL_POLL_NONE (0)"
|
||||
register, not interested in readiness (yet)
|
||||
.IP "CURL_POLL_IN (1)"
|
||||
register, interested in read readiness
|
||||
.IP "CURL_POLL_OUT (2)"
|
||||
register, interested in write readiness
|
||||
.IP "CURL_POLL_INOUT (3)"
|
||||
register, interested in both read and write readiness
|
||||
.IP "CURL_POLL_REMOVE (4)"
|
||||
deregister
|
||||
.RE
|
||||
.SH "RETURN VALUE"
|
||||
CURLMcode type, general libcurl multi interface error code.
|
||||
|
||||
If you receive \fICURLM_CALL_MULTI_PERFORM\fP, this basically means that you
|
||||
should call \fIcurl_multi_perform\fP again, before you wait for more actions
|
||||
on libcurl's sockets. You don't have to do it immediately, but the return code
|
||||
means that libcurl may have more data available to return or that there may be
|
||||
more data to send off before it is "satisfied".
|
||||
|
||||
NOTE that this only returns errors etc regarding the whole multi stack. There
|
||||
might still have occurred problems on individual transfers even when this
|
||||
function returns OK.
|
||||
.SH "TYPICAL USAGE"
|
||||
1. Create a multi handle
|
||||
|
||||
2. Set the socket callback with CURLMOPT_SOCKETFUNCTION
|
||||
|
||||
3. Add easy handles
|
||||
|
||||
4. Call curl_multi_socket_all() first once
|
||||
|
||||
5. Setup a "collection" of sockets to supervise when your socket
|
||||
callback is called.
|
||||
|
||||
6. Use curl_multi_timeout() to figure out how long to wait for action
|
||||
|
||||
7. Wait for action on any of libcurl's sockets
|
||||
|
||||
8, When action happens, call curl_multi_socket() for the socket(s) that got
|
||||
action.
|
||||
|
||||
9. Go back to step 6.
|
||||
.SH AVAILABILITY
|
||||
This function was added in libcurl 7.16.0
|
||||
.SH "SEE ALSO"
|
||||
.BR curl_multi_cleanup "(3), " curl_multi_init "(3), "
|
||||
.BR curl_multi_fdset "(3), " curl_multi_info_read "(3)"
|
1
docs/libcurl/curl_multi_socket_all.3
Normal file
1
docs/libcurl/curl_multi_socket_all.3
Normal file
@@ -0,0 +1 @@
|
||||
.so man3/curl_multi_socket.3
|
@@ -12,7 +12,7 @@ curl_multi_strerror - return string describing error code
|
||||
.SH DESCRIPTION
|
||||
The curl_multi_strerror() function returns a string describing the CURLMcode
|
||||
error code passed in the argument \fIerrornum\fP.
|
||||
|
||||
.SH AVAILABILITY
|
||||
This function was added in libcurl 7.12.0
|
||||
.SH RETURN VALUE
|
||||
A pointer to a zero terminated string.
|
||||
|
38
docs/libcurl/curl_multi_timeout.3
Normal file
38
docs/libcurl/curl_multi_timeout.3
Normal file
@@ -0,0 +1,38 @@
|
||||
.\" $Id$
|
||||
.\"
|
||||
.TH curl_multi_timeout 3 "2 Jan 2006" "libcurl 7.16.0" "libcurl Manual"
|
||||
.SH NAME
|
||||
curl_multi_timeout \- how long to wait for action before proceeding
|
||||
.SH SYNOPSIS
|
||||
#include <curl/curl.h>
|
||||
|
||||
CURLMcode curl_multi_timeout(CURLM *multi_handle, long *timeout);
|
||||
.SH DESCRIPTION
|
||||
|
||||
An application using the libcurl multi interface should call
|
||||
\fBcurl_multi_timeout(3)\fP to figure out how long it should wait for socket
|
||||
actions \- at most \- before proceeding.
|
||||
|
||||
Proceeding means either doing the socket-style timeout action: call the
|
||||
\fBcurl_multi_socket(3)\fP function with the \fBsockfd\fP argument set to
|
||||
CURL_SOCKET_TIMEOUT and the \fBeasy\fP argument set to CURL_EASY_TIMEOUT, or
|
||||
simply calling \fBcurl_multi_perform(3)\fP if you're using the simpler and
|
||||
older multi interface approach.
|
||||
|
||||
The timeout value returned in the long \fBtimeout\fP points to, is in number
|
||||
of milliseconds at this very moment. If 0, it means you should proceed
|
||||
immediately without waiting for anything. If it returns -1, there's no timeout
|
||||
at all set.
|
||||
.SH "RETURN VALUE"
|
||||
The standard CURLMcode for multi interface error codes.
|
||||
.SH "TYPICAL USAGE"
|
||||
Call \fBcurl_multi_timeout(3)\fP, then wait for action on the sockets. You
|
||||
figure out which sockets to wait for by calling \fBcurl_multi_fdset(3)\fP or
|
||||
by a previous call to \fBcurl_multi_socket(3)\fP.
|
||||
.SH AVAILABILITY
|
||||
This function was added in libcurl 7.16.0
|
||||
.SH "SEE ALSO"
|
||||
.BR curl_multi_cleanup "(3), " curl_multi_init "(3), "
|
||||
.BR curl_multi_fdset "(3), " curl_multi_info_read "(3), "
|
||||
.BR curl_multi_socket "(3) "
|
||||
|
@@ -12,7 +12,7 @@ curl_share_strerror - return string describing error code
|
||||
.SH DESCRIPTION
|
||||
The curl_share_strerror() function returns a string describing the CURLSHcode
|
||||
error code passed in the argument \fIerrornum\fP.
|
||||
|
||||
.SH AVAILABILITY
|
||||
This function was added in libcurl 7.12.0
|
||||
.SH RETURN VALUE
|
||||
A pointer to a zero terminated string.
|
||||
|
@@ -38,9 +38,9 @@ Couldn't resolve host. The given remote host was not resolved.
|
||||
.IP "CURLE_COULDNT_CONNECT (7)"
|
||||
Failed to connect() to host or proxy.
|
||||
.IP "CURLE_FTP_WEIRD_SERVER_REPLY (8)"
|
||||
After connecting to an FTP server, libcurl expects to get a certain reply back.
|
||||
This error code implies that it god a strange or bad reply. The given remote
|
||||
server is probably not an OK FTP server.
|
||||
After connecting to an FTP server, libcurl expects to get a certain reply
|
||||
back. This error code implies that it got a strange or bad reply. The given
|
||||
remote server is probably not an OK FTP server.
|
||||
.IP "CURLE_FTP_ACCESS_DENIED (9)"
|
||||
We were denied access when trying to login to an FTP server or when trying to
|
||||
change working directory to the one given in the URL.
|
||||
@@ -210,6 +210,9 @@ An easy handle was not good/valid.
|
||||
You are doomed.
|
||||
.IP "CURLM_INTERNAL_ERROR (4)"
|
||||
This can only be returned if libcurl bugs. Please report it to us!
|
||||
.IP "CURLM_BAD_SOCKET (5)"
|
||||
The passed-in socket is not a valid one that libcurl already knows about.
|
||||
(Added in 7.16.0)
|
||||
.SH "CURLSHcode"
|
||||
The "share" interface will return a CURLSHcode to indicate when an error has
|
||||
occurred. Also consider \fIcurl_share_strerror(3)\fP.
|
||||
|
@@ -5,7 +5,7 @@
|
||||
.\" * | (__| |_| | _ <| |___
|
||||
.\" * \___|\___/|_| \_\_____|
|
||||
.\" *
|
||||
.\" * Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
.\" * Copyright (C) 1998 - 2006, 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
|
||||
@@ -267,11 +267,13 @@ GnuTLS
|
||||
|
||||
http://www.gnu.org/software/gnutls/manual/html_node/Multi_002dthreaded-applications.html
|
||||
|
||||
When using multiple threads you should set the CURLOPT_NOSIGNAL option to
|
||||
TRUE for all handles. Everything will work fine except that timeouts are not
|
||||
honored during the DNS lookup - which you can work around by building libcurl
|
||||
with c-ares support. c-ares is a library that provides asynchronous name
|
||||
resolves. Unfortunately, c-ares does not yet support IPv6.
|
||||
When using multiple threads you should set the CURLOPT_NOSIGNAL option to TRUE
|
||||
for all handles. Everything will or might work fine except that timeouts are
|
||||
not honored during the DNS lookup - which you can work around by building
|
||||
libcurl with c-ares support. c-ares is a library that provides asynchronous
|
||||
name resolves. Unfortunately, c-ares does not yet fully support IPv6. On some
|
||||
platforms, libcurl simply will not function properly multi-threaded unless
|
||||
this option is set.
|
||||
|
||||
Also, note that CURLOPT_DNS_USE_GLOBAL_CACHE is not thread-safe.
|
||||
|
||||
@@ -887,12 +889,12 @@ data size is unknown.
|
||||
|
||||
There's only one aspect left in the HTTP requests that we haven't yet
|
||||
mentioned how to modify: the version field. All HTTP requests includes the
|
||||
version number to tell the server which version we support. libcurl speak
|
||||
HTTP 1.1 by default. Some very old servers don't like getting 1.1-requests
|
||||
and when dealing with stubborn old things like that, you can tell libcurl
|
||||
to use 1.0 instead by doing something like this:
|
||||
version number to tell the server which version we support. libcurl speak HTTP
|
||||
1.1 by default. Some very old servers don't like getting 1.1-requests and when
|
||||
dealing with stubborn old things like that, you can tell libcurl to use 1.0
|
||||
instead by doing something like this:
|
||||
|
||||
curl_easy_setopt(easyhandle, CURLOPT_HTTP_VERSION, CURLHTTP_VERSION_1_0);
|
||||
curl_easy_setopt(easyhandle, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);
|
||||
|
||||
.IP "FTP Custom Commands"
|
||||
|
||||
|
@@ -13,10 +13,11 @@ in-depth understanding on how to program with libcurl.
|
||||
There are more than a twenty custom bindings available that bring libcurl
|
||||
access to your favourite language. Look elsewhere for documentation on those.
|
||||
|
||||
All applications that use libcurl should call \fIcurl_global_init(3)\fP
|
||||
exactly once before any libcurl function can be used. After all usage of
|
||||
libcurl is complete, it \fBmust\fP call \fIcurl_global_cleanup(3)\fP. In
|
||||
between those two calls, you can use libcurl as described below.
|
||||
libcurl has a global constant environment that you must set up and
|
||||
maintain while using libcurl. This essentially means you call
|
||||
\fIcurl_global_init(3)\fP at the start of your program and
|
||||
\fIcurl_global_cleanup(3)\fP at the end. See GLOBAL CONSTANTS below
|
||||
for details.
|
||||
|
||||
To transfer files, you always set up an "easy handle" using
|
||||
\fIcurl_easy_init(3)\fP, but when you want the file(s) transferred you have
|
||||
@@ -86,6 +87,10 @@ Never ever call curl-functions simultaneously using the same handle from
|
||||
several threads. libcurl is thread-safe and can be used in any number of
|
||||
threads, but you must use separate curl handles if you want to use libcurl in
|
||||
more than one thread simultaneously.
|
||||
|
||||
The global environment functions are not thread-safe. See GLOBAL CONSTANTS
|
||||
below for details.
|
||||
|
||||
.SH "PERSISTENT CONNECTIONS"
|
||||
Persistent connections means that libcurl can re-use the same connection for
|
||||
several transfers, if the conditions are right.
|
||||
@@ -103,3 +108,96 @@ libcurl will be closed and forgotten.
|
||||
|
||||
Note that the options set with \fIcurl_easy_setopt(3)\fP will be used in on
|
||||
every repeated \fIcurl_easy_perform(3)\fP call.
|
||||
|
||||
.SH "GLOBAL CONSTANTS"
|
||||
There are a variety of constants that libcurl uses, mainly through its
|
||||
internal use of other libraries, which are too complicated for the
|
||||
library loader to set up. Therefore, a program must call a library
|
||||
function after the program is loaded and running to finish setting up
|
||||
the library code. For example, when libcurl is built for SSL
|
||||
capability via the GNU TLS library, there is an elaborate tree inside
|
||||
that library that describes the SSL protocol.
|
||||
|
||||
\fIcurl_global_init()\fP is the function that you must call. This may
|
||||
allocate resources (e.g. the memory for the GNU TLS tree mentioned
|
||||
above), so the companion function \fIcurl_global_cleanup()\fP releases
|
||||
them.
|
||||
|
||||
The basic rule for constructing a program that uses libcurl is this:
|
||||
Call \fIcurl_global_init()\fP, with a \fICURL_GLOBAL_ALL\fP argument,
|
||||
immediately after the program starts, while it is still only one
|
||||
thread and before it uses libcurl at all. Call
|
||||
\fIcurl_global_cleanup()\fP immediately before the program exits, when
|
||||
the program is again only one thread and after its last use of
|
||||
libcurl.
|
||||
|
||||
You can call both of these multiple times, as long as all calls meet
|
||||
these requirements and the number of calls to each is the same.
|
||||
|
||||
It isn't actually required that the functions be called at the beginning
|
||||
and end of the program -- that's just usually the easiest way to do it.
|
||||
It \fIis\fP required that the functions be called when no other thread
|
||||
in the program is running.
|
||||
|
||||
These global constant functions are \fInot thread safe\fP, so you must
|
||||
not call them when any other thread in the program is running. It
|
||||
isn't good enough that no other thread is using libcurl at the time,
|
||||
because these functions internally call similar functions of other
|
||||
libraries, and those functions are similarly thread-unsafe. You can't
|
||||
generally know what these libraries are, or whether other threads are
|
||||
using them.
|
||||
|
||||
The global constant situation merits special consideration when the
|
||||
code you are writing to use libcurl is not the main program, but rather
|
||||
a modular piece of a program, e.g. another library. As a module,
|
||||
your code doesn't know about other parts of the program -- it doesn't
|
||||
know whether they use libcurl or not. And its code doesn't necessarily
|
||||
run at the start and end of the whole program.
|
||||
|
||||
A module like this must have global constant functions of its own,
|
||||
just like \fIcurl_global_init()\fP and \fIcurl_global_cleanup()\fP.
|
||||
The module thus has control at the beginning and end of the program
|
||||
and has a place to call the libcurl functions. Note that if multiple
|
||||
modules in the program use libcurl, they all will separately call the
|
||||
libcurl functions, and that's OK because only the first
|
||||
\fIcurl_global_init()\fP and the last \fIcurl_global_cleanup()\fP in a
|
||||
program changes anything. (libcurl uses a reference count in static
|
||||
memory).
|
||||
|
||||
In a C++ module, it is common to deal with the global constant
|
||||
situation by defining a special class that represents the global
|
||||
constant environment of the module. A program always has exactly one
|
||||
object of the class, in static storage. That way, the program
|
||||
automatically calls the constructor of the object as the program
|
||||
starts up and the destructor as it terminates. As the author of this
|
||||
libcurl-using module, you can make the constructor call
|
||||
\fIcurl_global_init()\fP and the destructor call
|
||||
\fIcurl_global_cleanup()\fP and satisfy libcurl's requirements without
|
||||
your user having to think about it.
|
||||
|
||||
\fIcurl_global_init()\fP has an argument that tells what particular
|
||||
parts of the global constant environment to set up. In order to
|
||||
successfully use any value except \fICURL_GLOBAL_ALL\fP (which says to
|
||||
set up the whole thing), you must have specific knowledge of internal
|
||||
workings of libcurl and all other parts of the program of which it is
|
||||
part.
|
||||
|
||||
A special part of the global constant environment is the identity of
|
||||
the memory allocator. \fIcurl_global_init()\fP selects the system
|
||||
default memory allocator, but you can use \fIcurl_global_init_mem()\fP
|
||||
to supply one of your own. However, there is no way to use
|
||||
\fIcurl_global_init_mem()\fP in a modular program -- all modules in
|
||||
the program that might use libcurl would have to agree on one
|
||||
allocator.
|
||||
|
||||
There is a failsafe in libcurl that makes it usable in simple
|
||||
situations without you having to worry about the global constant
|
||||
environment at all: \fIcurl_easy_init()\fP sets up the environment
|
||||
itself if it hasn't been done yet. The resources it acquires to do so
|
||||
get released by the operating system automatically when the program
|
||||
exits.
|
||||
|
||||
This failsafe feature exists mainly for backward compatibility because
|
||||
there was a time when the global functions didn't exist. Because it
|
||||
is sufficient only in the simplest of programs, it is not recommended
|
||||
for any program to rely on it.
|
||||
|
@@ -1,7 +1,7 @@
|
||||
# LIBCURL_CHECK_CONFIG ([DEFAULT-ACTION], [MINIMUM-VERSION],
|
||||
# [ACTION-IF-YES], [ACTION-IF-NO])
|
||||
# ----------------------------------------------------------
|
||||
# David Shaw <dshaw@jabberwocky.com> Jun-21-2005
|
||||
# David Shaw <dshaw@jabberwocky.com> Jan-17-2006
|
||||
#
|
||||
# Checks for libcurl. DEFAULT-ACTION is the string yes or no to
|
||||
# specify whether to default to --with-libcurl or --without-libcurl.
|
||||
@@ -13,10 +13,10 @@
|
||||
# ACTION-IF-NO is a list of shell commands that are run otherwise.
|
||||
# Note that using --without-libcurl does run ACTION-IF-NO.
|
||||
#
|
||||
# This macro defines HAVE_LIBCURL if a working libcurl setup is found,
|
||||
# and sets @LIBCURL@ and @LIBCURL_CPPFLAGS@ to the necessary values.
|
||||
# Other useful defines are LIBCURL_FEATURE_xxx where xxx are the
|
||||
# various features supported by libcurl, and LIBCURL_PROTOCOL_yyy
|
||||
# This macro #defines HAVE_LIBCURL if a working libcurl setup is
|
||||
# found, and sets @LIBCURL@ and @LIBCURL_CPPFLAGS@ to the necessary
|
||||
# values. Other useful defines are LIBCURL_FEATURE_xxx where xxx are
|
||||
# the various features supported by libcurl, and LIBCURL_PROTOCOL_yyy
|
||||
# where yyy are the various protocols supported by libcurl. Both xxx
|
||||
# and yyy are capitalized. See the list of AH_TEMPLATEs at the top of
|
||||
# the macro for the complete list of possible defines. Shell
|
||||
@@ -32,7 +32,8 @@
|
||||
# found is after version 7.7.2, the first version that included the
|
||||
# curl-config script. Note that it is very important for people
|
||||
# packaging binary versions of libcurl to include this script!
|
||||
# Without curl-config, we can only guess what protocols are available.
|
||||
# Without curl-config, we can only guess what protocols are available,
|
||||
# or use curl_version_info to figure it out at runtime.
|
||||
|
||||
AC_DEFUN([LIBCURL_CHECK_CONFIG],
|
||||
[
|
||||
@@ -41,16 +42,19 @@ AC_DEFUN([LIBCURL_CHECK_CONFIG],
|
||||
AH_TEMPLATE([LIBCURL_FEATURE_IPV6],[Defined if libcurl supports IPv6])
|
||||
AH_TEMPLATE([LIBCURL_FEATURE_LIBZ],[Defined if libcurl supports libz])
|
||||
AH_TEMPLATE([LIBCURL_FEATURE_ASYNCHDNS],[Defined if libcurl supports AsynchDNS])
|
||||
AH_TEMPLATE([LIBCURL_FEATURE_IDN],[Defined if libcurl supports IDN])
|
||||
AH_TEMPLATE([LIBCURL_FEATURE_SSPI],[Defined if libcurl supports SSPI])
|
||||
AH_TEMPLATE([LIBCURL_FEATURE_NTLM],[Defined if libcurl supports NTLM])
|
||||
|
||||
AH_TEMPLATE([LIBCURL_PROTOCOL_HTTP],[Defined if libcurl supports HTTP])
|
||||
AH_TEMPLATE([LIBCURL_PROTOCOL_HTTPS],[Defined if libcurl supports HTTPS])
|
||||
AH_TEMPLATE([LIBCURL_PROTOCOL_FTP],[Defined if libcurl supports FTP])
|
||||
AH_TEMPLATE([LIBCURL_PROTOCOL_FTPS],[Defined if libcurl supports FTPS])
|
||||
AH_TEMPLATE([LIBCURL_PROTOCOL_GOPHER],[Defined if libcurl supports GOPHER])
|
||||
AH_TEMPLATE([LIBCURL_PROTOCOL_FILE],[Defined if libcurl supports FILE])
|
||||
AH_TEMPLATE([LIBCURL_PROTOCOL_TELNET],[Defined if libcurl supports TELNET])
|
||||
AH_TEMPLATE([LIBCURL_PROTOCOL_LDAP],[Defined if libcurl supports LDAP])
|
||||
AH_TEMPLATE([LIBCURL_PROTOCOL_DICT],[Defined if libcurl supports DICT])
|
||||
AH_TEMPLATE([LIBCURL_PROTOCOL_TFTP],[Defined if libcurl supports TFTP])
|
||||
|
||||
AC_ARG_WITH(libcurl,
|
||||
AC_HELP_STRING([--with-libcurl=DIR],[look for the curl library in DIR]),
|
||||
@@ -65,12 +69,13 @@ AC_DEFUN([LIBCURL_CHECK_CONFIG],
|
||||
_libcurl_try_link=yes
|
||||
|
||||
if test -d "$_libcurl_with" ; then
|
||||
CPPFLAGS="${CPPFLAGS} -I$withval/include"
|
||||
LDFLAGS="${LDFLAGS} -L$withval/lib"
|
||||
LIBCURL_CPPFLAGS="-I$withval/include"
|
||||
_libcurl_ldflags="-L$withval/lib"
|
||||
AC_PATH_PROG([_libcurl_config],["$withval/bin/curl-config"])
|
||||
else
|
||||
AC_PATH_PROG([_libcurl_config],[curl-config])
|
||||
fi
|
||||
|
||||
AC_PATH_PROG([_libcurl_config],[curl-config])
|
||||
|
||||
if test x$_libcurl_config != "x" ; then
|
||||
AC_CACHE_CHECK([for the version of libcurl],
|
||||
[libcurl_cv_lib_curl_version],
|
||||
@@ -126,15 +131,15 @@ AC_DEFUN([LIBCURL_CHECK_CONFIG],
|
||||
|
||||
# we didn't find curl-config, so let's see if the user-supplied
|
||||
# link line (or failing that, "-lcurl") is enough.
|
||||
LIBCURL=${LIBCURL-"-lcurl"}
|
||||
LIBCURL=${LIBCURL-"$_libcurl_ldflags -lcurl"}
|
||||
|
||||
AC_CACHE_CHECK([whether libcurl is usable],
|
||||
[libcurl_cv_lib_curl_usable],
|
||||
[
|
||||
_libcurl_save_cppflags=$CPPFLAGS
|
||||
CPPFLAGS="$CPPFLAGS $LIBCURL_CPPFLAGS"
|
||||
CPPFLAGS="$LIBCURL_CPPFLAGS $CPPFLAGS"
|
||||
_libcurl_save_libs=$LIBS
|
||||
LIBS="$LIBS $LIBCURL"
|
||||
LIBS="$LIBCURL $LIBS"
|
||||
|
||||
AC_LINK_IFELSE(AC_LANG_PROGRAM([#include <curl/curl.h>],[
|
||||
/* Try and use a few common options to force a failure if we are
|
||||
@@ -188,7 +193,7 @@ x=CURLOPT_VERBOSE;
|
||||
|
||||
# We don't have --protocols, so just assume that all
|
||||
# protocols are available
|
||||
_libcurl_protocols="HTTP FTP GOPHER FILE TELNET LDAP DICT"
|
||||
_libcurl_protocols="HTTP FTP FILE TELNET LDAP DICT"
|
||||
|
||||
if test x$libcurl_feature_SSL = xyes ; then
|
||||
_libcurl_protocols="$_libcurl_protocols HTTPS"
|
||||
@@ -216,6 +221,7 @@ x=CURLOPT_VERBOSE;
|
||||
unset _libcurl_protocol
|
||||
unset _libcurl_protocols
|
||||
unset _libcurl_version
|
||||
unset _libcurl_ldflags
|
||||
fi
|
||||
|
||||
if test x$_libcurl_with = xno || test x$libcurl_cv_lib_curl_usable != xyes ; then
|
||||
|
@@ -7,14 +7,25 @@ LDFLAGS = -lcrypt -lidn -lssl -lcrypto -ldl -lz -lresolv -L../ares/.libs -lcares
|
||||
LIBCURL = -L../lib/.libs/ -lcurl
|
||||
CFLAGS = -I../include -g -DHAVE_CURL_MULTI_SOCKET
|
||||
|
||||
all: shiper hiper ulimiter
|
||||
|
||||
hiper: hiper.o $(LIBCURL)
|
||||
$(CC) -o $@ $< $(LIBCURL) $(LDFLAGS)
|
||||
|
||||
hiper.o: hiper.c
|
||||
$(CC) $(CFLAGS) -c $<
|
||||
|
||||
shiper: shiper.o $(LIBCURL)
|
||||
$(CC) -o $@ $< $(LIBCURL) $(LDFLAGS)
|
||||
|
||||
shiper.o: shiper.c
|
||||
$(CC) $(CFLAGS) -c $<
|
||||
|
||||
ulimiter: ulimiter.c
|
||||
$(CC) -o $@ $<
|
||||
|
||||
clean:
|
||||
rm hiper.o hiper
|
||||
rm -f hiper.o hiper shiper shiper.o *~ ulimiter
|
||||
|
||||
$(LIBCURL):
|
||||
(cd ../lib && make)
|
||||
|
240
hiper/STATUS
Normal file
240
hiper/STATUS
Normal file
@@ -0,0 +1,240 @@
|
||||
Date: January 5, 2006
|
||||
Author: Daniel Stenberg
|
||||
|
||||
Status of project Hiper - high performance libcurl modifications
|
||||
================================================================
|
||||
|
||||
What is Hiper
|
||||
|
||||
You won't find such a description in this document. See
|
||||
http://curl.haxx.se/libcurl/hiper/ for further details.
|
||||
|
||||
Live Progress Info
|
||||
|
||||
During my work, I've posted occational updates on the curl-library mailing
|
||||
list but more importantly done frequent updates of
|
||||
http://curl.haxx.se/libcurl/hiper/schedule.html
|
||||
|
||||
Schedule
|
||||
|
||||
I took time off my regular job during Decemember 2005 and the first week of
|
||||
January 2006 to work on hiper full-time.
|
||||
|
||||
Step 1 - Measure the Existing Solution
|
||||
|
||||
I started full-time work on project Hiper on December 1st 2005. I began by
|
||||
putting together a test application that used the existing API to allow me
|
||||
to properly and with accuracy measure execution and transfer speeds when
|
||||
doing a large amount of transfers.
|
||||
|
||||
I soon discovered that it was impossible to do any sensible measurements by
|
||||
using live and actual URLs since the transfers were too unrelialble and
|
||||
uncontrolled. I then enhanced the current HTTP server in the curl test suite
|
||||
and made that support a large amount of transfers and some extra magic
|
||||
"commands" that would make the server either just sit "idle" or "stream"
|
||||
(continuously sending data in a never-ending stream). I then wrote up two
|
||||
files using the curl test suite file format and by acessing the properly
|
||||
formatted URLs on my localhost the HTTP server would either run "idle" or
|
||||
run "stream".
|
||||
|
||||
Having this working, I patched libcurl to always only recv() a single byte
|
||||
off the network each time, just to make sure that the time spent on reading
|
||||
data is constant and never very long.
|
||||
|
||||
I adjusted the test application (actually called 'hiper') to create Y idle
|
||||
transfers and Z stream transfers, had it run for N seconds and then quit and
|
||||
produce a summary on stdout. Now I got very solid and repeatable results. I
|
||||
started to run repeated tests and save the results when I ran into the
|
||||
dreaded 1024 socket maximum limit.
|
||||
|
||||
One side of the problem is that the fd_set type only allows 1024 file
|
||||
descriptors (on my Linux), which I had to solve by simply making my own type
|
||||
with room for more connections and do ugly typecasts in the code. The other
|
||||
side of the problem is that user applications have a limit imposed by the
|
||||
system on the maximum amount of file descriptors it can have open and I had
|
||||
to work around that by writing a special tool that runs setuid root that
|
||||
increases the limit, downgrades to a normal user again and then run the
|
||||
command line of your choice. This second approach has to be used for both
|
||||
'hiper' and the test HTTP server. (You need to build the HTTP server with
|
||||
CURL_SWS_FORK_ENABLED defined to have it do forks since it isn't desirable
|
||||
to do so when running the normal curl tests.)
|
||||
|
||||
Now I could run my test program without problems. I decided to run the tests
|
||||
with 1 stream connection and a varying amount of idle ones. I did 1001,
|
||||
2001, 3001, 5001 and 9001 connections and measured how long select() and
|
||||
curl_multi_perform() (including the curl_multi_fdset() call) would take in
|
||||
average, over a period of 20 seconds. I ran each test 5-6 times and I used
|
||||
the average time of all the runs.
|
||||
|
||||
The times in number of microseconds:
|
||||
|
||||
Connections multi_perform select
|
||||
1001 3504 951
|
||||
2001 7606 1988
|
||||
3001 11045 2715
|
||||
5001 16406 4024
|
||||
9001 32147 8030
|
||||
|
||||
Test system
|
||||
CPU: Athlon XP 2800
|
||||
RAM: 1 GB
|
||||
Linux: 2.6
|
||||
glibc: 2.3.5
|
||||
libcurl: 7.15.1
|
||||
|
||||
The only reason I stopped at 9001 connections is that my test machine ran
|
||||
out of avaiable memory by then as I ran the test server on the same machine,
|
||||
and I didn't want to risk the test result accuracy by having it start using
|
||||
the swap during the tests.
|
||||
|
||||
It means that at 9000 connections we spend 40ms for each socket action, even
|
||||
when only one socket ever have action.
|
||||
|
||||
With these 32000 microseconds curl_multi_perform() takes for 9000
|
||||
connections, it loops 18000 laps which makes less than 2 microseconds per
|
||||
lap. (Of course counting time/laps is an oversimplification, but anyway.)
|
||||
Hopefully we should achieve less than 10 microseconds for each call to
|
||||
curl_multi_socket() for an active connection.
|
||||
|
||||
The timing graph displayed on the libevent site (duplicated on the hiper
|
||||
project page) suggests that libevent is pretty much fixed at 50 microseconds
|
||||
(although I don't know what test box was used in their testing, we can
|
||||
compare the select()-times from my tests and see that they are at least
|
||||
resonably close).
|
||||
|
||||
Summing up, the current ~40 ms spent at 9000 connections could then possibly
|
||||
be lowered to something around 60 us!
|
||||
|
||||
Step 2 - Implement curl_multi_socket API
|
||||
|
||||
Most of the design decisions and debates about this new API have already
|
||||
been held on the curl-library mailing list a long time ago so I had a basic
|
||||
idea on what approach to use. The main ideas of the new API are simply:
|
||||
|
||||
1 - The application can use whatever event system it likes as it gets info
|
||||
from libcurl about what file descriptors libcurl waits for what action
|
||||
on. (The previous API returns fd_sets which is very select()-centric).
|
||||
|
||||
2 - When the application discovers action on a single socket, it calls
|
||||
libcurl and informs that there was action on this particular socket and
|
||||
libcurl can then act on that socket/transfer only and not care about
|
||||
any other transfers. (The previous API always had to scan through all
|
||||
the existing transfers.)
|
||||
|
||||
The idea is that curl_multi_socket() calls a given callback with information
|
||||
about what socket to wait for what action on, and the callback only gets
|
||||
called if the status of that socket has changed.
|
||||
|
||||
In the API draft from before, we have a timeout argument on a per socket
|
||||
basis and we also allowed curl_multi_socket() to pass in an 'easy handle'
|
||||
instead of socket to allow libcurl to shortcut a lookup and work on the
|
||||
affected easy handle right away. Both these turned out to be bad ideas.
|
||||
|
||||
The timeout argument was removed from the socket callback since after much
|
||||
thinking I came to the conclusion that we really don't want to handle
|
||||
timeouts on a per socket basis. We need it on a per transfer (easy handle)
|
||||
basis and thus we can't provide it in the callbacks in a nice way. Instead,
|
||||
we have to offer a curl_multi_timeout() that returns the largest amount of
|
||||
time we should wait before we call the "timeout action" of libcurl, to
|
||||
trigger the proper internal timeout action on the affected transfer. To get
|
||||
this to work, I added a struct to each easy handle in which we store an
|
||||
"expire time" (if any). The structs are then "splay sorted" so that we can
|
||||
add and remove times from the linked list and yet somewhat swiftly figure
|
||||
out 1 - how long time there is until the next timer expires and 2 - which
|
||||
timer (handle) should we take care of now. Of course, the upside of all this
|
||||
is that we get a curl_multi_timeout() that should also work with old-style
|
||||
applications that use curl_multi_perform().
|
||||
|
||||
The easy handle argument was removed fom the curl_multi_socket() function
|
||||
because having it there would require the application to do a socket to easy
|
||||
handle conversion on its own. I find it very unlikely that applications
|
||||
would want to do that and since libcurl would need such a lookup on its own
|
||||
anyway since we didn't want to force applications to do that translation
|
||||
code (it would be optional), it seemed like an unnecessary option. I also
|
||||
realized that when we use underlying libraries such as c-ares (for DNS
|
||||
asynch resolving) there might in fact be more than one transfer waiting for
|
||||
action on the same socket and thus it makes the lookup even tricker and even
|
||||
less likely to ever get done by applications. Instead I created an internal
|
||||
"socket to easy handles" hash table that given a socket (file descriptor)
|
||||
returns a list of easy handles that waits for some action on that socket.
|
||||
|
||||
To make libcurl be able to report plain sockets in the socket callback, I
|
||||
had to re-organize the internals of the curl_multi_fdset() etc so that the
|
||||
conversion from sockets to fd_sets for that function is only done in the
|
||||
last step before the data is returned. I also had to extend c-ares to get a
|
||||
function that can return plain sockets, as that library too returned only
|
||||
fd_sets and that is no longer good enough. The changes done to c-ares have
|
||||
been committed and are available in the c-ares CVS repository destined to be
|
||||
included in the upcoming c-ares 1.3.1 release.
|
||||
|
||||
The 'shiper' tool is the test application I wrote that uses the new
|
||||
curl_multi_socket() in its current state. It seems to be working and it uses
|
||||
the API as it is documented and supposed to work. It is still using
|
||||
select(), because I needed that during development (like until I had the
|
||||
socket hash implemented etc) and because I haven't yet learned how to use
|
||||
libevent or similar.
|
||||
|
||||
The hiper/shiper tools are very simple and initiates lots of connections and
|
||||
have them running for the test period and then kills them all.
|
||||
|
||||
Since I wasn't done with the implementation until early January I haven't
|
||||
had time to run very many measurements and checks, but I have done a few
|
||||
runs with up to a few hundred connections (with a single active one). The
|
||||
curl_multi_socket() invoke then takes 3-6 microseconds in average (using the
|
||||
read-only-1-byte-at-a-time hack). If this number does increase a lot when we
|
||||
add connections, it certainly matches my in my opinion very ambitious goal.
|
||||
We are now below the 60 microseconds "per socket action" goal. It is
|
||||
destined to be somewhat higher the more connections we have since the hash
|
||||
table gets more populated and the splay tree will grow etc.
|
||||
|
||||
Some tests at 7000 and 9000 connections showed that the socket hash lookup
|
||||
is somewhat of a bottle neck. Its current implementation may be a bit too
|
||||
limiting. It simply has a fixed-size array, and on each entry in the array
|
||||
it has a linked list with entries. So the hash only checks which list to
|
||||
scan through. The code I had used so for used a list with merely 7 slots (as
|
||||
that is what the DNS hash uses) but with 7000 connections that would make an
|
||||
average of 1000 nodes in each list to run through. I upped that to 97 slots
|
||||
(I believe a prime is suitable) and noticed a significant speed increase. I
|
||||
need to reconsider the hash implementation or use a rather large default
|
||||
value like this. At 9000 connections I was still below 10us per call.
|
||||
|
||||
Status Right Now
|
||||
|
||||
The curl_multi_socket() API is implemented according to how it is
|
||||
documented. The man pages for curl_multi_socket and curl_multi_timeout are
|
||||
both committed to CVS and are available online for easy browsing:
|
||||
|
||||
http://curl.haxx.se/libcurl/c/curl_multi_socket.html
|
||||
http://curl.haxx.se/libcurl/c/curl_multi_timeout.html
|
||||
|
||||
The hiper-5.patch I made available early morning January 5th, 2006 should
|
||||
apply fine on a recent CVS checkout (at the time of this writing curl 7.15.1
|
||||
is the latest public curl release but the hiper patch does not apply fine on
|
||||
that).
|
||||
|
||||
What is Left for the curl_multi_socket API
|
||||
|
||||
1 - More measuring with more extreme number of connections
|
||||
|
||||
2 - More testing with actual URLs and complete from start to end transfers.
|
||||
|
||||
I'm quite sure we don't set expire times all over in the code properly, so
|
||||
there is bound to be some timeout bugs left.
|
||||
|
||||
What it really takes is for me to commit the code and to make an official
|
||||
release with it so that we get people "out there" to help out testing it.
|
||||
|
||||
What is Left for project Hiper
|
||||
|
||||
1 - Add HTTP pipelining support
|
||||
|
||||
2 - Add a zero (or at least close to zero) copy interface
|
||||
|
||||
Neither of these points have been planned or detailed exactly how they will
|
||||
be implemented.
|
||||
|
||||
Roadmap Ahead
|
||||
|
||||
I plan and hope to return to full-time hiper work later on this spring or
|
||||
possibly summer to continue where I pause now. Of course some spare time
|
||||
might also be spent until then to get us moving forward.
|
253
hiper/hiper.c
253
hiper/hiper.c
@@ -7,12 +7,20 @@
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
* Connect to N sites simultanouesly and download data.
|
||||
* Connect N connections. Z are idle, and X are active. Transfer as fast as
|
||||
* possible.
|
||||
*
|
||||
* Run for a specific amount of time (10 secs for now). Output detailed timing
|
||||
* information.
|
||||
*
|
||||
*/
|
||||
|
||||
/* The maximum number of simultanoues connections/transfers we support */
|
||||
#define NCONNECTIONS 50000
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/time.h>
|
||||
#include <time.h>
|
||||
#include <unistd.h>
|
||||
@@ -20,12 +28,10 @@
|
||||
|
||||
#include <curl/curl.h>
|
||||
|
||||
/* The number of simultanoues connections/transfers we do */
|
||||
#define NCONNECTIONS 2000
|
||||
#define MICROSEC 1000000 /* number of microseconds in one second */
|
||||
|
||||
/* The least number of connections we are interested in, so when we go below
|
||||
this amount we can just as well stop */
|
||||
#define NMARGIN 50
|
||||
/* The maximum time (in microseconds) we run the test */
|
||||
#define RUN_FOR_THIS_LONG (20*MICROSEC)
|
||||
|
||||
/* Number of loops (seconds) we allow the total download amount and alive
|
||||
connections to remain the same until we bail out. Set this slightly higher
|
||||
@@ -39,11 +45,21 @@ struct globalinfo {
|
||||
struct connection {
|
||||
CURL *e;
|
||||
int id; /* just a counter for easy browsing */
|
||||
char url[80];
|
||||
char *url;
|
||||
size_t dlcounter;
|
||||
struct globalinfo *global;
|
||||
char error[CURL_ERROR_SIZE];
|
||||
};
|
||||
|
||||
/* on port 8999 we run a modified (fork-) sws that supports pure idle and full
|
||||
stream mode */
|
||||
#define PORT "8999"
|
||||
|
||||
#define HOST "192.168.1.13"
|
||||
|
||||
#define URL_IDLE "http://" HOST ":" PORT "/1000"
|
||||
#define URL_ACTIVE "http://" HOST ":" PORT "/1001"
|
||||
|
||||
static size_t
|
||||
writecallback(void *ptr, size_t size, size_t nmemb, void *data)
|
||||
{
|
||||
@@ -87,8 +103,6 @@ struct conncount {
|
||||
long maxtime;
|
||||
};
|
||||
|
||||
struct conncount timecount[NCONNECTIONS+1];
|
||||
|
||||
static struct timeval timerpause;
|
||||
static void timer_pause(void)
|
||||
{
|
||||
@@ -101,13 +115,6 @@ static void timer_pause(void)
|
||||
long lap;
|
||||
|
||||
lap = tvdiff(&timerpause, &cont);
|
||||
|
||||
timecount[still_running].time_us += lap;
|
||||
timecount[still_running].laps++; /* number of times added */
|
||||
|
||||
if(lap > timecount[still_running].maxtime) {
|
||||
timecount[still_running].maxtime = lap;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -124,7 +131,7 @@ static void timer_continue(void)
|
||||
}
|
||||
|
||||
static long total; /* amount of us from start to stop */
|
||||
static void timer_stop(void)
|
||||
static void timer_total(void)
|
||||
{
|
||||
struct timeval stop;
|
||||
/* Capture the time of the operation stopped moment, now calculate how long
|
||||
@@ -136,7 +143,7 @@ static void timer_stop(void)
|
||||
}
|
||||
|
||||
struct globalinfo info;
|
||||
struct connection conns[NCONNECTIONS];
|
||||
struct connection *conns;
|
||||
|
||||
long selects;
|
||||
long selectsalive;
|
||||
@@ -147,35 +154,36 @@ long performalive;
|
||||
long performselect;
|
||||
long topselect;
|
||||
|
||||
int num_total;
|
||||
int num_idle;
|
||||
int num_active;
|
||||
|
||||
static void report(void)
|
||||
{
|
||||
int i;
|
||||
long active = total - paused;
|
||||
long numdl = 0;
|
||||
|
||||
for(i=0; i < NCONNECTIONS; i++) {
|
||||
for(i=0; i < num_total; i++) {
|
||||
if(conns[i].dlcounter)
|
||||
numdl++;
|
||||
}
|
||||
|
||||
printf("Summary from %d simultanoues transfers:\n",
|
||||
NCONNECTIONS);
|
||||
printf("Summary from %d simultanoues transfers (%d active)\n",
|
||||
num_total, num_active);
|
||||
printf("%d out of %d connections provided data\n", numdl, num_total);
|
||||
|
||||
printf("Total time %ldus - Paused %ldus = Active %ldus =\n Active/total"
|
||||
" %ldus\n",
|
||||
total, paused, active, active/NCONNECTIONS);
|
||||
printf("Total time: %ldus select(): %ldus curl_multi_perform(): %ldus\n",
|
||||
total, paused, active);
|
||||
|
||||
printf(" Active/(connections that delivered data) = %ldus\n",
|
||||
active/numdl);
|
||||
|
||||
printf("%d out of %d connections provided data\n", numdl, NCONNECTIONS);
|
||||
|
||||
printf("%d calls to curl_multi_perform(), average %d alive. "
|
||||
printf("%d calls to curl_multi_perform() average %d alive "
|
||||
"Average time: %dus\n",
|
||||
perform, performalive/perform, active/perform);
|
||||
|
||||
printf("%d calls to select(), average %d alive\n",
|
||||
selects, selectsalive/selects);
|
||||
printf("%d calls to select(), average %d alive "
|
||||
"Average time: %dus\n",
|
||||
selects, selectsalive/selects,
|
||||
paused/selects);
|
||||
printf(" Average number of readable connections per select() return: %d\n",
|
||||
performselect/selects);
|
||||
printf(" Max number of readable connections for a single select() "
|
||||
@@ -184,9 +192,16 @@ static void report(void)
|
||||
|
||||
printf("%ld select() timeouts\n", timeouts);
|
||||
|
||||
for(i=1; i< NCONNECTIONS; i++) {
|
||||
printf("Downloaded %ld bytes in %ld bytes/sec, %ld usec/byte\n",
|
||||
info.dlcounter,
|
||||
info.dlcounter/(total/1000000),
|
||||
total/info.dlcounter);
|
||||
|
||||
#if 0
|
||||
for(i=1; i< num_total; i++) {
|
||||
if(timecount[i].laps) {
|
||||
printf("Time %d connections, average %ld max %ld (%ld laps) average/conn: %ld\n",
|
||||
printf("Time %d connections, average %ld max %ld (%ld laps) "
|
||||
"average/conn: %ld\n",
|
||||
i,
|
||||
timecount[i].time_us/timecount[i].laps,
|
||||
timecount[i].maxtime,
|
||||
@@ -194,8 +209,16 @@ static void report(void)
|
||||
(timecount[i].time_us/timecount[i].laps)/i );
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
struct ourfdset {
|
||||
char fdbuffer[NCONNECTIONS/8];
|
||||
};
|
||||
#define FD2_ZERO(x) FD_ZERO((fd_set *)x)
|
||||
|
||||
typedef struct ourfdset fd2_set;
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
CURLM *multi_handle;
|
||||
@@ -204,61 +227,68 @@ int main(int argc, char **argv)
|
||||
CURLMcode mcode = CURLM_OK;
|
||||
int rc;
|
||||
int i;
|
||||
FILE *urls;
|
||||
int startindex=0;
|
||||
char buffer[256];
|
||||
|
||||
int prevalive=-1;
|
||||
int prevsamecounter=0;
|
||||
int prevtotal = -1;
|
||||
fd2_set fdsizecheck;
|
||||
int selectmaxamount;
|
||||
|
||||
memset(&info, 0, sizeof(struct globalinfo));
|
||||
|
||||
if(argc < 2) {
|
||||
printf("Usage: hiper [file] [start index]\n");
|
||||
selectmaxamount = sizeof(fdsizecheck) * 8;
|
||||
printf("select() supports max %d connections\n", selectmaxamount);
|
||||
|
||||
if(argc < 3) {
|
||||
printf("Usage: hiper [num idle] [num active]\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
urls = fopen(argv[1], "r");
|
||||
if(!urls)
|
||||
/* failed to open list of urls */
|
||||
return 1;
|
||||
num_idle = atoi(argv[1]);
|
||||
num_active = atoi(argv[2]);
|
||||
|
||||
if(argc > 2)
|
||||
startindex = atoi(argv[2]);
|
||||
num_total = num_idle + num_active;
|
||||
|
||||
if(startindex) {
|
||||
/* Pass this many lines before we start using URLs from the file. On
|
||||
repeated invokes, try using different indexes to avoid torturing the
|
||||
same servers. */
|
||||
while(startindex--) {
|
||||
if(!fgets(buffer, sizeof(buffer), urls))
|
||||
break;
|
||||
}
|
||||
if(num_total > selectmaxamount) {
|
||||
printf("Requested more connections than supported!\n");
|
||||
return 4;
|
||||
}
|
||||
|
||||
conns = calloc(num_total, sizeof(struct connection));
|
||||
if(!conns) {
|
||||
printf("Out of memory\n");
|
||||
return 3;
|
||||
}
|
||||
|
||||
if(num_total >= NCONNECTIONS) {
|
||||
printf("Increase NCONNECTIONS!\n");
|
||||
return 2;
|
||||
}
|
||||
|
||||
/* init the multi stack */
|
||||
multi_handle = curl_multi_init();
|
||||
|
||||
for(i=0; i< NCONNECTIONS; i++) {
|
||||
for(i=0; i< num_total; i++) {
|
||||
CURL *e;
|
||||
char *nl;
|
||||
|
||||
memset(&conns[i], 0, sizeof(struct connection));
|
||||
|
||||
/* read a line from the file of URLs */
|
||||
if(!fgets(conns[i].url, sizeof(conns[i].url), urls))
|
||||
/* failed to read a line */
|
||||
break;
|
||||
|
||||
/* strip off trailing newlines */
|
||||
nl = strchr(conns[i].url, '\n');
|
||||
if(nl)
|
||||
*nl=0; /* cut */
|
||||
if(i < num_idle)
|
||||
conns[i].url = URL_IDLE;
|
||||
else
|
||||
conns[i].url = URL_ACTIVE;
|
||||
|
||||
#if 0
|
||||
printf("%d: Add URL %s\n", i, conns[i].url);
|
||||
|
||||
#endif
|
||||
e = curl_easy_init();
|
||||
|
||||
if(!e) {
|
||||
printf("curl_easy_init() for handle %d failed, exiting!\n", i);
|
||||
return 2;
|
||||
}
|
||||
|
||||
conns[i].e = e;
|
||||
conns[i].id = i;
|
||||
conns[i].global = &info;
|
||||
@@ -266,50 +296,64 @@ int main(int argc, char **argv)
|
||||
curl_easy_setopt(e, CURLOPT_URL, conns[i].url);
|
||||
curl_easy_setopt(e, CURLOPT_WRITEFUNCTION, writecallback);
|
||||
curl_easy_setopt(e, CURLOPT_WRITEDATA, &conns[i]);
|
||||
#if 0
|
||||
#if 1
|
||||
curl_easy_setopt(e, CURLOPT_VERBOSE, 1);
|
||||
curl_easy_setopt(e, CURLOPT_ERRORBUFFER, errorbuffer);
|
||||
#endif
|
||||
curl_easy_setopt(e, CURLOPT_ERRORBUFFER, conns[i].error);
|
||||
curl_easy_setopt(e, CURLOPT_PRIVATE, &conns[i]);
|
||||
|
||||
/* add the easy to the multi */
|
||||
curl_multi_add_handle(multi_handle, e);
|
||||
if(CURLM_OK != curl_multi_add_handle(multi_handle, e)) {
|
||||
printf("curl_multi_add_handle() returned error for %d\n", i);
|
||||
return 3;
|
||||
}
|
||||
}
|
||||
|
||||
/* we start some action by calling perform right away */
|
||||
while(CURLM_CALL_MULTI_PERFORM ==
|
||||
curl_multi_perform(multi_handle, &still_running));
|
||||
|
||||
printf("Starting timer!\n");
|
||||
printf("Starting timer, expects to run for %ldus\n", RUN_FOR_THIS_LONG);
|
||||
timer_start();
|
||||
|
||||
while(still_running) {
|
||||
while(still_running == num_total) {
|
||||
struct timeval timeout;
|
||||
int rc; /* select() return code */
|
||||
long timeout_ms;
|
||||
|
||||
fd_set fdread;
|
||||
fd_set fdwrite;
|
||||
fd_set fdexcep;
|
||||
fd2_set fdread;
|
||||
fd2_set fdwrite;
|
||||
fd2_set fdexcep;
|
||||
int maxfd;
|
||||
|
||||
FD_ZERO(&fdread);
|
||||
FD_ZERO(&fdwrite);
|
||||
FD_ZERO(&fdexcep);
|
||||
FD2_ZERO(&fdread);
|
||||
FD2_ZERO(&fdwrite);
|
||||
FD2_ZERO(&fdexcep);
|
||||
|
||||
/* set a suitable timeout to play around with */
|
||||
timeout.tv_sec = 0;
|
||||
timeout.tv_usec = 50000;
|
||||
curl_multi_timeout(multi_handle, &timeout_ms);
|
||||
|
||||
/* set timeout to wait */
|
||||
timeout.tv_sec = timeout_ms/1000;
|
||||
timeout.tv_usec = (timeout_ms%1000)*1000;
|
||||
|
||||
/* get file descriptors from the transfers */
|
||||
curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd);
|
||||
curl_multi_fdset(multi_handle,
|
||||
(fd_set *)&fdread,
|
||||
(fd_set *)&fdwrite,
|
||||
(fd_set *)&fdexcep, &maxfd);
|
||||
|
||||
timer_pause();
|
||||
selects++;
|
||||
selectsalive += still_running;
|
||||
rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
|
||||
rc = select(maxfd+1,
|
||||
(fd_set *)&fdread,
|
||||
(fd_set *)&fdwrite,
|
||||
(fd_set *)&fdexcep, &timeout);
|
||||
|
||||
#if 0
|
||||
/* Output this here to make it outside the timer */
|
||||
printf("Running: %d (%d bytes)\n", still_running, info.dlcounter);
|
||||
|
||||
#endif
|
||||
timer_continue();
|
||||
|
||||
switch(rc) {
|
||||
@@ -332,43 +376,38 @@ int main(int argc, char **argv)
|
||||
topselect = rc;
|
||||
break;
|
||||
}
|
||||
if(still_running < NMARGIN) {
|
||||
printf("Only %d connections left alive, existing\n",
|
||||
still_running);
|
||||
|
||||
if(total > RUN_FOR_THIS_LONG) {
|
||||
printf("Stopped after %ldus\n", total);
|
||||
break;
|
||||
}
|
||||
|
||||
if((prevalive == still_running) && (prevtotal == info.dlcounter) &&
|
||||
info.dlcounter) {
|
||||
/* The same amount of still alive transfers as last lap, increase
|
||||
counter. Only do this if _anything_ has been downloaded since it
|
||||
tends to come here during the initial name lookup phase when using
|
||||
asynch DNS libcurl otherwise.
|
||||
*/
|
||||
prevsamecounter++;
|
||||
|
||||
if(prevsamecounter >= IDLE_TIME) {
|
||||
/* for the sake of being efficient, we stop the operation when
|
||||
IDLE_TIME has passed without any bytes transfered */
|
||||
printf("Idle time (%d secs) reached (with %d still claimed alive),"
|
||||
" exiting\n",
|
||||
IDLE_TIME, still_running);
|
||||
break;
|
||||
}
|
||||
}
|
||||
else {
|
||||
prevsamecounter=0;
|
||||
if(prevalive != still_running) {
|
||||
printf("%d connections alive\n", still_running);
|
||||
}
|
||||
prevalive = still_running;
|
||||
prevtotal = info.dlcounter;
|
||||
|
||||
timer_total(); /* calculate the total time spent so far */
|
||||
}
|
||||
|
||||
timer_stop();
|
||||
if(still_running != num_total) {
|
||||
/* something made connections fail, extract the reason and tell */
|
||||
int msgs_left;
|
||||
struct connection *cptr;
|
||||
while ((msg = curl_multi_info_read(multi_handle, &msgs_left))) {
|
||||
if (msg->msg == CURLMSG_DONE) {
|
||||
curl_easy_getinfo(msg->easy_handle, CURLINFO_PRIVATE, &cptr);
|
||||
|
||||
printf("%d => (%d) %s", cptr->id, msg->data.result, cptr->error);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
curl_multi_cleanup(multi_handle);
|
||||
|
||||
/* cleanup all the easy handles */
|
||||
for(i=0; i< NCONNECTIONS; i++)
|
||||
for(i=0; i< num_total; i++)
|
||||
curl_easy_cleanup(conns[i].e);
|
||||
|
||||
report();
|
||||
|
557
hiper/shiper.c
Normal file
557
hiper/shiper.c
Normal file
@@ -0,0 +1,557 @@
|
||||
/*****************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
* / __| | | | |_) | |
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
* Connect N connections. Z are idle, and X are active. Transfer as fast as
|
||||
* possible.
|
||||
*
|
||||
* Run for a specific amount of time (10 secs for now). Output detailed timing
|
||||
* information.
|
||||
*
|
||||
* The same is hiper.c but instead using the new *socket() API instead of the
|
||||
* "old" *perform() call.
|
||||
*
|
||||
* Uses libevent.
|
||||
*
|
||||
*/
|
||||
|
||||
/* The maximum number of simultanoues connections/transfers we support */
|
||||
#define NCONNECTIONS 50000
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/time.h>
|
||||
#include <time.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/poll.h>
|
||||
|
||||
#include <curl/curl.h>
|
||||
|
||||
#include <event.h> /* for libevent */
|
||||
|
||||
#ifndef FALSE
|
||||
#define FALSE 0
|
||||
#endif
|
||||
|
||||
#ifndef TRUE
|
||||
#define TRUE 1
|
||||
#endif
|
||||
|
||||
#define MICROSEC 1000000 /* number of microseconds in one second */
|
||||
|
||||
/* The maximum time (in microseconds) we run the test */
|
||||
#define RUN_FOR_THIS_LONG (5*MICROSEC)
|
||||
|
||||
/* Number of loops (seconds) we allow the total download amount and alive
|
||||
connections to remain the same until we bail out. Set this slightly higher
|
||||
when using asynch supported libcurl. */
|
||||
#define IDLE_TIME 10
|
||||
|
||||
struct ourfdset {
|
||||
/* __fds_bits is what the Linux glibc headers use when they declare the
|
||||
fd_set struct so by using this we can actually avoid the typecase for the
|
||||
FD_SET() macro usage but it would hardly be portable */
|
||||
char __fds_bits[NCONNECTIONS/8];
|
||||
};
|
||||
#define FD2_ZERO(x) memset(x, 0, sizeof(struct ourfdset))
|
||||
|
||||
typedef struct ourfdset fd2_set;
|
||||
|
||||
struct globalinfo {
|
||||
size_t dlcounter;
|
||||
};
|
||||
|
||||
struct connection {
|
||||
CURL *e;
|
||||
int id; /* just a counter for easy browsing */
|
||||
char *url;
|
||||
size_t dlcounter;
|
||||
struct globalinfo *global;
|
||||
char error[CURL_ERROR_SIZE];
|
||||
};
|
||||
|
||||
struct fdinfo {
|
||||
/* create a link list of fdinfo structs */
|
||||
struct fdinfo *next;
|
||||
struct fdinfo *prev;
|
||||
curl_socket_t sockfd;
|
||||
CURL *easy;
|
||||
int action; /* as set by libcurl */
|
||||
long timeout; /* as set by libcurl */
|
||||
struct event ev;
|
||||
};
|
||||
|
||||
static struct fdinfo *allsocks;
|
||||
|
||||
static struct fdinfo *findsock(curl_socket_t s)
|
||||
{
|
||||
/* return the struct for the given socket */
|
||||
struct fdinfo *fdp = allsocks;
|
||||
|
||||
while(fdp) {
|
||||
if(fdp->sockfd == s)
|
||||
break;
|
||||
fdp = fdp->next;
|
||||
}
|
||||
return fdp; /* a struct pointer or NULL */
|
||||
}
|
||||
|
||||
static void remsock(curl_socket_t s)
|
||||
{
|
||||
struct fdinfo *fdp = allsocks;
|
||||
|
||||
while(fdp) {
|
||||
if(fdp->sockfd == s)
|
||||
break;
|
||||
fdp = fdp->next;
|
||||
}
|
||||
if(!fdp)
|
||||
/* did not find socket to remove! */
|
||||
return;
|
||||
|
||||
if(fdp->prev)
|
||||
fdp->prev->next = fdp->next;
|
||||
if(fdp->next)
|
||||
fdp->next->prev = fdp->prev;
|
||||
else
|
||||
/* this was the last entry */
|
||||
allsocks = NULL;
|
||||
}
|
||||
|
||||
static void setsock(struct fdinfo *fdp, curl_socket_t s, CURL *easy,
|
||||
int action)
|
||||
{
|
||||
fdp->sockfd = s;
|
||||
fdp->action = action;
|
||||
fdp->easy = easy;
|
||||
}
|
||||
|
||||
static void addsock(curl_socket_t s, CURL *easy, int action)
|
||||
{
|
||||
struct fdinfo *fdp = calloc(sizeof(struct fdinfo), 1);
|
||||
|
||||
setsock(fdp, s, easy, action);
|
||||
|
||||
if(allsocks) {
|
||||
fdp->next = allsocks;
|
||||
allsocks->prev = fdp;
|
||||
|
||||
/* now set allsocks to point to the new struct */
|
||||
allsocks = fdp;
|
||||
}
|
||||
else
|
||||
allsocks = fdp;
|
||||
}
|
||||
|
||||
static void fdinfo2fdset(fd2_set *fdread, fd2_set *fdwrite, int *maxfd)
|
||||
{
|
||||
struct fdinfo *fdp = allsocks;
|
||||
int writable=0;
|
||||
|
||||
FD2_ZERO(fdread);
|
||||
FD2_ZERO(fdwrite);
|
||||
|
||||
*maxfd = 0;
|
||||
|
||||
#if 0
|
||||
printf("Wait for: ");
|
||||
#endif
|
||||
|
||||
while(fdp) {
|
||||
if(fdp->action & CURL_POLL_IN) {
|
||||
FD_SET(fdp->sockfd, (fd_set *)fdread);
|
||||
}
|
||||
if(fdp->action & CURL_POLL_OUT) {
|
||||
FD_SET(fdp->sockfd, (fd_set *)fdwrite);
|
||||
writable++;
|
||||
}
|
||||
|
||||
#if 0
|
||||
printf("%d (%s%s) ",
|
||||
fdp->sockfd,
|
||||
(fdp->action & CURL_POLL_IN)?"r":"",
|
||||
(fdp->action & CURL_POLL_OUT)?"w":"");
|
||||
#endif
|
||||
|
||||
if(fdp->sockfd > *maxfd)
|
||||
*maxfd = fdp->sockfd;
|
||||
|
||||
fdp = fdp->next;
|
||||
}
|
||||
#if 0
|
||||
if(writable)
|
||||
printf("Check for %d writable sockets\n", writable);
|
||||
#endif
|
||||
}
|
||||
|
||||
/* on port 8999 we run a fork enabled sws that supports 'idle' and 'stream' */
|
||||
#define PORT "8999"
|
||||
|
||||
#define HOST "192.168.1.13"
|
||||
|
||||
#define URL_IDLE "http://" HOST ":" PORT "/1000"
|
||||
#define URL_ACTIVE "http://" HOST ":" PORT "/1001"
|
||||
|
||||
|
||||
static int socket_callback(CURL *easy, /* easy handle */
|
||||
curl_socket_t s, /* socket */
|
||||
int what, /* see above */
|
||||
void *userp) /* "private" pointer */
|
||||
{
|
||||
struct fdinfo *fdp;
|
||||
printf("socket %d easy %p what %d\n", s, easy, what);
|
||||
|
||||
if(what == CURL_POLL_REMOVE)
|
||||
remsock(s);
|
||||
else {
|
||||
fdp = findsock(s);
|
||||
|
||||
if(!fdp) {
|
||||
addsock(s, easy, what);
|
||||
}
|
||||
else {
|
||||
/* we already know about it, just change action/timeout */
|
||||
printf("Changing info for socket %d from %d to %d\n",
|
||||
s, fdp->action, what);
|
||||
setsock(fdp, s, easy, what);
|
||||
}
|
||||
}
|
||||
return 0; /* return code meaning? */
|
||||
}
|
||||
|
||||
|
||||
static size_t
|
||||
writecallback(void *ptr, size_t size, size_t nmemb, void *data)
|
||||
{
|
||||
size_t realsize = size * nmemb;
|
||||
struct connection *c = (struct connection *)data;
|
||||
|
||||
c->dlcounter += realsize;
|
||||
c->global->dlcounter += realsize;
|
||||
|
||||
#if 0
|
||||
printf("%02d: %d, total %d\n",
|
||||
c->id, c->dlcounter, c->global->dlcounter);
|
||||
#endif
|
||||
return realsize;
|
||||
}
|
||||
|
||||
/* return the diff between two timevals, in us */
|
||||
static long tvdiff(struct timeval *newer, struct timeval *older)
|
||||
{
|
||||
return (newer->tv_sec-older->tv_sec)*1000000+
|
||||
(newer->tv_usec-older->tv_usec);
|
||||
}
|
||||
|
||||
|
||||
/* store the start time of the program in this variable */
|
||||
static struct timeval timer;
|
||||
|
||||
static void timer_start(void)
|
||||
{
|
||||
/* capture the time of the start moment */
|
||||
gettimeofday(&timer, NULL);
|
||||
}
|
||||
|
||||
static struct timeval cont; /* at this moment we continued */
|
||||
|
||||
int still_running; /* keep number of running handles */
|
||||
|
||||
struct conncount {
|
||||
long time_us;
|
||||
long laps;
|
||||
long maxtime;
|
||||
};
|
||||
|
||||
static struct timeval timerpause;
|
||||
static void timer_pause(void)
|
||||
{
|
||||
/* capture the time of the pause moment */
|
||||
gettimeofday(&timerpause, NULL);
|
||||
|
||||
/* If we have a previous continue (all times except the first), we can now
|
||||
store the time for a whole "lap" */
|
||||
if(cont.tv_sec) {
|
||||
long lap;
|
||||
|
||||
lap = tvdiff(&timerpause, &cont);
|
||||
}
|
||||
}
|
||||
|
||||
static long paused; /* amount of us we have been pausing */
|
||||
|
||||
static void timer_continue(void)
|
||||
{
|
||||
/* Capture the time of the restored operation moment, now calculate how long
|
||||
time we were paused and added that to the 'paused' variable.
|
||||
*/
|
||||
gettimeofday(&cont, NULL);
|
||||
|
||||
paused += tvdiff(&cont, &timerpause);
|
||||
}
|
||||
|
||||
static long total; /* amount of us from start to stop */
|
||||
static void timer_total(void)
|
||||
{
|
||||
struct timeval stop;
|
||||
/* Capture the time of the operation stopped moment, now calculate how long
|
||||
time we were running and how much of that pausing.
|
||||
*/
|
||||
gettimeofday(&stop, NULL);
|
||||
|
||||
total = tvdiff(&stop, &timer);
|
||||
}
|
||||
|
||||
struct globalinfo info;
|
||||
struct connection *conns;
|
||||
|
||||
long selects;
|
||||
long timeouts;
|
||||
|
||||
long multi_socket;
|
||||
long performalive;
|
||||
long performselect;
|
||||
long topselect;
|
||||
|
||||
int num_total;
|
||||
int num_idle;
|
||||
int num_active;
|
||||
|
||||
static void report(void)
|
||||
{
|
||||
int i;
|
||||
long active = total - paused;
|
||||
long numdl = 0;
|
||||
|
||||
for(i=0; i < num_total; i++) {
|
||||
if(conns[i].dlcounter)
|
||||
numdl++;
|
||||
}
|
||||
|
||||
printf("Summary from %d simultanoues transfers (%d active)\n",
|
||||
num_total, num_active);
|
||||
printf("%d out of %d connections provided data\n", numdl, num_total);
|
||||
|
||||
printf("Total time: %ldus paused: %ldus curl_multi_socket(): %ldus\n",
|
||||
total, paused, active);
|
||||
|
||||
printf("%d calls to select() "
|
||||
"Average time: %dus\n",
|
||||
selects, paused/selects);
|
||||
printf(" Average number of readable connections per select() return: %d\n",
|
||||
performselect/selects);
|
||||
|
||||
printf(" Max number of readable connections for a single select() "
|
||||
"return: %d\n",
|
||||
topselect);
|
||||
|
||||
printf("%ld calls to multi_socket(), "
|
||||
"Average time: %ldus\n",
|
||||
multi_socket, active/multi_socket);
|
||||
|
||||
printf("%ld select() timeouts\n", timeouts);
|
||||
|
||||
printf("Downloaded %ld bytes in %ld bytes/sec, %ld usec/byte\n",
|
||||
info.dlcounter,
|
||||
info.dlcounter/(total/1000000),
|
||||
total/info.dlcounter);
|
||||
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
CURLM *multi_handle;
|
||||
CURLMsg *msg;
|
||||
CURLcode code = CURLE_OK;
|
||||
CURLMcode mcode = CURLM_OK;
|
||||
int rc;
|
||||
int i;
|
||||
fd2_set fdsizecheck;
|
||||
int selectmaxamount;
|
||||
struct fdinfo *fdp;
|
||||
char act;
|
||||
|
||||
memset(&info, 0, sizeof(struct globalinfo));
|
||||
|
||||
selectmaxamount = sizeof(fdsizecheck) * 8;
|
||||
printf("select() supports max %d connections\n", selectmaxamount);
|
||||
|
||||
if(argc < 3) {
|
||||
printf("Usage: hiper [num idle] [num active]\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
num_idle = atoi(argv[1]);
|
||||
num_active = atoi(argv[2]);
|
||||
|
||||
num_total = num_idle + num_active;
|
||||
|
||||
if(num_total > selectmaxamount) {
|
||||
printf("Requested more connections than supported!\n");
|
||||
return 4;
|
||||
}
|
||||
|
||||
conns = calloc(num_total, sizeof(struct connection));
|
||||
if(!conns) {
|
||||
printf("Out of memory\n");
|
||||
return 3;
|
||||
}
|
||||
|
||||
if(num_total >= NCONNECTIONS) {
|
||||
printf("Too many connections requested, increase NCONNECTIONS!\n");
|
||||
return 2;
|
||||
}
|
||||
|
||||
printf("About to do %d connections\n", num_total);
|
||||
|
||||
/* init the multi stack */
|
||||
multi_handle = curl_multi_init();
|
||||
|
||||
for(i=0; i< num_total; i++) {
|
||||
CURL *e;
|
||||
char *nl;
|
||||
|
||||
memset(&conns[i], 0, sizeof(struct connection));
|
||||
|
||||
if(i < num_idle)
|
||||
conns[i].url = URL_IDLE;
|
||||
else
|
||||
conns[i].url = URL_ACTIVE;
|
||||
|
||||
e = curl_easy_init();
|
||||
|
||||
if(!e) {
|
||||
printf("curl_easy_init() for handle %d failed, exiting!\n", i);
|
||||
return 2;
|
||||
}
|
||||
|
||||
conns[i].e = e;
|
||||
conns[i].id = i;
|
||||
conns[i].global = &info;
|
||||
|
||||
curl_easy_setopt(e, CURLOPT_URL, conns[i].url);
|
||||
curl_easy_setopt(e, CURLOPT_WRITEFUNCTION, writecallback);
|
||||
curl_easy_setopt(e, CURLOPT_WRITEDATA, &conns[i]);
|
||||
curl_easy_setopt(e, CURLOPT_VERBOSE, 0);
|
||||
curl_easy_setopt(e, CURLOPT_ERRORBUFFER, conns[i].error);
|
||||
curl_easy_setopt(e, CURLOPT_PRIVATE, &conns[i]);
|
||||
|
||||
/* add the easy to the multi */
|
||||
if(CURLM_OK != curl_multi_add_handle(multi_handle, e)) {
|
||||
printf("curl_multi_add_handle() returned error for %d\n", i);
|
||||
return 3;
|
||||
}
|
||||
}
|
||||
|
||||
curl_multi_setopt(multi_handle, CURLMOPT_SOCKETFUNCTION, socket_callback);
|
||||
curl_multi_setopt(multi_handle, CURLMOPT_SOCKETDATA, NULL);
|
||||
|
||||
/* we start the action by calling *socket() right away */
|
||||
while(CURLM_CALL_MULTI_PERFORM == curl_multi_socket_all(multi_handle));
|
||||
|
||||
printf("Starting timer, expects to run for %ldus\n", RUN_FOR_THIS_LONG);
|
||||
timer_start();
|
||||
timer_pause();
|
||||
|
||||
while(1) {
|
||||
struct timeval timeout;
|
||||
int rc; /* select() return code */
|
||||
long timeout_ms;
|
||||
|
||||
fd2_set fdread;
|
||||
fd2_set fdwrite;
|
||||
int maxfd;
|
||||
|
||||
curl_multi_timeout(multi_handle, &timeout_ms);
|
||||
|
||||
/* set timeout to wait */
|
||||
timeout.tv_sec = timeout_ms/1000;
|
||||
timeout.tv_usec = (timeout_ms%1000)*1000;
|
||||
|
||||
/* convert file descriptors from the transfers to fd_sets */
|
||||
fdinfo2fdset(&fdread, &fdwrite, &maxfd);
|
||||
|
||||
selects++;
|
||||
rc = select(maxfd+1,
|
||||
(fd_set *)&fdread,
|
||||
(fd_set *)&fdwrite,
|
||||
NULL, &timeout);
|
||||
switch(rc) {
|
||||
case -1:
|
||||
/* select error */
|
||||
break;
|
||||
case 0:
|
||||
timeouts++;
|
||||
curl_multi_socket(multi_handle, CURL_SOCKET_TIMEOUT);
|
||||
break;
|
||||
|
||||
default:
|
||||
/* timeout or readable/writable sockets */
|
||||
|
||||
for(i=0, fdp = allsocks; fdp; fdp = fdp->next) {
|
||||
act = 0;
|
||||
if((fdp->action & CURL_POLL_IN) &&
|
||||
FD_ISSET(fdp->sockfd, &fdread)) {
|
||||
act |= CURL_POLL_IN;
|
||||
i++;
|
||||
}
|
||||
if((fdp->action & CURL_POLL_OUT) &&
|
||||
FD_ISSET(fdp->sockfd, &fdwrite)) {
|
||||
act |= CURL_POLL_OUT;
|
||||
i++;
|
||||
}
|
||||
|
||||
if(act) {
|
||||
multi_socket++;
|
||||
timer_continue();
|
||||
if(act & CURL_POLL_OUT)
|
||||
act--;
|
||||
curl_multi_socket(multi_handle, fdp->sockfd);
|
||||
timer_pause();
|
||||
}
|
||||
}
|
||||
|
||||
performselect += rc;
|
||||
if(rc > topselect)
|
||||
topselect = rc;
|
||||
break;
|
||||
}
|
||||
|
||||
timer_total(); /* calculate the total time spent so far */
|
||||
|
||||
if(total > RUN_FOR_THIS_LONG) {
|
||||
printf("Stopped after %ldus\n", total);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(still_running != num_total) {
|
||||
/* something made connections fail, extract the reason and tell */
|
||||
int msgs_left;
|
||||
struct connection *cptr;
|
||||
while ((msg = curl_multi_info_read(multi_handle, &msgs_left))) {
|
||||
if (msg->msg == CURLMSG_DONE) {
|
||||
curl_easy_getinfo(msg->easy_handle, CURLINFO_PRIVATE, &cptr);
|
||||
|
||||
printf("%d => (%d) %s", cptr->id, msg->data.result, cptr->error);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
curl_multi_cleanup(multi_handle);
|
||||
|
||||
/* cleanup all the easy handles */
|
||||
for(i=0; i< num_total; i++)
|
||||
curl_easy_cleanup(conns[i].e);
|
||||
|
||||
report();
|
||||
|
||||
return code;
|
||||
}
|
101
hiper/ulimiter.c
Normal file
101
hiper/ulimiter.c
Normal file
@@ -0,0 +1,101 @@
|
||||
/*****************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
* / __| | | | |_) | |
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
* Little tool to raise the amount of maximum file descriptor and then run the
|
||||
* given command line (using the hard-coded uid/gid).
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/resource.h>
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
#include <string.h> /* for errno translation */
|
||||
|
||||
/* ulimiter
|
||||
*
|
||||
* Source code inspiration from:
|
||||
* http://www.cs.wisc.edu/condor/condorg/linux_scalability.html
|
||||
*/
|
||||
|
||||
#define UID 1000 /* the user who must run this */
|
||||
|
||||
#define GID 1000 /* group id to run the program as */
|
||||
|
||||
/* Number of open files to increase to */
|
||||
#define NEW_MAX 10000
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
int ret;
|
||||
struct rlimit rl;
|
||||
char *brgv[20];
|
||||
int brgc=argc-1;
|
||||
int i;
|
||||
|
||||
for(i=1; i< argc; i++)
|
||||
brgv[i-1]=argv[i];
|
||||
brgv[i-1]=NULL; /* terminate the list */
|
||||
|
||||
if(getuid() != UID) {
|
||||
fprintf(stderr, "Only uid %d is allowed to run this\n", UID);
|
||||
return 1;
|
||||
}
|
||||
|
||||
ret = getrlimit(RLIMIT_NOFILE, &rl);
|
||||
if(ret != 0) {
|
||||
fprintf(stderr, "Unable to read open file limit.\n"
|
||||
"(getrlimit(RLIMIT_NOFILE, &rl) failed)\n"
|
||||
"(%d, %s)", errno, strerror(errno));
|
||||
return 1;
|
||||
}
|
||||
|
||||
fprintf(stderr, "Limit was %d (max %d), setting to %d\n",
|
||||
rl.rlim_cur, rl.rlim_max, NEW_MAX);
|
||||
|
||||
rl.rlim_cur = rl.rlim_max = NEW_MAX;
|
||||
ret = setrlimit(RLIMIT_NOFILE, &rl);
|
||||
if(ret != 0) {
|
||||
fprintf(stderr, "Unable to set open file limit.\n"
|
||||
"(setrlimit(RLIMIT_NOFILE, &rl) failed)\n"
|
||||
"(%d, %s)", errno, strerror(errno));
|
||||
return 1;
|
||||
}
|
||||
|
||||
ret = getrlimit(RLIMIT_NOFILE, &rl);
|
||||
if(ret != 0) {
|
||||
fprintf(stderr, "Unable to read new open file limit.\n"
|
||||
"(getrlimit(RLIMIT_NOFILE, &rl) failed)\n"
|
||||
"(%d, %s)", errno, strerror(errno));
|
||||
return 1;
|
||||
}
|
||||
if(rl.rlim_cur < NEW_MAX) {
|
||||
fprintf(stderr, "Failed to set new open file limit.\n"
|
||||
"Limit is %d, expected %d\n",
|
||||
rl.rlim_cur, NEW_MAX);
|
||||
return 1;
|
||||
}
|
||||
|
||||
if(setgid(GID) != 0) {
|
||||
fprintf(stderr, "setgid failed (%d, %s)\n", errno, strerror(errno));
|
||||
return 1;
|
||||
}
|
||||
if(setuid(UID) != 0) {
|
||||
fprintf(stderr, "setuid failed (%d, %s)\n", errno, strerror(errno));
|
||||
return 1;
|
||||
}
|
||||
|
||||
ret = execv(brgv[0], brgv);
|
||||
|
||||
fprintf(stderr, "execl returned, failure\n"
|
||||
"returned %d, errno is %d (%s)\n",
|
||||
ret, errno, strerror(errno));
|
||||
return 1;
|
||||
}
|
@@ -7,7 +7,7 @@
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
* Copyright (C) 1998 - 2006, 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
|
||||
@@ -65,9 +65,11 @@ extern "C" {
|
||||
* We want the typedef curl_off_t setup for large file support on all
|
||||
* platforms. We also provide a CURL_FORMAT_OFF_T define to use in *printf
|
||||
* format strings when outputting a variable of type curl_off_t.
|
||||
*
|
||||
* Note: "pocc -Ze" is MSVC compatibily mode and this sets _MSC_VER!
|
||||
*/
|
||||
|
||||
#if defined(_MSC_VER) || defined(__LCC__)
|
||||
#if (defined(_MSC_VER) && !defined(__POCC__)) || (defined(__LCC__) && defined(WIN32))
|
||||
/* MSVC */
|
||||
#ifdef _WIN32_WCE
|
||||
typedef long curl_off_t;
|
||||
@@ -76,7 +78,7 @@ extern "C" {
|
||||
typedef signed __int64 curl_off_t;
|
||||
#define CURL_FORMAT_OFF_T "%I64d"
|
||||
#endif
|
||||
#else /* _MSC_VER || __LCC__ */
|
||||
#else /* (_MSC_VER && !__POCC__) || (__LCC__ && WIN32) */
|
||||
#if (defined(__GNUC__) && defined(WIN32)) || defined(__WATCOMC__)
|
||||
/* gcc on windows or Watcom */
|
||||
typedef long long curl_off_t;
|
||||
@@ -108,7 +110,7 @@ extern "C" {
|
||||
#define CURL_FORMAT_OFF_T "%ld"
|
||||
#endif
|
||||
#endif /* GCC or Watcom on Windows */
|
||||
#endif /* _MSC_VER || __LCC__ */
|
||||
#endif /* (_MSC_VER && !__POCC__) || (__LCC__ && WIN32) */
|
||||
|
||||
#ifdef UNDEF_FILE_OFFSET_BITS
|
||||
/* this was defined above for our checks, undefine it again */
|
||||
@@ -400,7 +402,8 @@ typedef enum {
|
||||
* platforms.
|
||||
*/
|
||||
#if defined(__STDC__) || defined(_MSC_VER) || defined(__cplusplus) || \
|
||||
defined(__HP_aCC) || defined(__BORLANDC__) || defined(__LCC__)
|
||||
defined(__HP_aCC) || defined(__BORLANDC__) || defined(__LCC__) || \
|
||||
defined(__POCC__)
|
||||
/* This compiler is believed to have an ISO compatible preprocessor */
|
||||
#define CURL_ISOCPP
|
||||
#else
|
||||
@@ -912,6 +915,18 @@ typedef enum {
|
||||
/* Select "file method" to use when doing FTP */
|
||||
CINIT(FTP_FILEMETHOD, LONG, 138),
|
||||
|
||||
/* Local port number to bind the socket to */
|
||||
CINIT(LOCALPORT, LONG, 139),
|
||||
|
||||
/* Number of ports to try, including the first one set with LOCALPORT.
|
||||
Thus, setting it to 1 will make no additional attempts but the first.
|
||||
*/
|
||||
CINIT(LOCALPORTRANGE, LONG, 140),
|
||||
|
||||
/* no transfer, set up connection and let application use the socket by
|
||||
extracting it with CURLINFO_LASTSOCKET */
|
||||
CINIT(CONNECT_ONLY, LONG, 141),
|
||||
|
||||
CURLOPT_LASTENTRY /* the last unused */
|
||||
} CURLoption;
|
||||
|
||||
@@ -1266,9 +1281,10 @@ typedef enum {
|
||||
CURLINFO_NUM_CONNECTS = CURLINFO_LONG + 26,
|
||||
CURLINFO_SSL_ENGINES = CURLINFO_SLIST + 27,
|
||||
CURLINFO_COOKIELIST = CURLINFO_SLIST + 28,
|
||||
CURLINFO_LASTSOCKET = CURLINFO_LONG + 29,
|
||||
/* Fill in new entries below here! */
|
||||
|
||||
CURLINFO_LASTONE = 28
|
||||
CURLINFO_LASTONE = 29
|
||||
} CURLINFO;
|
||||
|
||||
/* CURLINFO_RESPONSE_CODE is the new name for the option previously known as
|
||||
|
@@ -28,13 +28,13 @@
|
||||
|
||||
/* This is the version number of the libcurl package from which this header
|
||||
file origins: */
|
||||
#define LIBCURL_VERSION "7.15.1-CVS"
|
||||
#define LIBCURL_VERSION "7.15.2-CVS"
|
||||
|
||||
/* The numeric version number is also available "in parts" by using these
|
||||
defines: */
|
||||
#define LIBCURL_VERSION_MAJOR 7
|
||||
#define LIBCURL_VERSION_MINOR 15
|
||||
#define LIBCURL_VERSION_PATCH 1
|
||||
#define LIBCURL_VERSION_PATCH 2
|
||||
|
||||
/* This is the numeric version of the libcurl version number, meant for easier
|
||||
parsing and comparions by programs. The LIBCURL_VERSION_NUM define will
|
||||
@@ -51,6 +51,6 @@
|
||||
and it is always a greater number in a more recent release. It makes
|
||||
comparisons with greater than and less than work.
|
||||
*/
|
||||
#define LIBCURL_VERSION_NUM 0x070f01
|
||||
#define LIBCURL_VERSION_NUM 0x070f02
|
||||
|
||||
#endif /* __CURL_CURLVER_H */
|
||||
|
@@ -7,7 +7,7 @@
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2004, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
* 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
|
||||
|
@@ -7,7 +7,7 @@
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
* Copyright (C) 1998 - 2006, 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
|
||||
@@ -55,7 +55,7 @@
|
||||
/* HP-UX systems version 9, 10 and 11 lack sys/select.h and so does oldish
|
||||
libc5-based Linux systems. Only include it on system that are known to
|
||||
require it! */
|
||||
#if defined(_AIX) || defined(NETWARE)
|
||||
#if defined(_AIX) || defined(NETWARE) || defined(__NetBSD__)
|
||||
#include <sys/select.h>
|
||||
#endif
|
||||
|
||||
@@ -250,50 +250,8 @@ CURL_EXTERN const char *curl_multi_strerror(CURLMcode);
|
||||
*
|
||||
* Desc: An alternative version of curl_multi_perform() that allows the
|
||||
* application to pass in one of the file descriptors that have been
|
||||
* detected to have "action" on them and let libcurl perform. This
|
||||
* allows libcurl to not have to scan through all possible file
|
||||
* descriptors to check for this. The app is recommended to pass in
|
||||
* the 'easy' argument (or set it to CURL_EASY_NONE) to make libcurl
|
||||
* figure out the internal structure even faster and easier. If the
|
||||
* easy argument is set to something else than CURL_EASY_NONE, the
|
||||
* 's' (socket) argument will be ignored by libcurl.
|
||||
*
|
||||
* It also informs the application about updates in the socket (file
|
||||
* descriptor) status by doing none, one or multiple calls to the
|
||||
* curl_socket_callback. It thus updates the status with changes
|
||||
* since the previous time this function was used. If 'callback' is
|
||||
* NULL, no callback will be called. A status change may also be a
|
||||
* new timeout only, having the same IN/OUT status as before.
|
||||
*
|
||||
* If a previous wait for socket action(s) timed out, you should call
|
||||
* this function with the socket argument set to
|
||||
* CURL_SOCKET_TIMEOUT. If you want to force libcurl to (re-)check
|
||||
* all its internal sockets, and call the callback with status for
|
||||
* all sockets no matter what the previous state is, you call
|
||||
* curl_multi_socket_all() instead.
|
||||
*
|
||||
* curl_multi_perform() is thus the equivalent of calling
|
||||
* curl_multi_socket_all(handle, NULL, NULL);
|
||||
*
|
||||
* IMPLEMENTATION: libcurl will need an internal hash table to map
|
||||
* socket numbers to internal easy handles for the cases when 'easy'
|
||||
* is set to CURL_EASY_NONE.
|
||||
*
|
||||
* Regarding the timeout argument in the callback: it is the timeout
|
||||
* (in milliseconds) for waiting on action on this socket (and the
|
||||
* given time period starts when the callback is called) until you
|
||||
* should call curl_multi_socket() with the timeout stuff mentioned
|
||||
* above. If "actions" happens on the socket before the timeout
|
||||
* happens, remember that the timout timer keeps ticking until told
|
||||
* otherwise.
|
||||
*
|
||||
* The "what" argument has one of five values:
|
||||
*
|
||||
* 0 CURL_POLL_NONE (0) - register, not interested in readiness
|
||||
* 1 CURL_POLL_IN - register, interested in read readiness
|
||||
* 2 CURL_POLL_OUT - register, interested in write readiness
|
||||
* 3 CURL_POLL_INOUT - register, interested in both
|
||||
* 4 CURL_POLL_REMOVE - deregister
|
||||
* detected to have "action" on them and let libcurl perform.
|
||||
* See man page for details.
|
||||
*/
|
||||
#define CURL_POLL_NONE 0
|
||||
#define CURL_POLL_IN 1
|
||||
@@ -308,7 +266,6 @@ CURL_EXTERN const char *curl_multi_strerror(CURLMcode);
|
||||
typedef int (*curl_socket_callback)(CURL *easy, /* easy handle */
|
||||
curl_socket_t s, /* socket */
|
||||
int what, /* see above */
|
||||
long ms, /* timeout for wait */
|
||||
void *userp); /* "private" pointer */
|
||||
|
||||
CURLMcode curl_multi_socket(CURLM *multi_handle,
|
||||
|
@@ -154,10 +154,10 @@ CFGSET = TRUE
|
||||
# release-ssl-dll
|
||||
|
||||
!IF "$(CFG)" == "release-ssl-dll"
|
||||
TARGET = $(LIB_NAME).dll
|
||||
TARGET = $(LIB_NAME).lib
|
||||
DIROBJ = $(CFG)
|
||||
LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll"
|
||||
LNK = $(LNKDLL) $(WINLIBS) /out:$(DIROBJ)\$(TARGET) $(SSLLIBS) $(LFLAGSSSL) /IMPLIB:$(DIROBJ)\$(IMPLIB_NAME).lib
|
||||
LNK = $(LNKLIB) $(WINLIBS) $(SSLLIBS) $(LFLAGSSSL) /out:$(DIROBJ)\$(TARGET)
|
||||
CC = $(CCNODBG) $(RTLIB) $(CFLAGSSSL)
|
||||
CFGSET = TRUE
|
||||
!ENDIF
|
||||
|
@@ -54,7 +54,7 @@ and the Content-Encoding type is not checked.
|
||||
* The curl interface:
|
||||
|
||||
Use the --compressed option with curl to cause it to ask servers to compress
|
||||
responses using deflate.
|
||||
responses using any format supported by curl.
|
||||
|
||||
James Gallagher <jgallagher@gso.uri.edu>
|
||||
Dan Fandrich <dan@coneharvesters.com>
|
||||
|
@@ -5,7 +5,7 @@
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2004, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
* 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
|
||||
|
@@ -5,7 +5,7 @@
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2004, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
* 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
|
||||
|
@@ -1,53 +1,112 @@
|
||||
/* config.h. Generated automatically by configure. */
|
||||
/* config.h.in. Generated automatically from configure.in by autoheader. */
|
||||
#ifndef __LIB_CONFIG_WIN32_H
|
||||
#define __LIB_CONFIG_WIN32_H
|
||||
|
||||
#ifndef __CONFIG_WIN32_H
|
||||
#define __CONFIG_WIN32_H
|
||||
/* ================================================================ */
|
||||
/* lib/config-win32.h - Hand crafted config file for windows */
|
||||
/* ================================================================ */
|
||||
|
||||
/* Define if on AIX 3.
|
||||
System headers sometimes define this.
|
||||
We just want to avoid a redefinition error message. */
|
||||
#ifndef _ALL_SOURCE
|
||||
/* #undef _ALL_SOURCE */
|
||||
/* ---------------------------------------------------------------- */
|
||||
/* HEADER FILES */
|
||||
/* ---------------------------------------------------------------- */
|
||||
|
||||
/* Define if you have the <alloca.h> header file. */
|
||||
/* #define HAVE_ALLOCA_H 1 */
|
||||
|
||||
/* Define if you have the <arpa/inet.h> header file. */
|
||||
/* #define HAVE_ARPA_INET_H 1 */
|
||||
|
||||
/* Define if you have the <assert.h> header file. */
|
||||
#define HAVE_ASSERT_H 1
|
||||
|
||||
/* Define if you have the <crypto.h> header file. */
|
||||
/* #define HAVE_CRYPTO_H 1 */
|
||||
|
||||
/* Define if you have the <dlfcn.h> header file. */
|
||||
/* #define HAVE_DLFCN_H 1 */
|
||||
|
||||
/* Define if you have the <err.h> header file. */
|
||||
/* #define HAVE_ERR_H 1 */
|
||||
|
||||
/* Define if you have the <fcntl.h> header file. */
|
||||
#define HAVE_FCNTL_H 1
|
||||
|
||||
/* Define if you have the <getopt.h> header file. */
|
||||
/* #define HAVE_GETOPT_H 1 */
|
||||
|
||||
/* Define if you have the <io.h> header file. */
|
||||
#define HAVE_IO_H 1
|
||||
|
||||
/* Define if you have the <malloc.h> header file. */
|
||||
#define HAVE_MALLOC_H 1
|
||||
|
||||
/* Define if you have the <netdb.h> header file. */
|
||||
/* #define HAVE_NETDB_H 1 */
|
||||
|
||||
/* Define if you have the <netinet/in.h> header file. */
|
||||
/* #define HAVE_NETINET_IN_H 1 */
|
||||
|
||||
/* Define if you have the <sgtty.h> header file. */
|
||||
/* #define HAVE_SGTTY_H 1 */
|
||||
|
||||
/* Define if you have the <ssl.h> header file. */
|
||||
/* #define HAVE_SSL_H 1 */
|
||||
|
||||
/* Define if you have the <stdlib.h> header file. */
|
||||
#define HAVE_STDLIB_H 1
|
||||
|
||||
/* Define if you have the <sys/param.h> header file. */
|
||||
/* #define HAVE_SYS_PARAM_H 1 */
|
||||
|
||||
/* Define if you have the <sys/select.h> header file. */
|
||||
/* #define HAVE_SYS_SELECT_H 1 */
|
||||
|
||||
/* Define if you have the <sys/socket.h> header file. */
|
||||
/* #define HAVE_SYS_SOCKET_H 1 */
|
||||
|
||||
/* Define if you have the <sys/sockio.h> header file. */
|
||||
/* #define HAVE_SYS_SOCKIO_H 1 */
|
||||
|
||||
/* Define if you have the <sys/stat.h> header file. */
|
||||
#define HAVE_SYS_STAT_H 1
|
||||
|
||||
/* Define if you have the <sys/types.h> header file. */
|
||||
#define HAVE_SYS_TYPES_H 1
|
||||
|
||||
/* Define if you have the <sys/utime.h> header file */
|
||||
#ifndef __BORLANDC__
|
||||
#define HAVE_SYS_UTIME_H 1
|
||||
#endif
|
||||
|
||||
/* Define to empty if the keyword does not work. */
|
||||
/* #undef const */
|
||||
/* Define if you have the <termio.h> header file. */
|
||||
/* #define HAVE_TERMIO_H 1 */
|
||||
|
||||
/* Define if you don't have vprintf but do have _doprnt. */
|
||||
/* #undef HAVE_DOPRNT */
|
||||
/* Define if you have the <termios.h> header file. */
|
||||
/* #define HAVE_TERMIOS_H 1 */
|
||||
|
||||
/* Define if you have the vprintf function. */
|
||||
#define HAVE_VPRINTF 1
|
||||
/* Define if you have the <time.h> header file. */
|
||||
#define HAVE_TIME_H 1
|
||||
|
||||
/* Define as the return type of signal handlers (int or void). */
|
||||
/*#define RETSIGTYPE void */
|
||||
|
||||
/* Define to `unsigned' if <sys/types.h> doesn't define. */
|
||||
/* #undef size_t */
|
||||
|
||||
/* Define this to 'int' if ssize_t is not an available typedefed type */
|
||||
#if defined(__WATCOMC__) && (__WATCOMC__ >= 1240)
|
||||
#else
|
||||
#define ssize_t int
|
||||
/* Define if you have the <unistd.h> header file. */
|
||||
#if defined(__MINGW32__) || defined(__WATCOMC__) || defined(__LCC__) || \
|
||||
defined(__POCC__)
|
||||
#define HAVE_UNISTD_H 1
|
||||
#endif
|
||||
|
||||
/* Define this to 'int' if socklen_t is not an available typedefed type */
|
||||
#if !defined(ENABLE_IPV6) && ((_MSC_VER < 1300) || !defined(USE_SSLEAY))
|
||||
#define socklen_t int
|
||||
#endif
|
||||
/* Define if you have the <windows.h> header file. */
|
||||
#define HAVE_WINDOWS_H 1
|
||||
|
||||
/* The size of a `curl_off_t', as computed by sizeof. */
|
||||
#ifdef SIZEOF_CURL_OFF_T
|
||||
#undef SIZEOF_CURL_OFF_T
|
||||
#endif
|
||||
/* Define if you have the <winsock.h> header file. */
|
||||
#define HAVE_WINSOCK_H 1
|
||||
|
||||
/* Borland lacks _lseeki64(), so we don't support >2GB files */
|
||||
#ifdef __BORLANDC__
|
||||
#define SIZEOF_CURL_OFF_T 4
|
||||
#else
|
||||
#define SIZEOF_CURL_OFF_T 8
|
||||
#endif
|
||||
/* Define if you have the <winsock2.h> header file. */
|
||||
#define HAVE_WINSOCK2_H 1
|
||||
|
||||
/* Define if you have the <ws2tcpip.h> header file. */
|
||||
#define HAVE_WS2TCPIP_H 1
|
||||
|
||||
/* ---------------------------------------------------------------- */
|
||||
/* OTHER HEADER INFO */
|
||||
/* ---------------------------------------------------------------- */
|
||||
|
||||
/* Define if you have the ANSI C header files. */
|
||||
#define STDC_HEADERS 1
|
||||
@@ -55,14 +114,15 @@
|
||||
/* Define if you can safely include both <sys/time.h> and <time.h>. */
|
||||
/* #define TIME_WITH_SYS_TIME 1 */
|
||||
|
||||
/* Define cpu-machine-OS */
|
||||
#define OS "i386-pc-win32"
|
||||
/* ---------------------------------------------------------------- */
|
||||
/* FUNCTIONS */
|
||||
/* ---------------------------------------------------------------- */
|
||||
|
||||
/* The number of bytes in a long double. */
|
||||
#define SIZEOF_LONG_DOUBLE 16
|
||||
/* Define if you have the closesocket function. */
|
||||
#define HAVE_CLOSESOCKET 1
|
||||
|
||||
/* The number of bytes in a long long. */
|
||||
/* #define SIZEOF_LONG_LONG 8 */
|
||||
/* Define if you don't have vprintf but do have _doprnt. */
|
||||
/* #define HAVE_DOPRNT 1 */
|
||||
|
||||
/* Define if you have the gethostbyaddr function. */
|
||||
#define HAVE_GETHOSTBYADDR 1
|
||||
@@ -71,13 +131,16 @@
|
||||
#define HAVE_GETHOSTNAME 1
|
||||
|
||||
/* Define if you have the getpass function. */
|
||||
/*#define HAVE_GETPASS 1*/
|
||||
/* #define HAVE_GETPASS 1 */
|
||||
|
||||
/* Define if you have the getservbyname function. */
|
||||
#define HAVE_GETSERVBYNAME 1
|
||||
|
||||
/* Define if you have the getprotobyname function. */
|
||||
#define HAVE_GETPROTOBYNAME
|
||||
|
||||
/* Define if you have the gettimeofday function. */
|
||||
/* #define HAVE_GETTIMEOFDAY 1 */
|
||||
/* #define HAVE_GETTIMEOFDAY 1 */
|
||||
|
||||
/* Define if you have the inet_addr function. */
|
||||
#define HAVE_INET_ADDR 1
|
||||
@@ -85,17 +148,29 @@
|
||||
/* Define if you have the inet_ntoa function. */
|
||||
#define HAVE_INET_NTOA 1
|
||||
|
||||
/* Define if you have the ioctlsocket function. */
|
||||
#define HAVE_IOCTLSOCKET 1
|
||||
|
||||
/* Define if you have the perror function. */
|
||||
#define HAVE_PERROR 1
|
||||
|
||||
/* Define if you have the RAND_screen function when using SSL */
|
||||
#define HAVE_RAND_SCREEN 1
|
||||
|
||||
/* Define if you have the `RAND_status' function when using SSL. */
|
||||
#define HAVE_RAND_STATUS 1
|
||||
|
||||
/* Define if you have the select function. */
|
||||
#define HAVE_SELECT 1
|
||||
|
||||
/* Define if you have the setvbuf function. */
|
||||
#define HAVE_SETVBUF 1
|
||||
|
||||
/* Define if you have the socket function. */
|
||||
#define HAVE_SOCKET 1
|
||||
|
||||
/* Define if you have the strcasecmp function. */
|
||||
/*#define HAVE_STRCASECMP 1*/
|
||||
/* #define HAVE_STRCASECMP 1 */
|
||||
|
||||
/* Define if you have the stricmp function. */
|
||||
#define HAVE_STRICMP 1
|
||||
@@ -110,155 +185,112 @@
|
||||
#define HAVE_STRSTR 1
|
||||
|
||||
/* Define if you have the strtoll function. */
|
||||
#if defined(__MINGW32__) || defined(__WATCOMC__)
|
||||
#if defined(__MINGW32__) || defined(__WATCOMC__) || defined(__POCC__)
|
||||
#define HAVE_STRTOLL 1
|
||||
#endif
|
||||
|
||||
/* Define if you have the tcgetattr function. */
|
||||
/*#define HAVE_TCGETATTR 1*/
|
||||
/* #define HAVE_TCGETATTR 1 */
|
||||
|
||||
/* Define if you have the tcsetattr function. */
|
||||
/*#define HAVE_TCSETATTR 1*/
|
||||
/* #define HAVE_TCSETATTR 1 */
|
||||
|
||||
/* Define if you have the uname function. */
|
||||
/*#define HAVE_UNAME 1*/
|
||||
/* #define HAVE_UNAME 1 */
|
||||
|
||||
/* Define if you have utime() */
|
||||
/* Define if you have the utime function */
|
||||
#ifndef __BORLANDC__
|
||||
#define HAVE_UTIME 1
|
||||
#endif
|
||||
|
||||
/* Define if you have the <alloca.h> header file. */
|
||||
/*#define HAVE_ALLOCA_H 1*/
|
||||
/* Define if you have the vprintf function. */
|
||||
#define HAVE_VPRINTF 1
|
||||
|
||||
/* Define if you have the malloc.h file. */
|
||||
#define HAVE_MALLOC_H 1
|
||||
/* ---------------------------------------------------------------- */
|
||||
/* TYPEDEF REPLACEMENTS */
|
||||
/* ---------------------------------------------------------------- */
|
||||
|
||||
/* Define if you have the <arpa/inet.h> header file. */
|
||||
/* #define HAVE_ARPA_INET_H 1 */
|
||||
|
||||
/* Define if you have the <assert.h> header file. */
|
||||
#define HAVE_ASSERT_H 1
|
||||
|
||||
/* Define if you have the <crypto.h> header file. */
|
||||
/* #undef HAVE_CRYPTO_H */
|
||||
|
||||
/* Define if you have the <dlfcn.h> header file. */
|
||||
/*#define HAVE_DLFCN_H 1*/
|
||||
|
||||
/* Define if you have the <err.h> header file. */
|
||||
/* #undef HAVE_ERR_H */
|
||||
|
||||
/* Define if you have the <fcntl.h> header file. */
|
||||
#define HAVE_FCNTL_H 1
|
||||
|
||||
/* Define if you have the <getopt.h> header file. */
|
||||
/* #undef HAVE_GETOPT_H */
|
||||
|
||||
/* Define if you have the <netdb.h> header file. */
|
||||
/* #define HAVE_NETDB_H 1 */
|
||||
|
||||
/* Define if you have the <netinet/in.h> header file. */
|
||||
/*#define HAVE_NETINET_IN_H 1*/
|
||||
|
||||
/* Define if you have the <sgtty.h> header file. */
|
||||
/*#define HAVE_SGTTY_H 1*/
|
||||
|
||||
/* Define if you have the <ssl.h> header file. */
|
||||
/* #undef HAVE_SSL_H */
|
||||
|
||||
/* Define if you have the <sys/param.h> header file. */
|
||||
/*#define HAVE_SYS_PARAM_H 1*/
|
||||
|
||||
/* Define if you have the <sys/select.h> header file. */
|
||||
/* #define HAVE_SYS_SELECT_H 1 */
|
||||
|
||||
/* Define if you have the <sys/socket.h> header file. */
|
||||
/*#define HAVE_SYS_SOCKET_H 1*/
|
||||
|
||||
/* Define if you have the <sys/sockio.h> header file. */
|
||||
/* #define HAVE_SYS_SOCKIO_H 1 */
|
||||
|
||||
/* Define if you have the <sys/stat.h> header file. */
|
||||
#define HAVE_SYS_STAT_H 1
|
||||
|
||||
/* Define if you have the <sys/utime.h> header file */
|
||||
#ifndef __BORLANDC__
|
||||
#define HAVE_SYS_UTIME_H 1
|
||||
#endif
|
||||
|
||||
/* Define if you have the <sys/types.h> header file. */
|
||||
#define HAVE_SYS_TYPES_H 1
|
||||
|
||||
/* Define if you have the <termio.h> header file. */
|
||||
/* #define HAVE_TERMIO_H 1 */
|
||||
|
||||
/* Define if you have the <termios.h> header file. */
|
||||
/* #define HAVE_TERMIOS_H 1 */
|
||||
|
||||
/* Name of package */
|
||||
#define PACKAGE "curl"
|
||||
|
||||
/* Define if you have the <io.h> header file. */
|
||||
#define HAVE_IO_H 1
|
||||
|
||||
/* Define if you have the <time.h> header file. */
|
||||
#define HAVE_TIME_H 1
|
||||
|
||||
/* Define if you have the <winsock.h> header file. */
|
||||
#define HAVE_WINSOCK_H 1
|
||||
|
||||
/* Define if you have the <winsock2.h> header file. */
|
||||
#define HAVE_WINSOCK2_H 1
|
||||
|
||||
/* Define if you have the <ws2tcpip.h> header file. */
|
||||
#define HAVE_WS2TCPIP_H 1
|
||||
|
||||
/* Define if you have the <stdlib.h> header file. */
|
||||
#define HAVE_STDLIB_H 1
|
||||
|
||||
/* Define if you have the closesocket function. */
|
||||
#define HAVE_CLOSESOCKET 1
|
||||
|
||||
/* Define if you have the setvbuf function. */
|
||||
#define HAVE_SETVBUF 1
|
||||
|
||||
/* Define if you have the RAND_screen function when using SSL */
|
||||
#define HAVE_RAND_SCREEN 1
|
||||
|
||||
/* Define if you have the `RAND_status' function. */
|
||||
#define HAVE_RAND_STATUS 1
|
||||
|
||||
/* Define this to if in_addr_t is not an available typedefed type */
|
||||
/* Define this if in_addr_t is not an available 'typedefed' type */
|
||||
#define in_addr_t unsigned long
|
||||
|
||||
/* use ioctlsocket() for non-blocking sockets */
|
||||
#define HAVE_IOCTLSOCKET
|
||||
/* Define as the return type of signal handlers (int or void). */
|
||||
/* #define RETSIGTYPE void */
|
||||
|
||||
/* Define to `unsigned' if size_t is not an available 'typedefed' type */
|
||||
/* #define size_t unsigned */
|
||||
|
||||
/* Define to 'int' if ssize_t is not an available 'typedefed' type */
|
||||
#if (defined(__WATCOMC__) && (__WATCOMC__ >= 1240)) || defined(__POCC__)
|
||||
#else
|
||||
#define ssize_t int
|
||||
#endif
|
||||
|
||||
/* Define to 'int' if socklen_t is not an available 'typedefed' type */
|
||||
#ifndef HAVE_WS2TCPIP_H
|
||||
#define socklen_t int
|
||||
#endif
|
||||
|
||||
/* ---------------------------------------------------------------- */
|
||||
/* TYPE SIZES */
|
||||
/* ---------------------------------------------------------------- */
|
||||
|
||||
/* The number of bytes in a long double. */
|
||||
#define SIZEOF_LONG_DOUBLE 16
|
||||
|
||||
/* The number of bytes in a long long. */
|
||||
/* #define SIZEOF_LONG_LONG 8 */
|
||||
|
||||
/* Undef SIZEOF_CURL_OFF_T if already defined. */
|
||||
#ifdef SIZEOF_CURL_OFF_T
|
||||
#undef SIZEOF_CURL_OFF_T
|
||||
#endif
|
||||
|
||||
/* Define SIZEOF_CURL_OFF_T as computed by sizeof(curl_off_t) */
|
||||
/* Borland/PellesC lacks _lseeki64(), so we don't support >2GB files. */
|
||||
#if defined(__BORLANDC__) || defined(__POCC__)
|
||||
#define SIZEOF_CURL_OFF_T 4
|
||||
#else
|
||||
#define SIZEOF_CURL_OFF_T 8
|
||||
#endif
|
||||
|
||||
/* ---------------------------------------------------------------- */
|
||||
/* STRUCT RELATED */
|
||||
/* ---------------------------------------------------------------- */
|
||||
|
||||
/* Define this if you have struct sockaddr_storage */
|
||||
#define HAVE_STRUCT_SOCKADDR_STORAGE
|
||||
#define HAVE_STRUCT_SOCKADDR_STORAGE 1
|
||||
|
||||
/* ---------------------------------------------------------------- */
|
||||
/* COMPILER SPECIFIC */
|
||||
/* ---------------------------------------------------------------- */
|
||||
|
||||
/* Undef keyword 'const' if it does not work. */
|
||||
/* #undef const */
|
||||
|
||||
/* ---------------------------------------------------------------- */
|
||||
/* LDAP LIBRARY FILES */
|
||||
/* ---------------------------------------------------------------- */
|
||||
|
||||
/* lber dynamic library file */
|
||||
/* #undef DL_LBER_FILE */
|
||||
|
||||
/* Defines set for VS2005 to _not_ deprecate a few functions we use. */
|
||||
#define _CRT_SECURE_NO_DEPRECATE
|
||||
#define _CRT_NONSTDC_NO_DEPRECATE
|
||||
/* #define DL_LBER_FILE */
|
||||
|
||||
/* ldap dynamic library file */
|
||||
#define DL_LDAP_FILE "wldap32.dll"
|
||||
|
||||
/*************************************************
|
||||
* This section is for compiler specific defines.*
|
||||
*************************************************/
|
||||
/* Borland and MS don't have this */
|
||||
#if defined(__MINGW32__) || defined(__WATCOMC__) || defined(__LCC__)
|
||||
/* ---------------------------------------------------------------- */
|
||||
/* ADDITIONAL DEFINITIONS */
|
||||
/* ---------------------------------------------------------------- */
|
||||
|
||||
/* Define if you have the <unistd.h> header file. */
|
||||
#define HAVE_UNISTD_H 1
|
||||
/* Defines set for VS2005 to _not_ deprecate a few functions we use. */
|
||||
#define _CRT_SECURE_NO_DEPRECATE 1
|
||||
#define _CRT_NONSTDC_NO_DEPRECATE 1
|
||||
|
||||
#else
|
||||
/* Define cpu-machine-OS */
|
||||
#undef OS
|
||||
#define OS "i386-pc-win32"
|
||||
|
||||
#endif
|
||||
/* Name of package */
|
||||
#define PACKAGE "curl"
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* __LIB_CONFIG_WIN32_H */
|
||||
|
@@ -1,46 +1,109 @@
|
||||
/* config.h. Generated automatically by configure. */
|
||||
/* config.h.in. Generated automatically from configure.in by autoheader. */
|
||||
#ifndef __LIB_CONFIG_WIN32CE_H
|
||||
#define __LIB_CONFIG_WIN32CE_H
|
||||
|
||||
#ifndef __CONFIG_WIN32CE_H
|
||||
#define __CONFIG_WIN32CE_H
|
||||
/* ================================================================ */
|
||||
/* lib/config-win32ce.h - Hand crafted config file for windows ce */
|
||||
/* ================================================================ */
|
||||
|
||||
/* Define if on AIX 3.
|
||||
System headers sometimes define this.
|
||||
We just want to avoid a redefinition error message. */
|
||||
#ifndef _ALL_SOURCE
|
||||
/* #undef _ALL_SOURCE */
|
||||
/* ---------------------------------------------------------------- */
|
||||
/* HEADER FILES */
|
||||
/* ---------------------------------------------------------------- */
|
||||
|
||||
/* Define if you have the <alloca.h> header file. */
|
||||
/* #define HAVE_ALLOCA_H 1 */
|
||||
|
||||
/* Define if you have the <arpa/inet.h> header file. */
|
||||
/* #define HAVE_ARPA_INET_H 1 */
|
||||
|
||||
/* Define if you have the <assert.h> header file. */
|
||||
/* #define HAVE_ASSERT_H 1 */
|
||||
|
||||
/* Define if you have the <crypto.h> header file. */
|
||||
/* #define HAVE_CRYPTO_H 1 */
|
||||
|
||||
/* Define if you have the <dlfcn.h> header file. */
|
||||
/* #define HAVE_DLFCN_H 1 */
|
||||
|
||||
/* Define if you have the <err.h> header file. */
|
||||
/* #define HAVE_ERR_H 1 */
|
||||
|
||||
/* Define if you have the <fcntl.h> header file. */
|
||||
#define HAVE_FCNTL_H 1
|
||||
|
||||
/* Define if you have the <getopt.h> header file. */
|
||||
/* #define HAVE_GETOPT_H 1 */
|
||||
|
||||
/* Define if you have the <io.h> header file. */
|
||||
#define HAVE_IO_H 1
|
||||
|
||||
/* Define if you have the <malloc.h> header file. */
|
||||
#define HAVE_MALLOC_H 1
|
||||
|
||||
/* Define if you have the <netdb.h> header file. */
|
||||
/* #define HAVE_NETDB_H 1 */
|
||||
|
||||
/* Define if you have the <netinet/in.h> header file. */
|
||||
/* #define HAVE_NETINET_IN_H 1 */
|
||||
|
||||
/* Define if you have the <sgtty.h> header file. */
|
||||
/* #define HAVE_SGTTY_H 1 */
|
||||
|
||||
/* Define if you have the <ssl.h> header file. */
|
||||
/* #define HAVE_SSL_H 1 */
|
||||
|
||||
/* Define if you have the <stdlib.h> header file. */
|
||||
#define HAVE_STDLIB_H 1
|
||||
|
||||
/* Define if you have the <sys/param.h> header file. */
|
||||
/* #define HAVE_SYS_PARAM_H 1 */
|
||||
|
||||
/* Define if you have the <sys/select.h> header file. */
|
||||
/* #define HAVE_SYS_SELECT_H 1 */
|
||||
|
||||
/* Define if you have the <sys/socket.h> header file. */
|
||||
/* #define HAVE_SYS_SOCKET_H 1 */
|
||||
|
||||
/* Define if you have the <sys/sockio.h> header file. */
|
||||
/* #define HAVE_SYS_SOCKIO_H 1 */
|
||||
|
||||
/* Define if you have the <sys/stat.h> header file. */
|
||||
#define HAVE_SYS_STAT_H 1
|
||||
|
||||
/* Define if you have the <sys/types.h> header file. */
|
||||
/* #define HAVE_SYS_TYPES_H 1 */
|
||||
|
||||
/* Define if you have the <sys/utime.h> header file */
|
||||
#define HAVE_SYS_UTIME_H 1
|
||||
|
||||
/* Define if you have the <termio.h> header file. */
|
||||
/* #define HAVE_TERMIO_H 1 */
|
||||
|
||||
/* Define if you have the <termios.h> header file. */
|
||||
/* #define HAVE_TERMIOS_H 1 */
|
||||
|
||||
/* Define if you have the <time.h> header file. */
|
||||
#define HAVE_TIME_H 1
|
||||
|
||||
/* Define if you have the <unistd.h> header file. */
|
||||
#if defined(__MINGW32__) || defined(__WATCOMC__) || defined(__LCC__)
|
||||
#define HAVE_UNISTD_H 1
|
||||
#endif
|
||||
|
||||
/* Define to empty if the keyword does not work. */
|
||||
/* #undef const */
|
||||
/* Define if you have the <windows.h> header file. */
|
||||
#define HAVE_WINDOWS_H 1
|
||||
|
||||
/* Define if you don't have vprintf but do have _doprnt. */
|
||||
/* #undef HAVE_DOPRNT */
|
||||
/* Define if you have the <winsock.h> header file. */
|
||||
#define HAVE_WINSOCK_H 1
|
||||
|
||||
/* Define if you have the vprintf function. */
|
||||
#define HAVE_VPRINTF 1
|
||||
/* Define if you have the <winsock2.h> header file. */
|
||||
/* #define HAVE_WINSOCK2_H 1 */
|
||||
|
||||
/* Define as the return type of signal handlers (int or void). */
|
||||
/*#define RETSIGTYPE void */
|
||||
/* Define if you have the <ws2tcpip.h> header file. */
|
||||
/* #define HAVE_WS2TCPIP_H 1 */
|
||||
|
||||
/* Define to `unsigned' if <sys/types.h> doesn't define. */
|
||||
/* #undef size_t */
|
||||
|
||||
/* Define this to 'int' if ssize_t is not an available typedefed type */
|
||||
#define ssize_t int
|
||||
|
||||
/* Define this to 'int' if socklen_t is not an available typedefed type */
|
||||
#if !defined(ENABLE_IPV6) && ((_MSC_VER < 1300) || !defined(USE_SSLEAY))
|
||||
#define socklen_t int
|
||||
#endif
|
||||
|
||||
/* The size of a `curl_off_t', as computed by sizeof. */
|
||||
#ifdef SIZEOF_CURL_OFF_T
|
||||
#undef SIZEOF_CURL_OFF_T
|
||||
#endif
|
||||
|
||||
/* Borland lacks _lseeki64(), so we don't support >2GB files */
|
||||
#define SIZEOF_CURL_OFF_T 4
|
||||
/* ---------------------------------------------------------------- */
|
||||
/* OTHER HEADER INFO */
|
||||
/* ---------------------------------------------------------------- */
|
||||
|
||||
/* Define if you have the ANSI C header files. */
|
||||
#define STDC_HEADERS 1
|
||||
@@ -48,14 +111,15 @@
|
||||
/* Define if you can safely include both <sys/time.h> and <time.h>. */
|
||||
/* #define TIME_WITH_SYS_TIME 1 */
|
||||
|
||||
/* Define cpu-machine-OS */
|
||||
#define OS "i386-pc-win32ce"
|
||||
/* ---------------------------------------------------------------- */
|
||||
/* FUNCTIONS */
|
||||
/* ---------------------------------------------------------------- */
|
||||
|
||||
/* The number of bytes in a long double. */
|
||||
#define SIZEOF_LONG_DOUBLE 16
|
||||
/* Define if you have the closesocket function. */
|
||||
#define HAVE_CLOSESOCKET 1
|
||||
|
||||
/* The number of bytes in a long long. */
|
||||
/* #define SIZEOF_LONG_LONG 8 */
|
||||
/* Define if you don't have vprintf but do have _doprnt. */
|
||||
/* #define HAVE_DOPRNT 1 */
|
||||
|
||||
/* Define if you have the gethostbyaddr function. */
|
||||
#define HAVE_GETHOSTBYADDR 1
|
||||
@@ -64,7 +128,7 @@
|
||||
#define HAVE_GETHOSTNAME 1
|
||||
|
||||
/* Define if you have the getpass function. */
|
||||
/*#define HAVE_GETPASS 1*/
|
||||
/* #define HAVE_GETPASS 1 */
|
||||
|
||||
/* Define if you have the getservbyname function. */
|
||||
#define HAVE_GETSERVBYNAME 1
|
||||
@@ -78,180 +142,171 @@
|
||||
/* Define if you have the inet_ntoa function. */
|
||||
#define HAVE_INET_NTOA 1
|
||||
|
||||
/* Define if you have the ioctlsocket function. */
|
||||
#define HAVE_IOCTLSOCKET 1
|
||||
|
||||
/* Define if you have the perror function. */
|
||||
#define HAVE_PERROR 1
|
||||
|
||||
/* Define if you have the RAND_screen function when using SSL */
|
||||
#define HAVE_RAND_SCREEN 1
|
||||
|
||||
/* Define if you have the `RAND_status' function when using SSL. */
|
||||
#define HAVE_RAND_STATUS 1
|
||||
|
||||
/* Define if you have the select function. */
|
||||
#define HAVE_SELECT 1
|
||||
|
||||
/* Define if you have the setvbuf function. */
|
||||
#define HAVE_SETVBUF 1
|
||||
|
||||
/* Define if you have the socket function. */
|
||||
#define HAVE_SOCKET 1
|
||||
|
||||
/* Define if you have the strcasecmp function. */
|
||||
/*#define HAVE_STRCASECMP 1*/
|
||||
/* #define HAVE_STRCASECMP 1 */
|
||||
|
||||
/* Define if you have the stricmp function. */
|
||||
//#define HAVE_STRICMP 1
|
||||
/* #define HAVE_STRICMP 1 */
|
||||
|
||||
/* Define if you have the strdup function. */
|
||||
//#define HAVE_STRDUP 1
|
||||
/* #define HAVE_STRDUP 1 */
|
||||
|
||||
/* Define if you have the strftime function. */
|
||||
//#define HAVE_STRFTIME 1
|
||||
/* #define HAVE_STRFTIME 1 */
|
||||
|
||||
/* Define if you have the strstr function. */
|
||||
#define HAVE_STRSTR 1
|
||||
|
||||
/* Define if you have the strtoll function. */
|
||||
#ifdef __MINGW32__
|
||||
#if defined(__MINGW32__) || defined(__WATCOMC__)
|
||||
#define HAVE_STRTOLL 1
|
||||
#endif
|
||||
|
||||
/* Define if you have the tcgetattr function. */
|
||||
/*#define HAVE_TCGETATTR 1*/
|
||||
/* #define HAVE_TCGETATTR 1 */
|
||||
|
||||
/* Define if you have the tcsetattr function. */
|
||||
/*#define HAVE_TCSETATTR 1*/
|
||||
/* #define HAVE_TCSETATTR 1 */
|
||||
|
||||
/* Define if you have the uname function. */
|
||||
/*#define HAVE_UNAME 1*/
|
||||
/* #define HAVE_UNAME 1 */
|
||||
|
||||
/* Define if you have utime() */
|
||||
/* Define if you have the utime function */
|
||||
#define HAVE_UTIME 1
|
||||
|
||||
/* Define if you have the <alloca.h> header file. */
|
||||
/*#define HAVE_ALLOCA_H 1*/
|
||||
/* Define if you have the vprintf function. */
|
||||
#define HAVE_VPRINTF 1
|
||||
|
||||
/* Define if you have the malloc.h file. */
|
||||
#define HAVE_MALLOC_H 1
|
||||
/* ---------------------------------------------------------------- */
|
||||
/* TYPEDEF REPLACEMENTS */
|
||||
/* ---------------------------------------------------------------- */
|
||||
|
||||
/* Define if you have the <arpa/inet.h> header file. */
|
||||
/* #define HAVE_ARPA_INET_H 1 */
|
||||
/* Define this if in_addr_t is not an available 'typedefed' type */
|
||||
#define in_addr_t unsigned long
|
||||
|
||||
/* Define if you have the <assert.h> header file. */
|
||||
//#define HAVE_ASSERT_H 1
|
||||
/* Define as the return type of signal handlers (int or void). */
|
||||
/* #define RETSIGTYPE void */
|
||||
|
||||
/* Define if you have the <crypto.h> header file. */
|
||||
/* #undef HAVE_CRYPTO_H */
|
||||
/* Define to `unsigned' if size_t is not an available 'typedefed' type */
|
||||
/* #define size_t unsigned */
|
||||
|
||||
/* Define if you have the <dlfcn.h> header file. */
|
||||
/*#define HAVE_DLFCN_H 1*/
|
||||
/* Define to 'int' if ssize_t is not an available 'typedefed' type */
|
||||
#define ssize_t int
|
||||
|
||||
/* Define if you have the <err.h> header file. */
|
||||
/* #undef HAVE_ERR_H */
|
||||
/* Define to 'int' if socklen_t is not an available 'typedefed' type */
|
||||
#ifndef HAVE_WS2TCPIP_H
|
||||
#define socklen_t int
|
||||
#endif
|
||||
|
||||
/* Define if you have the <fcntl.h> header file. */
|
||||
#define HAVE_FCNTL_H 1
|
||||
/* ---------------------------------------------------------------- */
|
||||
/* TYPE SIZES */
|
||||
/* ---------------------------------------------------------------- */
|
||||
|
||||
/* Define if you have the <getopt.h> header file. */
|
||||
/* #undef HAVE_GETOPT_H */
|
||||
/* The number of bytes in a long double. */
|
||||
#define SIZEOF_LONG_DOUBLE 16
|
||||
|
||||
/* Define if you have the <netdb.h> header file. */
|
||||
/* #define HAVE_NETDB_H 1 */
|
||||
/* The number of bytes in a long long. */
|
||||
/* #define SIZEOF_LONG_LONG 8 */
|
||||
|
||||
/* Define if you have the <netinet/in.h> header file. */
|
||||
/*#define HAVE_NETINET_IN_H 1*/
|
||||
/* Undef SIZEOF_CURL_OFF_T if already defined. */
|
||||
#ifdef SIZEOF_CURL_OFF_T
|
||||
#undef SIZEOF_CURL_OFF_T
|
||||
#endif
|
||||
|
||||
/* Define if you have the <sgtty.h> header file. */
|
||||
/*#define HAVE_SGTTY_H 1*/
|
||||
/* Define SIZEOF_CURL_OFF_T as computed by sizeof(curl_off_t) */
|
||||
#define SIZEOF_CURL_OFF_T 4
|
||||
|
||||
/* Define if you have the <ssl.h> header file. */
|
||||
/* #undef HAVE_SSL_H */
|
||||
/* ---------------------------------------------------------------- */
|
||||
/* STRUCT RELATED */
|
||||
/* ---------------------------------------------------------------- */
|
||||
|
||||
/* Define if you have the <sys/param.h> header file. */
|
||||
/*#define HAVE_SYS_PARAM_H 1*/
|
||||
/* Define this if you have struct sockaddr_storage */
|
||||
/* #define HAVE_STRUCT_SOCKADDR_STORAGE 1 */
|
||||
|
||||
/* Define if you have the <sys/select.h> header file. */
|
||||
/* #define HAVE_SYS_SELECT_H 1 */
|
||||
/* ---------------------------------------------------------------- */
|
||||
/* COMPILER SPECIFIC */
|
||||
/* ---------------------------------------------------------------- */
|
||||
|
||||
/* Define if you have the <sys/socket.h> header file. */
|
||||
/*#define HAVE_SYS_SOCKET_H 1*/
|
||||
/* Undef keyword 'const' if it does not work. */
|
||||
/* #undef const */
|
||||
|
||||
/* Define if you have the <sys/sockio.h> header file. */
|
||||
/* #define HAVE_SYS_SOCKIO_H 1 */
|
||||
/* ---------------------------------------------------------------- */
|
||||
/* LDAP LIBRARY FILES */
|
||||
/* ---------------------------------------------------------------- */
|
||||
|
||||
/* Define if you have the <sys/stat.h> header file. */
|
||||
#define HAVE_SYS_STAT_H 1
|
||||
/* lber dynamic library file */
|
||||
/* #define DL_LBER_FILE */
|
||||
|
||||
/* Define if you have the <sys/utime.h> header file */
|
||||
#define HAVE_SYS_UTIME_H 1
|
||||
/* ldap dynamic library file */
|
||||
/* #define DL_LDAP_FILE "wldap32.dll" */
|
||||
|
||||
/* Define if you have the <sys/types.h> header file. */
|
||||
//#define HAVE_SYS_TYPES_H 1
|
||||
/* ---------------------------------------------------------------- */
|
||||
/* ADDITIONAL DEFINITIONS */
|
||||
/* ---------------------------------------------------------------- */
|
||||
|
||||
/* Define if you have the <termio.h> header file. */
|
||||
/* #define HAVE_TERMIO_H 1 */
|
||||
/* Defines set for VS2005 to _not_ deprecate a few functions we use. */
|
||||
#define _CRT_SECURE_NO_DEPRECATE 1
|
||||
#define _CRT_NONSTDC_NO_DEPRECATE 1
|
||||
|
||||
/* Define if you have the <termios.h> header file. */
|
||||
/* #define HAVE_TERMIOS_H 1 */
|
||||
/* Define cpu-machine-OS */
|
||||
#undef OS
|
||||
#define OS "i386-pc-win32ce"
|
||||
|
||||
/* Name of package */
|
||||
#define PACKAGE "curl"
|
||||
|
||||
/* Define if you have the <io.h> header file. */
|
||||
#define HAVE_IO_H 1
|
||||
/* ---------------------------------------------------------------- */
|
||||
/* WinCE */
|
||||
/* ---------------------------------------------------------------- */
|
||||
|
||||
/* Define if you have the <time.h> header file. */
|
||||
#define HAVE_TIME_H 1
|
||||
|
||||
/* Define if you have the <winsock.h> header file. */
|
||||
#define HAVE_WINSOCK_H 1
|
||||
|
||||
/* Define if you have the <winsock2.h> header file. */
|
||||
//#define HAVE_WINSOCK2_H 1
|
||||
|
||||
/* Define if you have the <ws2tcpip.h> header file. */
|
||||
//#define HAVE_WS2TCPIP_H 1
|
||||
|
||||
/* Define if you have the <stdlib.h> header file. */
|
||||
#define HAVE_STDLIB_H 1
|
||||
|
||||
/* Define if you have the closesocket function. */
|
||||
#define HAVE_CLOSESOCKET 1
|
||||
|
||||
/* Define if you have the setvbuf function. */
|
||||
#define HAVE_SETVBUF 1
|
||||
|
||||
/* Define if you have the RAND_screen function when using SSL */
|
||||
#define HAVE_RAND_SCREEN 1
|
||||
|
||||
/* Define if you have the `RAND_status' function. */
|
||||
#define HAVE_RAND_STATUS 1
|
||||
|
||||
/* Define this to if in_addr_t is not an available typedefed type */
|
||||
#define in_addr_t unsigned long
|
||||
|
||||
/* use ioctlsocket() for non-blocking sockets */
|
||||
#define HAVE_IOCTLSOCKET
|
||||
|
||||
/*************************************************
|
||||
* This section is for compiler specific defines.*
|
||||
*************************************************/
|
||||
/* Borland and MS don't have this */
|
||||
#if defined(__MINGW32__) || defined(__WATCOMC__) || defined(__LCC__)
|
||||
|
||||
/* Define if you have the <unistd.h> header file. */
|
||||
#define HAVE_UNISTD_H 1
|
||||
|
||||
#else
|
||||
#define CURL_DISABLE_FILE 1
|
||||
#define CURL_DISABLE_TELNET 1
|
||||
#define CURL_DISABLE_LDAP 1
|
||||
#define WITHOUT_MM_LIB 1
|
||||
|
||||
#ifdef HAVE_WINDOWS_H
|
||||
# ifndef WIN32_LEAN_AND_MEAN
|
||||
# define WIN32_LEAN_AND_MEAN
|
||||
# endif
|
||||
# include <windows.h>
|
||||
# ifdef HAVE_WINSOCK2_H
|
||||
# include <winsock2.h>
|
||||
# ifdef HAVE_WS2TCPIP_H
|
||||
# include <ws2tcpip.h>
|
||||
# endif
|
||||
# else
|
||||
# ifdef HAVE_WINSOCK_H
|
||||
# include <winsock.h>
|
||||
# endif
|
||||
# endif
|
||||
# include <process.h>
|
||||
#endif
|
||||
|
||||
/* WinCE */
|
||||
|
||||
#define CURL_DISABLE_FILE
|
||||
|
||||
#define CURL_DISABLE_TELNET
|
||||
#define CURL_DISABLE_LDAP
|
||||
#define WITHOUT_MM_LIB
|
||||
|
||||
#include <winsock.h>
|
||||
#include <process.h>
|
||||
|
||||
#define ENOSPC 1
|
||||
#define ENOMEM 2
|
||||
#define EAGAIN 3
|
||||
|
||||
extern int stat(const char *path,struct stat *buffer );
|
||||
|
||||
#endif
|
||||
#endif /* __LIB_CONFIG_WIN32CE_H */
|
||||
|
@@ -20,6 +20,7 @@
|
||||
#define HAVE_GETHOSTNAME 1
|
||||
#define HAVE_GETPASS 1
|
||||
#define HAVE_GETSERVBYNAME 1
|
||||
#define HAVE_GETPROTOBYNAME 1
|
||||
#define HAVE_GETTIMEOFDAY 1
|
||||
#define HAVE_INET_ADDR 1
|
||||
#define HAVE_INET_NTOA 1
|
||||
|
176
lib/connect.c
176
lib/connect.c
@@ -5,7 +5,7 @@
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
* Copyright (C) 1998 - 2006, 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
|
||||
@@ -83,7 +83,6 @@
|
||||
#endif
|
||||
|
||||
#ifdef WIN32
|
||||
#include <windows.h>
|
||||
#define EINPROGRESS WSAEINPROGRESS
|
||||
#define EWOULDBLOCK WSAEWOULDBLOCK
|
||||
#define EISCONN WSAEISCONN
|
||||
@@ -99,6 +98,7 @@
|
||||
#include "memory.h"
|
||||
#include "select.h"
|
||||
#include "url.h" /* for Curl_safefree() */
|
||||
#include "sockaddr.h" /* required for Curl_sockaddr_storage */
|
||||
|
||||
/* The last #include file should be: */
|
||||
#include "memdebug.h"
|
||||
@@ -216,7 +216,7 @@ int waitconnect(curl_socket_t sockfd, /* socket */
|
||||
/* Call this function once now, and ignore the results. We do this to
|
||||
"clear" the error state on the socket so that we can later read it
|
||||
reliably. This is reported necessary on the MPE/iX operating system. */
|
||||
verifyconnect(sockfd, NULL);
|
||||
(void)verifyconnect(sockfd, NULL);
|
||||
#endif
|
||||
|
||||
/* now select() until we get connect or timeout */
|
||||
@@ -240,16 +240,20 @@ int waitconnect(curl_socket_t sockfd, /* socket */
|
||||
static CURLcode bindlocal(struct connectdata *conn,
|
||||
curl_socket_t sockfd)
|
||||
{
|
||||
#ifdef HAVE_INET_NTOA
|
||||
bool bindworked = FALSE;
|
||||
struct SessionHandle *data = conn->data;
|
||||
struct sockaddr_in me;
|
||||
struct sockaddr *sock = NULL; /* bind to this address */
|
||||
socklen_t socksize; /* size of the data sock points to */
|
||||
unsigned short port = data->set.localport; /* use this port number, 0 for
|
||||
"random" */
|
||||
/* how many port numbers to try to bind to, increasing one at a time */
|
||||
int portnum = data->set.localportrange;
|
||||
|
||||
/*************************************************************
|
||||
* Select device to bind socket to
|
||||
*************************************************************/
|
||||
if (strlen(data->set.device)<255) {
|
||||
if (data->set.device && (strlen(data->set.device)<255) ) {
|
||||
struct Curl_dns_entry *h=NULL;
|
||||
size_t size;
|
||||
char myhost[256] = "";
|
||||
in_addr_t in;
|
||||
int rc;
|
||||
@@ -267,8 +271,10 @@ static CURLcode bindlocal(struct connectdata *conn,
|
||||
if(rc == CURLRESOLV_PENDING)
|
||||
(void)Curl_wait_for_resolv(conn, &h);
|
||||
|
||||
if(h)
|
||||
if(h) {
|
||||
was_iface = TRUE;
|
||||
Curl_resolv_unlock(data, h);
|
||||
}
|
||||
}
|
||||
|
||||
if(!was_iface) {
|
||||
@@ -280,9 +286,11 @@ static CURLcode bindlocal(struct connectdata *conn,
|
||||
if(rc == CURLRESOLV_PENDING)
|
||||
(void)Curl_wait_for_resolv(conn, &h);
|
||||
|
||||
if(h)
|
||||
if(h) {
|
||||
/* we know data->set.device is shorter than the myhost array */
|
||||
strcpy(myhost, data->set.device);
|
||||
Curl_resolv_unlock(data, h);
|
||||
}
|
||||
}
|
||||
|
||||
if(! *myhost) {
|
||||
@@ -296,7 +304,7 @@ static CURLcode bindlocal(struct connectdata *conn,
|
||||
return CURLE_HTTP_PORT_FAILED;
|
||||
}
|
||||
|
||||
infof(data, "We bind local end to %s\n", myhost);
|
||||
infof(data, "Bind local address to %s\n", myhost);
|
||||
|
||||
#ifdef SO_BINDTODEVICE
|
||||
/* I am not sure any other OSs than Linux that provide this feature, and
|
||||
@@ -324,60 +332,79 @@ static CURLcode bindlocal(struct connectdata *conn,
|
||||
#endif
|
||||
|
||||
in=inet_addr(myhost);
|
||||
if (CURL_INADDR_NONE != in) {
|
||||
|
||||
if ( h ) {
|
||||
Curl_addrinfo *addr = h->addr;
|
||||
|
||||
Curl_resolv_unlock(data, h);
|
||||
/* we don't need it anymore after this function has returned */
|
||||
|
||||
if( bind(sockfd, addr->ai_addr, (socklen_t)addr->ai_addrlen) >= 0) {
|
||||
/* we succeeded to bind */
|
||||
#ifdef ENABLE_IPV6
|
||||
struct sockaddr_in6 add;
|
||||
#else
|
||||
struct sockaddr_in add;
|
||||
#endif
|
||||
|
||||
bindworked = TRUE;
|
||||
|
||||
size = sizeof(add);
|
||||
if(getsockname(sockfd, (struct sockaddr *) &add,
|
||||
(socklen_t *)&size)<0) {
|
||||
failf(data, "getsockname() failed");
|
||||
return CURLE_HTTP_PORT_FAILED;
|
||||
}
|
||||
}
|
||||
|
||||
if(!bindworked) {
|
||||
data->state.os_errno = Curl_ourerrno();
|
||||
failf(data, "bind failure: %s",
|
||||
Curl_strerror(conn, data->state.os_errno));
|
||||
return CURLE_HTTP_PORT_FAILED;
|
||||
}
|
||||
|
||||
} /* end of if h */
|
||||
else {
|
||||
failf(data,"couldn't find my own IP address (%s)", myhost);
|
||||
return CURLE_HTTP_PORT_FAILED;
|
||||
}
|
||||
if (CURL_INADDR_NONE == in) {
|
||||
failf(data,"couldn't find my own IP address (%s)", myhost);
|
||||
return CURLE_HTTP_PORT_FAILED;
|
||||
} /* end of inet_addr */
|
||||
|
||||
else {
|
||||
failf(data, "couldn't find my own IP address (%s)", myhost);
|
||||
return CURLE_HTTP_PORT_FAILED;
|
||||
if ( h ) {
|
||||
Curl_addrinfo *addr = h->addr;
|
||||
sock = addr->ai_addr;
|
||||
socksize = addr->ai_addrlen;
|
||||
}
|
||||
else
|
||||
return CURLE_HTTP_PORT_FAILED;
|
||||
|
||||
}
|
||||
else if(port) {
|
||||
/* if a local port number is requested but no local IP, extract the
|
||||
address from the socket */
|
||||
memset(&me, 0, sizeof(struct sockaddr));
|
||||
me.sin_family = AF_INET;
|
||||
me.sin_addr.s_addr = INADDR_ANY;
|
||||
|
||||
sock = (struct sockaddr *)&me;
|
||||
socksize = sizeof(struct sockaddr);
|
||||
|
||||
}
|
||||
else
|
||||
/* no local kind of binding was requested */
|
||||
return CURLE_OK;
|
||||
|
||||
} /* end of device selection support */
|
||||
#else
|
||||
(void)conn;
|
||||
(void)sockfd;
|
||||
#endif /* end of HAVE_INET_NTOA */
|
||||
do {
|
||||
|
||||
/* Set port number to bind to, 0 makes the system pick one */
|
||||
if(sock->sa_family == AF_INET)
|
||||
((struct sockaddr_in *)sock)->sin_port = htons(port);
|
||||
#ifdef ENABLE_IPV6
|
||||
else
|
||||
((struct sockaddr_in6 *)sock)->sin6_port = htons(port);
|
||||
#endif
|
||||
|
||||
if( bind(sockfd, sock, socksize) >= 0) {
|
||||
/* we succeeded to bind */
|
||||
struct Curl_sockaddr_storage add;
|
||||
unsigned short port = 0;
|
||||
size_t size;
|
||||
|
||||
size = sizeof(add);
|
||||
if(getsockname(sockfd, (struct sockaddr *) &add,
|
||||
(socklen_t *)&size)<0) {
|
||||
failf(data, "getsockname() failed");
|
||||
return CURLE_HTTP_PORT_FAILED;
|
||||
}
|
||||
if(((struct sockaddr *)&add)->sa_family == AF_INET)
|
||||
port = ntohs(((struct sockaddr_in *)&add)->sin_port);
|
||||
#ifdef ENABLE_IPV6
|
||||
else
|
||||
port = ntohs(((struct sockaddr_in6 *)&add)->sin6_port);
|
||||
#endif
|
||||
infof(data, "Local port: %d\n", port);
|
||||
return CURLE_OK;
|
||||
}
|
||||
if(--portnum > 0) {
|
||||
infof(data, "Bind to local port %d failed, trying next\n", port);
|
||||
port++; /* try next port */
|
||||
}
|
||||
else
|
||||
break;
|
||||
} while(1);
|
||||
|
||||
data->state.os_errno = Curl_ourerrno();
|
||||
failf(data, "bind failure: %s",
|
||||
Curl_strerror(conn, data->state.os_errno));
|
||||
return CURLE_HTTP_PORT_FAILED;
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -563,7 +590,7 @@ CURLcode Curl_is_connected(struct connectdata *conn,
|
||||
|
||||
/* nope, not connected */
|
||||
if (WAITCONN_FDSET_ERROR == rc) {
|
||||
verifyconnect(sockfd, &error);
|
||||
(void)verifyconnect(sockfd, &error);
|
||||
data->state.os_errno = error;
|
||||
infof(data, "%s\n",Curl_strerror(conn,error));
|
||||
}
|
||||
@@ -592,7 +619,15 @@ static void tcpnodelay(struct connectdata *conn,
|
||||
#ifdef TCP_NODELAY
|
||||
struct SessionHandle *data= conn->data;
|
||||
socklen_t onoff = (socklen_t) data->set.tcp_nodelay;
|
||||
if(setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, (void *)&onoff,
|
||||
int proto = IPPROTO_TCP;
|
||||
|
||||
#ifdef HAVE_GETPROTOBYNAME
|
||||
struct protoent *pe = getprotobyname("tcp");
|
||||
if (pe)
|
||||
proto = pe->p_proto;
|
||||
#endif
|
||||
|
||||
if(setsockopt(sockfd, proto, TCP_NODELAY, (void *)&onoff,
|
||||
sizeof(onoff)) < 0)
|
||||
infof(data, "Could not set TCP_NODELAY: %s\n",
|
||||
Curl_strerror(conn, Curl_ourerrno()));
|
||||
@@ -619,6 +654,8 @@ static void nosigpipe(struct connectdata *conn,
|
||||
infof(data, "Could not set SO_NOSIGPIPE: %s\n",
|
||||
Curl_strerror(conn, Curl_ourerrno()));
|
||||
}
|
||||
#else
|
||||
#define nosigpipe(x,y)
|
||||
#endif
|
||||
|
||||
/* singleipconnect() connects to the given IP only, and it may return without
|
||||
@@ -632,9 +669,10 @@ singleipconnect(struct connectdata *conn,
|
||||
char addr_buf[128];
|
||||
int rc;
|
||||
int error;
|
||||
bool conected;
|
||||
bool isconnected;
|
||||
struct SessionHandle *data = conn->data;
|
||||
curl_socket_t sockfd;
|
||||
CURLcode res;
|
||||
|
||||
sockfd = socket(ai->ai_family, conn->socktype, ai->ai_protocol);
|
||||
if (sockfd == CURL_SOCKET_BAD)
|
||||
@@ -648,17 +686,13 @@ singleipconnect(struct connectdata *conn,
|
||||
if(data->set.tcp_nodelay)
|
||||
tcpnodelay(conn, sockfd);
|
||||
|
||||
#ifdef SO_NOSIGPIPE
|
||||
nosigpipe(conn, sockfd);
|
||||
#endif
|
||||
if(conn->data->set.device) {
|
||||
/* user selected to bind the outgoing socket to a specified "device"
|
||||
before doing connect */
|
||||
CURLcode res = bindlocal(conn, sockfd);
|
||||
if(res) {
|
||||
sclose(sockfd); /* close socket and bail out */
|
||||
return CURL_SOCKET_BAD;
|
||||
}
|
||||
|
||||
/* possibly bind the local end to an IP, interface or port */
|
||||
res = bindlocal(conn, sockfd);
|
||||
if(res) {
|
||||
sclose(sockfd); /* close socket and bail out */
|
||||
return CURL_SOCKET_BAD;
|
||||
}
|
||||
|
||||
/* set socket non-blocking */
|
||||
@@ -702,9 +736,9 @@ singleipconnect(struct connectdata *conn,
|
||||
return sockfd;
|
||||
}
|
||||
|
||||
conected = verifyconnect(sockfd, &error);
|
||||
isconnected = verifyconnect(sockfd, &error);
|
||||
|
||||
if(!rc && conected) {
|
||||
if(!rc && isconnected) {
|
||||
/* we are connected, awesome! */
|
||||
*connected = TRUE; /* this is a true connect */
|
||||
infof(data, "connected\n");
|
||||
|
@@ -7,7 +7,7 @@
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2004, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
* 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
|
||||
|
@@ -190,7 +190,7 @@ curl_calloc_callback Curl_ccalloc = (curl_calloc_callback)calloc;
|
||||
*/
|
||||
CURLcode curl_global_init(long flags)
|
||||
{
|
||||
if (initialized)
|
||||
if (initialized++)
|
||||
return CURLE_OK;
|
||||
|
||||
/* Setup the default memory functions here (again) */
|
||||
@@ -217,7 +217,6 @@ CURLcode curl_global_init(long flags)
|
||||
idna_init();
|
||||
#endif
|
||||
|
||||
initialized = 1;
|
||||
init_flags = flags;
|
||||
|
||||
return CURLE_OK;
|
||||
@@ -263,6 +262,9 @@ void curl_global_cleanup(void)
|
||||
if (!initialized)
|
||||
return;
|
||||
|
||||
if (--initialized)
|
||||
return;
|
||||
|
||||
Curl_global_host_cache_dtor();
|
||||
|
||||
if (init_flags & CURL_GLOBAL_SSL)
|
||||
@@ -275,7 +277,6 @@ void curl_global_cleanup(void)
|
||||
amiga_cleanup();
|
||||
#endif
|
||||
|
||||
initialized = 0;
|
||||
init_flags = 0;
|
||||
}
|
||||
|
||||
@@ -526,6 +527,8 @@ CURL *curl_easy_duphandle(CURL *incurl)
|
||||
memset(outcurl->state.connects, 0,
|
||||
sizeof(struct connectdata *)*outcurl->state.numconnects);
|
||||
|
||||
outcurl->state.lastconnect = -1;
|
||||
|
||||
outcurl->progress.flags = data->progress.flags;
|
||||
outcurl->progress.callback = data->progress.callback;
|
||||
|
||||
|
@@ -8,7 +8,7 @@
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2004, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
* 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
|
||||
|
@@ -230,11 +230,11 @@ static CURLcode file_upload(struct connectdata *conn)
|
||||
if(res)
|
||||
break;
|
||||
|
||||
nread = (size_t)readcount;
|
||||
|
||||
if (nread <= 0)
|
||||
if (readcount <= 0) /* fix questionable compare error. curlvms */
|
||||
break;
|
||||
|
||||
nread = (size_t)readcount;
|
||||
|
||||
/* write the data to the target */
|
||||
nwrite = fwrite(buf, 1, nread, fp);
|
||||
if(nwrite != nread) {
|
||||
|
281
lib/ftp.c
281
lib/ftp.c
@@ -5,7 +5,7 @@
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
* Copyright (C) 1998 - 2006, 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
|
||||
@@ -763,7 +763,11 @@ static CURLcode ftp_state_cwd(struct connectdata *conn)
|
||||
return result;
|
||||
}
|
||||
|
||||
typedef enum { EPRT, LPRT, PORT, DONE } ftpport;
|
||||
typedef enum {
|
||||
EPRT,
|
||||
PORT,
|
||||
DONE
|
||||
} ftpport;
|
||||
|
||||
static CURLcode ftp_state_use_port(struct connectdata *conn,
|
||||
ftpport fcmd) /* start with this */
|
||||
@@ -773,6 +777,7 @@ static CURLcode ftp_state_use_port(struct connectdata *conn,
|
||||
struct FTP *ftp = conn->proto.ftp;
|
||||
struct SessionHandle *data=conn->data;
|
||||
curl_socket_t portsock= CURL_SOCKET_BAD;
|
||||
char myhost[256] = "";
|
||||
|
||||
#ifdef ENABLE_IPV6
|
||||
/******************************************************************
|
||||
@@ -783,14 +788,15 @@ static CURLcode ftp_state_use_port(struct connectdata *conn,
|
||||
socklen_t sslen;
|
||||
char hbuf[NI_MAXHOST];
|
||||
struct sockaddr *sa=(struct sockaddr *)&ss;
|
||||
unsigned char *ap;
|
||||
unsigned char *pp;
|
||||
char portmsgbuf[1024], tmp[1024];
|
||||
const char *mode[] = { "EPRT", "LPRT", "PORT", NULL };
|
||||
char tmp[1024];
|
||||
const char *mode[] = { "EPRT", "PORT", NULL };
|
||||
int rc;
|
||||
int error;
|
||||
char *host=NULL;
|
||||
struct Curl_dns_entry *h=NULL;
|
||||
unsigned short port;
|
||||
|
||||
/* Step 1, figure out what address that is requested */
|
||||
|
||||
if(data->set.ftpport && (strlen(data->set.ftpport) > 1)) {
|
||||
/* attempt to get the address of the given interface name */
|
||||
@@ -833,6 +839,9 @@ static CURLcode ftp_state_use_port(struct connectdata *conn,
|
||||
else
|
||||
res = NULL; /* failure! */
|
||||
|
||||
|
||||
/* step 2, create a socket for the requested address */
|
||||
|
||||
portsock = CURL_SOCKET_BAD;
|
||||
error = 0;
|
||||
for (ai = res; ai; ai = ai->ai_next) {
|
||||
@@ -847,35 +856,65 @@ static CURLcode ftp_state_use_port(struct connectdata *conn,
|
||||
error = Curl_ourerrno();
|
||||
continue;
|
||||
}
|
||||
|
||||
if (bind(portsock, ai->ai_addr, ai->ai_addrlen) < 0) {
|
||||
error = Curl_ourerrno();
|
||||
sclose(portsock);
|
||||
portsock = CURL_SOCKET_BAD;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (listen(portsock, 1) < 0) {
|
||||
error = Curl_ourerrno();
|
||||
sclose(portsock);
|
||||
portsock = CURL_SOCKET_BAD;
|
||||
continue;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
if (portsock == CURL_SOCKET_BAD) {
|
||||
failf(data, "socket failure: %s", Curl_strerror(conn,error));
|
||||
if(!ai) {
|
||||
failf(data, "socket failure: %s", Curl_strerror(conn, error));
|
||||
return CURLE_FTP_PORT_FAILED;
|
||||
}
|
||||
|
||||
/* step 3, bind to a suitable local address */
|
||||
|
||||
/* Try binding the given address. */
|
||||
if (bind(portsock, ai->ai_addr, ai->ai_addrlen) < 0) {
|
||||
|
||||
/* It failed. Bind the address used for the control connection instead */
|
||||
sslen = sizeof(ss);
|
||||
|
||||
if (getsockname(conn->sock[FIRSTSOCKET],
|
||||
(struct sockaddr *)sa, &sslen) < 0) {
|
||||
failf(data, "getsockname() failed");
|
||||
sclose(portsock);
|
||||
return CURLE_FTP_PORT_FAILED;
|
||||
}
|
||||
|
||||
/* set port number to zero to make bind() pick "any" */
|
||||
if(((struct sockaddr *)sa)->sa_family == AF_INET)
|
||||
((struct sockaddr_in *)sa)->sin_port=0;
|
||||
else
|
||||
((struct sockaddr_in6 *)sa)->sin6_port =0;
|
||||
|
||||
if(bind(portsock, (struct sockaddr *)sa, sslen) < 0) {
|
||||
failf(data, "bind failed: %s", Curl_strerror(conn, Curl_ourerrno()));
|
||||
sclose(portsock);
|
||||
return CURLE_FTP_PORT_FAILED;
|
||||
}
|
||||
}
|
||||
|
||||
/* get the name again after the bind() so that we can extract the
|
||||
port number it uses now */
|
||||
sslen = sizeof(ss);
|
||||
if (getsockname(portsock, sa, &sslen) < 0) {
|
||||
failf(data, "getsockname(): %s", Curl_strerror(conn,Curl_ourerrno()));
|
||||
if(getsockname(portsock, (struct sockaddr *)sa, &sslen)<0) {
|
||||
failf(data, "getsockname() failed: %s",
|
||||
Curl_strerror(conn, Curl_ourerrno()) );
|
||||
return CURLE_FTP_PORT_FAILED;
|
||||
}
|
||||
|
||||
/* step 4, listen on the socket */
|
||||
|
||||
if (listen(portsock, 1) < 0) {
|
||||
error = Curl_ourerrno();
|
||||
sclose(portsock);
|
||||
failf(data, "socket failure: %s", Curl_strerror(conn, error));
|
||||
return CURLE_FTP_PORT_FAILED;
|
||||
}
|
||||
|
||||
/* step 5, send the proper FTP command */
|
||||
|
||||
/* get a plain printable version of the numerical address to work with
|
||||
below */
|
||||
Curl_printable_address(ai, myhost, sizeof(myhost));
|
||||
|
||||
#ifdef PF_INET6
|
||||
if(!conn->bits.ftp_use_eprt && conn->bits.ipv6)
|
||||
/* EPRT is disabled but we are connected to a IPv6 host, so we ignore the
|
||||
@@ -884,107 +923,58 @@ static CURLcode ftp_state_use_port(struct connectdata *conn,
|
||||
#endif
|
||||
|
||||
for (; fcmd != DONE; fcmd++) {
|
||||
int lprtaf, eprtaf;
|
||||
int alen=0, plen=0;
|
||||
|
||||
if(!conn->bits.ftp_use_eprt && (EPRT == fcmd))
|
||||
/* if disabled, goto next */
|
||||
continue;
|
||||
|
||||
if(!conn->bits.ftp_use_lprt && (LPRT == fcmd))
|
||||
/* if disabled, goto next */
|
||||
continue;
|
||||
|
||||
switch (sa->sa_family) {
|
||||
case AF_INET:
|
||||
ap = (unsigned char *)&((struct sockaddr_in *)&ss)->sin_addr;
|
||||
alen = sizeof(((struct sockaddr_in *)&ss)->sin_addr);
|
||||
pp = (unsigned char *)&((struct sockaddr_in *)&ss)->sin_port;
|
||||
plen = sizeof(((struct sockaddr_in *)&ss)->sin_port);
|
||||
lprtaf = 4;
|
||||
eprtaf = 1;
|
||||
port = ntohs(((struct sockaddr_in *)sa)->sin_port);
|
||||
break;
|
||||
case AF_INET6:
|
||||
ap = (unsigned char *)&((struct sockaddr_in6 *)&ss)->sin6_addr;
|
||||
alen = sizeof(((struct sockaddr_in6 *)&ss)->sin6_addr);
|
||||
pp = (unsigned char *)&((struct sockaddr_in6 *)&ss)->sin6_port;
|
||||
plen = sizeof(((struct sockaddr_in6 *)&ss)->sin6_port);
|
||||
lprtaf = 6;
|
||||
eprtaf = 2;
|
||||
port = ntohs(((struct sockaddr_in6 *)sa)->sin6_port);
|
||||
break;
|
||||
default:
|
||||
ap = pp = NULL;
|
||||
lprtaf = eprtaf = -1;
|
||||
break;
|
||||
}
|
||||
|
||||
if (EPRT == fcmd) {
|
||||
if (eprtaf < 0)
|
||||
continue;
|
||||
if (getnameinfo((struct sockaddr *)&ss, sslen,
|
||||
portmsgbuf, sizeof(portmsgbuf), tmp, sizeof(tmp),
|
||||
NIFLAGS))
|
||||
continue;
|
||||
/*
|
||||
* Two fine examples from RFC2428;
|
||||
*
|
||||
* EPRT |1|132.235.1.2|6275|
|
||||
*
|
||||
* EPRT |2|1080::8:800:200C:417A|5282|
|
||||
*/
|
||||
|
||||
/* do not transmit IPv6 scope identifier to the wire */
|
||||
if (sa->sa_family == AF_INET6) {
|
||||
char *q = strchr(portmsgbuf, '%');
|
||||
if (q)
|
||||
*q = '\0';
|
||||
}
|
||||
|
||||
result = Curl_nbftpsendf(conn, "%s |%d|%s|%s|", mode[fcmd], eprtaf,
|
||||
portmsgbuf, tmp);
|
||||
result = Curl_nbftpsendf(conn, "%s |%d|%s|%d|", mode[fcmd],
|
||||
ai->ai_family == AF_INET?1:2,
|
||||
myhost, port);
|
||||
if(result)
|
||||
return result;
|
||||
break;
|
||||
}
|
||||
else if ((LPRT == fcmd) || (PORT == fcmd)) {
|
||||
int i;
|
||||
else if (PORT == fcmd) {
|
||||
char *source = myhost;
|
||||
char *dest = tmp;
|
||||
|
||||
if ((LPRT == fcmd) && lprtaf < 0)
|
||||
continue;
|
||||
if ((PORT == fcmd) && sa->sa_family != AF_INET)
|
||||
if ((PORT == fcmd) && ai->ai_family != AF_INET)
|
||||
continue;
|
||||
|
||||
portmsgbuf[0] = '\0';
|
||||
if (LPRT == fcmd) {
|
||||
snprintf(tmp, sizeof(tmp), "%d,%d", lprtaf, alen);
|
||||
if (strlcat(portmsgbuf, tmp, sizeof(portmsgbuf)) >=
|
||||
sizeof(portmsgbuf)) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < alen; i++) {
|
||||
if (portmsgbuf[0])
|
||||
snprintf(tmp, sizeof(tmp), ",%u", ap[i]);
|
||||
/* translate x.x.x.x to x,x,x,x */
|
||||
while(source && *source) {
|
||||
if(*source == '.')
|
||||
*dest=',';
|
||||
else
|
||||
snprintf(tmp, sizeof(tmp), "%u", ap[i]);
|
||||
|
||||
if (strlcat(portmsgbuf, tmp, sizeof(portmsgbuf)) >=
|
||||
sizeof(portmsgbuf)) {
|
||||
continue;
|
||||
}
|
||||
*dest = *source;
|
||||
dest++;
|
||||
source++;
|
||||
}
|
||||
*dest = 0;
|
||||
snprintf(dest, 20, ",%d,%d", port>>8, port&0xff);
|
||||
|
||||
if (LPRT == fcmd) {
|
||||
snprintf(tmp, sizeof(tmp), ",%d", plen);
|
||||
|
||||
if (strlcat(portmsgbuf, tmp, sizeof(portmsgbuf)) >= sizeof(portmsgbuf))
|
||||
continue;
|
||||
}
|
||||
|
||||
for (i = 0; i < plen; i++) {
|
||||
snprintf(tmp, sizeof(tmp), ",%u", pp[i]);
|
||||
|
||||
if (strlcat(portmsgbuf, tmp, sizeof(portmsgbuf)) >=
|
||||
sizeof(portmsgbuf)) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
result = Curl_nbftpsendf(conn, "%s %s", mode[fcmd], portmsgbuf);
|
||||
result = Curl_nbftpsendf(conn, "%s %s", mode[fcmd], tmp);
|
||||
if(result)
|
||||
return result;
|
||||
break;
|
||||
@@ -1007,10 +997,11 @@ static CURLcode ftp_state_use_port(struct connectdata *conn,
|
||||
*/
|
||||
struct sockaddr_in sa;
|
||||
unsigned short porttouse;
|
||||
char myhost[256] = "";
|
||||
bool sa_filled_in = FALSE;
|
||||
Curl_addrinfo *addr = NULL;
|
||||
unsigned short ip[4];
|
||||
bool freeaddr = TRUE;
|
||||
|
||||
(void)fcmd; /* not used in the IPv4 code */
|
||||
if(data->set.ftpport) {
|
||||
in_addr_t in;
|
||||
@@ -1030,7 +1021,7 @@ static CURLcode ftp_state_use_port(struct connectdata *conn,
|
||||
else if(strlen(data->set.ftpport)> 1) {
|
||||
/* might be a host name! */
|
||||
struct Curl_dns_entry *h=NULL;
|
||||
int rc = Curl_resolv(conn, myhost, 0, &h);
|
||||
int rc = Curl_resolv(conn, data->set.ftpport, 0, &h);
|
||||
if(rc == CURLRESOLV_PENDING)
|
||||
/* BLOCKING */
|
||||
rc = Curl_wait_for_resolv(conn, &h);
|
||||
@@ -1039,7 +1030,13 @@ static CURLcode ftp_state_use_port(struct connectdata *conn,
|
||||
/* when we return from this function, we can forget about this entry
|
||||
so we can unlock it now already */
|
||||
Curl_resolv_unlock(data, h);
|
||||
|
||||
freeaddr = FALSE; /* make sure we don't free 'addr' in this function
|
||||
since it points to a DNS cache entry! */
|
||||
} /* (h) */
|
||||
else {
|
||||
infof(data, "Failed to resolve host name %s\n", data->set.ftpport);
|
||||
}
|
||||
} /* strlen */
|
||||
} /* CURL_INADDR_NONE */
|
||||
} /* data->set.ftpport */
|
||||
@@ -1132,7 +1129,8 @@ static CURLcode ftp_state_use_port(struct connectdata *conn,
|
||||
else
|
||||
return CURLE_FTP_PORT_FAILED;
|
||||
|
||||
Curl_freeaddrinfo(addr);
|
||||
if(freeaddr)
|
||||
Curl_freeaddrinfo(addr);
|
||||
|
||||
ftp->count1 = PORT;
|
||||
|
||||
@@ -1543,8 +1541,13 @@ static CURLcode ftp_state_pasv_resp(struct connectdata *conn,
|
||||
if(ptr) {
|
||||
newport = num;
|
||||
|
||||
/* use the same IP we are already connected to */
|
||||
snprintf(newhost, NEWHOST_BUFSIZE, "%s", conn->ip_addr_str);
|
||||
if (conn->bits.tunnel_proxy)
|
||||
/* proxy tunnel -> use other host info because ip_addr_str is the
|
||||
proxy address not the ftp host */
|
||||
snprintf(newhost, sizeof(newhost), "%s", conn->host.name);
|
||||
else
|
||||
/* use the same IP we are already connected to */
|
||||
snprintf(newhost, NEWHOST_BUFSIZE, "%s", conn->ip_addr_str);
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -1590,7 +1593,12 @@ static CURLcode ftp_state_pasv_resp(struct connectdata *conn,
|
||||
infof(data, "Skips %d.%d.%d.%d for data connection, uses %s instead\n",
|
||||
ip[0], ip[1], ip[2], ip[3],
|
||||
conn->ip_addr_str);
|
||||
snprintf(newhost, sizeof(newhost), "%s", conn->ip_addr_str);
|
||||
if (conn->bits.tunnel_proxy)
|
||||
/* proxy tunnel -> use other host info because ip_addr_str is the
|
||||
proxy address not the ftp host */
|
||||
snprintf(newhost, sizeof(newhost), "%s", conn->host.name);
|
||||
else
|
||||
snprintf(newhost, sizeof(newhost), "%s", conn->ip_addr_str);
|
||||
}
|
||||
else
|
||||
snprintf(newhost, sizeof(newhost),
|
||||
@@ -1653,6 +1661,18 @@ static CURLcode ftp_state_pasv_resp(struct connectdata *conn,
|
||||
|
||||
Curl_resolv_unlock(data, addr); /* we're done using this address */
|
||||
|
||||
if (result && ftp->count1 == 0 && ftpcode == 229) {
|
||||
infof(data, "got positive EPSV response, but can't connect. "
|
||||
"Disabling EPSV\n");
|
||||
/* disable it for next transfer */
|
||||
conn->bits.ftp_use_epsv = FALSE;
|
||||
data->state.errorbuf = FALSE; /* allow error message to get rewritten */
|
||||
NBFTPSENDF(conn, "PASV", NULL);
|
||||
ftp->count1++;
|
||||
/* remain in the FTP_PASV state */
|
||||
return result;
|
||||
}
|
||||
|
||||
if(result)
|
||||
return result;
|
||||
|
||||
@@ -1669,13 +1689,28 @@ static CURLcode ftp_state_pasv_resp(struct connectdata *conn,
|
||||
ftp_pasv_verbose(conn, conninfo, newhost, connectport);
|
||||
|
||||
#ifndef CURL_DISABLE_HTTP
|
||||
if(conn->bits.tunnel_proxy) {
|
||||
if(conn->bits.tunnel_proxy && conn->bits.httpproxy) {
|
||||
/* FIX: this MUST wait for a proper connect first if 'connected' is
|
||||
* FALSE */
|
||||
|
||||
/* BLOCKING */
|
||||
/* We want "seamless" FTP operations through HTTP proxy tunnel */
|
||||
|
||||
/* Curl_proxyCONNECT is based on a pointer to a struct HTTP at the member
|
||||
* conn->proto.http; we want FTP through HTTP and we have to change the
|
||||
* member temporarily for connecting to the HTTP proxy. After
|
||||
* Curl_proxyCONNECT we have to set back the member to the original struct
|
||||
* FTP pointer
|
||||
*/
|
||||
struct HTTP http_proxy;
|
||||
struct FTP *ftp_save = conn->proto.ftp;
|
||||
memset(&http_proxy, 0, sizeof(http_proxy));
|
||||
conn->proto.http = &http_proxy;
|
||||
|
||||
result = Curl_proxyCONNECT(conn, SECONDARYSOCKET, newhost, newport);
|
||||
|
||||
conn->proto.ftp = ftp_save;
|
||||
|
||||
if(CURLE_OK != result)
|
||||
return result;
|
||||
}
|
||||
@@ -1701,10 +1736,6 @@ static CURLcode ftp_state_port_resp(struct connectdata *conn,
|
||||
infof(data, "disabling EPRT usage\n");
|
||||
conn->bits.ftp_use_eprt = FALSE;
|
||||
}
|
||||
else if (LPRT == fcmd) {
|
||||
infof(data, "disabling LPRT usage\n");
|
||||
conn->bits.ftp_use_lprt = FALSE;
|
||||
}
|
||||
fcmd++;
|
||||
|
||||
if(fcmd == DONE) {
|
||||
@@ -2529,6 +2560,8 @@ static CURLcode ftp_statemach_act(struct connectdata *conn)
|
||||
else {
|
||||
/* return failure */
|
||||
failf(data, "Server denied you to change to the given directory");
|
||||
ftp->cwdfail = TRUE; /* don't remember this path as we failed
|
||||
to enter it */
|
||||
return CURLE_FTP_ACCESS_DENIED;
|
||||
}
|
||||
}
|
||||
@@ -2724,6 +2757,11 @@ CURLcode Curl_ftp_connect(struct connectdata *conn,
|
||||
{
|
||||
struct FTP *ftp;
|
||||
CURLcode result;
|
||||
#ifndef CURL_DISABLE_HTTP
|
||||
/* for FTP over HTTP proxy */
|
||||
struct HTTP http_proxy;
|
||||
struct FTP *ftp_save;
|
||||
#endif /* CURL_DISABLE_HTTP */
|
||||
|
||||
*done = FALSE; /* default to not done yet */
|
||||
|
||||
@@ -2748,11 +2786,25 @@ CURLcode Curl_ftp_connect(struct connectdata *conn,
|
||||
ftp->response_time = 3600; /* set default response time-out */
|
||||
|
||||
#ifndef CURL_DISABLE_HTTP
|
||||
if (conn->bits.tunnel_proxy) {
|
||||
if (conn->bits.tunnel_proxy && conn->bits.httpproxy) {
|
||||
/* BLOCKING */
|
||||
/* We want "seamless" FTP operations through HTTP proxy tunnel */
|
||||
|
||||
/* Curl_proxyCONNECT is based on a pointer to a struct HTTP at the member
|
||||
* conn->proto.http; we want FTP through HTTP and we have to change the
|
||||
* member temporarily for connecting to the HTTP proxy. After
|
||||
* Curl_proxyCONNECT we have to set back the member to the original struct
|
||||
* FTP pointer
|
||||
*/
|
||||
ftp_save = conn->proto.ftp;
|
||||
memset(&http_proxy, 0, sizeof(http_proxy));
|
||||
conn->proto.http = &http_proxy;
|
||||
|
||||
result = Curl_proxyCONNECT(conn, FIRSTSOCKET,
|
||||
conn->host.name, conn->remote_port);
|
||||
|
||||
conn->proto.ftp = ftp_save;
|
||||
|
||||
if(CURLE_OK != result)
|
||||
return result;
|
||||
}
|
||||
@@ -2815,7 +2867,7 @@ CURLcode Curl_ftp_done(struct connectdata *conn, CURLcode status)
|
||||
|
||||
flen = ftp->file?strlen(ftp->file):0; /* file is "raw" already */
|
||||
dlen = strlen(path)-flen;
|
||||
if(dlen) {
|
||||
if(dlen && !ftp->cwdfail) {
|
||||
ftp->prevpath = path;
|
||||
if(flen)
|
||||
/* if 'path' is not the whole string */
|
||||
@@ -3664,6 +3716,7 @@ CURLcode ftp_parse_url_path(struct connectdata *conn)
|
||||
/* the ftp struct is already inited in ftp_connect() */
|
||||
ftp = conn->proto.ftp;
|
||||
ftp->ctl_valid = FALSE;
|
||||
ftp->cwdfail = FALSE;
|
||||
|
||||
switch(data->set.ftp_filemethod) {
|
||||
case FTPFILE_NOCWD:
|
||||
|
@@ -5,7 +5,7 @@
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2004, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
* 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
|
||||
@@ -27,10 +27,6 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#ifdef WIN32
|
||||
#include <windows.h>
|
||||
#endif
|
||||
|
||||
#ifdef VMS
|
||||
#include <unixlib.h>
|
||||
#endif
|
||||
@@ -47,7 +43,6 @@ char *GetEnv(const char *variable)
|
||||
return NULL;
|
||||
#else
|
||||
#ifdef WIN32
|
||||
/* This shit requires windows.h (HUGE) to be included */
|
||||
char env[MAX_PATH]; /* MAX_PATH is from windef.h */
|
||||
char *temp = getenv(variable);
|
||||
env[0] = '\0';
|
||||
|
@@ -5,7 +5,7 @@
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
* Copyright (C) 1998 - 2006, 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
|
||||
@@ -187,6 +187,14 @@ CURLcode Curl_getinfo(struct SessionHandle *data, CURLINFO info, ...)
|
||||
case CURLINFO_COOKIELIST:
|
||||
*param_slistp = Curl_cookie_list(data);
|
||||
break;
|
||||
case CURLINFO_LASTSOCKET:
|
||||
if((data->state.lastconnect != -1) &&
|
||||
(data->state.connects[data->state.lastconnect] != NULL))
|
||||
*param_longp = data->state.connects[data->state.lastconnect]->
|
||||
sock[FIRSTSOCKET];
|
||||
else
|
||||
*param_longp = -1;
|
||||
break;
|
||||
default:
|
||||
return CURLE_BAD_FUNCTION_ARGUMENT;
|
||||
}
|
||||
|
40
lib/hostip.c
40
lib/hostip.c
@@ -5,7 +5,7 @@
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
* Copyright (C) 1998 - 2006, 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
|
||||
@@ -276,6 +276,39 @@ void Curl_hostcache_prune(struct SessionHandle *data)
|
||||
Curl_share_unlock(data, CURL_LOCK_DATA_DNS);
|
||||
}
|
||||
|
||||
static int
|
||||
remove_entry_if_stale(struct SessionHandle *data, struct Curl_dns_entry *dns)
|
||||
{
|
||||
struct hostcache_prune_data user;
|
||||
|
||||
if( !dns || (data->set.dns_cache_timeout == -1) || !data->hostcache)
|
||||
/* cache forever means never prune, and NULL hostcache means
|
||||
we can't do it */
|
||||
return 0;
|
||||
|
||||
time(&user.now);
|
||||
user.cache_timeout = data->set.dns_cache_timeout;
|
||||
|
||||
if ( !hostcache_timestamp_remove(&user,dns) )
|
||||
return 0;
|
||||
|
||||
/* ok, we do need to clear the cache. although we need to remove just a
|
||||
single entry we clean the entire hash, as no explicit delete function
|
||||
is provided */
|
||||
if(data->share)
|
||||
Curl_share_lock(data, CURL_LOCK_DATA_DNS, CURL_LOCK_ACCESS_SINGLE);
|
||||
|
||||
Curl_hash_clean_with_criterium(data->hostcache,
|
||||
(void *) &user,
|
||||
hostcache_timestamp_remove);
|
||||
|
||||
if(data->share)
|
||||
Curl_share_unlock(data, CURL_LOCK_DATA_DNS);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
#ifdef HAVE_SIGSETJMP
|
||||
/* Beware this is a global and unique instance. This is used to store the
|
||||
return address that we can jump back to from inside a signal handler. This
|
||||
@@ -405,6 +438,11 @@ int Curl_resolv(struct connectdata *conn,
|
||||
/* free the allocated entry_id again */
|
||||
free(entry_id);
|
||||
|
||||
/* See whether the returned entry is stale. Deliberately done after the
|
||||
locked block */
|
||||
if ( remove_entry_if_stale(data,dns) )
|
||||
dns = NULL; /* the memory deallocation is being handled by the hash */
|
||||
|
||||
rc = CURLRESOLV_ERROR; /* default to failure */
|
||||
|
||||
if (!dns) {
|
||||
|
@@ -7,7 +7,7 @@
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
* Copyright (C) 1998 - 2006, 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
|
||||
@@ -82,6 +82,7 @@
|
||||
#define CURL_ASYNC_SUCCESS ARES_SUCCESS
|
||||
#else
|
||||
#define CURL_ASYNC_SUCCESS CURLE_OK
|
||||
#define ares_cancel(x)
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
@@ -143,7 +143,10 @@ int curl_dogetnameinfo(const struct sockaddr *sa, socklen_t salen,
|
||||
char *serv, size_t servlen, int flags,
|
||||
int line, const char *source)
|
||||
{
|
||||
int res=(getnameinfo)(sa, salen, host, hostlen, serv, servlen, flags);
|
||||
int res = (getnameinfo)(sa, salen,
|
||||
host, hostlen,
|
||||
serv, servlen,
|
||||
flags);
|
||||
if(0 == res) {
|
||||
/* success */
|
||||
if(logfile)
|
||||
|
25
lib/http.c
25
lib/http.c
@@ -5,7 +5,7 @@
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
* Copyright (C) 1998 - 2006, 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
|
||||
@@ -845,8 +845,9 @@ send_buffer *add_buffer_init(void)
|
||||
static
|
||||
CURLcode add_buffer_send(send_buffer *in,
|
||||
struct connectdata *conn,
|
||||
long *bytes_written) /* add the number of sent
|
||||
long *bytes_written, /* add the number of sent
|
||||
bytes to this counter */
|
||||
int socketindex)
|
||||
{
|
||||
ssize_t amount;
|
||||
CURLcode res;
|
||||
@@ -854,7 +855,11 @@ CURLcode add_buffer_send(send_buffer *in,
|
||||
size_t size;
|
||||
struct HTTP *http = conn->proto.http;
|
||||
size_t sendsize;
|
||||
curl_socket_t sockfd = conn->sock[FIRSTSOCKET];
|
||||
curl_socket_t sockfd;
|
||||
|
||||
curlassert(socketindex <= SECONDARYSOCKET);
|
||||
|
||||
sockfd = conn->sock[socketindex];
|
||||
|
||||
/* The looping below is required since we use non-blocking sockets, but due
|
||||
to the circumstances we will just loop and try again and again etc */
|
||||
@@ -1166,7 +1171,7 @@ CURLcode Curl_proxyCONNECT(struct connectdata *conn,
|
||||
if(CURLE_OK == result)
|
||||
/* Now send off the request */
|
||||
result = add_buffer_send(req_buffer, conn,
|
||||
&data->info.request_size);
|
||||
&data->info.request_size, sockindex);
|
||||
}
|
||||
if(result)
|
||||
failf(data, "Failed sending CONNECT to proxy");
|
||||
@@ -1356,7 +1361,7 @@ CURLcode Curl_http_connect(struct connectdata *conn, bool *done)
|
||||
* after the connect has occured, can we start talking SSL
|
||||
*/
|
||||
|
||||
if(conn->bits.tunnel_proxy) {
|
||||
if(conn->bits.tunnel_proxy && conn->bits.httpproxy) {
|
||||
|
||||
/* either SSL over proxy, or explicitly asked for */
|
||||
result = Curl_proxyCONNECT(conn, FIRSTSOCKET,
|
||||
@@ -2032,7 +2037,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
|
||||
return result;
|
||||
|
||||
result = add_buffer_send(req_buffer, conn,
|
||||
&data->info.request_size);
|
||||
&data->info.request_size, FIRSTSOCKET);
|
||||
if(result)
|
||||
failf(data, "Failed sending POST request");
|
||||
else
|
||||
@@ -2097,7 +2102,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
|
||||
|
||||
/* fire away the whole request to the server */
|
||||
result = add_buffer_send(req_buffer, conn,
|
||||
&data->info.request_size);
|
||||
&data->info.request_size, FIRSTSOCKET);
|
||||
if(result)
|
||||
failf(data, "Failed sending POST request");
|
||||
else
|
||||
@@ -2141,7 +2146,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
|
||||
|
||||
/* this sends the buffer and frees all the buffer resources */
|
||||
result = add_buffer_send(req_buffer, conn,
|
||||
&data->info.request_size);
|
||||
&data->info.request_size, FIRSTSOCKET);
|
||||
if(result)
|
||||
failf(data, "Failed sending PUT request");
|
||||
else
|
||||
@@ -2263,7 +2268,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
|
||||
}
|
||||
/* issue the request */
|
||||
result = add_buffer_send(req_buffer, conn,
|
||||
&data->info.request_size);
|
||||
&data->info.request_size, FIRSTSOCKET);
|
||||
|
||||
if(result)
|
||||
failf(data, "Failed sending HTTP POST request");
|
||||
@@ -2280,7 +2285,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
|
||||
|
||||
/* issue the request */
|
||||
result = add_buffer_send(req_buffer, conn,
|
||||
&data->info.request_size);
|
||||
&data->info.request_size, FIRSTSOCKET);
|
||||
|
||||
if(result)
|
||||
failf(data, "Failed sending HTTP request");
|
||||
|
@@ -111,7 +111,7 @@ log_gss_error(struct connectdata *conn, OM_uint32 error_status, char *prefix)
|
||||
gss_release_buffer(&min_stat, &status_string);
|
||||
} while (!GSS_ERROR(maj_stat) && msg_ctx != 0);
|
||||
|
||||
infof(conn->data, buf);
|
||||
infof(conn->data, "%s", buf);
|
||||
}
|
||||
|
||||
int Curl_input_negotiate(struct connectdata *conn, char *header)
|
||||
|
@@ -68,9 +68,9 @@
|
||||
* Returns `dst' (as a const)
|
||||
* Note:
|
||||
* - uses no statics
|
||||
* - takes a u_char* not an in_addr as input
|
||||
* - takes a unsigned char* not an in_addr as input
|
||||
*/
|
||||
static char *inet_ntop4 (const u_char *src, char *dst, size_t size)
|
||||
static char *inet_ntop4 (const unsigned char *src, char *dst, size_t size)
|
||||
{
|
||||
#if defined(HAVE_INET_NTOA_R_2_ARGS)
|
||||
const char *ptr;
|
||||
@@ -97,7 +97,7 @@ static char *inet_ntop4 (const u_char *src, char *dst, size_t size)
|
||||
/*
|
||||
* Convert IPv6 binary address into presentation (printable) format.
|
||||
*/
|
||||
static char *inet_ntop6 (const u_char *src, char *dst, size_t size)
|
||||
static char *inet_ntop6 (const unsigned char *src, char *dst, size_t size)
|
||||
{
|
||||
/*
|
||||
* Note that int32_t and int16_t need only be "at least" large enough
|
||||
@@ -208,10 +208,10 @@ char *Curl_inet_ntop(int af, const void *src, char *buf, size_t size)
|
||||
{
|
||||
switch (af) {
|
||||
case AF_INET:
|
||||
return inet_ntop4((const u_char*)src, buf, size);
|
||||
return inet_ntop4((const unsigned char*)src, buf, size);
|
||||
#ifdef ENABLE_IPV6
|
||||
case AF_INET6:
|
||||
return inet_ntop6((const u_char*)src, buf, size);
|
||||
return inet_ntop6((const unsigned char*)src, buf, size);
|
||||
#endif
|
||||
default:
|
||||
SET_ERRNO(EAFNOSUPPORT);
|
||||
|
@@ -114,7 +114,7 @@ inet_pton4(const char *src, unsigned char *dst)
|
||||
const char *pch;
|
||||
|
||||
if ((pch = strchr(digits, ch)) != NULL) {
|
||||
u_int val = *tp * 10 + (u_int)(pch - digits);
|
||||
unsigned int val = *tp * 10 + (unsigned int)(pch - digits);
|
||||
|
||||
if (val > 255)
|
||||
return (0);
|
||||
@@ -161,7 +161,7 @@ inet_pton6(const char *src, unsigned char *dst)
|
||||
unsigned char tmp[IN6ADDRSZ], *tp, *endp, *colonp;
|
||||
const char *xdigits, *curtok;
|
||||
int ch, saw_xdigit;
|
||||
u_int val;
|
||||
unsigned int val;
|
||||
|
||||
memset((tp = tmp), 0, IN6ADDRSZ);
|
||||
endp = tp + IN6ADDRSZ;
|
||||
|
16
lib/krb4.c
16
lib/krb4.c
@@ -1,14 +1,13 @@
|
||||
/* This source code was modified by Martin Hedenfalk <mhe@stacken.kth.se> for
|
||||
* use in Curl. His latest changes were done 2000-09-18.
|
||||
* use in Curl. Martin's latest changes were done 2000-09-18.
|
||||
*
|
||||
* It has since been patched away like a madman by Daniel Stenberg
|
||||
* <daniel@haxx.se> to make it better applied to curl conditions, and to make
|
||||
* it not use globals, pollute name space and more. This source code awaits a
|
||||
* rewrite to work around the paragraph 2 in the BSD licenses as explained
|
||||
* below.
|
||||
* It has since been patched away like a madman by Daniel Stenberg to make it
|
||||
* better applied to curl conditions, and to make it not use globals, pollute
|
||||
* name space and more.
|
||||
*
|
||||
* Copyright (c) 1995, 1996, 1997, 1998, 1999 Kungliga Tekniska H<>gskolan
|
||||
* (Royal Institute of Technology, Stockholm, Sweden).
|
||||
* Copyright (c) 2004 - 2006 Daniel Stenberg
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@@ -36,7 +35,10 @@
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE. */
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
#include "setup.h"
|
||||
|
||||
|
@@ -39,7 +39,6 @@
|
||||
#include <errno.h>
|
||||
|
||||
#if defined(WIN32)
|
||||
# include <windows.h>
|
||||
# include <malloc.h>
|
||||
# include <winldap.h>
|
||||
#endif
|
||||
|
84
lib/multi.c
84
lib/multi.c
@@ -5,7 +5,7 @@
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
* Copyright (C) 1998 - 2006, 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
|
||||
@@ -92,10 +92,10 @@ struct Curl_one_easy {
|
||||
int msg_num; /* number of messages left in 'msg' to return */
|
||||
};
|
||||
|
||||
|
||||
#define CURL_MULTI_HANDLE 0x000bab1e
|
||||
|
||||
#define GOOD_MULTI_HANDLE(x) ((x)&&(((struct Curl_multi *)x)->type == CURL_MULTI_HANDLE))
|
||||
#define GOOD_MULTI_HANDLE(x) \
|
||||
((x)&&(((struct Curl_multi *)x)->type == CURL_MULTI_HANDLE))
|
||||
#define GOOD_EASY_HANDLE(x) (x)
|
||||
|
||||
/* This is the struct known as CURLM on the outside */
|
||||
@@ -245,6 +245,11 @@ CURLMcode curl_multi_remove_handle(CURLM *multi_handle,
|
||||
Curl_easy_addmulti(easy->easy_handle, NULL); /* clear the association
|
||||
to this multi handle */
|
||||
|
||||
/* if we have a connection we must call Curl_done() here so that we
|
||||
don't leave a half-baked one around */
|
||||
if(easy->easy_conn)
|
||||
Curl_done(&easy->easy_conn, easy->result);
|
||||
|
||||
/* make the previous node point to our next */
|
||||
if(easy->prev)
|
||||
easy->prev->next = easy->next;
|
||||
@@ -522,40 +527,49 @@ CURLMcode curl_multi_perform(CURLM *multi_handle, int *running_handles)
|
||||
break;
|
||||
|
||||
case CURLM_STATE_DO:
|
||||
/* Perform the protocol's DO action */
|
||||
easy->result = Curl_do(&easy->easy_conn, &dophase_done);
|
||||
|
||||
if(CURLE_OK == easy->result) {
|
||||
|
||||
if(!dophase_done) {
|
||||
/* DO was not completed in one function call, we must continue
|
||||
DOING... */
|
||||
multistate(easy, CURLM_STATE_DOING);
|
||||
result = CURLM_OK;
|
||||
}
|
||||
|
||||
/* after DO, go PERFORM... or DO_MORE */
|
||||
else if(easy->easy_conn->bits.do_more) {
|
||||
/* we're supposed to do more, but we need to sit down, relax
|
||||
and wait a little while first */
|
||||
multistate(easy, CURLM_STATE_DO_MORE);
|
||||
result = CURLM_OK;
|
||||
}
|
||||
else {
|
||||
/* we're done with the DO, now PERFORM */
|
||||
easy->result = Curl_readwrite_init(easy->easy_conn);
|
||||
if(CURLE_OK == easy->result) {
|
||||
multistate(easy, CURLM_STATE_PERFORM);
|
||||
result = CURLM_CALL_MULTI_PERFORM;
|
||||
}
|
||||
}
|
||||
if(easy->easy_handle->set.connect_only) {
|
||||
/* keep connection open for application to use the socket */
|
||||
easy->easy_conn->bits.close = FALSE;
|
||||
multistate(easy, CURLM_STATE_DONE);
|
||||
easy->result = CURLE_OK;
|
||||
result = CURLM_OK;
|
||||
}
|
||||
else {
|
||||
/* failure detected */
|
||||
Curl_posttransfer(easy->easy_handle);
|
||||
Curl_done(&easy->easy_conn, easy->result);
|
||||
Curl_disconnect(easy->easy_conn); /* close the connection */
|
||||
easy->easy_conn = NULL; /* no more connection */
|
||||
/* Perform the protocol's DO action */
|
||||
easy->result = Curl_do(&easy->easy_conn, &dophase_done);
|
||||
|
||||
if(CURLE_OK == easy->result) {
|
||||
|
||||
if(!dophase_done) {
|
||||
/* DO was not completed in one function call, we must continue
|
||||
DOING... */
|
||||
multistate(easy, CURLM_STATE_DOING);
|
||||
result = CURLM_OK;
|
||||
}
|
||||
|
||||
/* after DO, go PERFORM... or DO_MORE */
|
||||
else if(easy->easy_conn->bits.do_more) {
|
||||
/* we're supposed to do more, but we need to sit down, relax
|
||||
and wait a little while first */
|
||||
multistate(easy, CURLM_STATE_DO_MORE);
|
||||
result = CURLM_OK;
|
||||
}
|
||||
else {
|
||||
/* we're done with the DO, now PERFORM */
|
||||
easy->result = Curl_readwrite_init(easy->easy_conn);
|
||||
if(CURLE_OK == easy->result) {
|
||||
multistate(easy, CURLM_STATE_PERFORM);
|
||||
result = CURLM_CALL_MULTI_PERFORM;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
/* failure detected */
|
||||
Curl_posttransfer(easy->easy_handle);
|
||||
Curl_done(&easy->easy_conn, easy->result);
|
||||
Curl_disconnect(easy->easy_conn); /* close the connection */
|
||||
easy->easy_conn = NULL; /* no more connection */
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
|
@@ -390,8 +390,8 @@ static time_t Curl_parsedate(const char *date)
|
||||
*/
|
||||
t = mktime(&tm);
|
||||
|
||||
/* time zone adjust */
|
||||
if(-1 != t) {
|
||||
/* time zone adjust (cast t to int to compare to negative one) */
|
||||
if(-1 != (int)t) {
|
||||
struct tm *gmt;
|
||||
long delta;
|
||||
time_t t2;
|
||||
|
114
lib/setup.h
114
lib/setup.h
@@ -1,5 +1,5 @@
|
||||
#ifndef __SETUP_H
|
||||
#define __SETUP_H
|
||||
#ifndef __LIB_CURL_SETUP_H
|
||||
#define __LIB_CURL_SETUP_H
|
||||
/***************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
@@ -7,7 +7,7 @@
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
* Copyright (C) 1998 - 2006, 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
|
||||
@@ -24,45 +24,76 @@
|
||||
***************************************************************************/
|
||||
|
||||
#ifdef HTTP_ONLY
|
||||
#define CURL_DISABLE_TFTP
|
||||
#define CURL_DISABLE_FTP
|
||||
#define CURL_DISABLE_LDAP
|
||||
#define CURL_DISABLE_TELNET
|
||||
#define CURL_DISABLE_DICT
|
||||
#define CURL_DISABLE_FILE
|
||||
#define CURL_DISABLE_GOPHER
|
||||
#endif /* HTTP_ONLY */
|
||||
|
||||
#if !defined(WIN32) && defined(__WIN32__)
|
||||
/* This should be a good Borland fix. */
|
||||
#define WIN32
|
||||
#endif
|
||||
#if !defined(WIN32) && defined(_WIN32)
|
||||
/* This works for VS2005 on x64 */
|
||||
/* Borland fix */
|
||||
#define WIN32
|
||||
#endif
|
||||
|
||||
#if !defined(WIN32) && defined(_WIN32)
|
||||
/* VS2005 on x64 fix */
|
||||
#define WIN32
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Include configuration script results or hand-crafted
|
||||
* configuration file for platforms which lack config tool.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h" /* the configure script results */
|
||||
#include "config.h"
|
||||
#else
|
||||
|
||||
#ifdef _WIN32_WCE
|
||||
#include "config-win32ce.h"
|
||||
#else
|
||||
#ifdef WIN32
|
||||
/* hand-modified win32 config.h! */
|
||||
#include "config-win32.h"
|
||||
#endif /* WIN32 */
|
||||
#endif /* WIN32_WCE */
|
||||
#endif /* HAVE_CONFIG_H */
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef macintosh
|
||||
/* hand-modified MacOS config.h! */
|
||||
#include "config-mac.h"
|
||||
#endif
|
||||
|
||||
#ifdef AMIGA
|
||||
/* hand-modified AmigaOS config.h! */
|
||||
#include "amigaos.h"
|
||||
#endif
|
||||
|
||||
#endif /* HAVE_CONFIG_H */
|
||||
|
||||
/*
|
||||
* Include header files for windows builds before redefining anything.
|
||||
* Use this preproessor block only to include or exclude windows.h,
|
||||
* winsock2.h, ws2tcpip.h or winsock.h. Any other windows thing belongs
|
||||
* to any other further and independant block.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_WINDOWS_H
|
||||
# ifndef WIN32_LEAN_AND_MEAN
|
||||
# define WIN32_LEAN_AND_MEAN
|
||||
# endif
|
||||
# include <windows.h>
|
||||
# ifdef HAVE_WINSOCK2_H
|
||||
# include <winsock2.h>
|
||||
# ifdef HAVE_WS2TCPIP_H
|
||||
# include <ws2tcpip.h>
|
||||
# endif
|
||||
# else
|
||||
# ifdef HAVE_WINSOCK_H
|
||||
# include <winsock.h>
|
||||
# endif
|
||||
# endif
|
||||
#endif
|
||||
|
||||
|
||||
#ifndef TRUE
|
||||
#define TRUE 1
|
||||
#endif
|
||||
@@ -121,6 +152,21 @@ typedef unsigned char bool;
|
||||
#include <curl/stdcheaders.h>
|
||||
#endif
|
||||
|
||||
/*
|
||||
* PellesC cludge section (yikes);
|
||||
* - It has 'ssize_t', but it is in <unistd.h>. The way the headers
|
||||
* on Win32 are included, forces me to include this header here.
|
||||
* - sys_nerr, EINTR is missing in v4.0 or older.
|
||||
*/
|
||||
#ifdef __POCC__
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
#if (__POCC__ <= 400)
|
||||
#define sys_nerr EILSEQ /* for strerror.c */
|
||||
#define EINTR -1 /* for select.c */
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(CURLDEBUG) && defined(HAVE_ASSERT_H)
|
||||
#define curlassert(x) assert(x)
|
||||
#else
|
||||
@@ -149,6 +195,7 @@ typedef unsigned char bool;
|
||||
#define struct_stat struct stat
|
||||
#endif /* Win32 with large file support */
|
||||
|
||||
|
||||
/* Below we define four functions. They should
|
||||
1. close a socket
|
||||
2. read from a socket
|
||||
@@ -160,20 +207,6 @@ typedef unsigned char bool;
|
||||
|
||||
#ifdef WIN32
|
||||
|
||||
#ifndef WIN32_LEAN_AND_MEAN
|
||||
#define WIN32_LEAN_AND_MEAN /* Prevent including <winsock*.h> in <windows.h> */
|
||||
#endif /* WIN32_LEAN_AND_MEAN */
|
||||
|
||||
#ifdef HAVE_WINSOCK2_H
|
||||
#include <winsock2.h> /* required by telnet.c */
|
||||
#endif
|
||||
|
||||
#if defined(ENABLE_IPV6) || defined(USE_SSLEAY)
|
||||
#if !defined(_MSC_VER) || (_MSC_VER >= 1300)
|
||||
#include <ws2tcpip.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if !defined(__GNUC__) || defined(__MINGW32__)
|
||||
#define sclose(x) closesocket(x)
|
||||
|
||||
@@ -196,6 +229,7 @@ typedef unsigned char bool;
|
||||
#else /* WIN32 */
|
||||
|
||||
#ifdef DJGPP
|
||||
#include <sys/ioctl.h>
|
||||
#define sclose(x) close_s(x)
|
||||
#define sread(x,y,z) read_s(x,y,z)
|
||||
#define swrite(x,y,z) write_s(x,y,z)
|
||||
@@ -269,12 +303,24 @@ typedef int curl_socket_t;
|
||||
|
||||
/* "cl -ML" or "cl -MLd" implies a single-threaded runtime library where
|
||||
_beginthreadex() is not available */
|
||||
#if defined(_MSC_VER) && !defined(_MT) && !defined(USE_ARES)
|
||||
#if (defined(_MSC_VER) && !defined(__POCC__)) && !defined(_MT) && !defined(USE_ARES)
|
||||
#undef USE_THREADING_GETADDRINFO
|
||||
#undef USE_THREADING_GETHOSTBYNAME
|
||||
#define CURL_NO__BEGINTHREADEX
|
||||
#endif
|
||||
|
||||
/*
|
||||
* msvc 6.0 does not have struct sockaddr_storage and
|
||||
* does not define IPPROTO_ESP in winsock2.h. But both
|
||||
* are available if PSDK is properly installed.
|
||||
*/
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#if !defined(HAVE_WINSOCK2_H) || ((_MSC_VER < 1300) && !defined(IPPROTO_ESP))
|
||||
#undef HAVE_STRUCT_SOCKADDR_STORAGE
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef mpeix
|
||||
#define IOCTL_3_ARGS
|
||||
#endif
|
||||
@@ -310,14 +356,10 @@ typedef int curl_socket_t;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(CURL_DISABLE_HTTP) && !defined(CURL_DISABLE_GOPHER)
|
||||
#define CURL_DISABLE_GOPHER
|
||||
#endif
|
||||
|
||||
#ifdef CURLDEBUG
|
||||
#define DEBUGF(x) x
|
||||
#else
|
||||
#define DEBUGF(x)
|
||||
#endif
|
||||
|
||||
#endif /* __SETUP_H */
|
||||
#endif /* __LIB_CURL_SETUP_H */
|
||||
|
@@ -802,12 +802,13 @@ static int hostmatch(const char *hostname, const char *pattern)
|
||||
if (hostmatch(hostname++,pattern) == HOST_MATCH)
|
||||
return HOST_MATCH;
|
||||
}
|
||||
return HOST_NOMATCH;
|
||||
break;
|
||||
}
|
||||
|
||||
if (toupper(c) != toupper(*hostname++))
|
||||
return HOST_NOMATCH;
|
||||
break;
|
||||
}
|
||||
return HOST_NOMATCH;
|
||||
}
|
||||
|
||||
static int
|
||||
|
@@ -5,7 +5,7 @@
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2004, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
* 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
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user