Compare commits
335 Commits
curl-7_17_
...
curl-7_18_
Author | SHA1 | Date | |
---|---|---|---|
![]() |
a7b98f5f6b | ||
![]() |
6bae091c1b | ||
![]() |
33d68653f0 | ||
![]() |
267836e83c | ||
![]() |
87fdfe770d | ||
![]() |
8fca5c2e69 | ||
![]() |
5f2055729e | ||
![]() |
c6df788866 | ||
![]() |
e67b2524d1 | ||
![]() |
d7bcc26179 | ||
![]() |
69e540dfa6 | ||
![]() |
2198869eb1 | ||
![]() |
fb07259e0d | ||
![]() |
9d28a0252c | ||
![]() |
d54c14ccf9 | ||
![]() |
41def4be6e | ||
![]() |
2d38d0d515 | ||
![]() |
e796c79d18 | ||
![]() |
c93ba48da2 | ||
![]() |
e322513698 | ||
![]() |
6fa72e6417 | ||
![]() |
c914e6ea5d | ||
![]() |
79cb74f03a | ||
![]() |
34cf35051a | ||
![]() |
9bd28a021f | ||
![]() |
5ee3f41e0d | ||
![]() |
64e88ff6a7 | ||
![]() |
acd7c94598 | ||
![]() |
bdb2beb8e4 | ||
![]() |
727e23322f | ||
![]() |
ef0ed9b720 | ||
![]() |
a674654f83 | ||
![]() |
3caeb0a91f | ||
![]() |
a4eddf0d0d | ||
![]() |
fcf9029179 | ||
![]() |
e40327ba00 | ||
![]() |
bdd0e3d3f5 | ||
![]() |
e9490fdbd9 | ||
![]() |
bd40b3ff3f | ||
![]() |
8c66811e09 | ||
![]() |
daadcfd1de | ||
![]() |
62df0ff025 | ||
![]() |
01d95b56a0 | ||
![]() |
f6adae8d35 | ||
![]() |
bcaadb4284 | ||
![]() |
8d963aa0e2 | ||
![]() |
0530b0a5ca | ||
![]() |
5396121595 | ||
![]() |
bcfc7d90d1 | ||
![]() |
47246eb401 | ||
![]() |
3620e71010 | ||
![]() |
c522f349fe | ||
![]() |
6893fcaa9b | ||
![]() |
301ae1ae1b | ||
![]() |
ddaa78f08b | ||
![]() |
3d55877764 | ||
![]() |
3ee32d7920 | ||
![]() |
b3de497d83 | ||
![]() |
ed6466d176 | ||
![]() |
991505e077 | ||
![]() |
56f17d2c9f | ||
![]() |
19ae96f4d0 | ||
![]() |
53108806af | ||
![]() |
1d620a3df4 | ||
![]() |
69f685056d | ||
![]() |
9c7d4394f9 | ||
![]() |
bcc3c9279a | ||
![]() |
5d63404966 | ||
![]() |
a8ae8087c4 | ||
![]() |
502da27d65 | ||
![]() |
4ab8ebb232 | ||
![]() |
f866af912d | ||
![]() |
4f00a8db73 | ||
![]() |
5004529685 | ||
![]() |
2b63eb8511 | ||
![]() |
f09fe4b49f | ||
![]() |
22c76df44d | ||
![]() |
35be09cf58 | ||
![]() |
3564aec388 | ||
![]() |
a042090467 | ||
![]() |
148d727525 | ||
![]() |
08adf67969 | ||
![]() |
e2c817731a | ||
![]() |
8df7e0bdba | ||
![]() |
14ff7e75e0 | ||
![]() |
d270d6518a | ||
![]() |
18faa50940 | ||
![]() |
0ce484eed9 | ||
![]() |
bce5ae9a07 | ||
![]() |
15f832d1c2 | ||
![]() |
c249a8aa1b | ||
![]() |
fc794ae012 | ||
![]() |
07227e8089 | ||
![]() |
32cc75d6cb | ||
![]() |
1c0a19ad53 | ||
![]() |
de23b98522 | ||
![]() |
5e1c9e90d9 | ||
![]() |
59b4bdf78d | ||
![]() |
34d02d1969 | ||
![]() |
2408b236ca | ||
![]() |
4acd437952 | ||
![]() |
314f62958d | ||
![]() |
c616d56e96 | ||
![]() |
f111c9edae | ||
![]() |
7138296633 | ||
![]() |
195e94c0fa | ||
![]() |
cadd08f36a | ||
![]() |
7306b7829b | ||
![]() |
423309541a | ||
![]() |
9c6533d287 | ||
![]() |
b430576436 | ||
![]() |
65008a4e55 | ||
![]() |
3df484088f | ||
![]() |
2912189875 | ||
![]() |
fcb2595ed6 | ||
![]() |
0878af3ec0 | ||
![]() |
fe0d7aee49 | ||
![]() |
2e42b0a252 | ||
![]() |
fcc485092a | ||
![]() |
a4945fe687 | ||
![]() |
88d89b2177 | ||
![]() |
61a2d5ea75 | ||
![]() |
c479c64333 | ||
![]() |
7a2177dc42 | ||
![]() |
bf6e2f28ba | ||
![]() |
f5da1e5484 | ||
![]() |
fd8d862c37 | ||
![]() |
083d3190e5 | ||
![]() |
6787d1ed35 | ||
![]() |
d9023c16ab | ||
![]() |
193d33fd4a | ||
![]() |
a46b40b7fd | ||
![]() |
0b9b8acb08 | ||
![]() |
bf98b635cd | ||
![]() |
7795eb6db8 | ||
![]() |
31674559d3 | ||
![]() |
04e4d9a0b3 | ||
![]() |
f277124a0f | ||
![]() |
6adf5880f5 | ||
![]() |
4e8c4fc80b | ||
![]() |
fc1d1ea934 | ||
![]() |
9cd30c2012 | ||
![]() |
d639ed1aaf | ||
![]() |
c3a02f5407 | ||
![]() |
674845f239 | ||
![]() |
07a1857d59 | ||
![]() |
f4ffa85f60 | ||
![]() |
bcd7d03b3b | ||
![]() |
82c9379b6c | ||
![]() |
c1730dc50a | ||
![]() |
20695098c8 | ||
![]() |
ee52ae001c | ||
![]() |
26115aac5d | ||
![]() |
ca6b27aed2 | ||
![]() |
4fabe22173 | ||
![]() |
7b1a22147e | ||
![]() |
dc24540ed1 | ||
![]() |
92eae30f4d | ||
![]() |
79ef08f631 | ||
![]() |
e3c5f8374b | ||
![]() |
6dc68b4193 | ||
![]() |
afab4d888f | ||
![]() |
c751dfd65d | ||
![]() |
dbca1347f1 | ||
![]() |
3b6315ce1f | ||
![]() |
3c1db5f250 | ||
![]() |
562e9b7bf3 | ||
![]() |
a83e72692f | ||
![]() |
bd99a7dc8c | ||
![]() |
db2d52a792 | ||
![]() |
24602edc17 | ||
![]() |
b0b40d9a00 | ||
![]() |
71b105ceb1 | ||
![]() |
ccb4956145 | ||
![]() |
3d09cb0a88 | ||
![]() |
a03c2d825b | ||
![]() |
06fb242e23 | ||
![]() |
a086952244 | ||
![]() |
2b314064ae | ||
![]() |
439990be88 | ||
![]() |
41d8186c7e | ||
![]() |
6e9276229f | ||
![]() |
636f5eb882 | ||
![]() |
963ef5414c | ||
![]() |
975812d246 | ||
![]() |
089668ec73 | ||
![]() |
cc0ce38acc | ||
![]() |
8cdff55b80 | ||
![]() |
662bee7193 | ||
![]() |
f8172f85b1 | ||
![]() |
7d3ea12b62 | ||
![]() |
59dc9085d1 | ||
![]() |
4e4f33a297 | ||
![]() |
8fa599215b | ||
![]() |
31e2409d6b | ||
![]() |
15c304225f | ||
![]() |
e1998e3b58 | ||
![]() |
5c447f2499 | ||
![]() |
9d0ffb9cc6 | ||
![]() |
2be50baf97 | ||
![]() |
a1772ca406 | ||
![]() |
30eda92a53 | ||
![]() |
1f058f1014 | ||
![]() |
84d0477cb9 | ||
![]() |
1c93e75375 | ||
![]() |
380ed8bebf | ||
![]() |
98e8978857 | ||
![]() |
56ddfbea6e | ||
![]() |
45a2240ead | ||
![]() |
f75ba55b51 | ||
![]() |
46e6115d72 | ||
![]() |
800a72878a | ||
![]() |
649f7b7fd3 | ||
![]() |
c1b734a3e1 | ||
![]() |
cf806748ec | ||
![]() |
b28dc011e0 | ||
![]() |
ee4fef3768 | ||
![]() |
058a023fae | ||
![]() |
0c367fef94 | ||
![]() |
a418d290f1 | ||
![]() |
08cb30801c | ||
![]() |
788de4f7ba | ||
![]() |
ebce0a16f6 | ||
![]() |
df546bd58c | ||
![]() |
05221e9056 | ||
![]() |
e963714de6 | ||
![]() |
dc11239ff1 | ||
![]() |
d59841618d | ||
![]() |
8d3964782a | ||
![]() |
162c039e9d | ||
![]() |
13648f8ccd | ||
![]() |
5b809a3104 | ||
![]() |
3daa54d636 | ||
![]() |
8f1829d1d2 | ||
![]() |
6efb6addf2 | ||
![]() |
d789097af0 | ||
![]() |
4bd2d49ca1 | ||
![]() |
ecfede9b3c | ||
![]() |
cb04619de2 | ||
![]() |
61e2e86aef | ||
![]() |
9b86eecb94 | ||
![]() |
35212da048 | ||
![]() |
755e743cdd | ||
![]() |
1a323390ec | ||
![]() |
23559fd118 | ||
![]() |
d994a873a4 | ||
![]() |
b6575ce0b0 | ||
![]() |
e2b2a84497 | ||
![]() |
86956c2261 | ||
![]() |
ef6dfdc7fd | ||
![]() |
f3b85ef79d | ||
![]() |
1d7e42ee9f | ||
![]() |
6dfb5b4e1f | ||
![]() |
930085751c | ||
![]() |
258c4686b2 | ||
![]() |
600d0b1303 | ||
![]() |
2f928797cf | ||
![]() |
f3f06e823c | ||
![]() |
58292f49c5 | ||
![]() |
5376d1047c | ||
![]() |
1746b57161 | ||
![]() |
0561bffab3 | ||
![]() |
968e943eac | ||
![]() |
5be00c95a7 | ||
![]() |
c80b9c3778 | ||
![]() |
536f98a766 | ||
![]() |
c4e5613a7d | ||
![]() |
bff962398d | ||
![]() |
2b15823dab | ||
![]() |
59dcc7e191 | ||
![]() |
ea3fe98867 | ||
![]() |
4f05613fbb | ||
![]() |
22e52ddd6e | ||
![]() |
1125d45397 | ||
![]() |
44d408204a | ||
![]() |
50feea3eef | ||
![]() |
ca95f58ac0 | ||
![]() |
ed636cbe44 | ||
![]() |
738e4f410c | ||
![]() |
4e731a0189 | ||
![]() |
5cf6a539fe | ||
![]() |
17fde12fb8 | ||
![]() |
5c8b973d4f | ||
![]() |
b22e03b2b2 | ||
![]() |
a2926ebe7c | ||
![]() |
c508d70258 | ||
![]() |
f5971f54ff | ||
![]() |
c5b16d4468 | ||
![]() |
3c71a1bab7 | ||
![]() |
3ec322685b | ||
![]() |
9a39839a43 | ||
![]() |
e87c996fe0 | ||
![]() |
32195c673d | ||
![]() |
b99a61c5b0 | ||
![]() |
c960cd41e8 | ||
![]() |
a29471d0f7 | ||
![]() |
ba6f20a244 | ||
![]() |
61572a1f97 | ||
![]() |
dee3844f13 | ||
![]() |
cbd1a77ec2 | ||
![]() |
33f7ac06c3 | ||
![]() |
70f10f1ac9 | ||
![]() |
775b60fa09 | ||
![]() |
66e4d391d3 | ||
![]() |
caf880be18 | ||
![]() |
c8355c27e9 | ||
![]() |
c2d7e2ae17 | ||
![]() |
98ecad0da6 | ||
![]() |
bbc4e05434 | ||
![]() |
ad6e28073c | ||
![]() |
af29dcbafb | ||
![]() |
b9a7f4e502 | ||
![]() |
51009a40b4 | ||
![]() |
2ec8f77f21 | ||
![]() |
7f62028d66 | ||
![]() |
d34fe06fb0 | ||
![]() |
2f3d520571 | ||
![]() |
48dd0c5673 | ||
![]() |
8be493296d | ||
![]() |
6f33531861 | ||
![]() |
16897354bc | ||
![]() |
823a0454a6 | ||
![]() |
6790c559af | ||
![]() |
c56c4a0a47 | ||
![]() |
45064c5778 | ||
![]() |
7aba59f577 | ||
![]() |
59b05ac383 | ||
![]() |
9b15f1be26 | ||
![]() |
38cd2d781f | ||
![]() |
2f285b3f16 | ||
![]() |
57d2fb41d0 | ||
![]() |
0f77fe55b6 | ||
![]() |
68ee002ad0 | ||
![]() |
1fc3b18592 | ||
![]() |
5a5287ef2a |
430
CHANGES
430
CHANGES
@@ -6,6 +6,436 @@
|
||||
|
||||
Changelog
|
||||
|
||||
Version 7.18.0 (28 January 2008)
|
||||
|
||||
Daniel S (27 Jan 2008)
|
||||
- Dmitry Kurochkin: In "real world" testing I found more bugs in
|
||||
pipelining. Broken connection is not restored and we get into infinite
|
||||
loop. It happens because of wrong is_in_pipeline values.
|
||||
|
||||
Daniel S (26 Jan 2008)
|
||||
- Kevin Reed filed bug report #1879375
|
||||
(http://curl.haxx.se/bug/view.cgi?id=1879375) which describes how libcurl
|
||||
got lost in this scenario: proxy tunnel (or HTTPS over proxy), ask to do any
|
||||
proxy authentication and the proxy replies with an auth (like NTLM) and then
|
||||
closes the connection after that initial informational response.
|
||||
|
||||
libcurl would not properly re-initialize the connection to the proxy and
|
||||
continue the auth negotiation like supposed. It does now however, as it will
|
||||
now detect if one or more authentication methods were available and asked
|
||||
for, and will thus retry the connection and continue from there.
|
||||
|
||||
- I made the progress callback get called properly during proxy CONNECT.
|
||||
|
||||
Daniel S (23 Jan 2008)
|
||||
- Igor Franchuk pointed out that CURLOPT_COOKIELIST set to "ALL" leaked
|
||||
memory, and so did "SESS". Fixed now.
|
||||
|
||||
Yang Tse (22 Jan 2008)
|
||||
- Check poll.h at configuration time, and use it when sys/poll.h unavailable
|
||||
|
||||
Daniel S (22 Jan 2008)
|
||||
- Dmitry Kurochkin removed the cancelled state for pipelining, as we agreed
|
||||
that it is bad anyway. Starting now, removing a handle that is in used in a
|
||||
pipeline will break the pipeline - it'll be set back up again but still...
|
||||
|
||||
Yang Tse (21 Jan 2008)
|
||||
- Disable ldap support for cygwin builds, since it breaks whole build process.
|
||||
Fixing it will affect other platforms, so it is postponed for another release.
|
||||
|
||||
Daniel S (18 Jan 2008)
|
||||
- Lau Hang Kin found and fixed a problem with the multi interface when doing
|
||||
CONNECT over a proxy. curl_multi_fdset() didn't report back the socket
|
||||
properly during that state, due to a missing case in the switch in the
|
||||
multi_getsock() function.
|
||||
|
||||
Yang Tse (17 Jan 2008)
|
||||
- Don't abort tests 518 and 537 when unable to raise the open-file soft limit.
|
||||
|
||||
Daniel S (16 Jan 2008)
|
||||
- Nathan Coulter's patch that makes runtests.pl respect the PATH when figuring
|
||||
out what valgrind to run.
|
||||
|
||||
Yang Tse (16 Jan 2008)
|
||||
- Improved handling of out of memory in the command line tool that afected
|
||||
data url encoded HTTP POSTs when reading it from a file.
|
||||
|
||||
Daniel S (16 Jan 2008)
|
||||
- Dmitry Kurochkin worked a lot on improving the HTTP Pipelining support that
|
||||
previously had a number of flaws, perhaps most notably when an application
|
||||
fired up N transfers at once as then they wouldn't pipeline at all that
|
||||
nicely as anyone would think... Test case 530 was also updated to take the
|
||||
improved functionality into account.
|
||||
|
||||
- Calls to Curl_failf() are not supposed to provide a trailing newline as the
|
||||
function itself adds that. Fixed on 50 or something strings!
|
||||
|
||||
Daniel S (15 Jan 2008)
|
||||
- I made the torture test on test 530 go through. This was actually due to
|
||||
silly code left from when we switched to let the multi handle "hold" the dns
|
||||
cache when using the multi interface... Of course this only triggered when a
|
||||
certain function call returned error at the correct moment.
|
||||
|
||||
Daniel S (14 Jan 2008)
|
||||
- Joe Malicki filed bug report #1871269
|
||||
(http://curl.haxx.se/bug/view.cgi?id=1871269) and we could fix his hang-
|
||||
problem that occurred when doing a large HTTP POST request with the
|
||||
response-body read from a callback.
|
||||
|
||||
Daniel S (12 Jan 2008)
|
||||
- I re-arranged the curl --help output. All the options are now sorted on
|
||||
their long option names and all descriptions are one-liners.
|
||||
|
||||
- Eric Landes provided the patch (edited by me) that introduces the
|
||||
--keepalive-time to curl to set the keepalive probe interval. I also took
|
||||
the opportunity to rename the recently added no-keep-alive option to
|
||||
no-keepalive to keep a consistent naming and to avoid getting two dashes in
|
||||
these option names. Eric also provided an update to the man page for the new
|
||||
option.
|
||||
|
||||
Daniel S (11 Jan 2008)
|
||||
- Daniel Egger made CURLOPT_RANGE work on file:// URLs the very same way it
|
||||
already worked for FTP:// URLs.
|
||||
|
||||
- I made the curl tool switch from using CURLOPT_IOCTLFUNCTION to now use the
|
||||
spanking new CURLOPT_SEEKFUNCTION simply to take advantage of the improved
|
||||
performance for the upload resume cases where you want to upload the last
|
||||
few bytes of a very large file. To implement this decently, I had to switch
|
||||
the client code for uploading from fopen()/fread() to plain open()/read() so
|
||||
that we can use lseek() to do >32bit seeks (as fseek() doesn't allow that)
|
||||
on systems that offer support for that.
|
||||
|
||||
Daniel S (10 Jan 2008)
|
||||
- Michal Marek made curl-config --libs not include /usr/lib64 in the output
|
||||
(it already before skipped /usr/lib). /usr/lib64 is the default library
|
||||
directory on many 64bit systems and it's unlikely that anyone would use the
|
||||
path privately on systems where it's not.
|
||||
|
||||
- Georg Lippitsch brought CURLOPT_SEEKFUNCTION and CURLOPT_SEEKDATA to allow
|
||||
libcurl to seek in a given input stream. This is particularly important when
|
||||
doing upload resumes when there's already a huge part of the file present
|
||||
remotely. Before, and still if this callback isn't used, libcurl will read
|
||||
and through away the entire file up to the point to where the resuming
|
||||
begins (which of course can be a slow opereration depending on file size,
|
||||
I/O bandwidth and more). This new function will also be preferred to get
|
||||
used instead of the CURLOPT_IOCTLFUNCTION for seeking back in a stream when
|
||||
doing multi-stage HTTP auth with POST/PUT.
|
||||
|
||||
- Nikitinskit Dmitriy filed bug report #1868255
|
||||
(http://curl.haxx.se/bug/view.cgi?id=1868255) with a patch. It identifies
|
||||
and fixes a problem with parsing WWW-Authenticate: headers with additional
|
||||
spaces in the line that the parser wasn't written to deal with.
|
||||
|
||||
Daniel S (8 Jan 2008)
|
||||
- Introducing curl_easy_pause() and new magic return codes for both the read
|
||||
and the write callbacks that now can make a connection's reading and/or
|
||||
writing get paused.
|
||||
|
||||
Daniel S (6 Jan 2008)
|
||||
- Jeff Johnson filed bug report #1863171
|
||||
(http://curl.haxx.se/bug/view.cgi?id=1863171) where he pointed out that
|
||||
libcurl's date parser didn't accept a +1300 time zone which actually is used
|
||||
fairly often (like New Zealand's Dailight Savings Time), so I modified the
|
||||
parser to now accept up to and including -1400 to +1400.
|
||||
|
||||
Daniel S (5 Jan 2008)
|
||||
- Based on further discussion on curl-library, I reverted yesterday's SOCKS5
|
||||
code to instead introduce support for a new proxy type called
|
||||
CURLPROXY_SOCKS5_HOSTNAME that is used to send the host name to the proxy
|
||||
instead of IP address and there's thus no longer any need for a new
|
||||
curl_easy_setopt() option.
|
||||
|
||||
The default SOCKS5 proxy is again back to sending the IP address to the
|
||||
proxy. The new curl command line option for enabling sending host name to a
|
||||
SOCKS5 proxy is now --socks5-hostname.
|
||||
|
||||
Daniel S (4 Jan 2008)
|
||||
- Based on Maxim Perenesenko's patch, we now do SOCKS5 operations and let the
|
||||
proxy do the host name resolving and only if --socks5ip (or
|
||||
CURLOPT_SOCKS5_RESOLVE_LOCAL) is used we resolve the host name locally and
|
||||
pass on the IP address only to the proxy.
|
||||
|
||||
Yang Tse (3 Jan 2008)
|
||||
- Modified test harness to allow SCP, SFTP and SOCKS4 tests to run with
|
||||
OpenSSH 2.9.9, SunSSH 1.0 or later versions. SOCKS5 tests need OpenSSH
|
||||
3.7, SunSSH 1.0 or later.
|
||||
|
||||
Daniel S (2 Jan 2008)
|
||||
- I fixed two cases of missing return code checks when handling chunked
|
||||
decoding where a write error (or abort return from a callback) didn't stop
|
||||
libcurl's processing.
|
||||
|
||||
- I removed the socklen_t use from the public curl/curl.h header and instead
|
||||
made it an unsigned int. The type was only used in the curl_sockaddr struct
|
||||
definition (only used by the curl_opensocket_callback). On all platforms I
|
||||
could find information about, socklen_t is 32 unsigned bits large so I don't
|
||||
think this will break the API or ABI. The main reason for this change is of
|
||||
course for all the platforms that don't have a socklen_t definition in their
|
||||
headers to build fine again. Providing our own configure magic and custom
|
||||
definition of socklen_t on those systems proved to work but was a lot of
|
||||
cruft, code and extra magic needed - when this very small change of type
|
||||
seems harmless and still solves the missing socklen_t problem.
|
||||
|
||||
- Richard Atterer brought a patch that added support for SOCKS4a proxies,
|
||||
which is an inofficial PROXY4 variant that sends the hostname to the proxy
|
||||
instead of the resolved address (which is already supported by SOCKS5).
|
||||
--socks4a is the curl command line option for it and CURLOPT_PROXYTYPE can
|
||||
now be set to CURLPROXY_SOCKS4A as well.
|
||||
|
||||
Daniel S (1 Jan 2008)
|
||||
- Mohun Biswas pointed out that --libcurl generated a source code with an int
|
||||
function but without a return statement. While fixing that, I also took care
|
||||
about adding some better comments for the generated code.
|
||||
|
||||
Daniel S (27 Dec 2007)
|
||||
- Dmitry Kurochkin mentioned a flaw
|
||||
(http://curl.haxx.se/mail/lib-2007-12/0252.html) in detect_proxy() which
|
||||
failed to set the bits.proxy variable properly when an environment variable
|
||||
told libcurl to use a http proxy.
|
||||
|
||||
Daniel S (26 Dec 2007)
|
||||
- In an attempt to repeat the problem in bug report #1850730
|
||||
(http://curl.haxx.se/bug/view.cgi?id=1850730) I wrote up test case 552. The
|
||||
test is doing a 70K POST with a read callback and an ioctl callback over a
|
||||
proxy requiring Digest auth. The test case code is more or less identical to
|
||||
the test recipe code provided by Spacen Jasset (who submitted the bug
|
||||
report).
|
||||
|
||||
Daniel S (25 Dec 2007)
|
||||
- Gary Maxwell filed bug report #1856628
|
||||
(http://curl.haxx.se/bug/view.cgi?id=1856628) and provided a fix for the
|
||||
(small) memory leak in the SSL session ID caching code. It happened when a
|
||||
previous entry in the cache was re-used.
|
||||
|
||||
Daniel Fandrich (19 Dec 2007)
|
||||
- Ensure that nroff doesn't put anything but ASCII characters into the
|
||||
--manual text.
|
||||
|
||||
Yang Tse (18 Dec 2007)
|
||||
- MSVC 9.0 (VS2008) does not support Windows build targets prior to WinXP,
|
||||
and makes wrong asumptions of build target when it isn't specified. So,
|
||||
if no build target has been defined we will target WinXP when building
|
||||
curl/libcurl with MSVC 9.0 (VS2008).
|
||||
|
||||
- (http://curl.haxx.se/mail/archive-2007-12/0039.html) reported and fixed
|
||||
a file truncation problem on Windows build targets triggered when retrying
|
||||
a download with curl.
|
||||
|
||||
Daniel S (17 Dec 2007)
|
||||
- Mateusz Loskot pointed out that MSVC 9.0 (VS2008) has the pollfd struct and
|
||||
defines in winsock2.h somehow differently than previous versions and that
|
||||
curl 7.17.1 would fail to compile out of the box.
|
||||
|
||||
Daniel S (13 Dec 2007)
|
||||
- David Wright filed bug report #1849764
|
||||
(http://curl.haxx.se/bug/view.cgi?id=1849764) with an included fix. He
|
||||
identified a problem for re-used connections that previously had sent
|
||||
Expect: 100-continue and in some situations the subsequent POST (that didn't
|
||||
use Expect:) still had the internal flag set for its use. David's fix (that
|
||||
makes the setting of the flag in every single request unconditionally) is
|
||||
fine and is now used!
|
||||
|
||||
Daniel S (12 Dec 2007)
|
||||
- Gilles Blanc made the curl tool enable SO_KEEPALIVE for the connections and
|
||||
added the --no-keep-alive option that can disable that on demand.
|
||||
|
||||
Daniel S (9 Dec 2007)
|
||||
- Andrew Moise filed bug report #1847501
|
||||
(http://curl.haxx.se/bug/view.cgi?id=1847501) and pointed out a memcpy()
|
||||
that should be memmove() in the convert_lineends() function.
|
||||
|
||||
Daniel S (8 Dec 2007)
|
||||
- Renamed all internal static functions that had Curl_ prefixes to no longer
|
||||
have them. The Curl_ prefix is exclusively used for library internal global
|
||||
symbols. Static functions can be named anything, except for using Curl_ or
|
||||
curl_ prefixes. This is for consistency and for easier maintainance and
|
||||
overview.
|
||||
|
||||
- Cleaned up and reformatted the TODO document to look like the FAQ and
|
||||
CONTRIBUTE, which makes nicer web pages
|
||||
|
||||
- Added test cases 549 and 550 that test CURLOPT_PROXY_TRANSFER_MODE.
|
||||
|
||||
- Added keywords on a bunch of test cases
|
||||
|
||||
- Fixed an OOM problem in the curl code that would lead to fclose on a bad
|
||||
handle and crash
|
||||
|
||||
Daniel S (5 Dec 2007)
|
||||
- Spacen Jasset reported a problem with doing POST (with data read with a
|
||||
callback) over a proxy when NTLM is used as auth with the proxy. The bug
|
||||
also concerned Digest and was limited to using callback only. Spacen worked
|
||||
with us to provide a useful patch. I added the test case 547 and 548 to
|
||||
verify two variations of POST over proxy with NTLM.
|
||||
|
||||
Daniel S (3 Dec 2007)
|
||||
- Ray Pekowski filed bug report #1842029
|
||||
(http://curl.haxx.se/bug/view.cgi?id=1842029) in which he identified a
|
||||
problem with SSL session caching that prevent it from working, and provided
|
||||
the associated fix!
|
||||
|
||||
- Now libcurl (built with OpenSSL) doesn't return error anymore if the remote
|
||||
SSL-based server doesn't present a certificate when the request is told to
|
||||
ignore certificate verification anyway.
|
||||
|
||||
- Michal Marek introduced CURLOPT_PROXY_TRANSFER_MODE which is used to control
|
||||
the appending of the "type=" thing on FTP URLs when they are passed to a
|
||||
HTTP proxy. Some proxies just don't like that appending (which is done
|
||||
unconditionally in 7.17.1), and some proxies treat binary/ascii transfers
|
||||
better with the appending done!
|
||||
|
||||
Daniel S (29 Nov 2007)
|
||||
- A bug report on the curl-library list showed a HTTP Digest session going on
|
||||
with a 700+ letter nonce. Previously libcurl only support 127 letter ones
|
||||
and now I bumped it to 1023.
|
||||
|
||||
- Fixed the resumed FTP upload loop to not require that the read callback
|
||||
returns a full buffer on each invoke.
|
||||
|
||||
Daniel S (25 Nov 2007)
|
||||
- Added test case 1015 that tests --data-urlencode in multiple ways
|
||||
|
||||
- Fixed --data-urlencode for when no @ or = are used
|
||||
|
||||
- Extended the user-agent buffer curl uses, since we can hit the 128 byte
|
||||
border with plenty development libraries used. Like my current set: "curl
|
||||
7.17.2-CVS (i686-pc-linux-gnu) libcurl/7.17.2-CVS OpenSSL/0.9.8g
|
||||
zlib/1.2.3.3 c-ares/1.5.2-CVS libidn/1.1 libssh2/0.19.0-CVS"
|
||||
|
||||
Daniel S (24 Nov 2007)
|
||||
- Internal rearrangements, so that the previous struct HandleData is no more.
|
||||
It is now known as SingleRequest and the Curl_transfer_keeper struct within
|
||||
that was remove entirely. This has the upside that there are less duplicate
|
||||
struct members that made it hard to see and remember what struct that was
|
||||
used to store what data. The transfer_keeper thing was once stored on a
|
||||
per-connection basis and then it made sense to have the duplicate info but
|
||||
since it was moved to the SessionHandle (in 7.16.0) it just added weirdness.
|
||||
The SingleRequest struct is used by data that only is valid for this single
|
||||
request.
|
||||
|
||||
Yang Tse (22 Nov 2007)
|
||||
- Provide a socklen_t definition in curl.h for Win32 API build targets
|
||||
which don't have one.
|
||||
|
||||
Daniel S (22 Nov 2007)
|
||||
- Alessandro Vesely helped me improve the --data-urlencode's syntax, parser
|
||||
and documentation.
|
||||
|
||||
Daniel S (21 Nov 2007)
|
||||
- While inspecting the Negotiate code, I noticed how the proxy auth was using
|
||||
the same state struct as the host auth, so both could never be used at the
|
||||
same time! I fixed it (without being able to check) to use two separate
|
||||
structs to allow authentication using Negotiate on host and proxy
|
||||
simultaneously.
|
||||
|
||||
Daniel S (20 Nov 2007)
|
||||
- Emil Romanus pointed out a bug that made an easy handle get the cookie
|
||||
engine activated when set to use a share (even if the share doesn't share
|
||||
cookies). I fixed it.
|
||||
|
||||
- Fixed a very long-lasting mprintf() bug that occurred when we did "%.*s%s",
|
||||
since the second %s would then wrongly used the numerical precision argument
|
||||
instead and crash.
|
||||
|
||||
- Introduced --data-urlencode to the curl tool for easier url encoding of the
|
||||
data sent in a post.
|
||||
|
||||
Daniel S (18 Nov 2007)
|
||||
- Rob Crittenden fixed SSL connections with NSS done with the multi-interface
|
||||
|
||||
Daniel S (17 Nov 2007)
|
||||
- Michal Marek made the test suite remember what test servers that fail to
|
||||
start so that subsequent tries are simply skipped.
|
||||
|
||||
- Andres Garcia made the examples build fine on Windows (mingw + msys) when
|
||||
the lib was built staticly.
|
||||
|
||||
Daniel S (16 Nov 2007)
|
||||
- Ates Goral identified a problem in http.c:add_buffer_send() when a debug
|
||||
callback was used, as it could wrongly pass on a bad size for the outgoing
|
||||
HTTP header. The bad size would be a very large value as it was a wrapped
|
||||
size_t content. This happened when the whole HTTP request failed to get sent
|
||||
in one single send. http://curl.haxx.se/mail/lib-2007-11/0165.html
|
||||
|
||||
Daniel S (15 Nov 2007)
|
||||
- Fixed yet another remaining problem with doing SFTP directory listings on a
|
||||
re-used persistent connection. Mentioned by Immanuel Gregoire on the mailing
|
||||
list.
|
||||
|
||||
- Michal Marek fixed the test suite to better deal with the case when the HTTP
|
||||
ipv6 server can't run.
|
||||
|
||||
Yang Tse (14 Nov 2007)
|
||||
- Fix a variable potential wrapping in add_buffer() when using absolutely
|
||||
huge send buffer sizes.
|
||||
|
||||
Daniel S (13 Nov 2007)
|
||||
- Fixed a remaining problem with doing SFTP directory listings on a re-used
|
||||
persistent connection. Mentioned by Immanuel Gregoire on the mailing list.
|
||||
|
||||
Daniel S (12 Nov 2007)
|
||||
- Bug report #1830637 (http://curl.haxx.se/bug/view.cgi?id=1830637), which was
|
||||
forwarded from the Gentoo bug tracker by Daniel Black and was originally
|
||||
submitted by Robin Johnson, pointed out that libcurl would do bad memory
|
||||
references when it failed and bailed out before the handler thing was
|
||||
setup. My fix is not done like the provided patch does it, but instead I
|
||||
make sure that there's never any chance for a NULL pointer in that struct
|
||||
member.
|
||||
|
||||
Yang Tse (10 Nov 2007)
|
||||
- Vikram Saxena (http://curl.haxx.se/mail/lib-2007-11/0096.html) pointed out
|
||||
that the pollfd struct was being multi defined when using VS2008. This is
|
||||
now fixed in /curl/lib/select.h
|
||||
|
||||
Daniel S (8 Nov 2007)
|
||||
- Bug report #1823487 (http://curl.haxx.se/bug/view.cgi?id=1823487) pointed
|
||||
out that SFTP requests didn't use persistent connections. Neither did SCP
|
||||
ones. I gave the SSH code a good beating and now both SCP and SFTP should
|
||||
use persistent connections fine. I also did a bunch of indent changes as
|
||||
well as a bug fix for the "keyboard interactive" auth.
|
||||
|
||||
Dan F (6 Nov 2007)
|
||||
- Improved telnet support by drastically reducing the number of write
|
||||
callbacks needed to pass a buffer to the user. Instead one per byte it
|
||||
is now as little as one per segment.
|
||||
|
||||
Yang Tse (6 Nov 2007)
|
||||
- Bug report #1824894 (http://curl.haxx.se/bug/view.cgi?id=1824894) pointed
|
||||
out a problem in curl.h when building C++ apps with MSVC. To fix it, the
|
||||
inclusion of header files in curl.h is moved outside of the C++ extern "C"
|
||||
linkage block.
|
||||
|
||||
Daniel S (1 Nov 2007)
|
||||
- Toby Peterson patched a memory problem in the command line tool that
|
||||
happened when a user had a home dir as an empty string. curl would then do
|
||||
free() on a wrong area.
|
||||
|
||||
Dan F (1 Nov 2007)
|
||||
- Fixed curl-config --features to not display libz when it wasn't used
|
||||
due to a missing header file.
|
||||
|
||||
Dan F (31 October 2007)
|
||||
- Fixed the output of curl-config --protocols which showed SCP and SFTP
|
||||
always, except when --without-libssh2 was given
|
||||
|
||||
- Added test cases 1013 and 1014 to check that curl-config --protocols and
|
||||
curl-config --features matches the output of curl --version
|
||||
|
||||
Dan F (30 October 2007)
|
||||
- Fixed an OOM problem with file: URLs
|
||||
|
||||
- Moved Curl_file_connect into the protocol handler struct
|
||||
|
||||
Dan F (29 October 2007)
|
||||
- Added test case 546 to check that subsequent FTP transfers work after a
|
||||
failed one using the multi interface
|
||||
|
||||
Daniel S (29 October 2007)
|
||||
- Based on one of those bug reports that are intercepted by a distro's bug
|
||||
tracker (https://bugzilla.redhat.com/show_bug.cgi?id=316191), I now made
|
||||
curl-config --features and --protocols show the correct output when built
|
||||
with NSS.
|
||||
|
||||
Version 7.17.1 (29 October 2007)
|
||||
|
||||
Dan F (25 October 2007)
|
||||
|
@@ -10864,7 +10864,7 @@ Version 6.2
|
||||
the configure script to leave SSL alone. The previous functionality has
|
||||
been retained. Troy Engel helped test this new one.
|
||||
|
||||
Version 6.1
|
||||
Version 6.1 (October 17 1999)
|
||||
|
||||
Daniel (17 October 1999):
|
||||
- I ifdef'ed or commented all the zlib stuff in the sources and configure
|
||||
@@ -10939,7 +10939,7 @@ Version 6.1beta
|
||||
- Made the -F option allow stdin when specifying files. By using '-' instead
|
||||
of file name, the data will be read from stdin.
|
||||
|
||||
Version 6.0
|
||||
Version 6.0 (September 14 1999)
|
||||
|
||||
Daniel (13 September 1999)
|
||||
- Added -X/--http-request <request> to enable any HTTP command to be sent.
|
||||
@@ -11201,7 +11201,7 @@ Version 5.9.1
|
||||
with form posting where the variable shouldn't have any content, as in curl
|
||||
-F "form=" www.site.com. It was now fixed.
|
||||
|
||||
Version 5.9
|
||||
Version 5.9 (May 22 1999)
|
||||
|
||||
Daniel (22 May 1999)
|
||||
- I've got a bug report from Aaron Scarisbrick in which he states he has some
|
||||
@@ -11939,7 +11939,7 @@ Version 4.8.1
|
||||
had nothing but header. Appearantly Solaris deals with negative sizes in
|
||||
fwrite() calls a lot better than Linux does... =B-]
|
||||
|
||||
Version 4.8
|
||||
Version 4.8 (Aug 31, 1998)
|
||||
Daniel Stenberg
|
||||
- Continue FTP file transfer. -c is the switch. Note that you need to
|
||||
specify a file name if you wanna resume a download (you can't resume a
|
||||
|
2
COPYING
2
COPYING
@@ -1,6 +1,6 @@
|
||||
COPYRIGHT AND PERMISSION NOTICE
|
||||
|
||||
Copyright (c) 1996 - 2007, Daniel Stenberg, <daniel@haxx.se>.
|
||||
Copyright (c) 1996 - 2008, Daniel Stenberg, <daniel@haxx.se>.
|
||||
|
||||
All rights reserved.
|
||||
|
||||
|
@@ -5,7 +5,7 @@
|
||||
# | (__| |_| | _ <| |___
|
||||
# \___|\___/|_| \_\_____|
|
||||
#
|
||||
# Copyright (C) 1998 - 2007, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
# Copyright (C) 1998 - 2008, 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
|
||||
@@ -128,6 +128,12 @@ vc:
|
||||
cd ..\src
|
||||
nmake /f Makefile.$(VC)
|
||||
|
||||
vc-x64:
|
||||
cd lib
|
||||
MACHINE=x64 nmake /f Makefile.$(VC) cfg=release
|
||||
cd ..\src
|
||||
MACHINE=x64 nmake /f Makefile.$(VC)
|
||||
|
||||
vc-zlib:
|
||||
cd lib
|
||||
nmake /f Makefile.$(VC) cfg=release-zlib
|
||||
|
120
RELEASE-NOTES
120
RELEASE-NOTES
@@ -1,53 +1,68 @@
|
||||
Curl and libcurl 7.17.1
|
||||
Curl and libcurl 7.18.0
|
||||
|
||||
Public curl release number: 102
|
||||
Releases counted from the very beginning: 128
|
||||
Available command line options: 121
|
||||
Available curl_easy_setopt() options: 147
|
||||
Number of public functions in libcurl: 55
|
||||
Amount of public web site mirrors: 43
|
||||
Number of known libcurl bindings: 36
|
||||
Number of contributors: 588
|
||||
Public curl releases: 103
|
||||
Command line options: 126
|
||||
curl_easy_setopt() options: 150
|
||||
Public functions in libcurl: 56
|
||||
Public web site mirrors: 43
|
||||
Known libcurl bindings: 36
|
||||
Contributors: 597
|
||||
|
||||
This release includes the following changes:
|
||||
|
||||
o automatically append ";type=<a|i>" when using HTTP proxies for FTP urls
|
||||
o improved NSS support
|
||||
o added --proxy-negotiate
|
||||
o added --post301 and CURLOPT_POST301
|
||||
o builds with c-ares 1.5.0
|
||||
o added CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 and --hostpubmd5
|
||||
o renamed CURLE_SSL_PEER_CERTIFICATE to CURLE_PEER_FAILED_VERIFICATION
|
||||
o added CURLOPT_OPENSOCKETFUNCTION and CURLOPT_OPENSOCKETDATA
|
||||
o CULROPT_COOKIELIST supports "FLUSH"
|
||||
o added CURLOPT_COPYPOSTFIELDS
|
||||
o added --static-libs to curl-config
|
||||
o --data-urlencode
|
||||
o CURLOPT_PROXY_TRANSFER_MODE
|
||||
o --no-keepalive - now curl does connections with keep-alive enabled by
|
||||
default
|
||||
o --socks4a added (proxy type CURLPROXY_SOCKS4A for libcurl)
|
||||
o --socks5-hostname added (CURLPROXY_SOCKS5_HOSTNAME for libcurl)
|
||||
o curl_easy_pause()
|
||||
o CURLOPT_SEEKFUNCTION and CURLOPT_SEEKDATA
|
||||
o --keepalive-time
|
||||
o curl --help output was re-ordered
|
||||
|
||||
This release includes the following bugfixes:
|
||||
|
||||
o curl-config --protocols now properly reports LDAPS, SCP and SFTP
|
||||
o ldapv3 support on Windows
|
||||
o ldap builds with the MSVC makefiles
|
||||
o no HOME and no key given caused SSH auth failure
|
||||
o Negotiate authentication over proxy
|
||||
o --ftp-method nocwd on directory listings
|
||||
o FTP, CURLOPT_NOBODY enabled and CURLOPT_HEADER disabled now does TYPE
|
||||
before SIZE
|
||||
o re-used handle transfers with SFTP
|
||||
o curl_easy_escape() problem with byte values >= 128
|
||||
o handles chunked-encoded CONNECT responses
|
||||
o misuse of ares_timeout() result
|
||||
o --local-port on TFTP transfers
|
||||
o CURLOPT_POSTFIELDS could fail to send binary data
|
||||
o specifying a proxy with a trailing slash didn't work (unless it also
|
||||
contained a port number)
|
||||
o redirect from HTTP to FTP or TFTP memory problems and leaks
|
||||
o re-used connections a bit too much when using non-SSL protocols tunneled
|
||||
over a HTTP proxy
|
||||
o embed the manifest in VC8 builds
|
||||
o use valgrind in the tests even when the lib is built shared with libtool
|
||||
o libcurl built with NSS can now ignore the peer verification even when the
|
||||
ca cert bundle is absent
|
||||
o curl-config --features and --protocols show the correct output when built
|
||||
with NSS, and also when SCP, SFTP and libz are not available
|
||||
o free problem in the curl tool for users with empty home dir
|
||||
o curl.h version 7.17.1 problem when building C++ apps with MSVC
|
||||
o SFTP and SCP use persistent connections
|
||||
o segfault on bad URL
|
||||
o variable wrapping when using absolutely huge send buffer sizes
|
||||
o variable wrapping when using debug callback and the HTTP request wasn't sent
|
||||
in one go
|
||||
o SSL connections with NSS done with the multi-interface
|
||||
o setting a share no longer activates cookies
|
||||
o Negotiate now works on auth and proxy simultanouesly
|
||||
o support HTTP Digest nonces up to 1023 letters
|
||||
o resumed ftp upload no longer requires the read callback to return full
|
||||
buffers
|
||||
o no longer default-appends ;type= on FTP URLs thru proxies
|
||||
o SSL session id caching
|
||||
o POST with callback over proxy requiring NTLM or Digest
|
||||
o Expect: 100-continue flaw on re-used connection with POSTs
|
||||
o build fix for MSVC 9.0 (VS2008)
|
||||
o Windows curl builds failed file truncation when retry downloading
|
||||
o SSL session ID cache memory leak
|
||||
o bad connection re-use check with environment variable-activated proxy use
|
||||
o --libcurl now generates a return statement as well
|
||||
o socklen_t is no longer used in the public includes
|
||||
o time zone offsets from -1400 to +1400 are now accepted by the date parser
|
||||
o allows more spaces in WWW/Proxy-Authenticate: headers
|
||||
o curl-config --libs skips /usr/lib64
|
||||
o range support for file:// transfers
|
||||
o libcurl hang with huge POST request and request-body read from callback
|
||||
o removed extra newlines from many error messages
|
||||
o improved pipelining
|
||||
o improved OOM handling for data url encoded HTTP POSTs when read from a file
|
||||
o test suite could pick wrong tool(s) if more than one existed in the PATH
|
||||
o curl_multi_fdset() failed to return socket while doing CONNECT over proxy
|
||||
o curl_multi_remove_handle() on a handle that is in used for a pipeline now
|
||||
break that pipeline
|
||||
o CURLOPT_COOKIELIST memory leaks
|
||||
o progress meter/callback during http proxy CONNECT requests
|
||||
o auth for http proxy when the proxy closes connection after first response
|
||||
|
||||
This release includes the following known bugs:
|
||||
|
||||
@@ -55,18 +70,25 @@ This release includes the following known bugs:
|
||||
|
||||
Other curl-related news:
|
||||
|
||||
o
|
||||
o TclCurl 7.17.1 => http://personal1.iddeo.es/andresgarci/tclcurl/english/
|
||||
o Ruby Curl::Multi 0.1 => http://curl-multi.rubyforge.org/
|
||||
o curl-java 0.2.1 => http://curl.haxx.se/libcurl/java/
|
||||
|
||||
New curl mirrors:
|
||||
|
||||
o http://curl.wetzlmayr.at/ is a new web mirror in Nuremberg, Germany
|
||||
o http://curl.gominet.net/ is new mirror in Vizcaya, Portugal
|
||||
o http://curl.very-clever.com/ is a new mirror in Nuremberg, Germany
|
||||
|
||||
This release would not have looked like this without help, code, reports and
|
||||
advice from friends like these:
|
||||
|
||||
Dan Fandrich, Michal Marek, G<>nter Knauf, Rob Crittenden, Immanuel Gregoire,
|
||||
Mark Davies, Max Katsev, Philip Langdale, Alex Fishman, Johnny Luong,
|
||||
Alexey Pesternikov, Yang Tse, Kim Rinnewitz, Michael Wallner,
|
||||
Patrick Monnerat, Vladimir Lazarenko
|
||||
Dan Fandrich, Gisle Vanem, Toby Peterson, Yang Tse, Daniel Black,
|
||||
Robin Johnson, Michal Marek, Ates Goral, Andres Garcia, Rob Crittenden,
|
||||
Emil Romanus, Alessandro Vesely, Ray Pekowski, Spacen Jasset, Andrew Moise,
|
||||
Gilles Blanc, David Wright, Vikram Saxena, Mateusz Loskot, Gary Maxwell,
|
||||
Dmitry Kurochkin, Mohun Biswas, Richard Atterer, Maxim Perenesenko,
|
||||
Daniel Egger, Jeff Johnson, Nikitinskit Dmitriy, Georg Lippitsch, Eric Landes,
|
||||
Joe Malicki, Nathan Coulter, Lau Hang Kin, Judson Bishop, Igor Franchuk,
|
||||
Kevin Reed
|
||||
|
||||
Thanks! (and sorry if I forgot to mention someone)
|
||||
|
@@ -1,4 +1,4 @@
|
||||
To be addressed before 7.17.1 (planned release: late October 2007)
|
||||
To be addressed before 7.18.0 (planned release: January 2008)
|
||||
=============================
|
||||
|
||||
106 -
|
||||
118 -
|
||||
|
23
ares/CHANGES
23
ares/CHANGES
@@ -1,5 +1,28 @@
|
||||
Changelog for the c-ares project
|
||||
|
||||
* December 11 2007 (Gisle Vanem)
|
||||
|
||||
- Added another sample application; acountry.c which converts an
|
||||
IPv4-address(es) and/or host-name(s) to country-name and country-code.
|
||||
This uses the service of the DNSBL at countries.nerd.dk.
|
||||
|
||||
* December 3 2007 (Daniel Stenberg)
|
||||
|
||||
- Brad Spencer fixed the configure script to assume that there's no
|
||||
/dev/urandom when built cross-compiled as then the script cannot check for
|
||||
it.
|
||||
|
||||
- Erik Kline cleaned up ares_gethostbyaddr.c:next_lookup() somewhat
|
||||
|
||||
Version 1.5.1 (Nov 21, 2007)
|
||||
|
||||
* November 21 2007 (Daniel Stenberg)
|
||||
|
||||
- Robin Cornelius pointed out that ares_llist.h was missing in the release
|
||||
archive for 1.5.0
|
||||
|
||||
Version 1.5.0 (Nov 21, 2007)
|
||||
|
||||
* October 2 2007 (Daniel Stenberg)
|
||||
|
||||
- ares_strerror() segfaulted if the input error number was out of the currently
|
||||
|
@@ -8,11 +8,21 @@ MSVCFILES = vc/adig/adig.dep vc/adig/adig.dsp vc/vc.dsw vc/ahost/ahost.dep \
|
||||
vc/ahost/ahost.dsp vc/areslib/areslib.dep vc/areslib/areslib.dsp \
|
||||
vc/areslib/areslib.dsw
|
||||
|
||||
if DEBUGBUILD
|
||||
PROGS =
|
||||
else
|
||||
PROGS = ahost adig acountry
|
||||
endif
|
||||
|
||||
noinst_PROGRAMS =$(PROGS)
|
||||
|
||||
# adig and ahost are just sample programs and thus not mentioned with the
|
||||
# regular sources and headers
|
||||
EXTRA_DIST = CHANGES README.cares Makefile.inc adig.c ahost.c $(man_MANS) \
|
||||
$(MSVCFILES) AUTHORS config-win32.h RELEASE-NOTES libcares.pc.in
|
||||
|
||||
pkgconfigdir = $(libdir)/pkgconfig
|
||||
pkgconfig_DATA = libcares.pc
|
||||
|
||||
VER=-version-info 2:0:0
|
||||
# This flag accepts an argument of the form current[:revision[:age]]. So,
|
||||
@@ -61,6 +71,15 @@ libcares_ladir = $(includedir)
|
||||
# what headers to install on 'make install':
|
||||
libcares_la_HEADERS = ares.h ares_version.h ares_dns.h
|
||||
|
||||
ahost_SOURCES = ahost.c ares_getopt.c
|
||||
ahost_LDADD = $(top_builddir)/$(lib_LTLIBRARIES)
|
||||
|
||||
adig_SOURCES = adig.c ares_getopt.c
|
||||
adig_LDADD = $(top_builddir)/$(lib_LTLIBRARIES)
|
||||
|
||||
acountry_SOURCES = acountry.c ares_getopt.c
|
||||
acountry_LDADD = $(top_builddir)/$(lib_LTLIBRARIES)
|
||||
|
||||
# Make files named *.dist replace the file without .dist extension
|
||||
dist-hook:
|
||||
find $(distdir) -name "*.dist" -exec rm {} \;
|
||||
|
@@ -22,7 +22,7 @@ CFLAGS += -DWATT32 -DHAVE_AF_INET6 -DHAVE_PF_INET6 -DHAVE_FIONBIO \
|
||||
-DRECV_TYPE_ARG1='int' -DRECV_TYPE_ARG2='void*' \
|
||||
-DRECV_TYPE_ARG3='int' -DRECV_TYPE_ARG4='int' \
|
||||
-DRECV_TYPE_RETV='int' -DHAVE_STRUCT_TIMEVAL \
|
||||
-Dselect=select_s -UHAVE_CONFIG_H
|
||||
-Dselect=select_s -Dsocklen_t=int -UHAVE_CONFIG_H
|
||||
|
||||
LDFLAGS = -s
|
||||
|
||||
@@ -49,7 +49,7 @@ EX_LIBS += $(WATT32_ROOT)/lib/libwatt.a
|
||||
|
||||
OBJECTS = $(addprefix $(OBJ_DIR)/, $(CSOURCES:.c=.o))
|
||||
|
||||
all: $(OBJ_DIR) libcares.a ahost.exe adig.exe
|
||||
all: $(OBJ_DIR) libcares.a ahost.exe adig.exe acountry.exe
|
||||
@echo Welcome to c-ares.
|
||||
|
||||
libcares.a: $(OBJECTS)
|
||||
@@ -61,11 +61,14 @@ ahost.exe: ahost.c $(OBJ_DIR)/ares_getopt.o $(OBJ_HACK)
|
||||
adig.exe: adig.c $(OBJ_DIR)/ares_getopt.o $(OBJ_HACK)
|
||||
$(CC) $(LDFLAGS) $(CFLAGS) -o $@ $^ $(EX_LIBS)
|
||||
|
||||
acountry.exe: acountry.c $(OBJ_DIR)/ares_getopt.o $(OBJ_HACK)
|
||||
$(CC) $(LDFLAGS) $(CFLAGS) -o $@ $^ $(EX_LIBS)
|
||||
|
||||
clean:
|
||||
rm -f $(OBJECTS) libcares.a
|
||||
|
||||
vclean realclean: clean
|
||||
rm -f ahost.exe adig.exe depend.dj
|
||||
rm -f ahost.exe adig.exe acountry.exe depend.dj
|
||||
- rmdir $(OBJ_DIR)
|
||||
|
||||
-include depend.dj
|
||||
|
@@ -10,7 +10,7 @@ ares_parse_ns_reply.c ares_llist.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 \
|
||||
setup_once.h
|
||||
setup_once.h ares_llist.h
|
||||
|
||||
MANPAGES= ares_destroy.3 ares_expand_name.3 ares_expand_string.3 ares_fds.3 \
|
||||
ares_free_hostent.3 ares_free_string.3 ares_gethostbyaddr.3 \
|
||||
|
@@ -32,7 +32,7 @@ $(LIB): $(OBJLIB)
|
||||
|
||||
all: $(LIB) demos
|
||||
|
||||
demos: adig.exe ahost.exe
|
||||
demos: adig.exe ahost.exe acountry.exe
|
||||
|
||||
tags:
|
||||
etags *.[ch]
|
||||
@@ -61,7 +61,7 @@ install:
|
||||
done)
|
||||
|
||||
clean:
|
||||
$(RM) ares_getopt.o $(OBJLIB) $(LIB) adig.exe ahost.exe
|
||||
$(RM) ares_getopt.o $(OBJLIB) $(LIB) adig.exe ahost.exe acountry.exe
|
||||
|
||||
distclean: clean
|
||||
$(RM) config.cache config.log config.status Makefile
|
||||
|
@@ -18,10 +18,10 @@ INSTDIR = ../curl-$(LIBCURL_VERSION_STR)-bin-nw
|
||||
endif
|
||||
|
||||
# Edit the vars below to change NLM target settings.
|
||||
TARGETS = adig.nlm ahost.nlm
|
||||
TARGETS = adig.nlm ahost.nlm acountry.nlm
|
||||
LTARGET = libcares.$(LIBEXT)
|
||||
VERSION = $(LIBCARES_VERSION)
|
||||
COPYR = Copyright (C) 1996 - 2007, Daniel Stenberg, <daniel@haxx.se>
|
||||
COPYR = Copyright (C) 1996 - 2008, Daniel Stenberg, <daniel@haxx.se>
|
||||
DESCR = cURL $(subst .def,,$(notdir $@)) $(LIBCARES_VERSION_STR) - http://curl.haxx.se
|
||||
MTSAFE = YES
|
||||
STACK = 64000
|
||||
@@ -300,7 +300,6 @@ ifeq ($(LIBARCH),CLIB)
|
||||
@echo $(DL)#define SEND_TYPE_ARG3 int$(DL) >> $@
|
||||
@echo $(DL)#define SEND_TYPE_ARG4 int$(DL) >> $@
|
||||
@echo $(DL)#define SEND_TYPE_RETV int$(DL) >> $@
|
||||
@echo $(DL)#define DL_LDAP_FILE "ldapsdk.nlm"$(DL) >> $@
|
||||
@echo $(DL)#define socklen_t int$(DL) >> $@
|
||||
@echo $(DL)#define strncasecmp strnicmp$(DL) >> $@
|
||||
@echo $(DL)#define strcasecmp stricmp$(DL) >> $@
|
||||
@@ -338,7 +337,6 @@ else
|
||||
@echo $(DL)#define SEND_TYPE_ARG4 int$(DL) >> $@
|
||||
@echo $(DL)#define SEND_TYPE_RETV ssize_t$(DL) >> $@
|
||||
@echo $(DL)#define SIZEOF_STRUCT_IN6_ADDR 16$(DL) >> $@
|
||||
@echo $(DL)#define DL_LDAP_FILE "lldapsdk.nlm"$(DL) >> $@
|
||||
endif
|
||||
@echo $(DL)#define HAVE_ARPA_INET_H 1$(DL) >> $@
|
||||
@echo $(DL)#define HAVE_ARPA_NAMESER_H 1$(DL) >> $@
|
||||
|
@@ -76,7 +76,7 @@ OBJECTS = $(OBJ_DIR)\ares_fds.obj \
|
||||
$(OBJ_DIR)\inet_net_pton.obj \
|
||||
$(OBJ_DIR)\inet_ntop.obj
|
||||
|
||||
all: $(OBJ_DIR) cares.lib cares.dll cares_imp.lib ahost.exe adig.exe
|
||||
all: $(OBJ_DIR) cares.lib cares.dll cares_imp.lib ahost.exe adig.exe acountry.exe
|
||||
@echo Welcome to c-ares library and examples
|
||||
|
||||
$(OBJ_DIR):
|
||||
@@ -131,6 +131,9 @@ ahost.exe: $(OBJ_DIR) $(OBJ_DIR)\ahost.obj $(OBJ_DIR)\ares_getopt.obj cares_imp.
|
||||
adig.exe: $(OBJ_DIR) $(OBJ_DIR)\adig.obj $(OBJ_DIR)\ares_getopt.obj cares_imp.lib
|
||||
link $(LDFLAGS) -out:$@ $(OBJ_DIR)\adig.obj $(OBJ_DIR)\ares_getopt.obj cares_imp.lib $(EX_LIBS)
|
||||
|
||||
acountry.exe: $(OBJ_DIR) $(OBJ_DIR)\acountry.obj $(OBJ_DIR)\ares_getopt.obj cares_imp.lib
|
||||
link $(LDFLAGS) -out:$@ $(OBJ_DIR)\acountry.obj $(OBJ_DIR)\ares_getopt.obj cares_imp.lib $(EX_LIBS)
|
||||
|
||||
clean:
|
||||
- del $(OBJ_DIR)\*.obj *.ilk *.pdb *.pbt *.pbi *.pbo *._xe *.map
|
||||
|
||||
|
@@ -1,4 +1,4 @@
|
||||
This is what's new and changed in the c-ares 1.4.1 release:
|
||||
This is what's new and changed in the c-ares 1.5.2 release:
|
||||
|
||||
o
|
||||
|
||||
|
589
ares/acountry.c
Normal file
589
ares/acountry.c
Normal file
@@ -0,0 +1,589 @@
|
||||
/*
|
||||
* $Id$
|
||||
*
|
||||
* IP-address/hostname to country converter.
|
||||
*
|
||||
* Problem; you want to know where IP a.b.c.d is located.
|
||||
*
|
||||
* Use ares_gethostbyname ("d.c.b.a.zz.countries.nerd.dk")
|
||||
* and get the CNAME (host->h_name). Result will be:
|
||||
* CNAME = zz<CC>.countries.nerd.dk with address 127.0.x.y (ver 1) or
|
||||
* CNAME = <a.b.c.d>.zz.countries.nerd.dk with address 127.0.x.y (ver 2)
|
||||
*
|
||||
* The 2 letter country code in <CC> and the ISO-3166 country
|
||||
* number in x.y (number = x*256 + y). Version 2 of the protocol is missing
|
||||
* the <CC> number.
|
||||
*
|
||||
* Ref: http://countries.nerd.dk/more.html
|
||||
*
|
||||
* Written by G. Vanem <gvanem@broadpark.no> 2006, 2007
|
||||
*
|
||||
* NB! This program may not be big-endian aware.
|
||||
*
|
||||
* 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 <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdarg.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
#ifdef HAVE_UNISTD_H
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
#if defined(WIN32)
|
||||
#include <winsock.h>
|
||||
#else
|
||||
#include <arpa/inet.h>
|
||||
#include <netinet/in.h>
|
||||
#include <netdb.h>
|
||||
#endif
|
||||
|
||||
#include "ares.h"
|
||||
#include "ares_getopt.h"
|
||||
#include "inet_net_pton.h"
|
||||
#include "inet_ntop.h"
|
||||
|
||||
static const char *usage = "acountry [-vh?] {host|addr} ...\n";
|
||||
static const char nerd_fmt[] = "%u.%u.%u.%u.zz.countries.nerd.dk";
|
||||
static const char *nerd_ver1 = nerd_fmt + 14;
|
||||
static const char *nerd_ver2 = nerd_fmt + 11;
|
||||
static int verbose = 0;
|
||||
|
||||
#define TRACE(fmt) do { \
|
||||
if (verbose > 0) \
|
||||
printf fmt ; \
|
||||
} while (0)
|
||||
|
||||
static void wait_ares(ares_channel channel);
|
||||
static void callback(void *arg, int status, int timeouts, struct hostent *host);
|
||||
static void callback2(void *arg, int status, int timeouts, struct hostent *host);
|
||||
static void find_country_from_cname(const char *cname, struct in_addr addr);
|
||||
|
||||
static void Abort(const char *fmt, ...)
|
||||
{
|
||||
va_list args;
|
||||
va_start(args, fmt);
|
||||
vfprintf(stderr, fmt, args);
|
||||
va_end(args);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
ares_channel channel;
|
||||
int ch, status;
|
||||
|
||||
#ifdef WIN32
|
||||
WORD wVersionRequested = MAKEWORD(USE_WINSOCK,USE_WINSOCK);
|
||||
WSADATA wsaData;
|
||||
WSAStartup(wVersionRequested, &wsaData);
|
||||
#endif
|
||||
|
||||
while ((ch = ares_getopt(argc, argv, "dvh?")) != -1)
|
||||
switch (ch)
|
||||
{
|
||||
case 'd':
|
||||
#ifdef WATT32
|
||||
dbug_init();
|
||||
#endif
|
||||
break;
|
||||
case 'v':
|
||||
verbose++;
|
||||
break;
|
||||
case 'h':
|
||||
case '?':
|
||||
default:
|
||||
Abort(usage);
|
||||
}
|
||||
|
||||
argc -= optind;
|
||||
argv += optind;
|
||||
if (argc < 1)
|
||||
Abort(usage);
|
||||
|
||||
status = ares_init(&channel);
|
||||
if (status != ARES_SUCCESS)
|
||||
{
|
||||
fprintf(stderr, "ares_init: %s\n", ares_strerror(status));
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Initiate the queries, one per command-line argument. */
|
||||
for ( ; *argv; argv++)
|
||||
{
|
||||
struct in_addr addr;
|
||||
char buf[100];
|
||||
|
||||
/* If this fails, assume '*argv' is a host-name that
|
||||
* must be resolved first
|
||||
*/
|
||||
if (ares_inet_pton(AF_INET, *argv, &addr) != 1)
|
||||
{
|
||||
ares_gethostbyname(channel, *argv, AF_INET, callback2, &addr);
|
||||
wait_ares(channel);
|
||||
if (addr.s_addr == INADDR_NONE)
|
||||
{
|
||||
printf("Failed to lookup %s\n", *argv);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
sprintf(buf, nerd_fmt,
|
||||
(unsigned int)(addr.s_addr >> 24),
|
||||
(unsigned int)((addr.s_addr >> 16) & 255),
|
||||
(unsigned int)((addr.s_addr >> 8) & 255),
|
||||
(unsigned int)(addr.s_addr & 255));
|
||||
TRACE(("Looking up %s...", buf));
|
||||
fflush(stdout);
|
||||
ares_gethostbyname(channel, buf, AF_INET, callback, buf);
|
||||
}
|
||||
|
||||
wait_ares(channel);
|
||||
ares_destroy(channel);
|
||||
|
||||
#ifdef WIN32
|
||||
WSACleanup();
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Wait for the queries to complete.
|
||||
*/
|
||||
static void wait_ares(ares_channel channel)
|
||||
{
|
||||
while (1)
|
||||
{
|
||||
struct timeval *tvp, tv;
|
||||
fd_set read_fds, write_fds;
|
||||
int nfds;
|
||||
|
||||
FD_ZERO(&read_fds);
|
||||
FD_ZERO(&write_fds);
|
||||
nfds = ares_fds(channel, &read_fds, &write_fds);
|
||||
if (nfds == 0)
|
||||
break;
|
||||
tvp = ares_timeout(channel, NULL, &tv);
|
||||
select(nfds, &read_fds, &write_fds, NULL, tvp);
|
||||
ares_process(channel, &read_fds, &write_fds);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* This is the callback used when we have the IP-address of interest.
|
||||
* Extract the CNAME and figure out the country-code from it.
|
||||
*/
|
||||
static void callback(void *arg, int status, int timeouts, struct hostent *host)
|
||||
{
|
||||
const char *name = (const char*)arg;
|
||||
const char *cname;
|
||||
char buf[20];
|
||||
|
||||
(void)timeouts;
|
||||
|
||||
if (!host || status != ARES_SUCCESS)
|
||||
{
|
||||
printf("Failed to lookup %s: %s\n", name, ares_strerror(status));
|
||||
return;
|
||||
}
|
||||
|
||||
TRACE(("\nFound address %s, name %s\n",
|
||||
ares_inet_ntop(AF_INET,(const char*)host->h_addr,buf,sizeof(buf)),
|
||||
host->h_name));
|
||||
|
||||
cname = host->h_name; /* CNAME gets put here */
|
||||
if (!cname)
|
||||
printf("Failed to get CNAME for %s\n", name);
|
||||
else
|
||||
find_country_from_cname(cname, *(struct in_addr*)host->h_addr);
|
||||
}
|
||||
|
||||
/*
|
||||
* This is the callback used to obtain the IP-address of the host of interest.
|
||||
*/
|
||||
static void callback2(void *arg, int status, int timeouts, struct hostent *host)
|
||||
{
|
||||
struct in_addr *addr = (struct in_addr*) arg;
|
||||
|
||||
(void)timeouts;
|
||||
if (!host || status != ARES_SUCCESS)
|
||||
memset(addr, INADDR_NONE, sizeof(*addr));
|
||||
else
|
||||
memcpy(addr, host->h_addr, sizeof(*addr));
|
||||
}
|
||||
|
||||
struct search_list {
|
||||
int country_number; /* ISO-3166 country number */
|
||||
char short_name[3]; /* A2 short country code */
|
||||
const char *long_name; /* normal country name */
|
||||
};
|
||||
|
||||
const struct search_list *list_lookup(int number, const struct search_list *list, int num)
|
||||
{
|
||||
while (num > 0 && list->long_name)
|
||||
{
|
||||
if (list->country_number == number)
|
||||
return (list);
|
||||
num--;
|
||||
list++;
|
||||
}
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
/*
|
||||
* Ref: ftp://ftp.ripe.net/iso3166-countrycodes.txt
|
||||
*/
|
||||
static const struct search_list country_list[] = {
|
||||
{ 4, "af", "Afghanistan" },
|
||||
{ 248, "ax", "<EFBFBD>land Island" },
|
||||
{ 8, "al", "Albania" },
|
||||
{ 12, "dz", "Algeria" },
|
||||
{ 16, "as", "American Samoa" },
|
||||
{ 20, "ad", "Andorra" },
|
||||
{ 24, "ao", "Angola" },
|
||||
{ 660, "ai", "Anguilla" },
|
||||
{ 10, "aq", "Antarctica" },
|
||||
{ 28, "ag", "Antigua & Barbuda" },
|
||||
{ 32, "ar", "Argentina" },
|
||||
{ 51, "am", "Armenia" },
|
||||
{ 533, "aw", "Aruba" },
|
||||
{ 36, "au", "Australia" },
|
||||
{ 40, "at", "Austria" },
|
||||
{ 31, "az", "Azerbaijan" },
|
||||
{ 44, "bs", "Bahamas" },
|
||||
{ 48, "bh", "Bahrain" },
|
||||
{ 50, "bd", "Bangladesh" },
|
||||
{ 52, "bb", "Barbados" },
|
||||
{ 112, "by", "Belarus" },
|
||||
{ 56, "be", "Belgium" },
|
||||
{ 84, "bz", "Belize" },
|
||||
{ 204, "bj", "Benin" },
|
||||
{ 60, "bm", "Bermuda" },
|
||||
{ 64, "bt", "Bhutan" },
|
||||
{ 68, "bo", "Bolivia" },
|
||||
{ 70, "ba", "Bosnia & Herzegowina" },
|
||||
{ 72, "bw", "Botswana" },
|
||||
{ 74, "bv", "Bouvet Island" },
|
||||
{ 76, "br", "Brazil" },
|
||||
{ 86, "io", "British Indian Ocean Territory" },
|
||||
{ 96, "bn", "Brunei Darussalam" },
|
||||
{ 100, "bg", "Bulgaria" },
|
||||
{ 854, "bf", "Burkina Faso" },
|
||||
{ 108, "bi", "Burundi" },
|
||||
{ 116, "kh", "Cambodia" },
|
||||
{ 120, "cm", "Cameroon" },
|
||||
{ 124, "ca", "Canada" },
|
||||
{ 132, "cv", "Cape Verde" },
|
||||
{ 136, "ky", "Cayman Islands" },
|
||||
{ 140, "cf", "Central African Republic" },
|
||||
{ 148, "td", "Chad" },
|
||||
{ 152, "cl", "Chile" },
|
||||
{ 156, "cn", "China" },
|
||||
{ 162, "cx", "Christmas Island" },
|
||||
{ 166, "cc", "Cocos Islands" },
|
||||
{ 170, "co", "Colombia" },
|
||||
{ 174, "km", "Comoros" },
|
||||
{ 178, "cg", "Congo" },
|
||||
{ 180, "cd", "Congo" },
|
||||
{ 184, "ck", "Cook Islands" },
|
||||
{ 188, "cr", "Costa Rica" },
|
||||
{ 384, "ci", "Cote d'Ivoire" },
|
||||
{ 191, "hr", "Croatia" },
|
||||
{ 192, "cu", "Cuba" },
|
||||
{ 196, "cy", "Cyprus" },
|
||||
{ 203, "cz", "Czech Republic" },
|
||||
{ 208, "dk", "Denmark" },
|
||||
{ 262, "dj", "Djibouti" },
|
||||
{ 212, "dm", "Dominica" },
|
||||
{ 214, "do", "Dominican Republic" },
|
||||
{ 218, "ec", "Ecuador" },
|
||||
{ 818, "eg", "Egypt" },
|
||||
{ 222, "sv", "El Salvador" },
|
||||
{ 226, "gq", "Equatorial Guinea" },
|
||||
{ 232, "er", "Eritrea" },
|
||||
{ 233, "ee", "Estonia" },
|
||||
{ 231, "et", "Ethiopia" },
|
||||
{ 238, "fk", "Falkland Islands" },
|
||||
{ 234, "fo", "Faroe Islands" },
|
||||
{ 242, "fj", "Fiji" },
|
||||
{ 246, "fi", "Finland" },
|
||||
{ 250, "fr", "France" },
|
||||
{ 249, "fx", "France, Metropolitan" },
|
||||
{ 254, "gf", "French Guiana" },
|
||||
{ 258, "pf", "French Polynesia" },
|
||||
{ 260, "tf", "French Southern Territories" },
|
||||
{ 266, "ga", "Gabon" },
|
||||
{ 270, "gm", "Gambia" },
|
||||
{ 268, "ge", "Georgia" },
|
||||
{ 276, "de", "Germany" },
|
||||
{ 288, "gh", "Ghana" },
|
||||
{ 292, "gi", "Gibraltar" },
|
||||
{ 300, "gr", "Greece" },
|
||||
{ 304, "gl", "Greenland" },
|
||||
{ 308, "gd", "Grenada" },
|
||||
{ 312, "gp", "Guadeloupe" },
|
||||
{ 316, "gu", "Guam" },
|
||||
{ 320, "gt", "Guatemala" },
|
||||
{ 324, "gn", "Guinea" },
|
||||
{ 624, "gw", "Guinea-Bissau" },
|
||||
{ 328, "gy", "Guyana" },
|
||||
{ 332, "ht", "Haiti" },
|
||||
{ 334, "hm", "Heard & Mc Donald Islands" },
|
||||
{ 336, "va", "Vatican City" },
|
||||
{ 340, "hn", "Honduras" },
|
||||
{ 344, "hk", "Hong kong" },
|
||||
{ 348, "hu", "Hungary" },
|
||||
{ 352, "is", "Iceland" },
|
||||
{ 356, "in", "India" },
|
||||
{ 360, "id", "Indonesia" },
|
||||
{ 364, "ir", "Iran" },
|
||||
{ 368, "iq", "Iraq" },
|
||||
{ 372, "ie", "Ireland" },
|
||||
{ 376, "il", "Israel" },
|
||||
{ 380, "it", "Italy" },
|
||||
{ 388, "jm", "Jamaica" },
|
||||
{ 392, "jp", "Japan" },
|
||||
{ 400, "jo", "Jordan" },
|
||||
{ 398, "kz", "Kazakhstan" },
|
||||
{ 404, "ke", "Kenya" },
|
||||
{ 296, "ki", "Kiribati" },
|
||||
{ 408, "kp", "Korea (north)" },
|
||||
{ 410, "kr", "Korea (south)" },
|
||||
{ 414, "kw", "Kuwait" },
|
||||
{ 417, "kg", "Kyrgyzstan" },
|
||||
{ 418, "la", "Laos" },
|
||||
{ 428, "lv", "Latvia" },
|
||||
{ 422, "lb", "Lebanon" },
|
||||
{ 426, "ls", "Lesotho" },
|
||||
{ 430, "lr", "Liberia" },
|
||||
{ 434, "ly", "Libya" },
|
||||
{ 438, "li", "Liechtenstein" },
|
||||
{ 440, "lt", "Lithuania" },
|
||||
{ 442, "lu", "Luxembourg" },
|
||||
{ 446, "mo", "Macao" },
|
||||
{ 807, "mk", "Macedonia" },
|
||||
{ 450, "mg", "Madagascar" },
|
||||
{ 454, "mw", "Malawi" },
|
||||
{ 458, "my", "Malaysia" },
|
||||
{ 462, "mv", "Maldives" },
|
||||
{ 466, "ml", "Mali" },
|
||||
{ 470, "mt", "Malta" },
|
||||
{ 584, "mh", "Marshall Islands" },
|
||||
{ 474, "mq", "Martinique" },
|
||||
{ 478, "mr", "Mauritania" },
|
||||
{ 480, "mu", "Mauritius" },
|
||||
{ 175, "yt", "Mayotte" },
|
||||
{ 484, "mx", "Mexico" },
|
||||
{ 583, "fm", "Micronesia" },
|
||||
{ 498, "md", "Moldova" },
|
||||
{ 492, "mc", "Monaco" },
|
||||
{ 496, "mn", "Mongolia" },
|
||||
{ 500, "ms", "Montserrat" },
|
||||
{ 504, "ma", "Morocco" },
|
||||
{ 508, "mz", "Mozambique" },
|
||||
{ 104, "mm", "Myanmar" },
|
||||
{ 516, "na", "Namibia" },
|
||||
{ 520, "nr", "Nauru" },
|
||||
{ 524, "np", "Nepal" },
|
||||
{ 528, "nl", "Netherlands" },
|
||||
{ 530, "an", "Netherlands Antilles" },
|
||||
{ 540, "nc", "New Caledonia" },
|
||||
{ 554, "nz", "New Zealand" },
|
||||
{ 558, "ni", "Nicaragua" },
|
||||
{ 562, "ne", "Niger" },
|
||||
{ 566, "ng", "Nigeria" },
|
||||
{ 570, "nu", "Niue" },
|
||||
{ 574, "nf", "Norfolk Island" },
|
||||
{ 580, "mp", "Northern Mariana Islands" },
|
||||
{ 578, "no", "Norway" },
|
||||
{ 512, "om", "Oman" },
|
||||
{ 586, "pk", "Pakistan" },
|
||||
{ 585, "pw", "Palau" },
|
||||
{ 275, "ps", "Palestinian Territory" },
|
||||
{ 591, "pa", "Panama" },
|
||||
{ 598, "pg", "Papua New Guinea" },
|
||||
{ 600, "py", "Paraguay" },
|
||||
{ 604, "pe", "Peru" },
|
||||
{ 608, "ph", "Philippines" },
|
||||
{ 612, "pn", "Pitcairn" },
|
||||
{ 616, "pl", "Poland" },
|
||||
{ 620, "pt", "Portugal" },
|
||||
{ 630, "pr", "Puerto Rico" },
|
||||
{ 634, "qa", "Qatar" },
|
||||
{ 638, "re", "Reunion" },
|
||||
{ 642, "ro", "Romania" },
|
||||
{ 643, "ru", "Russia" },
|
||||
{ 646, "rw", "Rwanda" },
|
||||
{ 659, "kn", "Saint Kitts & Nevis" },
|
||||
{ 662, "lc", "Saint Lucia" },
|
||||
{ 670, "vc", "Saint Vincent" },
|
||||
{ 882, "ws", "Samoa" },
|
||||
{ 674, "sm", "San Marino" },
|
||||
{ 678, "st", "Sao Tome & Principe" },
|
||||
{ 682, "sa", "Saudi Arabia" },
|
||||
{ 686, "sn", "Senegal" },
|
||||
{ 891, "cs", "Serbia and Montenegro" },
|
||||
{ 690, "sc", "Seychelles" },
|
||||
{ 694, "sl", "Sierra Leone" },
|
||||
{ 702, "sg", "Singapore" },
|
||||
{ 703, "sk", "Slovakia" },
|
||||
{ 705, "si", "Slovenia" },
|
||||
{ 90, "sb", "Solomon Islands" },
|
||||
{ 706, "so", "Somalia" },
|
||||
{ 710, "za", "South Africa" },
|
||||
{ 239, "gs", "South Georgia" },
|
||||
{ 724, "es", "Spain" },
|
||||
{ 144, "lk", "Sri Lanka" },
|
||||
{ 654, "sh", "St. Helena" },
|
||||
{ 666, "pm", "St. Pierre & Miquelon" },
|
||||
{ 736, "sd", "Sudan" },
|
||||
{ 740, "sr", "Suriname" },
|
||||
{ 744, "sj", "Svalbard & Jan Mayen Islands" },
|
||||
{ 748, "sz", "Swaziland" },
|
||||
{ 752, "se", "Sweden" },
|
||||
{ 756, "ch", "Switzerland" },
|
||||
{ 760, "sy", "Syrian Arab Republic" },
|
||||
{ 626, "tl", "Timor-Leste" },
|
||||
{ 158, "tw", "Taiwan" },
|
||||
{ 762, "tj", "Tajikistan" },
|
||||
{ 834, "tz", "Tanzania" },
|
||||
{ 764, "th", "Thailand" },
|
||||
{ 768, "tg", "Togo" },
|
||||
{ 772, "tk", "Tokelau" },
|
||||
{ 776, "to", "Tonga" },
|
||||
{ 780, "tt", "Trinidad & Tobago" },
|
||||
{ 788, "tn", "Tunisia" },
|
||||
{ 792, "tr", "Turkey" },
|
||||
{ 795, "tm", "Turkmenistan" },
|
||||
{ 796, "tc", "Turks & Caicos Islands" },
|
||||
{ 798, "tv", "Tuvalu" },
|
||||
{ 800, "ug", "Uganda" },
|
||||
{ 804, "ua", "Ukraine" },
|
||||
{ 784, "ae", "United Arab Emirates" },
|
||||
{ 826, "gb", "United Kingdom" },
|
||||
{ 840, "us", "United States" },
|
||||
{ 581, "um", "United States Minor Outlying Islands" },
|
||||
{ 858, "uy", "Uruguay" },
|
||||
{ 860, "uz", "Uzbekistan" },
|
||||
{ 548, "vu", "Vanuatu" },
|
||||
{ 862, "ve", "Venezuela" },
|
||||
{ 704, "vn", "Vietnam" },
|
||||
{ 92, "vg", "Virgin Islands (British)" },
|
||||
{ 850, "vi", "Virgin Islands (US)" },
|
||||
{ 876, "wf", "Wallis & Futuna Islands" },
|
||||
{ 732, "eh", "Western Sahara" },
|
||||
{ 887, "ye", "Yemen" },
|
||||
{ 894, "zm", "Zambia" },
|
||||
{ 716, "zw", "Zimbabwe" }
|
||||
};
|
||||
|
||||
/*
|
||||
* Check if start of 'str' is simply an IPv4 address.
|
||||
*/
|
||||
#define BYTE_OK(x) ((x) >= 0 && (x) <= 255)
|
||||
|
||||
static int is_addr(char *str, char **end)
|
||||
{
|
||||
int a0, a1, a2, a3, num, rc = 0, length = 0;
|
||||
|
||||
if ((num = sscanf(str,"%3d.%3d.%3d.%3d%n",&a0,&a1,&a2,&a3,&length)) == 4 &&
|
||||
BYTE_OK(a0) && BYTE_OK(a1) && BYTE_OK(a2) && BYTE_OK(a3) &&
|
||||
length >= (3+4))
|
||||
{
|
||||
rc = 1;
|
||||
*end = str + length;
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
/*
|
||||
* Find the country-code and name from the CNAME. E.g.:
|
||||
* version 1: CNAME = zzno.countries.nerd.dk with address 127.0.2.66
|
||||
* yields ccode_A" = "no" and cnumber 578 (2.66).
|
||||
* version 2: CNAME = <a.b.c.d>.zz.countries.nerd.dk with address 127.0.2.66
|
||||
* yields cnumber 578 (2.66). ccode_A is "";
|
||||
*/
|
||||
static void find_country_from_cname(const char *cname, struct in_addr addr)
|
||||
{
|
||||
const struct search_list *country;
|
||||
char ccode_A2[3], *ccopy, *dot_4;
|
||||
int cnumber, z0, z1, ver_1, ver_2;
|
||||
u_long ip;
|
||||
|
||||
ip = ntohl(addr.s_addr);
|
||||
z0 = tolower(cname[0]);
|
||||
z1 = tolower(cname[1]);
|
||||
ccopy = strdup(cname);
|
||||
|
||||
ver_1 = (z0 == 'z' && z1 == 'z' && !strcasecmp(cname+4,nerd_ver1));
|
||||
ver_2 = (is_addr(ccopy,&dot_4) && !strcasecmp(dot_4,nerd_ver2));
|
||||
|
||||
if (ver_1)
|
||||
{
|
||||
const char *dot = strchr(cname, '.');
|
||||
if ((z0 != 'z' && z1 != 'z') || dot != cname+4)
|
||||
{
|
||||
printf("Unexpected CNAME %s (ver_1)\n", cname);
|
||||
return;
|
||||
}
|
||||
}
|
||||
else if (ver_2)
|
||||
{
|
||||
z0 = tolower(dot_4[1]);
|
||||
z1 = tolower(dot_4[2]);
|
||||
if (z0 != 'z' && z1 != 'z')
|
||||
{
|
||||
printf("Unexpected CNAME %s (ver_2)\n", cname);
|
||||
return;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("Unexpected CNAME %s (ver?)\n", cname);
|
||||
return;
|
||||
}
|
||||
|
||||
if (ver_1)
|
||||
{
|
||||
ccode_A2[0] = tolower(cname[2]);
|
||||
ccode_A2[1] = tolower(cname[3]);
|
||||
ccode_A2[2] = '\0';
|
||||
}
|
||||
else
|
||||
ccode_A2[0] = '\0';
|
||||
|
||||
cnumber = ip & 0xFFFF;
|
||||
|
||||
TRACE(("Found country-code `%s', number %d\n",
|
||||
ver_1 ? ccode_A2 : "<n/a>", cnumber));
|
||||
|
||||
country = list_lookup(cnumber, country_list,
|
||||
sizeof(country_list) / sizeof(country_list[0]));
|
||||
if (!country)
|
||||
printf("Name for country-number %d not found.\n", cnumber);
|
||||
else
|
||||
{
|
||||
if (ver_1 && *(unsigned short*)&country->short_name != *(unsigned*)&ccode_A2)
|
||||
printf("short-name mismatch; %s vs %s\n", country->short_name, ccode_A2);
|
||||
|
||||
printf("%s (%s), number %d.\n",
|
||||
country->long_name, country->short_name, cnumber);
|
||||
}
|
||||
free(ccopy);
|
||||
}
|
||||
|
@@ -40,13 +40,6 @@
|
||||
#include "inet_net_pton.h"
|
||||
#include "ares_getopt.h"
|
||||
|
||||
#ifndef HAVE_STRUCT_IN6_ADDR
|
||||
struct in6_addr
|
||||
{
|
||||
unsigned char s6_addr[16];
|
||||
};
|
||||
#endif
|
||||
|
||||
static void callback(void *arg, int status, int timeouts, struct hostent *host);
|
||||
static void usage(void);
|
||||
|
||||
|
48
ares/ares.h
48
ares/ares.h
@@ -18,6 +18,14 @@
|
||||
#ifndef ARES__H
|
||||
#define ARES__H
|
||||
|
||||
/*
|
||||
* Define WIN32 when build target is Win32 API
|
||||
*/
|
||||
|
||||
#if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32)
|
||||
#define WIN32
|
||||
#endif
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
#if defined(_AIX) || (defined(NETWARE) && defined(__NOVELL_LIBC__))
|
||||
@@ -35,8 +43,12 @@
|
||||
#include <sys/socket.h>
|
||||
#include <tcp.h>
|
||||
#elif defined(WIN32)
|
||||
#include <winsock2.h>
|
||||
#include <windows.h>
|
||||
# ifndef WIN32_LEAN_AND_MEAN
|
||||
# define WIN32_LEAN_AND_MEAN
|
||||
# endif
|
||||
# include <windows.h>
|
||||
# include <winsock2.h>
|
||||
# include <ws2tcpip.h>
|
||||
#else
|
||||
#include <netinet/in.h>
|
||||
#include <sys/socket.h>
|
||||
@@ -232,10 +244,38 @@ int ares_expand_name(const unsigned char *encoded, const unsigned char *abuf,
|
||||
int alen, char **s, long *enclen);
|
||||
int ares_expand_string(const unsigned char *encoded, const unsigned char *abuf,
|
||||
int alen, unsigned char **s, long *enclen);
|
||||
|
||||
#if !defined(HAVE_STRUCT_IN6_ADDR) && !defined(s6_addr)
|
||||
struct in6_addr {
|
||||
union {
|
||||
unsigned char _S6_u8[16];
|
||||
} _S6_un;
|
||||
};
|
||||
#define s6_addr _S6_un._S6_u8
|
||||
#endif
|
||||
|
||||
struct addrttl {
|
||||
struct in_addr ipaddr;
|
||||
int ttl;
|
||||
};
|
||||
struct addr6ttl {
|
||||
struct in6_addr ip6addr;
|
||||
int ttl;
|
||||
};
|
||||
|
||||
/*
|
||||
** Parse the buffer, starting at *abuf and of length alen bytes, previously
|
||||
** obtained from an ares_search call. Put the results in *host, if nonnull.
|
||||
** Also, if addrttls is nonnull, put up to *naddrttls IPv4 addresses along with
|
||||
** their TTLs in that array, and set *naddrttls to the number of addresses
|
||||
** so written.
|
||||
*/
|
||||
int ares_parse_a_reply(const unsigned char *abuf, int alen,
|
||||
struct hostent **host);
|
||||
struct hostent **host,
|
||||
struct addrttl *addrttls, int *naddrttls);
|
||||
int ares_parse_aaaa_reply(const unsigned char *abuf, int alen,
|
||||
struct hostent **host);
|
||||
struct hostent **host,
|
||||
struct addr6ttl *addrttls, int *naddrttls);
|
||||
int ares_parse_ptr_reply(const unsigned char *abuf, int alen, const void *addr,
|
||||
int addrlen, int family, struct hostent **host);
|
||||
int ares_parse_ns_reply(const unsigned char *abuf, int alen,
|
||||
|
@@ -58,6 +58,7 @@ static void addr_callback(void *arg, int status, int timeouts,
|
||||
static void end_aquery(struct addr_query *aquery, int status,
|
||||
struct hostent *host);
|
||||
static int file_lookup(union ares_addr *addr, int family, struct hostent **host);
|
||||
static void ptr_rr_name(char *name, int family, union ares_addr *addr);
|
||||
|
||||
void ares_gethostbyaddr(ares_channel channel, const void *addr, int addrlen,
|
||||
int family, ares_host_callback callback, void *arg)
|
||||
@@ -101,48 +102,26 @@ static void next_lookup(struct addr_query *aquery)
|
||||
{
|
||||
const char *p;
|
||||
char name[128];
|
||||
int a1, a2, a3, a4, status;
|
||||
int status;
|
||||
struct hostent *host;
|
||||
unsigned long addr;
|
||||
|
||||
for (p = aquery->remaining_lookups; *p; p++)
|
||||
{
|
||||
switch (*p)
|
||||
{
|
||||
case 'b':
|
||||
if (aquery->family == AF_INET)
|
||||
{
|
||||
addr = ntohl(aquery->addr.addr4.s_addr);
|
||||
a1 = (int)((addr >> 24) & 0xff);
|
||||
a2 = (int)((addr >> 16) & 0xff);
|
||||
a3 = (int)((addr >> 8) & 0xff);
|
||||
a4 = (int)(addr & 0xff);
|
||||
sprintf(name, "%d.%d.%d.%d.in-addr.arpa", a4, a3, a2, a1);
|
||||
aquery->remaining_lookups = p + 1;
|
||||
ares_query(aquery->channel, name, C_IN, T_PTR, addr_callback,
|
||||
aquery);
|
||||
}
|
||||
else
|
||||
{
|
||||
unsigned char *bytes;
|
||||
bytes = (unsigned char *)&aquery->addr.addr6.s6_addr;
|
||||
sprintf(name, "%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.ip6.arpa",
|
||||
bytes[15]&0xf, bytes[15] >> 4, bytes[14]&0xf, bytes[14] >> 4,
|
||||
bytes[13]&0xf, bytes[13] >> 4, bytes[12]&0xf, bytes[12] >> 4,
|
||||
bytes[11]&0xf, bytes[11] >> 4, bytes[10]&0xf, bytes[10] >> 4,
|
||||
bytes[9]&0xf, bytes[9] >> 4, bytes[8]&0xf, bytes[8] >> 4,
|
||||
bytes[7]&0xf, bytes[7] >> 4, bytes[6]&0xf, bytes[6] >> 4,
|
||||
bytes[5]&0xf, bytes[5] >> 4, bytes[4]&0xf, bytes[4] >> 4,
|
||||
bytes[3]&0xf, bytes[3] >> 4, bytes[2]&0xf, bytes[2] >> 4,
|
||||
bytes[1]&0xf, bytes[1] >> 4, bytes[0]&0xf, bytes[0] >> 4);
|
||||
aquery->remaining_lookups = p + 1;
|
||||
ares_query(aquery->channel, name, C_IN, T_PTR, addr_callback,
|
||||
aquery);
|
||||
}
|
||||
ptr_rr_name(name, aquery->family, &aquery->addr);
|
||||
aquery->remaining_lookups = p + 1;
|
||||
ares_query(aquery->channel, name, C_IN, T_PTR, addr_callback,
|
||||
aquery);
|
||||
return;
|
||||
case 'f':
|
||||
status = file_lookup(&aquery->addr, aquery->family, &host);
|
||||
if (status != ARES_ENOTFOUND)
|
||||
|
||||
/* this status check below previously checked for !ARES_ENOTFOUND,
|
||||
but we should not assume that this single error code is the one
|
||||
that can occur, as that is in fact no longer the case */
|
||||
if (status == ARES_SUCCESS)
|
||||
{
|
||||
end_aquery(aquery, status, host);
|
||||
return;
|
||||
@@ -264,3 +243,31 @@ static int file_lookup(union ares_addr *addr, int family, struct hostent **host)
|
||||
*host = NULL;
|
||||
return status;
|
||||
}
|
||||
|
||||
static void ptr_rr_name(char *name, int family, union ares_addr *addr)
|
||||
{
|
||||
if (family == AF_INET)
|
||||
{
|
||||
unsigned long laddr = ntohl(addr->addr4.s_addr);
|
||||
int a1 = (int)((laddr >> 24) & 0xff);
|
||||
int a2 = (int)((laddr >> 16) & 0xff);
|
||||
int a3 = (int)((laddr >> 8) & 0xff);
|
||||
int a4 = (int)(laddr & 0xff);
|
||||
sprintf(name, "%d.%d.%d.%d.in-addr.arpa", a4, a3, a2, a1);
|
||||
}
|
||||
else
|
||||
{
|
||||
unsigned char *bytes = (unsigned char *)&addr->addr6.s6_addr;
|
||||
sprintf(name,
|
||||
"%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x."
|
||||
"%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.ip6.arpa",
|
||||
bytes[15]&0xf, bytes[15] >> 4, bytes[14]&0xf, bytes[14] >> 4,
|
||||
bytes[13]&0xf, bytes[13] >> 4, bytes[12]&0xf, bytes[12] >> 4,
|
||||
bytes[11]&0xf, bytes[11] >> 4, bytes[10]&0xf, bytes[10] >> 4,
|
||||
bytes[9]&0xf, bytes[9] >> 4, bytes[8]&0xf, bytes[8] >> 4,
|
||||
bytes[7]&0xf, bytes[7] >> 4, bytes[6]&0xf, bytes[6] >> 4,
|
||||
bytes[5]&0xf, bytes[5] >> 4, bytes[4]&0xf, bytes[4] >> 4,
|
||||
bytes[3]&0xf, bytes[3] >> 4, bytes[2]&0xf, bytes[2] >> 4,
|
||||
bytes[1]&0xf, bytes[1] >> 4, bytes[0]&0xf, bytes[0] >> 4);
|
||||
}
|
||||
}
|
||||
|
@@ -57,7 +57,7 @@ struct host_query {
|
||||
int timeouts;
|
||||
};
|
||||
|
||||
static void next_lookup(struct host_query *hquery, int status);
|
||||
static void next_lookup(struct host_query *hquery, int status_code);
|
||||
static void host_callback(void *arg, int status, int timeouts,
|
||||
unsigned char *abuf, int alen);
|
||||
static void end_hquery(struct host_query *hquery, int status,
|
||||
@@ -111,13 +111,14 @@ void ares_gethostbyname(ares_channel channel, const char *name, int family,
|
||||
hquery->timeouts = 0;
|
||||
|
||||
/* Start performing lookups according to channel->lookups. */
|
||||
next_lookup(hquery, ARES_SUCCESS);
|
||||
next_lookup(hquery, ARES_ECONNREFUSED /* initial error code */);
|
||||
}
|
||||
|
||||
static void next_lookup(struct host_query *hquery, int status)
|
||||
static void next_lookup(struct host_query *hquery, int status_code)
|
||||
{
|
||||
const char *p;
|
||||
struct hostent *host;
|
||||
int status = status_code;
|
||||
|
||||
for (p = hquery->remaining_lookups; *p; p++)
|
||||
{
|
||||
@@ -137,11 +138,16 @@ static void next_lookup(struct host_query *hquery, int status)
|
||||
case 'f':
|
||||
/* Host file lookup */
|
||||
status = file_lookup(hquery->name, hquery->family, &host);
|
||||
if (status != ARES_ENOTFOUND)
|
||||
|
||||
/* this status check below previously checked for !ARES_ENOTFOUND,
|
||||
but we should not assume that this single error code is the one
|
||||
that can occur, as that is in fact no longer the case */
|
||||
if (status == ARES_SUCCESS)
|
||||
{
|
||||
end_hquery(hquery, status, host);
|
||||
return;
|
||||
}
|
||||
status = status_code; /* Use original status code */
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -160,13 +166,13 @@ static void host_callback(void *arg, int status, int timeouts,
|
||||
{
|
||||
if (hquery->family == AF_INET)
|
||||
{
|
||||
status = ares_parse_a_reply(abuf, alen, &host);
|
||||
status = ares_parse_a_reply(abuf, alen, &host, NULL, NULL);
|
||||
if (host && channel->nsort)
|
||||
sort_addresses(host, channel->sortlist, channel->nsort);
|
||||
}
|
||||
else if (hquery->family == AF_INET6)
|
||||
{
|
||||
status = ares_parse_aaaa_reply(abuf, alen, &host);
|
||||
status = ares_parse_aaaa_reply(abuf, alen, &host, NULL, NULL);
|
||||
if (host && channel->nsort)
|
||||
sort6_addresses(host, channel->sortlist, channel->nsort);
|
||||
}
|
||||
|
@@ -1,6 +1,7 @@
|
||||
/* $Id$ */
|
||||
|
||||
/*
|
||||
/* Copyright (C) 2005 by Dominick Meglio
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this
|
||||
* software and its documentation for any purpose and without
|
||||
* fee is hereby granted, provided that the above copyright
|
||||
@@ -21,11 +22,13 @@
|
||||
#define PF_INET6 AF_INET6
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_STRUCT_IN6_ADDR
|
||||
struct in6_addr
|
||||
{
|
||||
unsigned char s6_addr[16];
|
||||
#if !defined(HAVE_STRUCT_IN6_ADDR) && !defined(s6_addr)
|
||||
struct in6_addr {
|
||||
union {
|
||||
unsigned char _S6_u8[16];
|
||||
} _S6_un;
|
||||
};
|
||||
#define s6_addr _S6_un._S6_u8
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_STRUCT_SOCKADDR_IN6
|
||||
|
@@ -22,24 +22,39 @@ ares_parse_a_reply \- Parse a reply to a DNS query of type A into a hostent
|
||||
.B #include <ares.h>
|
||||
.PP
|
||||
.B int ares_parse_a_reply(const unsigned char *\fIabuf\fP, int \fIalen\fP,
|
||||
.B struct hostent **\fIhost\fP);
|
||||
.B struct hostent **\fIhost\fP,
|
||||
.B struct addrttl *\fIaddrttls\fB, int *\fInaddrttls\fB);
|
||||
.fi
|
||||
.SH DESCRIPTION
|
||||
The
|
||||
.B ares_parse_a_reply
|
||||
function parses the response to a query of type A into a
|
||||
.BR "struct hostent" .
|
||||
.BR "struct hostent"
|
||||
and/or an array of
|
||||
.BR "struct addrttls" .
|
||||
The parameters
|
||||
.I abuf
|
||||
and
|
||||
.I alen
|
||||
give the contents of the response. The result is stored in allocated
|
||||
memory and a pointer to it stored into the variable pointed to by
|
||||
.IR host .
|
||||
.IR host ,
|
||||
if host is nonnull.
|
||||
It is the caller's responsibility to free the resulting host structure
|
||||
using
|
||||
.BR ares_free_hostent (3)
|
||||
when it is no longer needed.
|
||||
.PP
|
||||
If
|
||||
.IR addrttls
|
||||
and
|
||||
.IR naddrttls
|
||||
are both nonnull,
|
||||
then up to *naddrttls
|
||||
.BR "struct addrttl"
|
||||
records are stored in the array pointed to by addrttls,
|
||||
and then *naddrttls is set to the number of records so stored.
|
||||
Note that the memory for these records is supplied by the caller.
|
||||
.SH RETURN VALUES
|
||||
.B ares_parse_a_reply
|
||||
can return any of the following values:
|
||||
|
@@ -32,24 +32,32 @@
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <limits.h>
|
||||
#include "ares.h"
|
||||
#include "ares_dns.h"
|
||||
#include "ares_private.h"
|
||||
|
||||
int ares_parse_a_reply(const unsigned char *abuf, int alen,
|
||||
struct hostent **host)
|
||||
struct hostent **host,
|
||||
struct addrttl *addrttls, int *naddrttls)
|
||||
{
|
||||
unsigned int qdcount, ancount;
|
||||
int status, i, rr_type, rr_class, rr_len, naddrs;
|
||||
int status, i, rr_type, rr_class, rr_len, rr_ttl, naddrs;
|
||||
int cname_ttl = INT_MAX; /* the TTL imposed by the CNAME chain */
|
||||
int naliases;
|
||||
long len;
|
||||
const unsigned char *aptr;
|
||||
char *hostname, *rr_name, *rr_data, **aliases;
|
||||
struct in_addr *addrs;
|
||||
struct hostent *hostent;
|
||||
const int max_addr_ttls = (addrttls && naddrttls) ? *naddrttls : 0;
|
||||
|
||||
/* Set *host to NULL for all failure cases. */
|
||||
*host = NULL;
|
||||
if (host)
|
||||
*host = NULL;
|
||||
/* Same with *naddrttls. */
|
||||
if (naddrttls)
|
||||
*naddrttls = 0;
|
||||
|
||||
/* Give up if abuf doesn't have room for a header. */
|
||||
if (alen < HFIXEDSZ)
|
||||
@@ -73,20 +81,29 @@ int ares_parse_a_reply(const unsigned char *abuf, int alen,
|
||||
}
|
||||
aptr += len + QFIXEDSZ;
|
||||
|
||||
/* Allocate addresses and aliases; ancount gives an upper bound for both. */
|
||||
addrs = malloc(ancount * sizeof(struct in_addr));
|
||||
if (!addrs)
|
||||
if (host)
|
||||
{
|
||||
free(hostname);
|
||||
return ARES_ENOMEM;
|
||||
/* Allocate addresses and aliases; ancount gives an upper bound for both. */
|
||||
addrs = malloc(ancount * sizeof(struct in_addr));
|
||||
if (!addrs)
|
||||
{
|
||||
free(hostname);
|
||||
return ARES_ENOMEM;
|
||||
}
|
||||
aliases = malloc((ancount + 1) * sizeof(char *));
|
||||
if (!aliases)
|
||||
{
|
||||
free(hostname);
|
||||
free(addrs);
|
||||
return ARES_ENOMEM;
|
||||
}
|
||||
}
|
||||
aliases = malloc((ancount + 1) * sizeof(char *));
|
||||
if (!aliases)
|
||||
else
|
||||
{
|
||||
free(hostname);
|
||||
free(addrs);
|
||||
return ARES_ENOMEM;
|
||||
addrs = NULL;
|
||||
aliases = NULL;
|
||||
}
|
||||
|
||||
naddrs = 0;
|
||||
naliases = 0;
|
||||
|
||||
@@ -106,13 +123,33 @@ int ares_parse_a_reply(const unsigned char *abuf, int alen,
|
||||
rr_type = DNS_RR_TYPE(aptr);
|
||||
rr_class = DNS_RR_CLASS(aptr);
|
||||
rr_len = DNS_RR_LEN(aptr);
|
||||
rr_ttl = DNS_RR_TTL(aptr);
|
||||
aptr += RRFIXEDSZ;
|
||||
|
||||
if (rr_class == C_IN && rr_type == T_A
|
||||
&& rr_len == sizeof(struct in_addr)
|
||||
&& strcasecmp(rr_name, hostname) == 0)
|
||||
{
|
||||
memcpy(&addrs[naddrs], aptr, sizeof(struct in_addr));
|
||||
if (addrs)
|
||||
{
|
||||
if (aptr + sizeof(struct in_addr) > abuf + alen)
|
||||
{
|
||||
status = ARES_EBADRESP;
|
||||
break;
|
||||
}
|
||||
memcpy(&addrs[naddrs], aptr, sizeof(struct in_addr));
|
||||
}
|
||||
if (naddrs < max_addr_ttls)
|
||||
{
|
||||
struct addrttl * const at = &addrttls[naddrs];
|
||||
if (aptr + sizeof(struct in_addr) > abuf + alen)
|
||||
{
|
||||
status = ARES_EBADRESP;
|
||||
break;
|
||||
}
|
||||
memcpy(&at->ipaddr, aptr, sizeof(struct in_addr));
|
||||
at->ttl = rr_ttl;
|
||||
}
|
||||
naddrs++;
|
||||
status = ARES_SUCCESS;
|
||||
}
|
||||
@@ -120,7 +157,10 @@ int ares_parse_a_reply(const unsigned char *abuf, int alen,
|
||||
if (rr_class == C_IN && rr_type == T_CNAME)
|
||||
{
|
||||
/* Record the RR name as an alias. */
|
||||
aliases[naliases] = rr_name;
|
||||
if (aliases)
|
||||
aliases[naliases] = rr_name;
|
||||
else
|
||||
free(rr_name);
|
||||
naliases++;
|
||||
|
||||
/* Decode the RR data and replace the hostname with it. */
|
||||
@@ -129,6 +169,10 @@ int ares_parse_a_reply(const unsigned char *abuf, int alen,
|
||||
break;
|
||||
free(hostname);
|
||||
hostname = rr_data;
|
||||
|
||||
/* Take the min of the TTLs we see in the CNAME chain. */
|
||||
if (cname_ttl > rr_ttl)
|
||||
cname_ttl = rr_ttl;
|
||||
}
|
||||
else
|
||||
free(rr_name);
|
||||
@@ -145,32 +189,51 @@ int ares_parse_a_reply(const unsigned char *abuf, int alen,
|
||||
status = ARES_ENODATA;
|
||||
if (status == ARES_SUCCESS)
|
||||
{
|
||||
/* We got our answer. Allocate memory to build the host entry. */
|
||||
aliases[naliases] = NULL;
|
||||
hostent = malloc(sizeof(struct hostent));
|
||||
if (hostent)
|
||||
/* We got our answer. */
|
||||
if (naddrttls)
|
||||
{
|
||||
hostent->h_addr_list = malloc((naddrs + 1) * sizeof(char *));
|
||||
if (hostent->h_addr_list)
|
||||
const int n = naddrs < max_addr_ttls ? naddrs : max_addr_ttls;
|
||||
for (i = 0; i < n; i++)
|
||||
{
|
||||
/* Fill in the hostent and return successfully. */
|
||||
hostent->h_name = hostname;
|
||||
hostent->h_aliases = aliases;
|
||||
hostent->h_addrtype = AF_INET;
|
||||
hostent->h_length = sizeof(struct in_addr);
|
||||
for (i = 0; i < naddrs; i++)
|
||||
hostent->h_addr_list[i] = (char *) &addrs[i];
|
||||
hostent->h_addr_list[naddrs] = NULL;
|
||||
*host = hostent;
|
||||
return ARES_SUCCESS;
|
||||
/* Ensure that each A TTL is no larger than the CNAME TTL. */
|
||||
if (addrttls[i].ttl > cname_ttl)
|
||||
addrttls[i].ttl = cname_ttl;
|
||||
}
|
||||
free(hostent);
|
||||
*naddrttls = n;
|
||||
}
|
||||
status = ARES_ENOMEM;
|
||||
if (aliases)
|
||||
aliases[naliases] = NULL;
|
||||
if (host)
|
||||
{
|
||||
/* Allocate memory to build the host entry. */
|
||||
hostent = malloc(sizeof(struct hostent));
|
||||
if (hostent)
|
||||
{
|
||||
hostent->h_addr_list = malloc((naddrs + 1) * sizeof(char *));
|
||||
if (hostent->h_addr_list)
|
||||
{
|
||||
/* Fill in the hostent and return successfully. */
|
||||
hostent->h_name = hostname;
|
||||
hostent->h_aliases = aliases;
|
||||
hostent->h_addrtype = AF_INET;
|
||||
hostent->h_length = sizeof(struct in_addr);
|
||||
for (i = 0; i < naddrs; i++)
|
||||
hostent->h_addr_list[i] = (char *) &addrs[i];
|
||||
hostent->h_addr_list[naddrs] = NULL;
|
||||
*host = hostent;
|
||||
return ARES_SUCCESS;
|
||||
}
|
||||
free(hostent);
|
||||
}
|
||||
status = ARES_ENOMEM;
|
||||
}
|
||||
}
|
||||
if (aliases)
|
||||
{
|
||||
for (i = 0; i < naliases; i++)
|
||||
free(aliases[i]);
|
||||
free(aliases);
|
||||
}
|
||||
for (i = 0; i < naliases; i++)
|
||||
free(aliases[i]);
|
||||
free(aliases);
|
||||
free(addrs);
|
||||
free(hostname);
|
||||
return status;
|
||||
|
@@ -22,24 +22,39 @@ ares_parse_aaaa_reply \- Parse a reply to a DNS query of type AAAA into a hosten
|
||||
.B #include <ares.h>
|
||||
.PP
|
||||
.B int ares_parse_aaaa_reply(const unsigned char *\fIabuf\fP, int \fIalen\fP,
|
||||
.B struct hostent **\fIhost\fP);
|
||||
.B struct hostent **\fIhost\fP,
|
||||
.B struct addrttl *\fIaddrttls\fB, int *\fInaddrttls\fB);
|
||||
.fi
|
||||
.SH DESCRIPTION
|
||||
The
|
||||
.B ares_parse_aaaa_reply
|
||||
function parses the response to a query of type AAAA into a
|
||||
.BR "struct hostent" .
|
||||
.BR "struct hostent"
|
||||
and/or an array of
|
||||
.BR "struct addrttls" .
|
||||
The parameters
|
||||
.I abuf
|
||||
and
|
||||
.I alen
|
||||
give the contents of the response. The result is stored in allocated
|
||||
memory and a pointer to it stored into the variable pointed to by
|
||||
.IR host .
|
||||
.IR host ,
|
||||
if host is nonnull.
|
||||
It is the caller's responsibility to free the resulting host structure
|
||||
using
|
||||
.BR ares_free_hostent (3)
|
||||
when it is no longer needed.
|
||||
.PP
|
||||
If
|
||||
.IR addrttls
|
||||
and
|
||||
.IR naddrttls
|
||||
are both nonnull,
|
||||
then up to *naddrttls
|
||||
.BR "struct addr6ttl"
|
||||
records are stored in the array pointed to by addrttls,
|
||||
and then *naddrttls is set to the number of records so stored.
|
||||
Note that the memory for these records is supplied by the caller.
|
||||
.SH RETURN VALUES
|
||||
.B ares_parse_aaaa_reply
|
||||
can return any of the following values:
|
||||
|
@@ -34,25 +34,33 @@
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <limits.h>
|
||||
#include "ares.h"
|
||||
#include "ares_dns.h"
|
||||
#include "inet_net_pton.h"
|
||||
#include "ares_private.h"
|
||||
|
||||
int ares_parse_aaaa_reply(const unsigned char *abuf, int alen,
|
||||
struct hostent **host)
|
||||
struct hostent **host, struct addr6ttl *addrttls,
|
||||
int *naddrttls)
|
||||
{
|
||||
unsigned int qdcount, ancount;
|
||||
int status, i, rr_type, rr_class, rr_len, naddrs;
|
||||
int status, i, rr_type, rr_class, rr_len, rr_ttl, naddrs;
|
||||
int cname_ttl = INT_MAX; /* the TTL imposed by the CNAME chain */
|
||||
int naliases;
|
||||
long len;
|
||||
const unsigned char *aptr;
|
||||
char *hostname, *rr_name, *rr_data, **aliases;
|
||||
struct in6_addr *addrs;
|
||||
struct hostent *hostent;
|
||||
const int max_addr_ttls = (addrttls && naddrttls) ? *naddrttls : 0;
|
||||
|
||||
/* Set *host to NULL for all failure cases. */
|
||||
*host = NULL;
|
||||
if (host)
|
||||
*host = NULL;
|
||||
/* Same with *naddrttls. */
|
||||
if (naddrttls)
|
||||
*naddrttls = 0;
|
||||
|
||||
/* Give up if abuf doesn't have room for a header. */
|
||||
if (alen < HFIXEDSZ)
|
||||
@@ -77,18 +85,26 @@ int ares_parse_aaaa_reply(const unsigned char *abuf, int alen,
|
||||
aptr += len + QFIXEDSZ;
|
||||
|
||||
/* Allocate addresses and aliases; ancount gives an upper bound for both. */
|
||||
addrs = malloc(ancount * sizeof(struct in6_addr));
|
||||
if (!addrs)
|
||||
if (host)
|
||||
{
|
||||
free(hostname);
|
||||
return ARES_ENOMEM;
|
||||
addrs = malloc(ancount * sizeof(struct in6_addr));
|
||||
if (!addrs)
|
||||
{
|
||||
free(hostname);
|
||||
return ARES_ENOMEM;
|
||||
}
|
||||
aliases = malloc((ancount + 1) * sizeof(char *));
|
||||
if (!aliases)
|
||||
{
|
||||
free(hostname);
|
||||
free(addrs);
|
||||
return ARES_ENOMEM;
|
||||
}
|
||||
}
|
||||
aliases = malloc((ancount + 1) * sizeof(char *));
|
||||
if (!aliases)
|
||||
else
|
||||
{
|
||||
free(hostname);
|
||||
free(addrs);
|
||||
return ARES_ENOMEM;
|
||||
addrs = NULL;
|
||||
aliases = NULL;
|
||||
}
|
||||
naddrs = 0;
|
||||
naliases = 0;
|
||||
@@ -109,13 +125,33 @@ int ares_parse_aaaa_reply(const unsigned char *abuf, int alen,
|
||||
rr_type = DNS_RR_TYPE(aptr);
|
||||
rr_class = DNS_RR_CLASS(aptr);
|
||||
rr_len = DNS_RR_LEN(aptr);
|
||||
rr_ttl = DNS_RR_TTL(aptr);
|
||||
aptr += RRFIXEDSZ;
|
||||
|
||||
if (rr_class == C_IN && rr_type == T_AAAA
|
||||
&& rr_len == sizeof(struct in6_addr)
|
||||
&& strcasecmp(rr_name, hostname) == 0)
|
||||
{
|
||||
memcpy(&addrs[naddrs], aptr, sizeof(struct in6_addr));
|
||||
if (addrs)
|
||||
{
|
||||
if (aptr + sizeof(struct in6_addr) > abuf + alen)
|
||||
{
|
||||
status = ARES_EBADRESP;
|
||||
break;
|
||||
}
|
||||
memcpy(&addrs[naddrs], aptr, sizeof(struct in6_addr));
|
||||
}
|
||||
if (naddrs < max_addr_ttls)
|
||||
{
|
||||
struct addr6ttl * const at = &addrttls[naddrs];
|
||||
if (aptr + sizeof(struct in6_addr) > abuf + alen)
|
||||
{
|
||||
status = ARES_EBADRESP;
|
||||
break;
|
||||
}
|
||||
memcpy(&at->ip6addr, aptr, sizeof(struct in6_addr));
|
||||
at->ttl = rr_ttl;
|
||||
}
|
||||
naddrs++;
|
||||
status = ARES_SUCCESS;
|
||||
}
|
||||
@@ -123,7 +159,10 @@ int ares_parse_aaaa_reply(const unsigned char *abuf, int alen,
|
||||
if (rr_class == C_IN && rr_type == T_CNAME)
|
||||
{
|
||||
/* Record the RR name as an alias. */
|
||||
aliases[naliases] = rr_name;
|
||||
if (aliases)
|
||||
aliases[naliases] = rr_name;
|
||||
else
|
||||
free(rr_name);
|
||||
naliases++;
|
||||
|
||||
/* Decode the RR data and replace the hostname with it. */
|
||||
@@ -132,6 +171,10 @@ int ares_parse_aaaa_reply(const unsigned char *abuf, int alen,
|
||||
break;
|
||||
free(hostname);
|
||||
hostname = rr_data;
|
||||
|
||||
/* Take the min of the TTLs we see in the CNAME chain. */
|
||||
if (cname_ttl > rr_ttl)
|
||||
cname_ttl = rr_ttl;
|
||||
}
|
||||
else
|
||||
free(rr_name);
|
||||
@@ -148,32 +191,51 @@ int ares_parse_aaaa_reply(const unsigned char *abuf, int alen,
|
||||
status = ARES_ENODATA;
|
||||
if (status == ARES_SUCCESS)
|
||||
{
|
||||
/* We got our answer. Allocate memory to build the host entry. */
|
||||
aliases[naliases] = NULL;
|
||||
hostent = malloc(sizeof(struct hostent));
|
||||
if (hostent)
|
||||
/* We got our answer. */
|
||||
if (naddrttls)
|
||||
{
|
||||
hostent->h_addr_list = malloc((naddrs + 1) * sizeof(char *));
|
||||
if (hostent->h_addr_list)
|
||||
const int n = naddrs < max_addr_ttls ? naddrs : max_addr_ttls;
|
||||
for (i = 0; i < n; i++)
|
||||
{
|
||||
/* Fill in the hostent and return successfully. */
|
||||
hostent->h_name = hostname;
|
||||
hostent->h_aliases = aliases;
|
||||
hostent->h_addrtype = AF_INET6;
|
||||
hostent->h_length = sizeof(struct in6_addr);
|
||||
for (i = 0; i < naddrs; i++)
|
||||
hostent->h_addr_list[i] = (char *) &addrs[i];
|
||||
hostent->h_addr_list[naddrs] = NULL;
|
||||
*host = hostent;
|
||||
return ARES_SUCCESS;
|
||||
/* Ensure that each A TTL is no larger than the CNAME TTL. */
|
||||
if (addrttls[i].ttl > cname_ttl)
|
||||
addrttls[i].ttl = cname_ttl;
|
||||
}
|
||||
free(hostent);
|
||||
*naddrttls = n;
|
||||
}
|
||||
if (aliases)
|
||||
aliases[naliases] = NULL;
|
||||
if (host)
|
||||
{
|
||||
/* Allocate memory to build the host entry. */
|
||||
hostent = malloc(sizeof(struct hostent));
|
||||
if (hostent)
|
||||
{
|
||||
hostent->h_addr_list = malloc((naddrs + 1) * sizeof(char *));
|
||||
if (hostent->h_addr_list)
|
||||
{
|
||||
/* Fill in the hostent and return successfully. */
|
||||
hostent->h_name = hostname;
|
||||
hostent->h_aliases = aliases;
|
||||
hostent->h_addrtype = AF_INET6;
|
||||
hostent->h_length = sizeof(struct in6_addr);
|
||||
for (i = 0; i < naddrs; i++)
|
||||
hostent->h_addr_list[i] = (char *) &addrs[i];
|
||||
hostent->h_addr_list[naddrs] = NULL;
|
||||
*host = hostent;
|
||||
return ARES_SUCCESS;
|
||||
}
|
||||
free(hostent);
|
||||
}
|
||||
status = ARES_ENOMEM;
|
||||
}
|
||||
status = ARES_ENOMEM;
|
||||
}
|
||||
for (i = 0; i < naliases; i++)
|
||||
free(aliases[i]);
|
||||
free(aliases);
|
||||
if (aliases)
|
||||
{
|
||||
for (i = 0; i < naliases; i++)
|
||||
free(aliases[i]);
|
||||
free(aliases);
|
||||
}
|
||||
free(addrs);
|
||||
free(hostname);
|
||||
return status;
|
||||
|
@@ -18,6 +18,14 @@
|
||||
* without express or implied warranty.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Define WIN32 when build target is Win32 API
|
||||
*/
|
||||
|
||||
#if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32)
|
||||
#define WIN32
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
|
@@ -5,11 +5,11 @@
|
||||
|
||||
#define ARES_VERSION_MAJOR 1
|
||||
#define ARES_VERSION_MINOR 5
|
||||
#define ARES_VERSION_PATCH 0
|
||||
#define ARES_VERSION_PATCH 2
|
||||
#define ARES_VERSION ((ARES_VERSION_MAJOR<<16)|\
|
||||
(ARES_VERSION_MINOR<<8)|\
|
||||
(ARES_VERSION_PATCH))
|
||||
#define ARES_VERSION_STR "1.5.0-CVS"
|
||||
#define ARES_VERSION_STR "1.5.2-CVS"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
|
@@ -3,7 +3,8 @@
|
||||
|
||||
/* $Id$ */
|
||||
|
||||
/*
|
||||
/* Copyright (C) 2005 by Dominick Meglio
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this
|
||||
* software and its documentation for any purpose and without
|
||||
* fee is hereby granted, provided that the above copyright
|
||||
|
@@ -159,24 +159,58 @@
|
||||
/* Define this if you have struct timeval */
|
||||
#define HAVE_STRUCT_TIMEVAL 1
|
||||
|
||||
/* ---------------------------------------------------------------- */
|
||||
/* COMPILER SPECIFIC */
|
||||
/* ---------------------------------------------------------------- */
|
||||
|
||||
/* Define to avoid VS2005 complaining about portable C functions */
|
||||
#if defined(_MSC_VER) && (_MSC_VER >= 1400)
|
||||
#define _CRT_SECURE_NO_DEPRECATE 1
|
||||
#define _CRT_NONSTDC_NO_DEPRECATE 1
|
||||
#endif
|
||||
|
||||
/* VS2008 does not support Windows build targets prior to WinXP, */
|
||||
/* so, if no build target has been defined we will target WinXP. */
|
||||
#if defined(_MSC_VER) && (_MSC_VER >= 1500)
|
||||
# ifndef _WIN32_WINNT
|
||||
# define _WIN32_WINNT 0x0501
|
||||
# endif
|
||||
# ifndef WINVER
|
||||
# define WINVER 0x0501
|
||||
# endif
|
||||
# if (_WIN32_WINNT < 0x0501) || (WINVER < 0x0501)
|
||||
# error VS2008 does not support Windows build targets prior to WinXP
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* ---------------------------------------------------------------- */
|
||||
/* IPV6 COMPATIBILITY */
|
||||
/* ---------------------------------------------------------------- */
|
||||
|
||||
/* Define this if you have address family AF_INET6 */
|
||||
#ifdef HAVE_WINSOCK2_H
|
||||
#define HAVE_AF_INET6 1
|
||||
#endif
|
||||
|
||||
/* Define this if you have protocol family PF_INET6 */
|
||||
#ifdef HAVE_WINSOCK2_H
|
||||
#define HAVE_PF_INET6 1
|
||||
#endif
|
||||
|
||||
/* Define this if you have struct in6_addr */
|
||||
#ifdef HAVE_WS2TCPIP_H
|
||||
#define HAVE_STRUCT_IN6_ADDR 1
|
||||
#endif
|
||||
|
||||
/* Define this if you have struct sockaddr_in6 */
|
||||
#ifdef HAVE_WS2TCPIP_H
|
||||
#define HAVE_STRUCT_SOCKADDR_IN6 1
|
||||
#endif
|
||||
|
||||
/* Define this if you have sockaddr_in6 with scopeid */
|
||||
#ifdef HAVE_WS2TCPIP_H
|
||||
#define HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID 1
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* __ARES_CONFIG_WIN32_H */
|
||||
|
@@ -46,6 +46,8 @@ AC_HELP_STRING([--disable-debug],[Disable debug options]),
|
||||
dnl when doing the debug stuff, use static library only
|
||||
AC_DISABLE_SHARED
|
||||
|
||||
debugbuild="yes"
|
||||
|
||||
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])
|
||||
@@ -70,6 +72,7 @@ AC_HELP_STRING([--disable-debug],[Disable debug options]),
|
||||
esac ],
|
||||
AC_MSG_RESULT(no)
|
||||
)
|
||||
AM_CONDITIONAL(DEBUGBUILD, test x$debugbuild = xyes)
|
||||
|
||||
dnl skip libtool C++ and Fortran compiler checks
|
||||
m4_ifdef([AC_PROG_CXX], [m4_undefine([AC_PROG_CXX])])
|
||||
@@ -258,9 +261,6 @@ fi
|
||||
dnl socket lib?
|
||||
AC_CHECK_FUNC(connect, , [ AC_CHECK_LIB(socket, connect) ])
|
||||
|
||||
dnl dl lib?
|
||||
AC_CHECK_FUNC(dlclose, , [ AC_CHECK_LIB(dl, dlopen) ])
|
||||
|
||||
AC_MSG_CHECKING([whether to use libgcc])
|
||||
AC_ARG_ENABLE(libgcc,
|
||||
AC_HELP_STRING([--enable-libgcc],[use libgcc when linking]),
|
||||
@@ -831,8 +831,15 @@ AC_HELP_STRING([--with-random=FILE],
|
||||
[read randomness from FILE (default=/dev/urandom)]),
|
||||
[ RANDOM_FILE="$withval" ],
|
||||
[
|
||||
dnl Check for random device
|
||||
AC_CHECK_FILE("/dev/urandom", [ RANDOM_FILE="/dev/urandom"] )
|
||||
dnl Check for random device. If we're cross compiling, we can't
|
||||
dnl check, and it's better to assume it doesn't exist than it is
|
||||
dnl to fail on AC_CHECK_FILE or later.
|
||||
if test "$cross_compiling" = "no"; then
|
||||
AC_CHECK_FILE("/dev/urandom", [ RANDOM_FILE="/dev/urandom"] )
|
||||
else
|
||||
AC_MSG_WARN([cannot check for /dev/urandom while cross compiling; assuming none])
|
||||
fi
|
||||
|
||||
]
|
||||
)
|
||||
if test -n "$RANDOM_FILE" && test X"$RANDOM_FILE" != Xno ; then
|
||||
|
@@ -3,7 +3,8 @@
|
||||
|
||||
/* $Id$ */
|
||||
|
||||
/*
|
||||
/* Copyright (C) 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
|
||||
|
@@ -3,7 +3,8 @@
|
||||
|
||||
/* $Id$ */
|
||||
|
||||
/*
|
||||
/* Copyright (C) 2005 by Dominick Meglio
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this
|
||||
* software and its documentation for any purpose and without
|
||||
* fee is hereby granted, provided that the above copyright
|
||||
|
@@ -12,7 +12,7 @@ includedir=@includedir@
|
||||
|
||||
Name: c-ares
|
||||
URL: http://daniel.haxx.se/projects/c-ares/
|
||||
Description: asyncronous DNS lookup library
|
||||
Description: asynchronous DNS lookup library
|
||||
Version: @VERSION@
|
||||
Requires:
|
||||
Requires.private:
|
||||
|
@@ -7,9 +7,6 @@
|
||||
port build */
|
||||
|
||||
#ifndef NETWARE
|
||||
#ifndef __CYGWIN__
|
||||
#include <windows.h>
|
||||
#endif
|
||||
#include <process.h> /* for the _getpid() proto */
|
||||
#endif /* !NETWARE */
|
||||
#include <sys/types.h>
|
||||
|
10
ares/setup.h
10
ares/setup.h
@@ -16,13 +16,11 @@
|
||||
* without express or implied warranty.
|
||||
*/
|
||||
|
||||
#if !defined(WIN32) && defined(__WIN32__)
|
||||
/* Borland fix */
|
||||
#define WIN32
|
||||
#endif
|
||||
/*
|
||||
* Define WIN32 when build target is Win32 API
|
||||
*/
|
||||
|
||||
#if !defined(WIN32) && defined(_WIN32)
|
||||
/* VS2005 on x64 fix */
|
||||
#if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32)
|
||||
#define WIN32
|
||||
#endif
|
||||
|
||||
|
@@ -49,8 +49,8 @@ BSC32=bscmake.exe
|
||||
# ADD BASE BSC32 /nologo
|
||||
# ADD BSC32 /nologo
|
||||
LINK32=link.exe
|
||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
|
||||
# ADD LINK32 wsock32.lib areslib.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /libpath:"..\areslib\Release"
|
||||
# ADD BASE LINK32 ws2_32.lib advapi32.lib /nologo /subsystem:console /machine:I386
|
||||
# ADD LINK32 ws2_32.lib advapi32.lib areslib.lib /nologo /subsystem:console /machine:I386 /libpath:"..\areslib\Release"
|
||||
|
||||
!ELSEIF "$(CFG)" == "adig - Win32 Debug"
|
||||
|
||||
@@ -73,8 +73,8 @@ BSC32=bscmake.exe
|
||||
# ADD BASE BSC32 /nologo
|
||||
# ADD BSC32 /nologo
|
||||
LINK32=link.exe
|
||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
|
||||
# ADD LINK32 wsock32.lib areslib.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /libpath:"..\areslib\Debug"
|
||||
# ADD BASE LINK32 ws2_32.lib advapi32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
|
||||
# ADD LINK32 ws2_32.lib advapi32.lib areslib.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /libpath:"..\areslib\Debug"
|
||||
|
||||
!ENDIF
|
||||
|
||||
|
@@ -39,6 +39,7 @@ RSC=rc.exe
|
||||
# PROP Use_Debug_Libraries 0
|
||||
# PROP Output_Dir "Release"
|
||||
# PROP Intermediate_Dir "Release"
|
||||
# PROP Ignore_Export_Lib 0
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
|
||||
# ADD CPP /nologo /MD /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
|
||||
@@ -48,8 +49,8 @@ BSC32=bscmake.exe
|
||||
# ADD BASE BSC32 /nologo
|
||||
# ADD BSC32 /nologo
|
||||
LINK32=link.exe
|
||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
|
||||
# ADD LINK32 wsock32.lib areslib.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /libpath:"..\areslib\Release"
|
||||
# ADD BASE LINK32 ws2_32.lib advapi32.lib /nologo /subsystem:console /machine:I386
|
||||
# ADD LINK32 ws2_32.lib advapi32.lib areslib.lib /nologo /subsystem:console /machine:I386 /libpath:"..\areslib\Release"
|
||||
|
||||
!ELSEIF "$(CFG)" == "ahost - Win32 Debug"
|
||||
|
||||
@@ -62,6 +63,7 @@ LINK32=link.exe
|
||||
# PROP Use_Debug_Libraries 1
|
||||
# PROP Output_Dir "Debug"
|
||||
# PROP Intermediate_Dir "Debug"
|
||||
# PROP Ignore_Export_Lib 0
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
|
||||
# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FR /YX /FD /GZ /c
|
||||
@@ -71,8 +73,8 @@ BSC32=bscmake.exe
|
||||
# ADD BASE BSC32 /nologo
|
||||
# ADD BSC32 /nologo
|
||||
LINK32=link.exe
|
||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
|
||||
# ADD LINK32 wsock32.lib areslib.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /libpath:"..\areslib\Debug"
|
||||
# ADD BASE LINK32 ws2_32.lib advapi32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
|
||||
# ADD LINK32 ws2_32.lib advapi32.lib areslib.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /libpath:"..\areslib\Debug"
|
||||
|
||||
!ENDIF
|
||||
|
||||
|
62
configure.ac
62
configure.ac
@@ -5,7 +5,7 @@
|
||||
# | (__| |_| | _ <| |___
|
||||
# \___|\___/|_| \_\_____|
|
||||
#
|
||||
# Copyright (C) 1998 - 2007, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
# Copyright (C) 1998 - 2008, 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,11 +24,11 @@ dnl Process this file with autoconf to produce a configure script.
|
||||
|
||||
AC_PREREQ(2.57)
|
||||
|
||||
dnl We don't know the version number "staticly" so we use a dash here
|
||||
dnl We don't know the version number "statically" so we use a dash here
|
||||
AC_INIT(curl, [-], [a suitable curl mailing list => http://curl.haxx.se/mail/])
|
||||
|
||||
dnl configure script copyright
|
||||
AC_COPYRIGHT([Copyright (c) 1998 - 2006 Daniel Stenberg, <daniel@haxx.se>
|
||||
AC_COPYRIGHT([Copyright (c) 1998 - 2008 Daniel Stenberg, <daniel@haxx.se>
|
||||
This configure script may be copied, distributed and modified under the
|
||||
terms of the curl license; see COPYING for more details])
|
||||
|
||||
@@ -174,6 +174,7 @@ case $host in
|
||||
esac
|
||||
AC_MSG_RESULT($mimpure)
|
||||
AM_CONDITIONAL(MIMPURE, test x$mimpure = xyes)
|
||||
AM_CONDITIONAL(STATICLIB, false)
|
||||
|
||||
AC_MSG_CHECKING([if we need BUILDING_LIBCURL])
|
||||
case $host in
|
||||
@@ -185,6 +186,7 @@ case $host in
|
||||
then
|
||||
AC_DEFINE(CURL_STATICLIB, 1, [when not building a shared library])
|
||||
AC_MSG_RESULT(yes)
|
||||
AM_CONDITIONAL(STATICLIB, true)
|
||||
else
|
||||
AC_MSG_RESULT(no)
|
||||
fi
|
||||
@@ -321,10 +323,29 @@ AC_HELP_STRING([--disable-ldap],[Disable LDAP support]),
|
||||
AC_DEFINE(CURL_DISABLE_LDAP, 1, [to disable LDAP])
|
||||
AC_SUBST(CURL_DISABLE_LDAP, [1])
|
||||
;;
|
||||
*) AC_MSG_RESULT(yes)
|
||||
*)
|
||||
case $host in
|
||||
*-*-cygwin*)
|
||||
# Force no ldap. config/build process is broken for cygwin
|
||||
AC_DEFINE(CURL_DISABLE_LDAP, 1, [to disable LDAP])
|
||||
AC_SUBST(CURL_DISABLE_LDAP, [1])
|
||||
AC_MSG_RESULT(no)
|
||||
;;
|
||||
*)
|
||||
AC_MSG_RESULT(yes)
|
||||
esac
|
||||
;;
|
||||
esac ],
|
||||
AC_MSG_RESULT(yes)
|
||||
esac ],[
|
||||
case $host in
|
||||
*-*-cygwin*)
|
||||
# Force no ldap. config/build process is broken for cygwin
|
||||
AC_DEFINE(CURL_DISABLE_LDAP, 1, [to disable LDAP])
|
||||
AC_SUBST(CURL_DISABLE_LDAP, [1])
|
||||
AC_MSG_RESULT(no)
|
||||
;;
|
||||
*)
|
||||
AC_MSG_RESULT(yes)
|
||||
esac ]
|
||||
)
|
||||
AC_MSG_CHECKING([whether to support ldaps])
|
||||
AC_ARG_ENABLE(ldaps,
|
||||
@@ -901,6 +922,9 @@ dnl **********************************************************************
|
||||
dnl Check for GSS-API libraries
|
||||
dnl **********************************************************************
|
||||
|
||||
dnl check for gss stuff in the /usr as default
|
||||
|
||||
GSSAPI_ROOT="/usr"
|
||||
AC_ARG_WITH(gssapi-includes,
|
||||
AC_HELP_STRING([--with-gssapi-includes=DIR],
|
||||
[Specify location of GSSAPI header]),
|
||||
@@ -921,6 +945,10 @@ AC_ARG_WITH(gssapi,
|
||||
GSSAPI_ROOT="$withval"
|
||||
if test x"$GSSAPI_ROOT" != xno; then
|
||||
want_gss="yes"
|
||||
if test x"$GSSAPI_ROOT" = xyes; then
|
||||
dnl if yes, then use default root
|
||||
GSSAPI_ROOT="/usr"
|
||||
fi
|
||||
fi
|
||||
])
|
||||
|
||||
@@ -932,11 +960,15 @@ if test x"$want_gss" = xyes; then
|
||||
if test -z "$GSSAPI_INCS"; then
|
||||
if test -f "$GSSAPI_ROOT/bin/krb5-config"; then
|
||||
GSSAPI_INCS=`$GSSAPI_ROOT/bin/krb5-config --cflags gssapi`
|
||||
GSSAPI_LIBS=`$GSSAPI_ROOT/bin/krb5-config --libs gssapi`
|
||||
elif test "$GSSAPI_ROOT" != "yes"; then
|
||||
GSSAPI_INCS="-I$GSSAPI_ROOT/include"
|
||||
GSSAPI_LIBS="-lgssapi"
|
||||
fi
|
||||
fi
|
||||
|
||||
CPPFLAGS="$CPPFLAGS $GSSAPI_INCS"
|
||||
LIBS="$LIBS $GSSAPI_LIBS"
|
||||
|
||||
AC_CHECK_HEADER(gss.h,
|
||||
[
|
||||
@@ -1292,6 +1324,7 @@ else
|
||||
if test "$HAVE_LIBZ" = "1" && test "$HAVE_ZLIB_H" != "1"
|
||||
then
|
||||
AC_MSG_WARN([configure found only the libz lib, not the header file!])
|
||||
HAVE_LIBZ=""
|
||||
elif test "$HAVE_LIBZ" != "1" && test "$HAVE_ZLIB_H" = "1"
|
||||
then
|
||||
AC_MSG_WARN([configure found only the libz header file, not the lib!])
|
||||
@@ -1356,8 +1389,9 @@ if test X"$OPT_LIBSSH2" != Xno; then
|
||||
AC_CHECK_HEADERS(libssh2.h,
|
||||
curl_ssh_msg="enabled (libSSH2)"
|
||||
LIBSSH2_ENABLED=1
|
||||
AC_DEFINE(USE_LIBSSH2, 1, [if libSSH2 is in use]))
|
||||
AC_DEFINE(USE_LIBSSH2, 1, [if libSSH2 is in use])
|
||||
AC_SUBST(USE_LIBSSH2, [1])
|
||||
)
|
||||
|
||||
if test X"$OPT_LIBSSH2" != Xoff &&
|
||||
test "$LIBSSH2_ENABLED" != "1"; then
|
||||
@@ -1516,7 +1550,7 @@ if test "$OPENSSL_ENABLED" != "1" -a "$GNUTLS_ENABLED" != "1"; then
|
||||
|
||||
dnl Check for functionPK11_CreateGenericObject
|
||||
dnl this is needed for using the PEM PKCS#11 module
|
||||
AC_CHECK_LIB(nss3, PK11_CreateGenericObject-d,
|
||||
AC_CHECK_LIB(nss3, PK11_CreateGenericObject,
|
||||
[
|
||||
AC_DEFINE(HAVE_PK11_CREATEGENERICOBJECT, 1, [if you have the function PK11_CreateGenericObject])
|
||||
AC_SUBST(HAVE_PK11_CREATEGENERICOBJECT, [1])
|
||||
@@ -1566,13 +1600,17 @@ fi dnl OPENSSL != 1 -a GNUTLS_ENABLED != 1
|
||||
if test "x$OPENSSL_ENABLED$GNUTLS_ENABLED$NSS_ENABLED" = "x"; then
|
||||
AC_MSG_WARN([SSL disabled, you will not be able to use HTTPS, FTPS, NTLM and more.])
|
||||
AC_MSG_WARN([Use --with-ssl, --with-gnutls or --with-nss to address this.])
|
||||
else
|
||||
# SSL is enabled, genericly
|
||||
AC_SUBST(SSL_ENABLED)
|
||||
SSL_ENABLED="1"
|
||||
fi
|
||||
|
||||
dnl **********************************************************************
|
||||
dnl Check for the CA bundle
|
||||
dnl **********************************************************************
|
||||
|
||||
if test X"$USE_NSS$USE_GNUTLS$OPENSSL_ENABLED" != "X"; then
|
||||
if test X"$SSL_ENABLED" != "X"; then
|
||||
|
||||
AC_MSG_CHECKING([CA cert bundle install path])
|
||||
|
||||
@@ -1782,7 +1820,7 @@ if test x$cross_compiling != xyes; then
|
||||
)
|
||||
fi
|
||||
else
|
||||
dnl and for crosscompilings
|
||||
dnl and for crosscompiling
|
||||
AC_CHECK_FUNCS(gmtime_r)
|
||||
fi
|
||||
|
||||
@@ -1827,6 +1865,7 @@ AC_CHECK_HEADERS(
|
||||
utime.h \
|
||||
sys/utime.h \
|
||||
sys/poll.h \
|
||||
poll.h \
|
||||
sys/resource.h \
|
||||
libgen.h \
|
||||
locale.h \
|
||||
@@ -1874,6 +1913,7 @@ AC_CHECK_SIZEOF(curl_off_t, ,[
|
||||
AC_CHECK_SIZEOF(size_t)
|
||||
AC_CHECK_SIZEOF(long)
|
||||
AC_CHECK_SIZEOF(time_t)
|
||||
AC_CHECK_SIZEOF(off_t)
|
||||
|
||||
AC_CHECK_TYPE(long long,
|
||||
[AC_DEFINE(HAVE_LONGLONG, 1, [if your compiler supports long long])]
|
||||
@@ -2088,6 +2128,8 @@ if test "$disable_poll" = "no"; then
|
||||
AC_RUN_IFELSE([
|
||||
#ifdef HAVE_SYS_POLL_H
|
||||
#include <sys/poll.h>
|
||||
#elif defined(HAVE_POLL_H)
|
||||
#include <poll.h>
|
||||
#endif
|
||||
|
||||
int main(void)
|
||||
|
@@ -6,7 +6,7 @@
|
||||
# | (__| |_| | _ <| |___
|
||||
# \___|\___/|_| \_\_____|
|
||||
#
|
||||
# Copyright (C) 2001 - 2007, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
# Copyright (C) 2001 - 2008, 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,7 @@ while test $# -gt 0; do
|
||||
if test "@USE_SSLEAY@" = "1"; then
|
||||
echo "SSL"
|
||||
NTLM=1 # OpenSSL implies NTLM
|
||||
elif test -n "@USE_GNUTLS@"; then
|
||||
elif test -n "@SSL_ENABLED@"; then
|
||||
echo "SSL"
|
||||
fi
|
||||
if test "@KRB4_ENABLED@" = "1"; then
|
||||
@@ -113,13 +113,13 @@ while test $# -gt 0; do
|
||||
--protocols)
|
||||
if test "@CURL_DISABLE_HTTP@" != "1"; then
|
||||
echo "HTTP"
|
||||
if test "@USE_SSLEAY@" = "1"; then
|
||||
if test "@SSL_ENABLED@" = "1"; then
|
||||
echo "HTTPS"
|
||||
fi
|
||||
fi
|
||||
if test "@CURL_DISABLE_FTP@" != "1"; then
|
||||
echo "FTP"
|
||||
if test "@USE_SSLEAY@" = "1"; then
|
||||
if test "@SSL_ENABLED@" = "1"; then
|
||||
echo "FTPS"
|
||||
fi
|
||||
fi
|
||||
@@ -189,7 +189,7 @@ while test $# -gt 0; do
|
||||
;;
|
||||
|
||||
--libs)
|
||||
if test "X@libdir@" != "X/usr/lib"; then
|
||||
if test "X@libdir@" != "X/usr/lib" -a "X@libdir@" != "X/usr/lib64"; then
|
||||
CURLLIBDIR="-L@libdir@ "
|
||||
else
|
||||
CURLLIBDIR=""
|
||||
|
@@ -72,7 +72,7 @@ glib/GTK+
|
||||
|
||||
Java
|
||||
|
||||
Maintained by Vic Hanson
|
||||
Maintained by [blank]
|
||||
http://curl.haxx.se/libcurl/java/
|
||||
|
||||
Lisp
|
||||
@@ -143,11 +143,20 @@ Rexx
|
||||
Written Mark Hessling
|
||||
http://rexxcurl.sourceforge.net/
|
||||
|
||||
RPG
|
||||
|
||||
Support for ILE/RPG on OS/400 is included in source distribution
|
||||
http://curl.haxx.se/libcurl/
|
||||
See packages/OS400/README.OS400 and packages/OS400/curl.inc.in
|
||||
|
||||
Ruby
|
||||
|
||||
Written by Ross Bamford
|
||||
curb - written by Ross Bamford
|
||||
http://curb.rubyforge.org/
|
||||
|
||||
ruby-curl-multi - written by Kristjan Petursson and Keith Rarick
|
||||
http://curl-multi.rubyforge.org/
|
||||
|
||||
Scheme
|
||||
|
||||
Bigloo binding by Kirill Lisovsky
|
||||
|
@@ -102,6 +102,8 @@
|
||||
using spaces only (no tabs) and having the opening brace ({) on the same line
|
||||
as the if() or while().
|
||||
|
||||
Also note that we use if() and while() with no space before the parenthesis.
|
||||
|
||||
2.3 Commenting
|
||||
|
||||
Comment your source code extensively using C comments (/* comment */), DO NOT
|
||||
|
18
docs/FAQ
18
docs/FAQ
@@ -1,4 +1,4 @@
|
||||
Updated: July 30, 2007 (http://curl.haxx.se/docs/faq.html)
|
||||
Updated: Dec 10, 2007 (http://curl.haxx.se/docs/faq.html)
|
||||
_ _ ____ _
|
||||
___| | | | _ \| |
|
||||
/ __| | | | |_) | |
|
||||
@@ -83,6 +83,7 @@ FAQ
|
||||
5.10 How do I prevent libcurl from writing the response to stdout?
|
||||
5.11 How do I make libcurl not receive the whole HTTP response?
|
||||
5.12 Can I make libcurl fake or hide my real IP address?
|
||||
5.13 How do I stop an ongoing transfer?
|
||||
|
||||
6. License Issues
|
||||
6.1 I have a GPL program, can I use the libcurl library?
|
||||
@@ -214,8 +215,7 @@ FAQ
|
||||
improvements and have them inserted in the main sources (of course on the
|
||||
condition that developers agree on that the fixes are good).
|
||||
|
||||
The full list of the more than 530 contributors is found in the docs/THANKS
|
||||
file.
|
||||
The full list of all contributors is found in the docs/THANKS file.
|
||||
|
||||
curl is developed by a community, with Daniel at the wheel.
|
||||
|
||||
@@ -1033,6 +1033,18 @@ FAQ
|
||||
that makes you see and use a different IP address locally than what the
|
||||
remote server will see you coming from.
|
||||
|
||||
5.13 How do I stop an ongoing transfer?
|
||||
|
||||
There are several ways, but none of them are instant. There is no function
|
||||
you can call from another thread or similar that will stop it immediately.
|
||||
Instead you need to make sure that one of the callbacks you use return an
|
||||
appropriate value that will stop the transfer.
|
||||
|
||||
Suitable callbacks that you can do this with include the progress callback,
|
||||
the read callback and the write callback.
|
||||
|
||||
If you're using the multi interface, you also stop a transfer by removing
|
||||
the particular easy handle from the multi stack.
|
||||
|
||||
6. License Issues
|
||||
|
||||
|
@@ -188,7 +188,7 @@ Win32
|
||||
environment variables, for example:
|
||||
|
||||
set ZLIB_PATH=c:\zlib-1.2.3
|
||||
set OPENSSL_PATH=c:\openssl-0.9.8e
|
||||
set OPENSSL_PATH=c:\openssl-0.9.8g
|
||||
set LIBSSH2_PATH=c:\libssh2-0.17
|
||||
|
||||
ATTENTION: if you want to build with libssh2 support you have to use latest
|
||||
@@ -257,7 +257,7 @@ Win32
|
||||
Before running nmake define the OPENSSL_PATH environment variable with
|
||||
the root/base directory of OpenSSL, for example:
|
||||
|
||||
set OPENSSL_PATH=c:\openssl-0.9.8e
|
||||
set OPENSSL_PATH=c:\openssl-0.9.8g
|
||||
|
||||
Then run 'nmake vc-ssl' or 'nmake vc-ssl-dll' in curl's root
|
||||
directory. 'nmake vc-ssl' will create a libcurl static and dynamic
|
||||
@@ -521,7 +521,7 @@ NetWare
|
||||
http://www.gknw.net/development/ossl/netware/
|
||||
for CLIB-based builds OpenSSL needs to be patched to build with BSD
|
||||
sockets (currently only a winsock-based CLIB build is supported):
|
||||
http://www.gknw.net/development/ossl/netware/patches/v_0.9.8e/openssl-0.9.8e.diff
|
||||
http://www.gknw.net/development/ossl/netware/patches/v_0.9.8g/openssl-0.9.8g.diff
|
||||
- optional SSH2 sources (version 0.17 or later);
|
||||
|
||||
Set a search path to your compiler, linker and tools; on Linux make
|
||||
@@ -808,10 +808,12 @@ PORTS
|
||||
- ia64 Linux 2.3.99
|
||||
- m68k AmigaOS 3
|
||||
- m68k Linux
|
||||
- m68k uClinux
|
||||
- m68k OpenBSD
|
||||
- m88k dg-dgux5.4R3.00
|
||||
- s390 Linux
|
||||
- XScale/PXA250 Linux 2.4
|
||||
- Nios II uClinux
|
||||
|
||||
Useful URLs
|
||||
===========
|
||||
|
@@ -97,7 +97,9 @@ Library
|
||||
|
||||
... analyzes the URL, it separates the different components and connects to
|
||||
the remote host. This may involve using a proxy and/or using SSL. The
|
||||
Curl_gethost() function in lib/hostip.c is used for looking up host names.
|
||||
Curl_resolv() function in lib/hostip.c is used for looking up host names
|
||||
(it does then use the proper underlying method, which may vary between
|
||||
platforms and builds).
|
||||
|
||||
When Curl_connect is done, we are connected to the remote site. Then it is
|
||||
time to tell the server to get a document/file. Curl_do() arranges this.
|
||||
@@ -122,17 +124,20 @@ Library
|
||||
Curl_Transfer() function (in lib/transfer.c) to setup the transfer and
|
||||
returns.
|
||||
|
||||
Starting in 7.9.1, if this DO function fails and the connection is being
|
||||
re-used, libcurl will then close this connection, setup a new connection
|
||||
and re-issue the DO request on that. This is because there is no way to be
|
||||
perfectly sure that we have discovered a dead connection before the DO
|
||||
function and thus we might wrongly be re-using a connection that was closed
|
||||
by the remote peer.
|
||||
If this DO function fails and the connection is being re-used, libcurl will
|
||||
then close this connection, setup a new connection and re-issue the DO
|
||||
request on that. This is because there is no way to be perfectly sure that
|
||||
we have discovered a dead connection before the DO function and thus we
|
||||
might wrongly be re-using a connection that was closed by the remote peer.
|
||||
|
||||
Some time during the DO function, the Curl_setup_transfer() function must
|
||||
be called with some basic info about the upcoming transfer: what socket(s)
|
||||
to read/write and the expected file tranfer sizes (if known).
|
||||
|
||||
o Transfer()
|
||||
|
||||
Curl_perform() then calls Transfer() in lib/transfer.c that performs
|
||||
the entire file transfer.
|
||||
Curl_perform() then calls Transfer() in lib/transfer.c that performs the
|
||||
entire file transfer.
|
||||
|
||||
During transfer, the progress functions in lib/progress.c are called at a
|
||||
frequent interval (or at the user's choice, a specified callback might get
|
||||
@@ -236,9 +241,8 @@ Library
|
||||
URL encoding and decoding, called escaping and unescaping in the source code,
|
||||
is found in lib/escape.c.
|
||||
|
||||
While transfering data in Transfer() a few functions might get
|
||||
used. curl_getdate() in lib/getdate.c is for HTTP date comparisons (and
|
||||
more).
|
||||
While transfering data in Transfer() a few functions might get used.
|
||||
curl_getdate() in lib/parsedate.c is for HTTP date comparisons (and more).
|
||||
|
||||
lib/getenv.c offers curl_getenv() which is for reading environment variables
|
||||
in a neat platform independent way. That's used in the client, but also in
|
||||
@@ -254,10 +258,6 @@ Library
|
||||
A function named curl_version() that returns the full curl version string is
|
||||
found in lib/version.c.
|
||||
|
||||
If authentication is requested but no password is given, a getpass_r() clone
|
||||
exists in lib/getpass.c. libcurl offers a custom callback that can be used
|
||||
instead of this, but it doesn't change much to us.
|
||||
|
||||
Persistent Connections
|
||||
======================
|
||||
|
||||
@@ -269,9 +269,11 @@ Persistent Connections
|
||||
all the options etc that the library-user may choose.
|
||||
o The 'SessionHandle' struct holds the "connection cache" (an array of
|
||||
pointers to 'connectdata' structs). There's one connectdata struct
|
||||
allocated for each connection that libcurl knows about.
|
||||
o This also enables the 'curl handle' to be reused on subsequent transfers,
|
||||
something that was illegal before libcurl 7.7.
|
||||
allocated for each connection that libcurl knows about. Note that when you
|
||||
use the multi interface, the multi handle will hold the connection cache
|
||||
and not the particular easy handle. This of course to allow all easy handles
|
||||
in a multi stack to be able to share and re-use connections.
|
||||
o This enables the 'curl handle' to be reused on subsequent transfers.
|
||||
o When we are about to perform a transfer with curl_easy_perform(), we first
|
||||
check for an already existing connection in the cache that we can use,
|
||||
otherwise we create a new one and add to the cache. If the cache is full
|
||||
@@ -281,11 +283,46 @@ Persistent Connections
|
||||
o When the transfer operation is complete, we try to leave the connection
|
||||
open. Particular options may tell us not to, and protocols may signal
|
||||
closure on connections and then we don't keep it open of course.
|
||||
o When curl_easy_cleanup() is called, we close all still opened connections.
|
||||
o When curl_easy_cleanup() is called, we close all still opened connections,
|
||||
unless of course the multi interface "owns" the connections.
|
||||
|
||||
You do realize that the curl handle must be re-used in order for the
|
||||
persistent connections to work.
|
||||
|
||||
multi interface/non-blocking
|
||||
============================
|
||||
|
||||
We make an effort to provide a non-blocking interface to the library, the
|
||||
multi interface. To make that interface work as good as possible, no
|
||||
low-level functions within libcurl must be written to work in a blocking
|
||||
manner.
|
||||
|
||||
One of the primary reasons we introduced c-ares support was to allow the name
|
||||
resolve phase to be perfectly non-blocking as well.
|
||||
|
||||
The ultimate goal is to provide the easy interface simply by wrapping the
|
||||
multi interface functions and thus treat everything internally as the multi
|
||||
interface is the single interface we have.
|
||||
|
||||
The FTP and the SFTP/SCP protocols are thus perfect examples of how we adapt
|
||||
and adjust the code to allow non-blocking operations even on multi-stage
|
||||
protocols. The DICT, TELNET and TFTP are crappy examples and they are subject
|
||||
for rewrite in the future to better fit the libcurl protocol family.
|
||||
|
||||
SSL libraries
|
||||
=============
|
||||
|
||||
Originally libcurl supported SSLeay for SSL/TLS transports, but that was then
|
||||
extended to its successor OpenSSL but has since also been extended to several
|
||||
other SSL/TLS libraries and we expect and hope to further extend the support
|
||||
in future libcurl versions.
|
||||
|
||||
To deal with this internally in the best way possible, we have a generic SSL
|
||||
function API as provided by the sslgen.[ch] system, and they are the only SSL
|
||||
functions we must use from within libcurl. sslgen is then crafted to use the
|
||||
appropriate lower-level function calls to whatever SSL library that is in
|
||||
use.
|
||||
|
||||
Library Symbols
|
||||
===============
|
||||
|
||||
@@ -309,6 +346,13 @@ Return Codes and Informationals
|
||||
them. They are best used when revealing information that isn't otherwise
|
||||
obvious.
|
||||
|
||||
API/ABI
|
||||
=======
|
||||
|
||||
We make an effort to not export or show internals or how internals work, as
|
||||
that makes it easier to keep a solid API/ABI over time. See docs/libcurl/ABI
|
||||
for our promise to users.
|
||||
|
||||
Client
|
||||
======
|
||||
|
||||
|
@@ -3,6 +3,24 @@ 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!
|
||||
|
||||
52. Gautam Kachroo's issue that identifies a problem with the multi interface
|
||||
where a connection can be re-used without actually being properly
|
||||
SSL-negoatiated:
|
||||
http://curl.haxx.se/mail/lib-2008-01/0277.html
|
||||
|
||||
51.Kevin Reed's reported problem with a proxy when doing CONNECT and it
|
||||
wants NTLM and close the connection to the initial CONNECT response:
|
||||
http://curl.haxx.se/bug/view.cgi?id=1879375
|
||||
|
||||
50. Curl_done() and pipelning aren't totally cool together:
|
||||
http://curl.haxx.se/mail/lib-2008-01/0330.html
|
||||
|
||||
49. If using --retry and the transfer timeouts (possibly due to using -m or
|
||||
-y/-Y) the next attempt doesn't resume the transfer properly from what was
|
||||
downloaded in the previous attempt but will truncate and restart at the
|
||||
original position where it was at before the previous failed attempt. See
|
||||
http://curl.haxx.se/mail/lib-2008-01/0080.html
|
||||
|
||||
48. If a CONNECT response-headers are larger than BUFSIZE (16KB) when the
|
||||
connection is meant to be kept alive (like for NTLM proxy auth), the
|
||||
function will return prematurely and will confuse the rest of the HTTP
|
||||
@@ -43,23 +61,9 @@ may have been fixed since this was written!
|
||||
Also see #12. According to bug #1556528, even the SOCKS5 connect code does
|
||||
not do it right: http://curl.haxx.se/bug/view.cgi?id=1556528,
|
||||
|
||||
33. Doing multi-pass HTTP authentication on a non-default port does not work.
|
||||
This happens because the multi-pass code abuses the redirect following code
|
||||
for doing multiple requests, and when we following redirects to an absolute
|
||||
URL we must use the newly specified port and not the one specified in the
|
||||
original URL. A proper fix to this would need to separate the negotiation
|
||||
"redirect" from an actual redirect.
|
||||
|
||||
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.
|
||||
run that might be needed only for building libcurl. 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.
|
||||
|
@@ -12,6 +12,7 @@ Albert Chin-A-Young
|
||||
Albert Choy
|
||||
Ale Vesely
|
||||
Aleksandar Milivojevic
|
||||
Alex Fishman
|
||||
Alex Neblett
|
||||
Alex Suykov
|
||||
Alex aka WindEagle
|
||||
@@ -19,6 +20,7 @@ Alexander Kourakos
|
||||
Alexander Krasnostavsky
|
||||
Alexander Lazic
|
||||
Alexander Zhuravlev
|
||||
Alexey Pesternikov
|
||||
Alexey Simak
|
||||
Alexis Carvalho
|
||||
Allen Pulsifer
|
||||
@@ -229,6 +231,7 @@ Ignacio Vazquez-Abrams
|
||||
Igor Polyakov
|
||||
Ilguiz Latypov
|
||||
Ilja van Sprundel
|
||||
Immanuel Gregoire
|
||||
Ingmar Runge
|
||||
Ingo Ralf Blum
|
||||
Ingo Wilken
|
||||
@@ -274,6 +277,7 @@ John Janssen
|
||||
John Kelly
|
||||
John Lask
|
||||
John McGowan
|
||||
Johnny Luong
|
||||
Jon Grubbs
|
||||
Jon Travis
|
||||
Jon Turner
|
||||
@@ -308,6 +312,7 @@ Kent Boortz
|
||||
Kevin Fisk
|
||||
Kevin Lussier
|
||||
Kevin Roth
|
||||
Kim Rinnewitz
|
||||
Kimmo Kinnunen
|
||||
Kjell Ericson
|
||||
Kjetil Jacobsen
|
||||
@@ -348,6 +353,7 @@ Marco G. Salvagno
|
||||
Marcus Webster
|
||||
Mario Schroeder
|
||||
Mark Butler
|
||||
Mark Davies
|
||||
Mark Eichin
|
||||
Mark Lentczner
|
||||
Markus Koetter
|
||||
@@ -368,6 +374,7 @@ Matt Witherspoon
|
||||
Matthew Blain
|
||||
Matthew Clarke
|
||||
Maurice Barnum
|
||||
Max Katsev
|
||||
Mekonikum
|
||||
Mettgut Jamalla
|
||||
Michael Benedict
|
||||
@@ -440,6 +447,7 @@ Peter Wullinger
|
||||
Peteris Krumins
|
||||
Phil Karn
|
||||
Philip Gladstone
|
||||
Philip Langdale
|
||||
Philippe Hameau
|
||||
Philippe Raoult
|
||||
Philippe Vaucher
|
||||
@@ -575,6 +583,7 @@ Vilmos Nebehaj
|
||||
Vincent Bronner
|
||||
Vincent Penquerc'h
|
||||
Vincent Sanders
|
||||
Vladimir Lazarenko
|
||||
Vojtech Janota
|
||||
Vojtech Minarik
|
||||
Walter J. Mack
|
||||
|
713
docs/TODO
713
docs/TODO
@@ -4,346 +4,569 @@
|
||||
| (__| |_| | _ <| |___
|
||||
\___|\___/|_| \_\_____|
|
||||
|
||||
TODO
|
||||
Things that could be nice to do in the future
|
||||
|
||||
Things to do in project cURL. Please tell us what you think, contribute and
|
||||
send us patches that improve things! Also check the http://curl.haxx.se/dev
|
||||
web section for various technical development notes.
|
||||
send us patches that improve things!
|
||||
|
||||
All bugs documented in the KNOWN_BUGS document are subject for fixing!
|
||||
|
||||
LIBCURL
|
||||
1. libcurl
|
||||
1.1 Zero-copy interface
|
||||
1.2 More data sharing
|
||||
1.3 struct lifreq
|
||||
1.4 Get IP address
|
||||
1.5 c-ares ipv6
|
||||
1.6 configure-based info in public headers
|
||||
|
||||
* Introduce another callback interface for upload/download that makes one
|
||||
less copy of data and thus a faster operation.
|
||||
[http://curl.haxx.se/dev/no_copy_callbacks.txt]
|
||||
2. libcurl - multi interface
|
||||
2.1 More non-blocking
|
||||
2.2 Pause transfers
|
||||
2.3 Remove easy interface internally
|
||||
2.4 Avoid having to remove/readd handles
|
||||
|
||||
* More data sharing. curl_share_* functions already exist and work, and they
|
||||
can be extended to share more. For example, enable sharing of the ares
|
||||
channel and the connection cache.
|
||||
3. Documentation
|
||||
3.1 More and better
|
||||
|
||||
* Introduce a new error code indicating authentication problems (for proxy
|
||||
CONNECT error 407 for example). This cannot be an error code, we must not
|
||||
return informational stuff as errors, consider a new info returned by
|
||||
curl_easy_getinfo() http://curl.haxx.se/bug/view.cgi?id=845941
|
||||
4. FTP
|
||||
4.1 PRET
|
||||
4.2 Alter passive/active on failure and retry
|
||||
4.3 Earlier bad letter detection
|
||||
4.4 REST for large files
|
||||
4.5 FTP proxy support
|
||||
4.6 PORT port range
|
||||
4.7 ASCII support
|
||||
|
||||
* Use 'struct lifreq' and SIOCGLIFADDR instead of 'struct ifreq' and
|
||||
SIOCGIFADDR on newer Solaris versions as they claim the latter is obsolete.
|
||||
To support ipv6 interface addresses properly.
|
||||
5. HTTP
|
||||
5.1 Other HTTP versions with CONNECT
|
||||
5.2 Better persistancy for HTTP 1.0
|
||||
5.3 support FF3 sqlite cookie files
|
||||
|
||||
* Add the following to curl_easy_getinfo(): GET_HTTP_IP, GET_FTP_IP and
|
||||
GET_FTP_DATA_IP. Return a string with the used IP. Suggested by Alan.
|
||||
6. TELNET
|
||||
6.1 ditch stdin
|
||||
6.2 ditch telnet-specific select
|
||||
|
||||
* Add option that changes the interval in which the progress callback is
|
||||
called at most.
|
||||
7. SSL
|
||||
7.1 Disable specific versions
|
||||
7.2 Provide mytex locking API
|
||||
7.3 dumpcert
|
||||
7.4 Evaluate SSL patches
|
||||
7.5 Cache OpenSSL contexts
|
||||
7.6 Export session ids
|
||||
7.7 Provide callback for cert verfication
|
||||
7.8 Support other SSL libraries
|
||||
7.9 Support SRP on the TLS layer
|
||||
7.10 improve configure --with-ssl
|
||||
|
||||
* 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).
|
||||
8. GnuTLS
|
||||
8.1 Make NTLM work without OpenSSL functions
|
||||
8.2 SSl engine stuff
|
||||
8.3 SRP
|
||||
8.4 non-blocking
|
||||
8.5 check connection
|
||||
|
||||
* 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).
|
||||
9. LDAP
|
||||
9.1 ditch ldap-specific select
|
||||
|
||||
Work on this has been started but hasn't been finished, and the initial
|
||||
patch and some details are found here:
|
||||
http://curl.haxx.se/mail/lib-2006-12/0084.html
|
||||
10. New protocols
|
||||
10.1 RTSP
|
||||
10.2 RSYNC
|
||||
10.3 RTMP
|
||||
|
||||
LIBCURL - multi interface
|
||||
11. Client
|
||||
11.1 Content-Disposition
|
||||
11.2 sync
|
||||
11.3 glob posts
|
||||
11.4 prevent file overwriting
|
||||
11.5 ftp wildcard download
|
||||
11.6 simultaneous parallel transfers
|
||||
11.7 provide formpost headers
|
||||
11.8 url-specific options
|
||||
|
||||
* Make sure we don't ever loop because of non-blocking sockets return
|
||||
EWOULDBLOCK or similar. The GnuTLS connection etc.
|
||||
12. Build
|
||||
12.1 roffit
|
||||
|
||||
* Make transfers treated more carefully. We need a way to tell libcurl we
|
||||
have data to write, as the current system expects us to upload data each
|
||||
time the socket is writable and there is no way to say that we want to
|
||||
upload data soon just not right now, without that aborting the upload. The
|
||||
opposite situation should be possible as well, that we tell libcurl we're
|
||||
ready to accept read data. Today libcurl feeds the data as soon as it is
|
||||
available for reading, no matter what.
|
||||
13. Test suite
|
||||
13.1 SSL tunnel
|
||||
13.2 nicer lacking perl message
|
||||
13.3 more protocols supported
|
||||
13.4 more platforms supported
|
||||
|
||||
* Make curl_easy_perform() a wrapper-function that simply creates a multi
|
||||
handle, adds the easy handle to it, runs curl_multi_perform() until the
|
||||
transfer is done, then detach the easy handle, destroy the multi handle and
|
||||
return the easy handle's return code. This will thus make everything
|
||||
internally use and assume the multi interface. The select()-loop should use
|
||||
curl_multi_socket().
|
||||
14. Next SONAME bump
|
||||
14.1 http-style HEAD output for ftp
|
||||
14.2 combine error codes
|
||||
14.3 extend CURLOPT_SOCKOPTFUNCTION prototype
|
||||
|
||||
* curl_multi_handle_control() - this can control the easy handle (while)
|
||||
added to a multi handle in various ways:
|
||||
o RESTART, unconditionally restart this easy handle's transfer from the
|
||||
start, re-init the state
|
||||
o RESTART_COMPLETED, restart this easy handle's transfer but only if the
|
||||
existing transfer has already completed and it is in a "finished state".
|
||||
o STOP, just stop this transfer and consider it completed
|
||||
o PAUSE?
|
||||
o RESUME?
|
||||
15. Next major release
|
||||
15.1 cleanup return codes
|
||||
15.2 remove obsolete defines
|
||||
15.3 size_t
|
||||
15.4 remove several functions
|
||||
15.5 remove CURLOPT_FAILONERROR
|
||||
15.6 remove CURLOPT_DNS_USE_GLOBAL_CACHE
|
||||
|
||||
DOCUMENTATION
|
||||
==============================================================================
|
||||
|
||||
* More and better
|
||||
1. libcurl
|
||||
|
||||
FTP
|
||||
1.1 Zero-copy interface
|
||||
|
||||
* PRET is a command that primarily "drftpd" supports, which could be useful
|
||||
when using libcurl against such a server. It is a non-standard and a rather
|
||||
oddly designed command, but...
|
||||
http://curl.haxx.se/bug/feature.cgi?id=1729967
|
||||
Introdue another callback interface for upload/download that makes one less
|
||||
copy of data and thus a faster operation.
|
||||
[http://curl.haxx.se/dev/no_copy_callbacks.txt]
|
||||
|
||||
* When trying to connect passively to a server which only supports active
|
||||
connections, libcurl returns CURLE_FTP_WEIRD_PASV_REPLY and closes the
|
||||
connection. There could be a way to fallback to an active connection (and
|
||||
vice versa). http://curl.haxx.se/bug/feature.cgi?id=1754793
|
||||
1.2 More data sharing
|
||||
|
||||
* Make the detection of (bad) %0d and %0a codes in FTP url parts earlier in
|
||||
the process to avoid doing a resolve and connect in vain.
|
||||
curl_share_* functions already exist and work, and they can be extended to
|
||||
share more. For example, enable sharing of the ares channel and the
|
||||
connection cache.
|
||||
|
||||
* REST fix for servers not behaving well on >2GB requests. This should fail
|
||||
if the server doesn't set the pointer to the requested index. The tricky
|
||||
(impossible?) part is to figure out if the server did the right thing or
|
||||
not.
|
||||
1.3 struct lifreq
|
||||
|
||||
* Support the most common FTP proxies, Philip Newton provided a list
|
||||
allegedly from ncftp:
|
||||
http://curl.haxx.se/mail/archive-2003-04/0126.html
|
||||
Use 'struct lifreq' and SIOCGLIFADDR instead of 'struct ifreq' and
|
||||
SIOCGIFADDR on newer Solaris versions as they claim the latter is obsolete.
|
||||
To support ipv6 interface addresses for network interfaces properly.
|
||||
|
||||
* Make CURLOPT_FTPPORT support an additional port number on the IP/if/name,
|
||||
like "blabla:[port]" or possibly even "blabla:[portfirst]-[portsecond]".
|
||||
http://curl.haxx.se/bug/feature.cgi?id=1505166
|
||||
1.4 Get IP address
|
||||
|
||||
* FTP ASCII transfers do not follow RFC959. They don't convert the data
|
||||
accordingly.
|
||||
Add the following to curl_easy_getinfo(): GET_HTTP_IP, GET_FTP_IP and
|
||||
GET_FTP_DATA_IP. Return a string with the used IP.
|
||||
|
||||
* Since USERPWD always override the user and password specified in URLs, we
|
||||
might need another way to specify user+password for anonymous ftp logins.
|
||||
1.5 c-ares ipv6
|
||||
|
||||
* The FTP code should get a way of returning errors that is known to still
|
||||
have the control connection alive and sound. Currently, a returned error
|
||||
from within ftp-functions does not tell if the control connection is still
|
||||
OK to use or not. This causes libcurl to fail to re-use connections
|
||||
slightly too often.
|
||||
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).
|
||||
|
||||
HTTP
|
||||
1.6 configure-based info in public headers
|
||||
|
||||
* When doing CONNECT to a HTTP proxy, libcurl always uses HTTP/1.0. This has
|
||||
never been reported as causing trouble to anyone, but should be considered
|
||||
to use the HTTP version the user has chosen.
|
||||
Make the public 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).
|
||||
|
||||
* "Better" support for persistent connections over HTTP 1.0
|
||||
http://curl.haxx.se/bug/feature.cgi?id=1089001
|
||||
Work on this has been started but hasn't been finished, and the initial patch
|
||||
and some details are found here:
|
||||
http://curl.haxx.se/mail/lib-2006-12/0084.html
|
||||
|
||||
TELNET
|
||||
The remaining problems to solve involve the platforms that can't run
|
||||
configure.
|
||||
|
||||
* Reading input (to send to the remote server) on stdin is a crappy solution
|
||||
for library purposes. We need to invent a good way for the application to
|
||||
be able to provide the data to send.
|
||||
2. libcurl - multi interface
|
||||
|
||||
* Move the telnet support's network select() loop go away and merge the code
|
||||
into the main transfer loop. Until this is done, the multi interface won't
|
||||
work for telnet.
|
||||
2.1 More non-blocking
|
||||
|
||||
SSL
|
||||
Make sure we don't ever loop because of non-blocking sockets return
|
||||
EWOULDBLOCK or similar. The GnuTLS connection etc.
|
||||
|
||||
* Provide an option that allows for disabling specific SSL versions, such as
|
||||
SSLv2 http://curl.haxx.se/bug/feature.cgi?id=1767276
|
||||
2.2 Pause transfers
|
||||
|
||||
* Provide a libcurl API for setting mutex callbacks in the underlying SSL
|
||||
library, so that the same application code can use mutex-locking
|
||||
independently of OpenSSL or GnutTLS being used.
|
||||
Make transfers treated more carefully. We need a way to tell libcurl we have
|
||||
data to write, as the current system expects us to upload data each time the
|
||||
socket is writable and there is no way to say that we want to upload data
|
||||
soon just not right now, without that aborting the upload. The opposite
|
||||
situation should be possible as well, that we tell libcurl we're ready to
|
||||
accept read data. Today libcurl feeds the data as soon as it is available for
|
||||
reading, no matter what.
|
||||
|
||||
* Anton Fedorov's "dumpcert" patch:
|
||||
http://curl.haxx.se/mail/lib-2004-03/0088.html
|
||||
2.3 Remove easy interface internally
|
||||
|
||||
* Evaluate/apply Gertjan van Wingerde's SSL patches:
|
||||
http://curl.haxx.se/mail/lib-2004-03/0087.html
|
||||
Make curl_easy_perform() a wrapper-function that simply creates a multi
|
||||
handle, adds the easy handle to it, runs curl_multi_perform() until the
|
||||
transfer is done, then detach the easy handle, destroy the multi handle and
|
||||
return the easy handle's return code. This will thus make everything
|
||||
internally use and assume the multi interface. The select()-loop should use
|
||||
curl_multi_socket().
|
||||
|
||||
* "Look at SSL cafile - quick traces look to me like these are done on every
|
||||
request as well, when they should only be necessary once per ssl context
|
||||
(or once per handle)". The major improvement we can rather easily do is to
|
||||
make sure we don't create and kill a new SSL "context" for every request,
|
||||
but instead make one for every connection and re-use that SSL context in
|
||||
the same style connections are re-used. It will make us use slightly more
|
||||
memory but it will libcurl do less creations and deletions of SSL contexts.
|
||||
2.4 Avoid having to remove/readd handles
|
||||
|
||||
* Add an interface to libcurl that enables "session IDs" to get
|
||||
exported/imported. Cris Bailiff said: "OpenSSL has functions which can
|
||||
serialise the current SSL state to a buffer of your choice, and
|
||||
recover/reset the state from such a buffer at a later date - this is used
|
||||
by mod_ssl for apache to implement and SSL session ID cache".
|
||||
curl_multi_handle_control() - this can control the easy handle (while) added
|
||||
to a multi handle in various ways:
|
||||
|
||||
* OpenSSL supports a callback for customised verification of the peer
|
||||
certificate, but this doesn't seem to be exposed in the libcurl APIs. Could
|
||||
it be? There's so much that could be done if it were! (brought by Chris
|
||||
Clark)
|
||||
o RESTART, unconditionally restart this easy handle's transfer from the
|
||||
start, re-init the state
|
||||
|
||||
* Make curl's SSL layer capable of using other free SSL libraries. Such as
|
||||
MatrixSSL (http://www.matrixssl.org/).
|
||||
o RESTART_COMPLETED, restart this easy handle's transfer but only if the
|
||||
existing transfer has already completed and it is in a "finished state".
|
||||
|
||||
* Peter Sylvester's patch for SRP on the TLS layer.
|
||||
Awaits OpenSSL support for this, no need to support this in libcurl before
|
||||
there's an OpenSSL release that does it.
|
||||
o STOP, just stop this transfer and consider it completed
|
||||
|
||||
* make the configure --with-ssl option first check for OpenSSL, then GnuTLS,
|
||||
then NSS...
|
||||
o PAUSE?
|
||||
|
||||
GnuTLS
|
||||
o RESUME?
|
||||
|
||||
* Get NTLM working using the functions provided by libgcrypt, since GnuTLS
|
||||
already depends on that to function. Not strictly SSL/TLS related, but
|
||||
hey... Another option is to get available DES and MD4 source code from the
|
||||
cryptopp library. They are fine license-wise, but are C++.
|
||||
3. Documentation
|
||||
|
||||
* SSL engine stuff?
|
||||
3.1 More and better
|
||||
|
||||
* Work out a common method with Peter Sylvester's OpenSSL-patch for SRP
|
||||
on the TLS to provide name and password
|
||||
Exactly
|
||||
|
||||
* Fix the connection phase to be non-blocking when multi interface is used
|
||||
4. FTP
|
||||
|
||||
* Add a way to check if the connection seems to be alive, to correspond to
|
||||
the SSL_peak() way we use with OpenSSL.
|
||||
4.1 PRET
|
||||
|
||||
LDAP
|
||||
PRET is a command that primarily "drftpd" supports, which could be useful
|
||||
when using libcurl against such a server. It is a non-standard and a rather
|
||||
oddly designed command, but...
|
||||
http://curl.haxx.se/bug/feature.cgi?id=1729967
|
||||
|
||||
4.2 Alter passive/active on failure and retry
|
||||
|
||||
When trying to connect passively to a server which only supports active
|
||||
connections, libcurl returns CURLE_FTP_WEIRD_PASV_REPLY and closes the
|
||||
connection. There could be a way to fallback to an active connection (and
|
||||
vice versa). http://curl.haxx.se/bug/feature.cgi?id=1754793
|
||||
|
||||
4.3 Earlier bad letter detection
|
||||
|
||||
Make the detection of (bad) %0d and %0a codes in FTP url parts earlier in the
|
||||
process to avoid doing a resolve and connect in vain.
|
||||
|
||||
4.4 REST for large files
|
||||
|
||||
REST fix for servers not behaving well on >2GB requests. This should fail if
|
||||
the server doesn't set the pointer to the requested index. The tricky
|
||||
(impossible?) part is to figure out if the server did the right thing or not.
|
||||
|
||||
4.5 FTP proxy support
|
||||
|
||||
Support the most common FTP proxies, Philip Newton provided a list allegedly
|
||||
from ncftp. This is not a subject without debate, and is probably not really
|
||||
suitable for libcurl. http://curl.haxx.se/mail/archive-2003-04/0126.html
|
||||
|
||||
4.6 PORT port range
|
||||
|
||||
Make CURLOPT_FTPPORT support an additional port number on the IP/if/name,
|
||||
like "blabla:[port]" or possibly even "blabla:[portfirst]-[portsecond]".
|
||||
http://curl.haxx.se/bug/feature.cgi?id=1505166
|
||||
|
||||
4.7 ASCII support
|
||||
|
||||
FTP ASCII transfers do not follow RFC959. They don't convert the data
|
||||
accordingly.
|
||||
|
||||
5. HTTP
|
||||
|
||||
5.1 Other HTTP versions with CONNECT
|
||||
|
||||
When doing CONNECT to a HTTP proxy, libcurl always uses HTTP/1.0. This has
|
||||
never been reported as causing trouble to anyone, but should be considered to
|
||||
use the HTTP version the user has chosen.
|
||||
|
||||
5.2 Better persistancy for HTTP 1.0
|
||||
|
||||
"Better" support for persistent connections over HTTP 1.0
|
||||
http://curl.haxx.se/bug/feature.cgi?id=1089001
|
||||
|
||||
5.3 support FF3 sqlite cookie files
|
||||
|
||||
Firefox 3 is changing from its former format to a a sqlite database instead.
|
||||
We should consider how (lib)curl can/should support this.
|
||||
http://curl.haxx.se/bug/feature.cgi?id=1871388
|
||||
|
||||
6. TELNET
|
||||
|
||||
6.1 ditch stdin
|
||||
|
||||
Reading input (to send to the remote server) on stdin is a crappy solution for
|
||||
library purposes. We need to invent a good way for the application to be able
|
||||
to provide the data to send.
|
||||
|
||||
6.2 ditch telnet-specific select
|
||||
|
||||
Move the telnet support's network select() loop go away and merge the code
|
||||
into the main transfer loop. Until this is done, the multi interface won't
|
||||
work for telnet.
|
||||
|
||||
7. SSL
|
||||
|
||||
7.1 Disable specific versions
|
||||
|
||||
Provide an option that allows for disabling specific SSL versions, such as
|
||||
SSLv2 http://curl.haxx.se/bug/feature.cgi?id=1767276
|
||||
|
||||
7.2 Provide mytex locking API
|
||||
|
||||
Provide a libcurl API for setting mutex callbacks in the underlying SSL
|
||||
library, so that the same application code can use mutex-locking
|
||||
independently of OpenSSL or GnutTLS being used.
|
||||
|
||||
7.3 dumpcert
|
||||
|
||||
Anton Fedorov's "dumpcert" patch:
|
||||
http://curl.haxx.se/mail/lib-2004-03/0088.html
|
||||
|
||||
7.4 Evaluate SSL patches
|
||||
|
||||
Evaluate/apply Gertjan van Wingerde's SSL patches:
|
||||
http://curl.haxx.se/mail/lib-2004-03/0087.html
|
||||
|
||||
7.5 Cache OpenSSL contexts
|
||||
|
||||
"Look at SSL cafile - quick traces look to me like these are done on every
|
||||
request as well, when they should only be necessary once per ssl context (or
|
||||
once per handle)". The major improvement we can rather easily do is to make
|
||||
sure we don't create and kill a new SSL "context" for every request, but
|
||||
instead make one for every connection and re-use that SSL context in the same
|
||||
style connections are re-used. It will make us use slightly more memory but
|
||||
it will libcurl do less creations and deletions of SSL contexts.
|
||||
|
||||
7.6 Export session ids
|
||||
|
||||
Add an interface to libcurl that enables "session IDs" to get
|
||||
exported/imported. Cris Bailiff said: "OpenSSL has functions which can
|
||||
serialise the current SSL state to a buffer of your choice, and recover/reset
|
||||
the state from such a buffer at a later date - this is used by mod_ssl for
|
||||
apache to implement and SSL session ID cache".
|
||||
|
||||
7.7 Provide callback for cert verfication
|
||||
|
||||
OpenSSL supports a callback for customised verification of the peer
|
||||
certificate, but this doesn't seem to be exposed in the libcurl APIs. Could
|
||||
it be? There's so much that could be done if it were!
|
||||
|
||||
7.8 Support other SSL libraries
|
||||
|
||||
Make curl's SSL layer capable of using other free SSL libraries. Such as
|
||||
MatrixSSL (http://www.matrixssl.org/).
|
||||
|
||||
7.9 Support SRP on the TLS layer
|
||||
|
||||
Peter Sylvester's patch for SRP on the TLS layer. Awaits OpenSSL support for
|
||||
this, no need to support this in libcurl before there's an OpenSSL release
|
||||
that does it.
|
||||
|
||||
7.10 improve configure --with-ssl
|
||||
|
||||
make the configure --with-ssl option first check for OpenSSL, then GnuTLS,
|
||||
then NSS...
|
||||
|
||||
8. GnuTLS
|
||||
|
||||
8.1 Make NTLM work without OpenSSL functions
|
||||
|
||||
Get NTLM working using the functions provided by libgcrypt, since GnuTLS
|
||||
already depends on that to function. Not strictly SSL/TLS related, but
|
||||
hey... Another option is to get available DES and MD4 source code from the
|
||||
cryptopp library. They are fine license-wise, but are C++.
|
||||
|
||||
8.2 SSl engine stuff
|
||||
|
||||
Is this even possible?
|
||||
|
||||
8.3 SRP
|
||||
|
||||
Work out a common method with Peter Sylvester's OpenSSL-patch for SRP on the
|
||||
TLS to provide name and password. GnuTLS already supports it...
|
||||
|
||||
8.4 non-blocking
|
||||
|
||||
Fix the connection phase to be non-blocking when multi interface is used
|
||||
|
||||
8.5 check connection
|
||||
|
||||
Add a way to check if the connection seems to be alive, to correspond to the
|
||||
SSL_peak() way we use with OpenSSL.
|
||||
|
||||
9. LDAP
|
||||
|
||||
9.1 ditch ldap-specific select
|
||||
|
||||
* Look over the implementation. The looping will have to "go away" from the
|
||||
lib/ldap.c source file and get moved to the main network code so that the
|
||||
multi interface and friends will work for LDAP as well.
|
||||
|
||||
NEW PROTOCOLS
|
||||
10. New protocols
|
||||
|
||||
* RTSP - RFC2326 (protocol - very HTTP-like, also contains URL description)
|
||||
10.1 RTSP
|
||||
|
||||
* RSYNC (no RFCs for protocol nor URI/URL format). An implementation should
|
||||
most probably use an existing rsync library, such as librsync.
|
||||
RFC2326 (protocol - very HTTP-like, also contains URL description)
|
||||
|
||||
CLIENT
|
||||
10.2 RSYNC
|
||||
|
||||
* Add option that is similar to -O but that takes the output file name from
|
||||
the Content-Disposition: header, and/or uses the local file name used in
|
||||
redirections for the cases the server bounces the request further to a
|
||||
different file (name): http://curl.haxx.se/bug/feature.cgi?id=1364676
|
||||
There's no RFC for protocol nor URI/URL format. An implementation should
|
||||
most probably use an existing rsync library, such as librsync.
|
||||
|
||||
* "curl --sync http://example.com/feed[1-100].rss" or
|
||||
"curl --sync http://example.net/{index,calendar,history}.html"
|
||||
10.3 RTMP
|
||||
|
||||
Downloads a range or set of URLs using the remote name, but only if the
|
||||
remote file is newer than the local file. A Last-Modified HTTP date header
|
||||
should also be used to set the mod date on the downloaded file.
|
||||
(idea from "Brianiac")
|
||||
There exists a patch that claims to introduce this protocol:
|
||||
http://osdir.com/ml/gnu.gnash.devel2/2006-11/msg00278.html, further details
|
||||
in the feature-request: http://curl.haxx.se/bug/feature.cgi?id=1843469
|
||||
|
||||
* Globbing support for -d and -F, as in 'curl -d "name=foo[0-9]" URL'.
|
||||
Requested by Dane Jensen and others. This is easily scripted though.
|
||||
11. Client
|
||||
|
||||
* Add an option that prevents cURL from overwriting existing local files. When
|
||||
used, and there already is an existing file with the target file name
|
||||
(either -O or -o), a number should be appended (and increased if already
|
||||
existing). So that index.html becomes first index.html.1 and then
|
||||
index.html.2 etc. Jeff Pohlmeyer suggested.
|
||||
11.1 Content-Disposition
|
||||
|
||||
* "curl ftp://site.com/*.txt"
|
||||
Add option that is similar to -O but that takes the output file name from the
|
||||
Content-Disposition: header, and/or uses the local file name used in
|
||||
redirections for the cases the server bounces the request further to a
|
||||
different file (name): http://curl.haxx.se/bug/feature.cgi?id=1364676
|
||||
|
||||
* The client could be told to use maximum N simultaneous parallel transfers
|
||||
and then just make sure that happens. It should of course not make more
|
||||
than one connection to the same remote host. This would require the client
|
||||
to use the multi interface. http://curl.haxx.se/bug/feature.cgi?id=1558595
|
||||
11.2 sync
|
||||
|
||||
* Extending the capabilities of the multipart formposting. How about leaving
|
||||
the ';type=foo' syntax as it is and adding an extra tag (headers) which
|
||||
works like this: curl -F "coolfiles=@fil1.txt;headers=@fil1.hdr" where
|
||||
fil1.hdr contains extra headers like
|
||||
"curl --sync http://example.com/feed[1-100].rss" or
|
||||
"curl --sync http://example.net/{index,calendar,history}.html"
|
||||
|
||||
Content-Type: text/plain; charset=KOI8-R"
|
||||
Content-Transfer-Encoding: base64
|
||||
X-User-Comment: Please don't use browser specific HTML code
|
||||
Downloads a range or set of URLs using the remote name, but only if the
|
||||
remote file is newer than the local file. A Last-Modified HTTP date header
|
||||
should also be used to set the mod date on the downloaded file.
|
||||
|
||||
which should overwrite the program reasonable defaults (plain/text,
|
||||
8bit...) (Idea brough to us by kromJx)
|
||||
11.3 glob posts
|
||||
|
||||
* ability to specify the classic computing suffixes on the range
|
||||
specifications. For example, to download the first 500 Kilobytes of a file,
|
||||
be able to specify the following for the -r option: "-r 0-500K" or for the
|
||||
first 2 Megabytes of a file: "-r 0-2M". (Mark Smith suggested)
|
||||
Globbing support for -d and -F, as in 'curl -d "name=foo[0-9]" URL'.
|
||||
This is easily scripted though.
|
||||
|
||||
* --data-encode that URL encodes the data before posting
|
||||
http://curl.haxx.se/mail/archive-2003-11/0091.html (Kevin Roth suggested)
|
||||
11.4 prevent file overwriting
|
||||
|
||||
* Provide a way to make options bound to a specific URL among several on the
|
||||
command line. Possibly by letting ':' separate options between URLs,
|
||||
similar to this:
|
||||
Add an option that prevents cURL from overwriting existing local files. When
|
||||
used, and there already is an existing file with the target file name
|
||||
(either -O or -o), a number should be appended (and increased if already
|
||||
existing). So that index.html becomes first index.html.1 and then
|
||||
index.html.2 etc.
|
||||
|
||||
curl --data foo --url url.com : \
|
||||
--url url2.com : \
|
||||
--url url3.com --data foo3
|
||||
11.5 ftp wildcard download
|
||||
|
||||
(More details: http://curl.haxx.se/mail/archive-2004-07/0133.html)
|
||||
"curl ftp://site.com/*.txt"
|
||||
|
||||
The example would do a POST-GET-POST combination on a single command line.
|
||||
11.6 simultaneous parallel transfers
|
||||
|
||||
BUILD
|
||||
The client could be told to use maximum N simultaneous parallel transfers and
|
||||
then just make sure that happens. It should of course not make more than one
|
||||
connection to the same remote host. This would require the client to use the
|
||||
multi interface. http://curl.haxx.se/bug/feature.cgi?id=1558595
|
||||
|
||||
* Consider extending 'roffit' to produce decent ASCII output, and use that
|
||||
instead of (g)nroff when building src/hugehelp.c
|
||||
11.7 provide formpost headers
|
||||
|
||||
TEST SUITE
|
||||
Extending the capabilities of the multipart formposting. How about leaving
|
||||
the ';type=foo' syntax as it is and adding an extra tag (headers) which
|
||||
works like this: curl -F "coolfiles=@fil1.txt;headers=@fil1.hdr" where
|
||||
fil1.hdr contains extra headers like
|
||||
|
||||
* Make our own version of stunnel for simple port forwarding to enable HTTPS
|
||||
and FTP-SSL tests without the stunnel dependency, and it could allow us to
|
||||
provide test tools built with either OpenSSL or GnuTLS
|
||||
Content-Type: text/plain; charset=KOI8-R"
|
||||
Content-Transfer-Encoding: base64
|
||||
X-User-Comment: Please don't use browser specific HTML code
|
||||
|
||||
* If perl wasn't found by the configure script, don't attempt to run the
|
||||
tests but explain something nice why it doesn't.
|
||||
which should overwrite the program reasonable defaults (plain/text,
|
||||
8bit...)
|
||||
|
||||
* Extend the test suite to include more protocols. The telnet could just do
|
||||
ftp or http operations (for which we have test servers).
|
||||
11.8 url-specific options
|
||||
|
||||
* Make the test suite work on more platforms. OpenBSD and Mac OS. Remove
|
||||
fork()s and it should become even more portable.
|
||||
Provide a way to make options bound to a specific URL among several on the
|
||||
command line. Possibly by letting ':' separate options between URLs,
|
||||
similar to this:
|
||||
|
||||
NEXT soname bump
|
||||
curl --data foo --url url.com : \
|
||||
--url url2.com : \
|
||||
--url url3.com --data foo3
|
||||
|
||||
* #undef CURL_FTP_HTTPSTYLE_HEAD in lib/ftp.c to remove the HTTP-style headers
|
||||
from being output in NOBODY requests over ftp
|
||||
(More details: http://curl.haxx.se/mail/archive-2004-07/0133.html)
|
||||
|
||||
* Combine some of the error codes to remove duplicates. The original
|
||||
numbering should not be changed, and the old identifiers would be
|
||||
macroed to the new ones in an CURL_NO_OLDIES section to help with
|
||||
backward compatibility.
|
||||
The example would do a POST-GET-POST combination on a single command line.
|
||||
|
||||
Candidates for removal and their replacements:
|
||||
12. Build
|
||||
|
||||
CURLE_FILE_COULDNT_READ_FILE => CURLE_REMOTE_FILE_NOT_FOUND
|
||||
CURLE_FTP_COULDNT_RETR_FILE => CURLE_REMOTE_FILE_NOT_FOUND
|
||||
CURLE_FTP_COULDNT_USE_REST => CURLE_RANGE_ERROR
|
||||
CURLE_FUNCTION_NOT_FOUND => CURLE_FAILED_INIT
|
||||
CURLE_LDAP_INVALID_URL => CURLE_URL_MALFORMAT
|
||||
CURLE_TFTP_NOSUCHUSER => CURLE_TFTP_ILLEGAL
|
||||
CURLE_TFTP_NOTFOUND => CURLE_REMOTE_FILE_NOT_FOUND
|
||||
CURLE_TFTP_PERM => CURLE_REMOTE_ACCESS_DENIED
|
||||
12.1 roffit
|
||||
|
||||
NEXT MAJOR RELEASE
|
||||
Consider extending 'roffit' to produce decent ASCII output, and use that
|
||||
instead of (g)nroff when building src/hugehelp.c
|
||||
|
||||
* curl_easy_cleanup() returns void, but curl_multi_cleanup() returns a
|
||||
CURLMcode. These should be changed to be the same.
|
||||
13. Test suite
|
||||
|
||||
* remove obsolete defines from curl/curl.h
|
||||
13.1 SSL tunnel
|
||||
|
||||
* make several functions use size_t instead of int in their APIs
|
||||
Make our own version of stunnel for simple port forwarding to enable HTTPS
|
||||
and FTP-SSL tests without the stunnel dependency, and it could allow us to
|
||||
provide test tools built with either OpenSSL or GnuTLS
|
||||
|
||||
* remove the following functions from the public API:
|
||||
curl_getenv
|
||||
curl_mprintf (and variations)
|
||||
curl_strequal
|
||||
curl_strnequal
|
||||
13.2 nicer lacking perl message
|
||||
|
||||
They will instead become curlx_ - alternatives. That makes the curl app
|
||||
still capable of building with them from source.
|
||||
If perl wasn't found by the configure script, don't attempt to run the tests
|
||||
but explain something nice why it doesn't.
|
||||
|
||||
* Remove support for CURLOPT_FAILONERROR, it has gotten too kludgy and weird
|
||||
internally. Let the app judge success or not for itself.
|
||||
13.3 more protocols supported
|
||||
|
||||
Extend the test suite to include more protocols. The telnet could just do ftp
|
||||
or http operations (for which we have test servers).
|
||||
|
||||
13.4 more platforms supported
|
||||
|
||||
Make the test suite work on more platforms. OpenBSD and Mac OS. Remove
|
||||
fork()s and it should become even more portable.
|
||||
|
||||
14. Next SONAME bump
|
||||
|
||||
14.1 http-style HEAD output for ftp
|
||||
|
||||
#undef CURL_FTP_HTTPSTYLE_HEAD in lib/ftp.c to remove the HTTP-style headers
|
||||
from being output in NOBODY requests over ftp
|
||||
|
||||
14.2 combine error codes
|
||||
|
||||
Combine some of the error codes to remove duplicates. The original
|
||||
numbering should not be changed, and the old identifiers would be
|
||||
macroed to the new ones in an CURL_NO_OLDIES section to help with
|
||||
backward compatibility.
|
||||
|
||||
Candidates for removal and their replacements:
|
||||
|
||||
CURLE_FILE_COULDNT_READ_FILE => CURLE_REMOTE_FILE_NOT_FOUND
|
||||
CURLE_FTP_COULDNT_RETR_FILE => CURLE_REMOTE_FILE_NOT_FOUND
|
||||
CURLE_FTP_COULDNT_USE_REST => CURLE_RANGE_ERROR
|
||||
CURLE_FUNCTION_NOT_FOUND => CURLE_FAILED_INIT
|
||||
CURLE_LDAP_INVALID_URL => CURLE_URL_MALFORMAT
|
||||
CURLE_TFTP_NOSUCHUSER => CURLE_TFTP_ILLEGAL
|
||||
CURLE_TFTP_NOTFOUND => CURLE_REMOTE_FILE_NOT_FOUND
|
||||
CURLE_TFTP_PERM => CURLE_REMOTE_ACCESS_DENIED
|
||||
|
||||
14.3 extend CURLOPT_SOCKOPTFUNCTION prototype
|
||||
|
||||
The current prototype only provides 'purpose' that tells what the
|
||||
connection/socket is for, but not any protocol or similar. It makes it hard
|
||||
for applications to differentiate on TCP vs UDP and even HTTP vs FTP and
|
||||
similar.
|
||||
|
||||
15. Next major release
|
||||
|
||||
15.1 cleanup return codes
|
||||
|
||||
curl_easy_cleanup() returns void, but curl_multi_cleanup() returns a
|
||||
CURLMcode. These should be changed to be the same.
|
||||
|
||||
15.2 remove obsolete defines
|
||||
|
||||
remove obsolete defines from curl/curl.h
|
||||
|
||||
15.3 size_t
|
||||
|
||||
make several functions use size_t instead of int in their APIs
|
||||
|
||||
15.4 remove several functions
|
||||
|
||||
remove the following functions from the public API:
|
||||
|
||||
curl_getenv
|
||||
|
||||
curl_mprintf (and variations)
|
||||
|
||||
curl_strequal
|
||||
|
||||
curl_strnequal
|
||||
|
||||
They will instead become curlx_ - alternatives. That makes the curl app
|
||||
still capable of building with them from source.
|
||||
|
||||
15.5 remove CURLOPT_FAILONERROR
|
||||
|
||||
Remove support for CURLOPT_FAILONERROR, it has gotten too kludgy and weird
|
||||
internally. Let the app judge success or not for itself.
|
||||
|
||||
15.6 remove CURLOPT_DNS_USE_GLOBAL_CACHE
|
||||
|
||||
Remove support for a global DNS cache. Anything global is silly, and we
|
||||
already offer the share interface for the same functionality but done
|
||||
"right".
|
||||
|
154
docs/curl.1
154
docs/curl.1
@@ -5,7 +5,7 @@
|
||||
.\" * | (__| |_| | _ <| |___
|
||||
.\" * \___|\___/|_| \_\_____|
|
||||
.\" *
|
||||
.\" * Copyright (C) 1998 - 2007, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
.\" * Copyright (C) 1998 - 2008, 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 "21 Sep 2007" "Curl 7.17.1" "Curl Manual"
|
||||
.TH curl 1 "5 Jan 2008" "Curl 7.18.0" "Curl Manual"
|
||||
.SH NAME
|
||||
curl \- transfer a URL
|
||||
.SH SYNOPSIS
|
||||
@@ -82,7 +82,7 @@ specified on a single command line and cannot be used between separate curl
|
||||
invokes.
|
||||
.SH "PROGRESS METER"
|
||||
curl normally displays a progress meter during operations, indicating amount
|
||||
of transfered data, transfer speeds and estimated time left etc.
|
||||
of transferred data, transfer speeds and estimated time left etc.
|
||||
|
||||
However, since curl displays data to the terminal by default, if you invoke
|
||||
curl to do an operation and it is about to write data to the terminal, it
|
||||
@@ -115,10 +115,10 @@ used.
|
||||
.IP "--anyauth"
|
||||
(HTTP) Tells curl to figure out authentication method by itself, and use the
|
||||
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.
|
||||
doing a request and checking the response-headers, thus possibly 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.
|
||||
|
||||
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
|
||||
@@ -224,43 +224,63 @@ To create remote directories when using FTP or SFTP, try
|
||||
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
|
||||
button. Note that the data is sent exactly as specified with no extra
|
||||
processing (with all newlines cut off). The data is expected to be
|
||||
\&"url-encoded". This will cause curl to pass the data to the server using the
|
||||
content-type application/x-www-form-urlencoded. Compare to \fI-F/--form\fP. If
|
||||
this option is used more than once on the same command line, the data pieces
|
||||
specified will be merged together with a separating &-letter. Thus, using '-d
|
||||
name=daniel -d skill=lousy' would generate a post chunk that looks like
|
||||
\&'name=daniel&skill=lousy'.
|
||||
(HTTP) Sends the specified data in a POST request to the HTTP server, in the
|
||||
same way that a browser does when a user has filled in an HTML form and
|
||||
presses the submit button. This will cause curl to pass the data to the server
|
||||
using the content-type application/x-www-form-urlencoded. Compare to
|
||||
\fI-F/--form\fP.
|
||||
|
||||
\fI-d/--data\fP is the same as \fI--data-ascii\fP. To post data purely binary,
|
||||
you should instead use the \fI--data-binary\fP option. To URL encode the value
|
||||
of a form field you may use \fI--data-urlencode\fP.
|
||||
|
||||
If any of these options is used more than once on the same command line, the
|
||||
data pieces specified will be merged together with a separating
|
||||
&-letter. Thus, using '-d name=daniel -d skill=lousy' would generate a post
|
||||
chunk that looks like \&'name=daniel&skill=lousy'.
|
||||
|
||||
If you start the data with the letter @, the rest should be a file name to
|
||||
read the data from, or - if you want curl to read the data from stdin. The
|
||||
contents of the file must already be url-encoded. Multiple files can also be
|
||||
specified. Posting data from a file named 'foobar' would thus be done with
|
||||
\fI--data\fP @foobar".
|
||||
|
||||
To post data purely binary, you should instead use the \fI--data-binary\fP
|
||||
option.
|
||||
|
||||
\fI-d/--data\fP is the same as \fI--data-ascii\fP.
|
||||
|
||||
If this option is used several times, the ones following the first will
|
||||
append data.
|
||||
.IP "--data-ascii <data>"
|
||||
(HTTP) This is an alias for the \fI-d/--data\fP option.
|
||||
|
||||
If this option is used several times, the ones following the first will
|
||||
append data.
|
||||
\fI--data @foobar\fP.
|
||||
.IP "--data-binary <data>"
|
||||
(HTTP) This posts data in a similar manner as \fI--data-ascii\fP does,
|
||||
although when using this option the entire context of the posted data is kept
|
||||
as-is. If you want to post a binary file without the strip-newlines feature of
|
||||
the \fI--data-ascii\fP option, this is for you.
|
||||
(HTTP) This posts data exactly as specified with no extra processing
|
||||
whatsoever.
|
||||
|
||||
If this option is used several times, the ones following the first will
|
||||
append data.
|
||||
If you start the data with the letter @, the rest should be a filename. Data
|
||||
is posted in a similar manner as \fI--data-ascii\fP does, except that newlines
|
||||
are preserved and conversions are never done.
|
||||
|
||||
If this option is used several times, the ones following the first will append
|
||||
data. As described in \fI-d/--data\fP.
|
||||
.IP "--data-urlencode <data>"
|
||||
(HTTP) This posts data, similar to the other --data options with the exception
|
||||
that this performs URL encoding. (Added in 7.18.0)
|
||||
|
||||
To be CGI compliant, the <data> part should begin with a \fIname\fP followed
|
||||
by a separator and a content specification. The <data> part can be passed to
|
||||
curl using one of the following syntaxes:
|
||||
.RS
|
||||
.IP "content"
|
||||
This will make curl URL encode the content and pass that on. Just be careful
|
||||
so that the content doesn't contain any = or @ letters, as that will then make
|
||||
the syntax match one of the other cases below!
|
||||
.IP "=content"
|
||||
This will make curl URL encode the content and pass that on. The preceding =
|
||||
letter is not included in the data.
|
||||
.IP "name=content"
|
||||
This will make curl URL encode the content part and pass that on. Note that
|
||||
the name part is expected to be URL encoded already.
|
||||
.IP "@filename"
|
||||
This will make curl load data from the given file (including any newlines),
|
||||
URL encode that data and pass it on in the POST.
|
||||
.IP "name@filename"
|
||||
This will make curl load data from the given file (including any newlines),
|
||||
URL encode that data and pass it on in the POST. The name part gets an equal
|
||||
sign appended, resulting in \fIname=urlencoded-file-content\fP. Note that the
|
||||
name is expected to be URL encoded already.
|
||||
.RE
|
||||
.IP "--digest"
|
||||
(HTTP) Enables HTTP Digest authentication. This is a authentication that
|
||||
prevents the password from being sent over the wire in clear text. Use this in
|
||||
@@ -546,7 +566,7 @@ See also the \fI-A/--user-agent\fP and \fI-e/--referer\fP options.
|
||||
This option can be used multiple times to add/replace/remove multiple headers.
|
||||
.IP "--hostpubmd5"
|
||||
Pass a string containing 32 hexadecimal digits. The string should be the 128
|
||||
bit MD5 cheksum of the remote host's public key, curl will refuse the
|
||||
bit MD5 checksum of the remote host's public key, curl will refuse the
|
||||
connection with the host unless the md5sums match. This option is only for SCP
|
||||
and SFTP transfers. (Added in 7.17.1)
|
||||
.IP "--ignore-content-length"
|
||||
@@ -592,6 +612,14 @@ See this online resource for further details:
|
||||
\fBhttp://curl.haxx.se/docs/sslcerts.html\fP
|
||||
|
||||
If this option is used twice, the second time will again disable it.
|
||||
.IP "--keepalive-time <seconds>"
|
||||
This option sets the time a connection needs to remain idle before sending
|
||||
keepalive probes and the time between individual keepalive probes. It is
|
||||
currently effective on operating systems offering the TCP_KEEPIDLE and
|
||||
TCP_KEEPINTVL socket options (meaning Linux, recent AIX, HP-UX and more). This
|
||||
option has no effect if \fI--no-keepalive\fP is used. (Added in 7.18.0)
|
||||
|
||||
If this option is used multiple times, the last occurrence sets the amount.
|
||||
.IP "--key <key>"
|
||||
(SSL/SSH) Private key file name. Allows you to provide your private key in this
|
||||
separate file.
|
||||
@@ -617,8 +645,12 @@ If this option is used several times, the last one will be used.
|
||||
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 enclosed within quotes. If the
|
||||
parameters must be specified on the same config file line, separated by
|
||||
white space, colon, the equals sign or any combination thereof (however,
|
||||
the preferred separator is the equals sign). If the parameter is to contain
|
||||
white spaces, the parameter must be enclosed within quotes. Within double
|
||||
quotes, the following escape sequences are available: \\\\, \\", \\t, \\n,
|
||||
\\r and \\v. A backlash preceding any other letter is ignored. If the
|
||||
first column of a config line is a '#' character, the rest of the line will be
|
||||
treated as a comment. Only write one option per physical line in the config
|
||||
file.
|
||||
@@ -673,7 +705,8 @@ NOTE: this does not properly support -F and the sending of multipart
|
||||
formposts, so in those cases the output program will be missing necessary
|
||||
calls to \fIcurl_formadd(3)\fP, and possibly more.
|
||||
|
||||
If this option is used several times, the last given file name will be used.
|
||||
If this option is used several times, the last given file name will be
|
||||
used. (Added in 7.16.1)
|
||||
.IP "--limit-rate <speed>"
|
||||
Specify the maximum transfer rate you want curl to use. This feature is useful
|
||||
if you have a limited pipe and you'd like your transfer not use your entire
|
||||
@@ -799,6 +832,11 @@ will output the data in chunks, not necessarily exactly when the data arrives.
|
||||
Using this option will disable that buffering.
|
||||
|
||||
If this option is used twice, the second will again switch on buffering.
|
||||
.IP "--no-keepalive"
|
||||
Disables the use of keepalive messages on the TCP connection, as by default
|
||||
curl enables them.
|
||||
|
||||
If this option is used twice, the second will again enable keepalive.
|
||||
.IP "--no-sessionid"
|
||||
(SSL) Disable curl's use of SSL session-ID caching. By default all transfers
|
||||
are done using the cache. Note that while nothing ever should get hurt by
|
||||
@@ -861,7 +899,7 @@ a redirection. This option is meaningful only when using \fI-L/--location\fP
|
||||
(Added in 7.17.1)
|
||||
.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
|
||||
the given proxy. This might 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
|
||||
@@ -948,9 +986,9 @@ This option can be used multiple times.
|
||||
random data. The data is used to seed the random engine for SSL connections.
|
||||
See also the \fI--egd-file\fP option.
|
||||
.IP "-r/--range <range>"
|
||||
(HTTP/FTP)
|
||||
Retrieve a byte range (i.e a partial document) from a HTTP/1.1 or FTP
|
||||
server. Ranges can be specified in a number of ways.
|
||||
(HTTP/FTP/FILE) Retrieve a byte range (i.e a partial document) from a
|
||||
HTTP/1.1, FTP server or a local FILE. Ranges can be specified in a number of
|
||||
ways.
|
||||
.RS
|
||||
.TP 10
|
||||
.B 0-499
|
||||
@@ -1049,9 +1087,28 @@ 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 "--socks4a <host[:port]>"
|
||||
Use the specified SOCKS4a proxy. If the port number is not specified, it is
|
||||
assumed at port 1080. (Added in 7.18.0)
|
||||
|
||||
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-hostname <host[:port]>"
|
||||
Use the specified SOCKS5 proxy (and let the proxy resolve the host name). If
|
||||
the port number is not specified, it is assumed at port 1080. (Added in
|
||||
7.18.0)
|
||||
|
||||
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 "--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)
|
||||
Use the specified SOCKS5 proxy - but resolve the host name locally. If the
|
||||
port number is not specified, it is assumed at port 1080.
|
||||
|
||||
This option overrides any previous use of \fI-x/--proxy\fP, as they are
|
||||
mutually exclusive.
|
||||
@@ -1128,6 +1185,9 @@ If this option is used several times, each occurrence will toggle it on/off.
|
||||
Specify user and password to use for server authentication. Overrides
|
||||
\fI-n/--netrc\fP and \fI--netrc-optional\fP.
|
||||
|
||||
If you just give the user name (without entering a colon) curl will prompt for
|
||||
a password.
|
||||
|
||||
If you use an SSPI-enabled curl binary and do NTLM authentication, you can
|
||||
force curl to pick up the user name and password from your environment by
|
||||
simply specifying a single colon with this option: "-u :".
|
||||
|
@@ -18,6 +18,9 @@
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <curl/multi.h>
|
||||
#ifdef WIN32
|
||||
#include <windows.h>
|
||||
#endif
|
||||
|
||||
static const char *urls[] = {
|
||||
"http://www.microsoft.com",
|
||||
@@ -138,7 +141,11 @@ int main(void)
|
||||
L = 100;
|
||||
|
||||
if (M == -1) {
|
||||
#ifdef WIN32
|
||||
Sleep(L);
|
||||
#else
|
||||
sleep(L / 1000);
|
||||
#endif
|
||||
} else {
|
||||
T.tv_sec = L/1000;
|
||||
T.tv_usec = (L%1000)*1000;
|
||||
|
@@ -9,7 +9,13 @@ EXTRA_DIST = README Makefile.example makefile.dj $(COMPLICATED_EXAMPLES)
|
||||
INCLUDES = -I$(top_srcdir)/include
|
||||
|
||||
LIBDIR = $(top_builddir)/lib
|
||||
CPPFLAGS = -DCURL_NO_OLDIES
|
||||
|
||||
if STATICLIB
|
||||
# we need this define when building with a static lib on Windows
|
||||
STATICCPPFLAGS = -DCURL_STATICLIB
|
||||
endif
|
||||
|
||||
CPPFLAGS = -DCURL_NO_OLDIES $(STATICCPPFLAGS)
|
||||
|
||||
# Dependencies
|
||||
LDADD = $(LIBDIR)/libcurl.la
|
||||
|
@@ -98,5 +98,8 @@ int main(int argc, char **argv)
|
||||
if(chunk.memory)
|
||||
free(chunk.memory);
|
||||
|
||||
/* we're done with libcurl, so clean it up */
|
||||
curl_global_cleanup();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
217
docs/examples/smooth-gtk-thread.c
Normal file
217
docs/examples/smooth-gtk-thread.c
Normal file
@@ -0,0 +1,217 @@
|
||||
/*****************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
* / __| | | | |_) | |
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
* This is a multi threaded application that uses a progress bar to show
|
||||
* status. It uses Gtk+ to make a smooth pulse.
|
||||
*
|
||||
* Written by Jud Bishop after studying the other examples provided with
|
||||
* libcurl.
|
||||
*
|
||||
* To compile (on a single line):
|
||||
* gcc -ggdb `pkg-config --cflags --libs gtk+-2.0` -lcurl -lssl -lcrypto
|
||||
* -lgthread-2.0 -dl smooth-gtk-thread.c -o smooth-gtk-thread
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <gtk/gtk.h>
|
||||
#include <glib.h>
|
||||
#include <unistd.h>
|
||||
#include <pthread.h>
|
||||
|
||||
#include <curl/curl.h>
|
||||
#include <curl/types.h> /* new for v7 */
|
||||
#include <curl/easy.h> /* new for v7 */
|
||||
|
||||
#define NUMT 4
|
||||
|
||||
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
|
||||
int j = 0;
|
||||
gint num_urls = 9; /* Just make sure this is less than urls[]*/
|
||||
char *urls[]= {
|
||||
"90022",
|
||||
"90023",
|
||||
"90024",
|
||||
"90025",
|
||||
"90026",
|
||||
"90027",
|
||||
"90028",
|
||||
"90029",
|
||||
"90030"
|
||||
};
|
||||
|
||||
size_t write_file(void *ptr, size_t size, size_t nmemb, FILE *stream)
|
||||
{
|
||||
/* printf("write_file\n"); */
|
||||
return fwrite(ptr, size, nmemb, stream);
|
||||
}
|
||||
|
||||
/* http://xoap.weather.com/weather/local/46214?cc=*&dayf=5&unit=i */
|
||||
void *pull_one_url(void *NaN)
|
||||
{
|
||||
CURL *curl;
|
||||
CURLcode res;
|
||||
gchar *http;
|
||||
FILE *outfile;
|
||||
gint i;
|
||||
|
||||
/* Stop threads from entering unless j is incremented */
|
||||
pthread_mutex_lock(&lock);
|
||||
while ( j < num_urls )
|
||||
{
|
||||
printf("j = %d\n", j);
|
||||
|
||||
http =
|
||||
g_strdup_printf("xoap.weather.com/weather/local/%s?cc=*&dayf=5&unit=i\n",
|
||||
urls[j]);
|
||||
|
||||
printf( "http %s", http );
|
||||
|
||||
curl = curl_easy_init();
|
||||
if(curl)
|
||||
{
|
||||
|
||||
outfile = fopen(urls[j], "w");
|
||||
/* printf("fopen\n"); */
|
||||
|
||||
/* Set the URL and transfer type */
|
||||
curl_easy_setopt(curl, CURLOPT_URL, http);
|
||||
|
||||
/* Write to the file */
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEDATA, outfile);
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_file);
|
||||
|
||||
j++; /* critical line */
|
||||
pthread_mutex_unlock(&lock);
|
||||
|
||||
res = curl_easy_perform(curl);
|
||||
|
||||
fclose(outfile);
|
||||
printf("fclose\n");
|
||||
|
||||
curl_easy_cleanup(curl);
|
||||
}
|
||||
g_free (http);
|
||||
|
||||
/* Adds more latency, testing the mutex.*/
|
||||
sleep(1);
|
||||
|
||||
} /* end while */
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
gboolean pulse_bar(gpointer data)
|
||||
{
|
||||
gdk_threads_enter();
|
||||
gtk_progress_bar_pulse (GTK_PROGRESS_BAR (data));
|
||||
gdk_threads_leave();
|
||||
|
||||
/* Return true so the function will be called again;
|
||||
* returning false removes this timeout function.
|
||||
*/
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void *create_thread(void *progress_bar)
|
||||
{
|
||||
pthread_t tid[NUMT];
|
||||
int i;
|
||||
int error;
|
||||
|
||||
/* Make sure I don't create more threads than urls. */
|
||||
for(i=0; i < NUMT && i < num_urls ; i++) {
|
||||
error = pthread_create(&tid[i],
|
||||
NULL, /* default attributes please */
|
||||
pull_one_url,
|
||||
NULL);
|
||||
if(0 != error)
|
||||
fprintf(stderr, "Couldn't run thread number %d, errno %d\n", i, error);
|
||||
else
|
||||
fprintf(stderr, "Thread %d, gets %s\n", i, urls[i]);
|
||||
}
|
||||
|
||||
/* Wait for all threads to terminate. */
|
||||
for(i=0; i < NUMT && i < num_urls; i++) {
|
||||
error = pthread_join(tid[i], NULL);
|
||||
fprintf(stderr, "Thread %d terminated\n", i);
|
||||
}
|
||||
|
||||
/* This stops the pulsing if you have it turned on in the progress bar
|
||||
section */
|
||||
g_source_remove(GPOINTER_TO_INT(g_object_get_data(G_OBJECT(progress_bar),
|
||||
"pulse_id")));
|
||||
|
||||
/* This destroys the progress bar */
|
||||
gtk_widget_destroy(progress_bar);
|
||||
|
||||
/* [Un]Comment this out to kill the program rather than pushing close. */
|
||||
/* gtk_main_quit(); */
|
||||
|
||||
|
||||
return NULL;
|
||||
|
||||
}
|
||||
|
||||
static gboolean cb_delete(GtkWidget *window, gpointer data)
|
||||
{
|
||||
gtk_main_quit();
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
GtkWidget *top_window, *outside_frame, *inside_frame, *progress_bar;
|
||||
GtkAdjustment *adj;
|
||||
|
||||
/* Init thread */
|
||||
g_thread_init(NULL);
|
||||
gdk_threads_init ();
|
||||
gdk_threads_enter ();
|
||||
|
||||
gtk_init(&argc, &argv);
|
||||
|
||||
/* Base window */
|
||||
top_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
|
||||
|
||||
/* Frame */
|
||||
outside_frame = gtk_frame_new(NULL);
|
||||
gtk_frame_set_shadow_type(GTK_FRAME(outside_frame), GTK_SHADOW_OUT);
|
||||
gtk_container_add(GTK_CONTAINER(top_window), outside_frame);
|
||||
|
||||
/* Frame */
|
||||
inside_frame = gtk_frame_new(NULL);
|
||||
gtk_frame_set_shadow_type(GTK_FRAME(inside_frame), GTK_SHADOW_IN);
|
||||
gtk_container_set_border_width(GTK_CONTAINER(inside_frame), 5);
|
||||
gtk_container_add(GTK_CONTAINER(outside_frame), inside_frame);
|
||||
|
||||
/* Progress bar */
|
||||
progress_bar = gtk_progress_bar_new();
|
||||
gtk_progress_bar_pulse (GTK_PROGRESS_BAR (progress_bar));
|
||||
/* Make uniform pulsing */
|
||||
gint pulse_ref = g_timeout_add (300, pulse_bar, progress_bar);
|
||||
g_object_set_data(G_OBJECT(progress_bar), "pulse_id",
|
||||
GINT_TO_POINTER(pulse_ref));
|
||||
gtk_container_add(GTK_CONTAINER(inside_frame), progress_bar);
|
||||
|
||||
gtk_widget_show_all(top_window);
|
||||
printf("gtk_widget_show_all\n");
|
||||
|
||||
g_signal_connect(G_OBJECT (top_window), "delete-event",
|
||||
G_CALLBACK(cb_delete), NULL);
|
||||
|
||||
if (!g_thread_create(&create_thread, progress_bar, FALSE, NULL) != 0)
|
||||
g_warning("can't create the thread");
|
||||
|
||||
gtk_main();
|
||||
gdk_threads_leave();
|
||||
printf("gdk_threads_leave\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@@ -18,7 +18,8 @@ man_MANS = curl_easy_cleanup.3 curl_easy_getinfo.3 curl_easy_init.3 \
|
||||
curl_multi_strerror.3 curl_share_strerror.3 curl_global_init_mem.3 \
|
||||
libcurl-tutorial.3 curl_easy_reset.3 curl_easy_escape.3 \
|
||||
curl_easy_unescape.3 curl_multi_setopt.3 curl_multi_socket.3 \
|
||||
curl_multi_timeout.3 curl_formget.3 curl_multi_assign.3
|
||||
curl_multi_timeout.3 curl_formget.3 curl_multi_assign.3 \
|
||||
curl_easy_pause.3
|
||||
|
||||
HTMLPAGES = curl_easy_cleanup.html curl_easy_getinfo.html \
|
||||
curl_easy_init.html curl_easy_perform.html curl_easy_setopt.html \
|
||||
@@ -36,7 +37,7 @@ HTMLPAGES = curl_easy_cleanup.html curl_easy_getinfo.html \
|
||||
curl_share_strerror.html curl_global_init_mem.html libcurl-tutorial.html \
|
||||
curl_easy_reset.html curl_easy_escape.html curl_easy_unescape.html \
|
||||
curl_multi_setopt.html curl_multi_socket.html curl_multi_timeout.html \
|
||||
curl_formget.html curl_multi_assign.html
|
||||
curl_formget.html curl_multi_assign.html curl_easy_pause.html
|
||||
|
||||
PDFPAGES = curl_easy_cleanup.pdf curl_easy_getinfo.pdf curl_easy_init.pdf \
|
||||
curl_easy_perform.pdf curl_easy_setopt.pdf curl_easy_duphandle.pdf \
|
||||
@@ -53,7 +54,7 @@ PDFPAGES = curl_easy_cleanup.pdf curl_easy_getinfo.pdf curl_easy_init.pdf \
|
||||
curl_share_strerror.pdf curl_global_init_mem.pdf libcurl-tutorial.pdf \
|
||||
curl_easy_reset.pdf curl_easy_escape.pdf curl_easy_unescape.pdf \
|
||||
curl_multi_setopt.pdf curl_multi_socket.pdf curl_multi_timeout.pdf \
|
||||
curl_formget.pdf curl_multi_assign.pdf
|
||||
curl_formget.pdf curl_multi_assign.pdf curl_easy_pause.pdf
|
||||
|
||||
CLEANFILES = $(HTMLPAGES) $(PDFPAGES)
|
||||
|
||||
|
63
docs/libcurl/curl_easy_pause.3
Normal file
63
docs/libcurl/curl_easy_pause.3
Normal file
@@ -0,0 +1,63 @@
|
||||
.\" $Id$
|
||||
.\"
|
||||
.TH curl_easy_pause 3 "17 Dec 2007" "libcurl 7.18.0" "libcurl Manual"
|
||||
.SH NAME
|
||||
curl_easy_pause - pause and unpause a connection
|
||||
.SH SYNOPSIS
|
||||
.B #include <curl/curl.h>
|
||||
|
||||
.BI "CURLcode curl_easy_pause(CURL *"handle ", int "bitmask " );"
|
||||
|
||||
.SH DESCRIPTION
|
||||
Using this function, you can explicitly mark a running connection to get
|
||||
paused, and you can unpause a connection that was previously paused.
|
||||
|
||||
A connection can made to pause by using this function or by letting the read
|
||||
or the write callbacks return the proper magic return code
|
||||
(\fICURL_READFUNC_PAUSE\fP and \fICURL_WRITEFUNC_PAUSE\fP).
|
||||
|
||||
NOTE: while it may feel tempting, take care and notice that you cannot call
|
||||
this function from another thread.
|
||||
|
||||
When this function is called to unpause reading, the chance is high that you
|
||||
will get your write callback called before this function returns.
|
||||
|
||||
The \fBhandle\fP argument is of course identifying the handle that operates on
|
||||
the connection you want to pause or unpause.
|
||||
|
||||
The \fBbitmask\fP argument is a set of bits that sets the new state of the
|
||||
connection. The following bits can be used:
|
||||
.IP CURLPAUSE_RECV
|
||||
Pause receiving data. There will be no data received on this conneciton until
|
||||
this function is called again without this bit set. Thus, the write callback
|
||||
(\fICURLOPT_WRITEFUNCTION\fP) won't be called.
|
||||
.IP CURLPAUSE_SEND
|
||||
Pause sending data. There will be no data sent on this connection until this
|
||||
function is called again without this bit set. Thus, the read callback
|
||||
(\fICURLOPT_READFUNCTION\fP) won't be called.
|
||||
.IP CURLPAUSE_ALL
|
||||
Convenience define that pauses both directions.
|
||||
.IP CURLPAUSE_CONT
|
||||
Convenience define that unpauses both directions
|
||||
.SH RETURN VALUE
|
||||
CURLE_OK (zero) means that the option was set properly, and a non-zero return
|
||||
code means something wrong occurred after the new state was set. See the
|
||||
\fIlibcurl-errors(3)\fP man page for the full list with descriptions.
|
||||
.SH AVAILABILITY
|
||||
This function was added in libcurl 7.18.0. Before this version, there was no
|
||||
explicit support for pausing transfers.
|
||||
.SH "MEMORY USE"
|
||||
When pausing a read by returning the magic return code from a write callback,
|
||||
the read data is already in libcurl's internal buffers so it'll have to keep
|
||||
it in an allocated buffer until the reading is again unpaused using this
|
||||
function.
|
||||
|
||||
If the downloaded data is compressed and is asked to get uncompressed
|
||||
automatially on download, libcurl will continue to uncompress the entire
|
||||
downloaded chunk and it will cache the data uncompressed. This has the side-
|
||||
effect that if you download something that is compressed a lot, it can result
|
||||
in a very large data amount needing to be allocated to save the data during
|
||||
the pause. This said, you should probably consider not using paused reading if
|
||||
you allow libcurl to uncompress data automatically.
|
||||
.SH "SEE ALSO"
|
||||
.BR curl_easy_cleanup "(3), " curl_easy_reset "(3)"
|
@@ -5,7 +5,7 @@
|
||||
.\" * | (__| |_| | _ <| |___
|
||||
.\" * \___|\___/|_| \_\_____|
|
||||
.\" *
|
||||
.\" * Copyright (C) 1998 - 2007, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
.\" * Copyright (C) 1998 - 2008, 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_easy_setopt 3 "30 Aug 2007" "libcurl 7.17.0" "libcurl Manual"
|
||||
.TH curl_easy_setopt 3 "5 Jan 2008" "libcurl 7.18.0" "libcurl Manual"
|
||||
.SH NAME
|
||||
curl_easy_setopt \- set options for a curl easy handle
|
||||
.SH SYNOPSIS
|
||||
@@ -95,6 +95,10 @@ of bytes actually taken care of. If that amount differs from the amount passed
|
||||
to your function, it'll signal an error to the library and it will abort the
|
||||
transfer and return \fICURLE_WRITE_ERROR\fP.
|
||||
|
||||
From 7.18.0, the function can return CURL_WRITEFUNC_PAUSE which then will
|
||||
cause writing to this connection to become paused. See
|
||||
\fIcurl_easy_pause(3)\fP for further details.
|
||||
|
||||
This function may be called with zero bytes data if the transfered file is
|
||||
empty.
|
||||
|
||||
@@ -142,6 +146,10 @@ The read callback may return \fICURL_READFUNC_ABORT\fP to stop the current
|
||||
operation immediately, resulting in a \fICURLE_ABORTED_BY_CALLBACK\fP error
|
||||
code from the transfer (Added in 7.12.1)
|
||||
|
||||
From 7.18.0, the function can return CURL_READFUNC_PAUSE which then will cause
|
||||
reading from this connection to become paused. See \fIcurl_easy_pause(3)\fP
|
||||
for further details.
|
||||
|
||||
If you set the callback pointer to NULL, or doesn't set it at all, the default
|
||||
internal read function will be used. It is simply doing an fread() on the FILE
|
||||
* stream set with \fICURLOPT_READDATA\fP.
|
||||
@@ -163,11 +171,32 @@ something special I/O-related needs to be done that the library can't do by
|
||||
itself. For now, rewinding the read data stream is the only action it can
|
||||
request. The rewinding of the read data stream may be necessary when doing a
|
||||
HTTP PUT or POST with a multi-pass authentication method. (Option added in
|
||||
7.12.3)
|
||||
7.12.3).
|
||||
|
||||
Use \fICURLOPT_SEEKFUNCTION\fP instead to provide seeking!
|
||||
.IP CURLOPT_IOCTLDATA
|
||||
Pass a pointer that will be untouched by libcurl and passed as the 3rd
|
||||
argument in the ioctl callback set with \fICURLOPT_IOCTLFUNCTION\fP. (Option
|
||||
added in 7.12.3)
|
||||
.IP CURLOPT_SEEKFUNCTION
|
||||
Function pointer that should match the following prototype: \fIint
|
||||
function(void *instream, curl_off_t offset, int origin);\fP This function gets
|
||||
called by libcurl to seek to a certain position in the input stream and can be
|
||||
used to fast forward a file in a resumed upload (instead of reading all
|
||||
uploaded bytes with the normal read function/callback). It is also called to
|
||||
rewind a stream when doing a HTTP PUT or POST with a multi-pass authentication
|
||||
method. The function shall work like "fseek" or "lseek" and accepted SEEK_SET,
|
||||
SEEK_CUR and SEEK_END as argument for origin, although (in 7.18.0) libcurl
|
||||
only passes SEEK_SET. The callback must return 0 on success as returning
|
||||
non-zero will cause the upload operation to fail.
|
||||
|
||||
If you forward the input arguments directly to "fseek" or "lseek", note that
|
||||
the data type for \fIoffset\fP is not the same as defined for curl_off_t on
|
||||
many systems! (Option added in 7.18.0)
|
||||
.IP CURLOPT_SEEKDATA
|
||||
Data pointer to pass to the file read function. If you use the
|
||||
\fICURLOPT_SEEKFUNCTION\fP option, this is the pointer you'll get as input. If
|
||||
you don't specify a seek callback, NULL is passed. (Option added in 7.18.0)
|
||||
.IP CURLOPT_SOCKOPTFUNCTION
|
||||
Function pointer that should match the \fIcurl_sockopt_callback\fP prototype
|
||||
found in \fI<curl/curl.h>\fP. This function gets called by libcurl after the
|
||||
@@ -430,13 +459,21 @@ 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, \fICURLPROXY_SOCKS4\fP (added in 7.15.2)
|
||||
\fICURLPROXY_SOCKS5\fP. The HTTP type is default. (Added in 7.10)
|
||||
this are \fICURLPROXY_HTTP\fP, \fICURLPROXY_SOCKS4\fP (added in 7.15.2),
|
||||
\fICURLPROXY_SOCKS5\fP, \fICURLPROXY_SOCKS4A\fP (added in 7.18.0) and
|
||||
\fICURLPROXY_SOCKS5_HOSTNAME\fP (added in 7.18.0). 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
|
||||
and to tunnel through it. If you don't know what this means, you probably
|
||||
don't want this tunneling option.
|
||||
.IP CURLOPT_SOCKS5_RESOLVE_LOCAL
|
||||
Set the parameter to 1 to get the library to resolve the host name locally
|
||||
instead of passing it to the proxy to resolve, when using a SOCKS5 proxy.
|
||||
|
||||
Note that libcurl before 7.18.0 always resolved the host name locally even
|
||||
when SOCKS5 was used. (Added in 7.18.0)
|
||||
.IP CURLOPT_INTERFACE
|
||||
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
|
||||
@@ -670,7 +707,9 @@ and \fICURLOPT_READDATA\fP options but then you must make sure to not set
|
||||
\fICURLOPT_POSTFIELDS\fP to anything but NULL. When providing data with a
|
||||
callback, you must transmit it using chunked transfer-encoding or you must set
|
||||
the size of the data with the \fICURLOPT_POSTFIELDSIZE\fP or
|
||||
\fICURLOPT_POSTFIELDSIZE_LARGE\fP option.
|
||||
\fICURLOPT_POSTFIELDSIZE_LARGE\fP option. To enable chunked encoding, you
|
||||
simply pass in the appropriate Transfer-Encoding header, see the
|
||||
post-callback.c example.
|
||||
|
||||
You can override the default POST Content-Type: header by setting your own
|
||||
with \fICURLOPT_HTTPHEADER\fP.
|
||||
@@ -1064,6 +1103,13 @@ or similar.
|
||||
libcurl does not do a complete ASCII conversion when doing ASCII transfers
|
||||
over FTP. This is a known limitation/flaw that nobody has rectified. libcurl
|
||||
simply sets the mode to ascii and performs a standard transfer.
|
||||
.IP CURLOPT_PROXY_TRANSFER_MODE
|
||||
Pass a long. If the value is set to 1 (one), it tells libcurl to set the
|
||||
transfer mode (binary or ASCII) for FTP transfers done via an HTTP proxy, by
|
||||
appending ;type=a or ;type=i to the URL. Without this setting, or it being
|
||||
set to 0 (zero, the default), \fICURLOPT_TRANSFERTEXT\fP has no effect when
|
||||
doing FTP via a proxy. Beware that not all proxies support this feature.
|
||||
(Added in 7.18.0)
|
||||
.IP CURLOPT_CRLF
|
||||
Convert Unix newlines to CRLF newlines on transfers.
|
||||
.IP CURLOPT_RANGE
|
||||
@@ -1073,6 +1119,8 @@ transfers also support several intervals, separated with commas as in
|
||||
\fI"X-Y,N-M"\fP. Using this kind of multiple intervals will cause the HTTP
|
||||
server to send the response document in pieces (using standard MIME separation
|
||||
techniques). Pass a NULL to this option to disable the use of ranges.
|
||||
|
||||
Ranges work on HTTP, FTP and FILE (since 7.18.0) transfers only.
|
||||
.IP CURLOPT_RESUME_FROM
|
||||
Pass a long as parameter. It contains the offset in number of bytes that you
|
||||
want the transfer to start from. Set this option to 0 to make the transfer
|
||||
@@ -1491,6 +1539,14 @@ this curl handle use the data from the shared handle instead of keeping the
|
||||
data to itself. This enables several curl handles to share data. If the curl
|
||||
handles are used simultaneously, you \fBMUST\fP use the locking methods in the
|
||||
share handle. See \fIcurl_share_setopt(3)\fP for details.
|
||||
|
||||
If you add a share that is set to share cookies, your easy handle will use
|
||||
that cookie cache and get the cookie engine enabled. If you unshare an object
|
||||
that were using cookies (or change to another object that doesn't share
|
||||
cookies), the easy handle will get its cookie engine disabled.
|
||||
|
||||
Data that the share object is not set to share will be dealt with the usual
|
||||
way, as if no share was used.
|
||||
.IP CURLOPT_NEW_FILE_PERMS
|
||||
Pass a long as a parameter, containing the value of the permissions that will
|
||||
be assigned to newly created files on the remote server. The default value is
|
||||
|
@@ -47,10 +47,11 @@ changes. The timeout value is at what latest time the application should call
|
||||
one of the \&"performing" functions of the multi interface
|
||||
(\fIcurl_multi_socket(3)\fP, \fIcurl_multi_socket_all(3)\fP and
|
||||
\fIcurl_multi_perform(3)\fP) - to allow libcurl to keep timeouts and retries
|
||||
etc to work. Libcurl attempts to limit calling this only when the fixed future
|
||||
timeout time actually change. See also \fICURLMOPT_TIMERDATA\fP. This callback
|
||||
can be used instead of, or in addition to, \fIcurl_multi_timeout(3)\fP. (Added
|
||||
in 7.16.0)
|
||||
etc to work. A timeout value of -1 means that there is no timeout at all, and
|
||||
0 means that the timeout is already reached. Libcurl attempts to limit calling
|
||||
this only when the fixed future timeout time actually change. See also
|
||||
\fICURLMOPT_TIMERDATA\fP. This callback can be used instead of, or in addition
|
||||
to, \fIcurl_multi_timeout(3)\fP. (Added in 7.16.0)
|
||||
.IP CURLMOPT_TIMERDATA
|
||||
Pass a pointer to whatever you want passed to the
|
||||
\fBcurl_multi_timer_callback\fP's third argument, the userp pointer. This is
|
||||
|
@@ -23,6 +23,10 @@ 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.
|
||||
|
||||
Note: if libcurl returns a -1 timeout here, it just means that libcurl
|
||||
currently has no stored timeout value. You must not wait too long (more than a
|
||||
few seconds perhaps) before you call curl_multi_perform() again.
|
||||
.SH "RETURN VALUE"
|
||||
The standard CURLMcode for multi interface error codes.
|
||||
.SH "TYPICAL USAGE"
|
||||
|
@@ -7,7 +7,7 @@
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2007, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
* Copyright (C) 1998 - 2008, 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
|
||||
@@ -29,6 +29,14 @@
|
||||
|
||||
#include "curlver.h" /* the libcurl version defines */
|
||||
|
||||
/*
|
||||
* Define WIN32 when build target is Win32 API
|
||||
*/
|
||||
|
||||
#if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32)
|
||||
#define WIN32
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include <limits.h>
|
||||
|
||||
@@ -41,12 +49,42 @@
|
||||
# include <time.h>
|
||||
#endif /* defined (vms) */
|
||||
|
||||
typedef void CURL;
|
||||
#if defined(WIN32) && !defined(_WIN32_WCE) && !defined(__GNUC__) && \
|
||||
!defined(__CYGWIN__) || defined(__MINGW32__)
|
||||
#if !(defined(_WINSOCKAPI_) || defined(_WINSOCK_H))
|
||||
/* The check above prevents the winsock2 inclusion if winsock.h already was
|
||||
included, since they can't co-exist without problems */
|
||||
#include <winsock2.h>
|
||||
#include <ws2tcpip.h>
|
||||
#endif
|
||||
#else
|
||||
|
||||
/* 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(__NOVELL_LIBC__) || defined(__NetBSD__) || defined(__minix)
|
||||
#include <sys/select.h>
|
||||
#endif
|
||||
|
||||
#ifndef _WIN32_WCE
|
||||
#include <sys/socket.h>
|
||||
#endif
|
||||
#ifndef __WATCOMC__
|
||||
#include <sys/time.h>
|
||||
#endif
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
|
||||
#ifdef __BEOS__
|
||||
#include <support/SupportDefs.h>
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef void CURL;
|
||||
|
||||
/*
|
||||
* Decorate exportable functions for Win32 DLL linking.
|
||||
* This avoids using a .def file for building libcurl.dll.
|
||||
@@ -139,38 +177,6 @@ extern "C" {
|
||||
#undef FILESIZEBITS
|
||||
#endif
|
||||
|
||||
#if defined(_WIN32) && !defined(WIN32)
|
||||
/* Chris Lewis mentioned that he doesn't get WIN32 defined, only _WIN32 so we
|
||||
make this adjustment to catch this. */
|
||||
#define WIN32 1
|
||||
#endif
|
||||
|
||||
#if defined(WIN32) && !defined(_WIN32_WCE) && !defined(__GNUC__) && \
|
||||
!defined(__CYGWIN__) || defined(__MINGW32__)
|
||||
#if !(defined(_WINSOCKAPI_) || defined(_WINSOCK_H))
|
||||
/* The check above prevents the winsock2 inclusion if winsock.h already was
|
||||
included, since they can't co-exist without problems */
|
||||
#include <winsock2.h>
|
||||
#include <ws2tcpip.h>
|
||||
#endif
|
||||
#else
|
||||
|
||||
/* 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(__NOVELL_LIBC__) || defined(__NetBSD__) || defined(__minix)
|
||||
#include <sys/select.h>
|
||||
#endif
|
||||
|
||||
#ifndef _WIN32_WCE
|
||||
#include <sys/socket.h>
|
||||
#endif
|
||||
#ifndef __WATCOMC__
|
||||
#include <sys/time.h>
|
||||
#endif
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
|
||||
#ifndef curl_socket_typedef
|
||||
/* socket typedef */
|
||||
#ifdef WIN32
|
||||
@@ -224,7 +230,9 @@ typedef int (*curl_progress_callback)(void *clientp,
|
||||
time for those who feel adventurous. */
|
||||
#define CURL_MAX_WRITE_SIZE 16384
|
||||
#endif
|
||||
|
||||
/* This is a magic return code for the write callback that, when returned,
|
||||
will signal libcurl to pause receving on the current transfer. */
|
||||
#define CURL_WRITEFUNC_PAUSE 0x10000001
|
||||
typedef size_t (*curl_write_callback)(char *buffer,
|
||||
size_t size,
|
||||
size_t nitems,
|
||||
@@ -233,6 +241,13 @@ typedef size_t (*curl_write_callback)(char *buffer,
|
||||
/* This is a return code for the read callback that, when returned, will
|
||||
signal libcurl to immediately abort the current transfer. */
|
||||
#define CURL_READFUNC_ABORT 0x10000000
|
||||
/* This is a return code for the read callback that, when returned, will
|
||||
signal libcurl to pause sending data on the current transfer. */
|
||||
#define CURL_READFUNC_PAUSE 0x10000001
|
||||
typedef int (*curl_seek_callback)(void *instream,
|
||||
curl_off_t offset,
|
||||
int origin); /* 'whence' */
|
||||
|
||||
typedef size_t (*curl_read_callback)(char *buffer,
|
||||
size_t size,
|
||||
size_t nitems,
|
||||
@@ -251,7 +266,9 @@ struct curl_sockaddr {
|
||||
int family;
|
||||
int socktype;
|
||||
int protocol;
|
||||
socklen_t addrlen;
|
||||
unsigned int addrlen; /* addrlen was a socklen_t type before 7.18.0 but it
|
||||
turned really ugly and painful on the systems that
|
||||
lack this type */
|
||||
struct sockaddr addr;
|
||||
};
|
||||
|
||||
@@ -487,10 +504,15 @@ typedef CURLcode (*curl_ssl_ctx_callback)(CURL *curl, /* easy handle */
|
||||
void *userptr);
|
||||
|
||||
typedef enum {
|
||||
CURLPROXY_HTTP = 0,
|
||||
CURLPROXY_SOCKS4 = 4,
|
||||
CURLPROXY_SOCKS5 = 5
|
||||
} curl_proxytype;
|
||||
CURLPROXY_HTTP = 0, /* added in 7.10 */
|
||||
CURLPROXY_SOCKS4 = 4, /* support added in 7.15.2, enum existed already
|
||||
in 7.10 */
|
||||
CURLPROXY_SOCKS5 = 5, /* added in 7.10 */
|
||||
CURLPROXY_SOCKS4A = 6, /* added in 7.18.0 */
|
||||
CURLPROXY_SOCKS5_HOSTNAME = 7 /* Use the SOCKS5 protocol but pass along the
|
||||
host name rather than the IP address. added
|
||||
in 7.18.0 */
|
||||
} curl_proxytype; /* this enum was added in 7.10 */
|
||||
|
||||
#define CURLAUTH_NONE 0 /* nothing */
|
||||
#define CURLAUTH_BASIC (1<<0) /* Basic (default) */
|
||||
@@ -935,7 +957,7 @@ typedef enum {
|
||||
CINIT(SHARE, OBJECTPOINT, 100),
|
||||
|
||||
/* indicates type of proxy. accepted values are CURLPROXY_HTTP (default),
|
||||
CURLPROXY_SOCKS4 and CURLPROXY_SOCKS5. */
|
||||
CURLPROXY_SOCKS4, CURLPROXY_SOCKS4A and CURLPROXY_SOCKS5. */
|
||||
CINIT(PROXYTYPE, LONG, 101),
|
||||
|
||||
/* Set the Accept-Encoding string. Use this to tell a server you would like
|
||||
@@ -1159,6 +1181,13 @@ typedef enum {
|
||||
/* POST volatile input fields. */
|
||||
CINIT(COPYPOSTFIELDS, OBJECTPOINT, 165),
|
||||
|
||||
/* set transfer mode (;type=<a|i>) when doing FTP via an HTTP proxy */
|
||||
CINIT(PROXY_TRANSFER_MODE, LONG, 166),
|
||||
|
||||
/* Callback function for seeking in the input stream */
|
||||
CINIT(SEEKFUNCTION, FUNCTIONPOINT, 167),
|
||||
CINIT(SEEKDATA, OBJECTPOINT, 168),
|
||||
|
||||
CURLOPT_LASTENTRY /* the last unused */
|
||||
} CURLoption;
|
||||
|
||||
@@ -1241,10 +1270,6 @@ typedef enum {
|
||||
CURL_TIMECOND_LAST
|
||||
} curl_TimeCond;
|
||||
|
||||
#ifdef __BEOS__
|
||||
#include <support/SupportDefs.h>
|
||||
#endif
|
||||
|
||||
|
||||
/* curl_strequal() and curl_strnequal() are subject for removal in a future
|
||||
libcurl, see lib/README.curlx for details */
|
||||
@@ -1737,6 +1762,26 @@ CURL_EXTERN const char *curl_easy_strerror(CURLcode);
|
||||
*/
|
||||
CURL_EXTERN const char *curl_share_strerror(CURLSHcode);
|
||||
|
||||
/*
|
||||
* NAME curl_easy_pause()
|
||||
*
|
||||
* DESCRIPTION
|
||||
*
|
||||
* The curl_easy_pause function pauses or unpauses transfers. Select the new
|
||||
* state by setting the bitmask, use the convenience defines below.
|
||||
*
|
||||
*/
|
||||
CURL_EXTERN CURLcode curl_easy_pause(CURL *handle, int bitmask);
|
||||
|
||||
#define CURLPAUSE_RECV (1<<0)
|
||||
#define CURLPAUSE_RECV_CONT (0)
|
||||
|
||||
#define CURLPAUSE_SEND (1<<2)
|
||||
#define CURLPAUSE_SEND_CONT (0)
|
||||
|
||||
#define CURLPAUSE_ALL (CURLPAUSE_RECV|CURLPAUSE_SEND)
|
||||
#define CURLPAUSE_CONT (CURLPAUSE_RECV_CONT|CURLPAUSE_SEND_CONT)
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
@@ -7,7 +7,7 @@
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2007, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
* Copyright (C) 1998 - 2008, 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
|
||||
@@ -26,15 +26,18 @@
|
||||
/* This header file contains nothing but libcurl version info, generated by
|
||||
a script at release-time. This was made its own header file in 7.11.2 */
|
||||
|
||||
/* This is the global package copyright */
|
||||
#define LIBCURL_COPYRIGHT "1996 - 2008 Daniel Stenberg, <daniel@haxx.se>."
|
||||
|
||||
/* This is the version number of the libcurl package from which this header
|
||||
file origins: */
|
||||
#define LIBCURL_VERSION "7.17.1-CVS"
|
||||
#define LIBCURL_VERSION "7.18.0-CVS"
|
||||
|
||||
/* The numeric version number is also available "in parts" by using these
|
||||
defines: */
|
||||
#define LIBCURL_VERSION_MAJOR 7
|
||||
#define LIBCURL_VERSION_MINOR 17
|
||||
#define LIBCURL_VERSION_PATCH 1
|
||||
#define LIBCURL_VERSION_MINOR 18
|
||||
#define LIBCURL_VERSION_PATCH 0
|
||||
|
||||
/* 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,7 +54,7 @@
|
||||
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 0x071101
|
||||
#define LIBCURL_VERSION_NUM 0x071200
|
||||
|
||||
/*
|
||||
* This is the date and time when the full source package was created. The
|
||||
|
@@ -1,21 +1,32 @@
|
||||
#
|
||||
# Watcom / OpenWatcom / Win32 makefile for libcurl.
|
||||
# G. Vanem <giva@bgnett.no>
|
||||
# G. Vanem <gvanem@broadpark.no>
|
||||
#
|
||||
# $Id$
|
||||
|
||||
TARGETS = ca-bundle.h libcurl_wc.lib libcurl_wc.dll libcurl_wc_imp.lib
|
||||
TARGETS = ca-bundle.h libcurl_wc.dll libcurl_wc_imp.lib
|
||||
|
||||
CC = wcc386
|
||||
|
||||
CFLAGS = -3r -mf -d3 -hc -zff -zgf -zq -zm -zc -s -fr=con -w2 -fpi -oilrtfm -bt=nt -bd &
|
||||
-d+ -dWIN32 -dCURL_CA_BUNDLE=getenv("CURL_CA_BUNDLE") &
|
||||
CFLAGS = -3r -mf -d3 -hc -zff -zgf -zq -zm -zc -s -fr=con -w2 -fpi -oilrtfm -bt=nt &
|
||||
-bd -d+ -dWIN32 -dCURL_CA_BUNDLE=getenv("CURL_CA_BUNDLE") &
|
||||
-dBUILDING_LIBCURL -dWITHOUT_MM_LIB -dHAVE_SPNEGO=1 -dENABLE_IPV6 &
|
||||
-dDEBUG_THREADING_GETADDRINFO -dDEBUG=1 -dCURLDEBUG -d_WIN32_WINNT=0x0501 &
|
||||
-I. -I..\include -dCURL_DISABLE_LDAP
|
||||
-dWINBERAPI=__declspec(cdecl) -dWINLDAPAPI=__declspec(cdecl) &
|
||||
-I. -I..\include
|
||||
|
||||
OBJ_DIR = Watcom_obj
|
||||
LIB_ARG = $(OBJ_DIR)\wlib.arg
|
||||
#
|
||||
# Change to suite.
|
||||
#
|
||||
ZLIB_ROOT = ..\..\..\zlib-1.2.3
|
||||
USE_ZLIB = 0
|
||||
|
||||
!ifeq USE_ZLIB 1
|
||||
CFLAGS += -dHAVE_ZLIB_H -dHAVE_LIBZ -I$(ZLIB_ROOT)
|
||||
!endif
|
||||
|
||||
OBJ_DIR = WC_Win32.obj
|
||||
C_ARG = $(OBJ_DIR)\wcc386.arg
|
||||
LINK_ARG = $(OBJ_DIR)\wlink.arg
|
||||
|
||||
OBJS = $(OBJ_DIR)\base64.obj $(OBJ_DIR)\connect.obj &
|
||||
@@ -50,7 +61,7 @@ OBJS = $(OBJ_DIR)\base64.obj $(OBJ_DIR)\connect.obj &
|
||||
|
||||
RESOURCE = $(OBJ_DIR)\libcurl.res
|
||||
|
||||
all: $(OBJ_DIR) $(TARGETS) .SYMBOLIC
|
||||
all: $(OBJ_DIR) $(C_ARG) $(TARGETS) .SYMBOLIC
|
||||
@echo Welcome to libcurl
|
||||
|
||||
$(OBJ_DIR):
|
||||
@@ -59,17 +70,14 @@ $(OBJ_DIR):
|
||||
ca-bundle.h:
|
||||
@echo /* dummy ca-bundle.h. Not used */ > $@
|
||||
|
||||
libcurl_wc.lib: $(OBJS) $(LIB_ARG)
|
||||
wlib -q -b -c $@ @$(LIB_ARG)
|
||||
|
||||
libcurl_wc.dll: $(OBJS) $(RESOURCE) $(LINK_ARG)
|
||||
libcurl_wc.dll libcurl_wc_imp.lib: $(OBJS) $(RESOURCE) $(LINK_ARG)
|
||||
wlink name libcurl_wc.dll @$(LINK_ARG)
|
||||
|
||||
clean: .SYMBOLIC
|
||||
- rm -f $(OBJS) $(RESOURCE)
|
||||
|
||||
vclean realclean: clean .SYMBOLIC
|
||||
- rm -f $(TARGETS) $(LIB_ARG) $(LINK_ARG) libcurl_wc.map
|
||||
- rm -f $(TARGETS) $(C_ARG) $(LINK_ARG) libcurl_wc.map
|
||||
- rmdir $(OBJ_DIR)
|
||||
|
||||
.ERASE
|
||||
@@ -78,12 +86,11 @@ $(RESOURCE): libcurl.rc
|
||||
|
||||
.ERASE
|
||||
.c{$(OBJ_DIR)}.obj:
|
||||
$(CC) $[@ $(CFLAGS) -fo=$@
|
||||
@echo .
|
||||
$(CC) $[@ @$(C_ARG) -fo=$@
|
||||
|
||||
$(LIB_ARG): $(__MAKEFILES__)
|
||||
$(C_ARG): $(__MAKEFILES__)
|
||||
%create $^@
|
||||
for %f in ($(OBJS)) do @%append $^@ +- %f
|
||||
%append $^@ $(CFLAGS)
|
||||
|
||||
$(LINK_ARG): $(__MAKEFILES__)
|
||||
%create $^@
|
||||
@@ -91,7 +98,10 @@ $(LINK_ARG): $(__MAKEFILES__)
|
||||
@%append $^@ file { $(OBJS) }
|
||||
@%append $^@ option quiet, map, caseexact, eliminate, implib=libcurl_wc_imp.lib,
|
||||
@%append $^@ res=$(RESOURCE) libpath $(%watcom)\lib386;$(%watcom)\lib386\nt
|
||||
@%append $^@ library clib3r.lib, ws2_32.lib
|
||||
@%append $^@ library clib3r.lib, wldap32.lib, ws2_32.lib
|
||||
!ifeq USE_ZLIB 1
|
||||
@%append $^@ library $(ZLIB_ROOT)\zlib.lib
|
||||
!endif
|
||||
|
||||
#
|
||||
# Dependencies based on "gcc -MM .."
|
||||
|
@@ -21,11 +21,11 @@ ZLIB_PATH = ../../zlib-1.2.3
|
||||
endif
|
||||
# Edit the path below to point to the base of your OpenSSL package.
|
||||
ifndef OPENSSL_PATH
|
||||
OPENSSL_PATH = ../../openssl-0.9.8e
|
||||
OPENSSL_PATH = ../../openssl-0.9.8g
|
||||
endif
|
||||
# Edit the path below to point to the base of your LibSSH2 package.
|
||||
ifndef LIBSSH2_PATH
|
||||
LIBSSH2_PATH = ../../libssh2-0.17
|
||||
LIBSSH2_PATH = ../../libssh2-0.18
|
||||
endif
|
||||
# Edit the path below to point to the base of your Novell LDAP NDK.
|
||||
ifndef LDAP_SDK
|
||||
|
@@ -20,12 +20,12 @@ endif
|
||||
|
||||
# Edit the path below to point to the base of your OpenSSL package.
|
||||
ifndef OPENSSL_PATH
|
||||
OPENSSL_PATH = ../../openssl-0.9.8e
|
||||
OPENSSL_PATH = ../../openssl-0.9.8g
|
||||
endif
|
||||
|
||||
# Edit the path below to point to the base of your LibSSH2 package.
|
||||
ifndef LIBSSH2_PATH
|
||||
LIBSSH2_PATH = ../../libssh2-0.16
|
||||
LIBSSH2_PATH = ../../libssh2-0.18
|
||||
endif
|
||||
|
||||
ifndef INSTDIR
|
||||
@@ -35,7 +35,7 @@ endif
|
||||
# Edit the vars below to change NLM target settings.
|
||||
TARGET = libcurl
|
||||
VERSION = $(LIBCURL_VERSION)
|
||||
COPYR = Copyright (C) 1996 - 2007, Daniel Stenberg, <daniel@haxx.se>
|
||||
COPYR = Copyright (C) $(LIBCURL_COPYRIGHT_STR)
|
||||
DESCR = cURL libcurl $(LIBCURL_VERSION_STR) ($(LIBARCH)) - http://curl.haxx.se
|
||||
MTSAFE = YES
|
||||
STACK = 64000
|
||||
@@ -72,7 +72,7 @@ else
|
||||
CC = gcc
|
||||
endif
|
||||
# a native win32 awk can be downloaded from here:
|
||||
# http://www.gknw.net/development/prgtools/awk-20050424.zip
|
||||
# http://www.gknw.net/development/prgtools/awk-20070501.zip
|
||||
AWK = awk
|
||||
YACC = bison -y
|
||||
CP = cp -afv
|
||||
@@ -336,9 +336,9 @@ endif
|
||||
ifdef IMPORTS
|
||||
@echo $(DL)import $(IMPORTS)$(DL) >> $@
|
||||
endif
|
||||
ifeq ($(LD),nlmconv)
|
||||
@echo $(DL)input $(OBJL)$(DL) >> $@
|
||||
ifeq ($(findstring nlmconv,$(LD)),nlmconv)
|
||||
@echo $(DL)input $(PRELUDE)$(DL) >> $@
|
||||
@echo $(DL)input $(OBJL)$(DL) >> $@
|
||||
#ifdef LDLIBS
|
||||
# @echo $(DL)input $(LDLIBS)$(DL) >> $@
|
||||
#endif
|
||||
@@ -372,7 +372,6 @@ ifeq ($(LIBARCH),CLIB)
|
||||
@echo $(DL)#define SEND_TYPE_ARG4 int$(DL) >> $@
|
||||
@echo $(DL)#define SEND_TYPE_RETV int$(DL) >> $@
|
||||
@echo $(DL)#define socklen_t int$(DL) >> $@
|
||||
@echo $(DL)#define DL_LDAP_FILE "ldapsdk.nlm"$(DL) >> $@
|
||||
else
|
||||
@echo $(DL)#define OS "i586-pc-libc-NetWare"$(DL) >> $@
|
||||
@echo $(DL)#define HAVE_FTRUNCATE 1$(DL) >> $@
|
||||
@@ -405,7 +404,6 @@ else
|
||||
@echo $(DL)#define SEND_TYPE_ARG4 int$(DL) >> $@
|
||||
@echo $(DL)#define SEND_TYPE_RETV ssize_t$(DL) >> $@
|
||||
@echo $(DL)#define SIZEOF_STRUCT_IN6_ADDR 16$(DL) >> $@
|
||||
@echo $(DL)#define DL_LDAP_FILE "lldapsdk.nlm"$(DL) >> $@
|
||||
ifdef ENABLE_IPV6
|
||||
@echo $(DL)#define ENABLE_IPV6 1$(DL) >> $@
|
||||
endif
|
||||
|
@@ -35,7 +35,7 @@ IMPLIB_NAME = libcurl_imp
|
||||
IMPLIB_NAME_DEBUG = libcurld_imp
|
||||
|
||||
!IFNDEF OPENSSL_PATH
|
||||
OPENSSL_PATH = ../../openssl-0.9.8e
|
||||
OPENSSL_PATH = ../../openssl-0.9.8g
|
||||
!ENDIF
|
||||
|
||||
!IFNDEF ZLIB_PATH
|
||||
|
@@ -101,7 +101,7 @@ size_t Curl_base64_decode(const char *src, unsigned char **outptr)
|
||||
numQuantums = (length + equalsTerm) / 4;
|
||||
|
||||
/* Don't allocate a buffer if the decoded length is 0 */
|
||||
if (numQuantums <= 0)
|
||||
if(numQuantums <= 0)
|
||||
return 0;
|
||||
|
||||
rawlen = (numQuantums * 3) - equalsTerm;
|
||||
|
@@ -347,6 +347,26 @@
|
||||
#define HAVE_LONGLONG 1
|
||||
#endif
|
||||
|
||||
/* Define to avoid VS2005 complaining about portable C functions */
|
||||
#if defined(_MSC_VER) && (_MSC_VER >= 1400)
|
||||
#define _CRT_SECURE_NO_DEPRECATE 1
|
||||
#define _CRT_NONSTDC_NO_DEPRECATE 1
|
||||
#endif
|
||||
|
||||
/* VS2008 does not support Windows build targets prior to WinXP, */
|
||||
/* so, if no build target has been defined we will target WinXP. */
|
||||
#if defined(_MSC_VER) && (_MSC_VER >= 1500)
|
||||
# ifndef _WIN32_WINNT
|
||||
# define _WIN32_WINNT 0x0501
|
||||
# endif
|
||||
# ifndef WINVER
|
||||
# define WINVER 0x0501
|
||||
# endif
|
||||
# if (_WIN32_WINNT < 0x0501) || (WINVER < 0x0501)
|
||||
# error VS2008 does not support Windows build targets prior to WinXP
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* ---------------------------------------------------------------- */
|
||||
/* LDAP SUPPORT */
|
||||
/* ---------------------------------------------------------------- */
|
||||
@@ -370,10 +390,6 @@
|
||||
/* ADDITIONAL DEFINITIONS */
|
||||
/* ---------------------------------------------------------------- */
|
||||
|
||||
/* 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 cpu-machine-OS */
|
||||
#undef OS
|
||||
#if defined(_M_IX86) || defined(__i386__) /* x86 (MSVC or gcc) */
|
||||
|
@@ -308,6 +308,12 @@
|
||||
/* Undef keyword 'const' if it does not work. */
|
||||
/* #undef const */
|
||||
|
||||
/* Define to avoid VS2005 complaining about portable C functions */
|
||||
#if defined(_MSC_VER) && (_MSC_VER >= 1400)
|
||||
#define _CRT_SECURE_NO_DEPRECATE 1
|
||||
#define _CRT_NONSTDC_NO_DEPRECATE 1
|
||||
#endif
|
||||
|
||||
/* ---------------------------------------------------------------- */
|
||||
/* LDAP SUPPORT */
|
||||
/* ---------------------------------------------------------------- */
|
||||
@@ -320,10 +326,6 @@
|
||||
/* ADDITIONAL DEFINITIONS */
|
||||
/* ---------------------------------------------------------------- */
|
||||
|
||||
/* 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 cpu-machine-OS */
|
||||
#undef OS
|
||||
#define OS "i386-pc-win32ce"
|
||||
|
@@ -5,7 +5,7 @@
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2007, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
* Copyright (C) 1998 - 2008, 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
|
||||
@@ -116,7 +116,7 @@ int Curl_nonblock(curl_socket_t sockfd, /* operate on this */
|
||||
int flags;
|
||||
|
||||
flags = fcntl(sockfd, F_GETFL, 0);
|
||||
if (FALSE != nonblock)
|
||||
if(FALSE != nonblock)
|
||||
return fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);
|
||||
else
|
||||
return fcntl(sockfd, F_SETFL, flags & (~O_NONBLOCK));
|
||||
@@ -165,7 +165,7 @@ int Curl_nonblock(curl_socket_t sockfd, /* operate on this */
|
||||
#define SETBLOCK 6
|
||||
#endif
|
||||
|
||||
#if (SETBLOCK == 0)
|
||||
#if(SETBLOCK == 0)
|
||||
#error "no non-blocking method was found/used/set"
|
||||
#endif
|
||||
}
|
||||
@@ -233,7 +233,7 @@ static CURLcode bindlocal(struct connectdata *conn,
|
||||
/*************************************************************
|
||||
* Select device to bind socket to
|
||||
*************************************************************/
|
||||
if (dev && (strlen(dev)<255) ) {
|
||||
if(dev && (strlen(dev)<255) ) {
|
||||
struct Curl_dns_entry *h=NULL;
|
||||
char myhost[256] = "";
|
||||
in_addr_t in;
|
||||
@@ -303,11 +303,11 @@ static CURLcode bindlocal(struct connectdata *conn,
|
||||
* interfaces to go out the external interface.
|
||||
*
|
||||
*/
|
||||
if (was_iface) {
|
||||
if(was_iface) {
|
||||
/* Only bind to the interface when specified as interface, not just as a
|
||||
* hostname or ip address.
|
||||
*/
|
||||
if (setsockopt(sockfd, SOL_SOCKET, SO_BINDTODEVICE,
|
||||
if(setsockopt(sockfd, SOL_SOCKET, SO_BINDTODEVICE,
|
||||
dev, strlen(dev)+1) != 0) {
|
||||
/* printf("Failed to BINDTODEVICE, socket: %d device: %s error: %s\n",
|
||||
sockfd, dev, Curl_strerror(SOCKERRNO)); */
|
||||
@@ -323,12 +323,12 @@ static CURLcode bindlocal(struct connectdata *conn,
|
||||
#ifdef ENABLE_IPV6
|
||||
in6 = Curl_inet_pton (AF_INET6, myhost, (void *)&ipv6_addr);
|
||||
#endif
|
||||
if (CURL_INADDR_NONE == in && -1 == in6) {
|
||||
if(CURL_INADDR_NONE == in && -1 == in6) {
|
||||
failf(data,"couldn't find my own IP address (%s)", myhost);
|
||||
return CURLE_INTERFACE_FAILED;
|
||||
} /* end of inet_addr */
|
||||
|
||||
if ( h ) {
|
||||
if( h ) {
|
||||
Curl_addrinfo *addr = h->addr;
|
||||
sock = addr->ai_addr;
|
||||
socksize = addr->ai_addrlen;
|
||||
@@ -433,33 +433,33 @@ static bool verifyconnect(curl_socket_t sockfd, int *error)
|
||||
|
||||
#endif
|
||||
|
||||
if (0 != getsockopt(sockfd, SOL_SOCKET, SO_ERROR, (void *)&err, &errSize))
|
||||
if(0 != getsockopt(sockfd, SOL_SOCKET, SO_ERROR, (void *)&err, &errSize))
|
||||
err = SOCKERRNO;
|
||||
#ifdef _WIN32_WCE
|
||||
/* Old WinCE versions don't support SO_ERROR */
|
||||
if (WSAENOPROTOOPT == err) {
|
||||
if(WSAENOPROTOOPT == err) {
|
||||
SET_SOCKERRNO(0);
|
||||
err = 0;
|
||||
}
|
||||
#endif
|
||||
#ifdef __minix
|
||||
/* Minix 3.1.x doesn't support getsockopt on UDP sockets */
|
||||
if (EBADIOCTL == err) {
|
||||
if(EBADIOCTL == err) {
|
||||
SET_SOCKERRNO(0);
|
||||
err = 0;
|
||||
}
|
||||
#endif
|
||||
if ((0 == err) || (EISCONN == err))
|
||||
if((0 == err) || (EISCONN == err))
|
||||
/* we are connected, awesome! */
|
||||
rc = TRUE;
|
||||
else
|
||||
/* This wasn't a successful connect */
|
||||
rc = FALSE;
|
||||
if (error)
|
||||
if(error)
|
||||
*error = err;
|
||||
#else
|
||||
(void)sockfd;
|
||||
if (error)
|
||||
if(error)
|
||||
*error = SOCKERRNO;
|
||||
#endif
|
||||
return rc;
|
||||
@@ -504,7 +504,7 @@ static bool trynextip(struct connectdata *conn,
|
||||
/* try the next address */
|
||||
ai = conn->ip_addr->ai_next;
|
||||
|
||||
while (ai) {
|
||||
while(ai) {
|
||||
sockfd = singleipconnect(conn, ai, 0L, connected);
|
||||
if(sockfd != CURL_SOCKET_BAD) {
|
||||
/* store the new socket descriptor */
|
||||
@@ -545,7 +545,7 @@ CURLcode Curl_is_connected(struct connectdata *conn,
|
||||
|
||||
/* subtract the most strict timeout of the ones */
|
||||
if(data->set.timeout && data->set.connecttimeout) {
|
||||
if (data->set.timeout < data->set.connecttimeout)
|
||||
if(data->set.timeout < data->set.connecttimeout)
|
||||
allow_total = allow = data->set.timeout;
|
||||
else
|
||||
allow = data->set.connecttimeout;
|
||||
@@ -576,7 +576,7 @@ CURLcode Curl_is_connected(struct connectdata *conn,
|
||||
|
||||
if(WAITCONN_CONNECTED == rc) {
|
||||
int error;
|
||||
if (verifyconnect(sockfd, &error)) {
|
||||
if(verifyconnect(sockfd, &error)) {
|
||||
/* we are connected, awesome! */
|
||||
*connected = TRUE;
|
||||
return CURLE_OK;
|
||||
@@ -594,7 +594,7 @@ CURLcode Curl_is_connected(struct connectdata *conn,
|
||||
int error = 0;
|
||||
|
||||
/* nope, not connected */
|
||||
if (WAITCONN_FDSET_ERROR == rc) {
|
||||
if(WAITCONN_FDSET_ERROR == rc) {
|
||||
(void)verifyconnect(sockfd, &error);
|
||||
data->state.os_errno = error;
|
||||
infof(data, "%s\n",Curl_strerror(conn,error));
|
||||
@@ -628,7 +628,7 @@ static void tcpnodelay(struct connectdata *conn,
|
||||
|
||||
#ifdef HAVE_GETPROTOBYNAME
|
||||
struct protoent *pe = getprotobyname("tcp");
|
||||
if (pe)
|
||||
if(pe)
|
||||
proto = pe->p_proto;
|
||||
#endif
|
||||
|
||||
@@ -694,7 +694,7 @@ singleipconnect(struct connectdata *conn,
|
||||
addr->protocol=ai->ai_protocol;
|
||||
addr->addrlen =
|
||||
(ai->ai_addrlen < (socklen_t)sizeof(struct Curl_sockaddr_storage)) ?
|
||||
ai->ai_addrlen : (socklen_t)sizeof(struct Curl_sockaddr_storage);
|
||||
(unsigned int)ai->ai_addrlen : sizeof(struct Curl_sockaddr_storage);
|
||||
memcpy(&addr->addr, ai->ai_addr, addr->addrlen);
|
||||
|
||||
/* If set, use opensocket callback to get the socket */
|
||||
@@ -703,7 +703,7 @@ singleipconnect(struct connectdata *conn,
|
||||
CURLSOCKTYPE_IPCXN, addr);
|
||||
else
|
||||
sockfd = socket(addr->family, addr->socktype, addr->protocol);
|
||||
if (sockfd == CURL_SOCKET_BAD)
|
||||
if(sockfd == CURL_SOCKET_BAD)
|
||||
return CURL_SOCKET_BAD;
|
||||
|
||||
*connected = FALSE; /* default is not connected */
|
||||
@@ -728,7 +728,7 @@ singleipconnect(struct connectdata *conn,
|
||||
error = data->set.fsockopt(data->set.sockopt_client,
|
||||
sockfd,
|
||||
CURLSOCKTYPE_IPCXN);
|
||||
if (error) {
|
||||
if(error) {
|
||||
sclose(sockfd); /* close the socket and bail out */
|
||||
return CURL_SOCKET_BAD;
|
||||
}
|
||||
@@ -836,9 +836,9 @@ CURLcode Curl_connecthost(struct connectdata *conn, /* context */
|
||||
|
||||
/* if a timeout is set, use the most restrictive one */
|
||||
|
||||
if (data->set.timeout > 0)
|
||||
if(data->set.timeout > 0)
|
||||
timeout_set += 1;
|
||||
if (data->set.connecttimeout > 0)
|
||||
if(data->set.connecttimeout > 0)
|
||||
timeout_set += 2;
|
||||
|
||||
switch (timeout_set) {
|
||||
@@ -849,7 +849,7 @@ CURLcode Curl_connecthost(struct connectdata *conn, /* context */
|
||||
timeout_ms = data->set.connecttimeout;
|
||||
break;
|
||||
case 3:
|
||||
if (data->set.timeout < data->set.connecttimeout)
|
||||
if(data->set.timeout < data->set.connecttimeout)
|
||||
timeout_ms = data->set.timeout;
|
||||
else
|
||||
timeout_ms = data->set.connecttimeout;
|
||||
@@ -859,7 +859,7 @@ CURLcode Curl_connecthost(struct connectdata *conn, /* context */
|
||||
break;
|
||||
}
|
||||
|
||||
if (timeout_set > 0) {
|
||||
if(timeout_set > 0) {
|
||||
/* if a timeout was already set, substract elapsed time */
|
||||
timeout_ms -= Curl_tvdiff(before, data->progress.t_startsingle);
|
||||
if(timeout_ms < 0) {
|
||||
@@ -906,7 +906,7 @@ CURLcode Curl_connecthost(struct connectdata *conn, /* context */
|
||||
before = after;
|
||||
} /* end of connect-to-each-address loop */
|
||||
|
||||
if (sockfd == CURL_SOCKET_BAD) {
|
||||
if(sockfd == CURL_SOCKET_BAD) {
|
||||
/* no good connect was made */
|
||||
*sockconn = CURL_SOCKET_BAD;
|
||||
failf(data, "couldn't connect to host");
|
||||
|
@@ -57,7 +57,7 @@ static CURLcode
|
||||
process_zlib_error(struct connectdata *conn, z_stream *z)
|
||||
{
|
||||
struct SessionHandle *data = conn->data;
|
||||
if (z->msg)
|
||||
if(z->msg)
|
||||
failf (data, "Error while processing content unencoding: %s",
|
||||
z->msg);
|
||||
else
|
||||
@@ -77,7 +77,7 @@ exit_zlib(z_stream *z, zlibInitState *zlib_init, CURLcode result)
|
||||
|
||||
static CURLcode
|
||||
inflate_stream(struct connectdata *conn,
|
||||
struct Curl_transfer_keeper *k)
|
||||
struct SingleRequest *k)
|
||||
{
|
||||
int allow_restart = 1;
|
||||
z_stream *z = &k->z; /* zlib state structure */
|
||||
@@ -90,7 +90,7 @@ inflate_stream(struct connectdata *conn,
|
||||
/* Dynamically allocate a buffer for decompression because it's uncommonly
|
||||
large to hold on the stack */
|
||||
decomp = (char*)malloc(DSIZ);
|
||||
if (decomp == NULL) {
|
||||
if(decomp == NULL) {
|
||||
return exit_zlib(z, &k->zlib_init, CURLE_OUT_OF_MEMORY);
|
||||
}
|
||||
|
||||
@@ -102,39 +102,39 @@ inflate_stream(struct connectdata *conn,
|
||||
z->avail_out = DSIZ;
|
||||
|
||||
status = inflate(z, Z_SYNC_FLUSH);
|
||||
if (status == Z_OK || status == Z_STREAM_END) {
|
||||
if(status == Z_OK || status == Z_STREAM_END) {
|
||||
allow_restart = 0;
|
||||
if(DSIZ - z->avail_out) {
|
||||
result = Curl_client_write(conn, CLIENTWRITE_BODY, decomp,
|
||||
DSIZ - z->avail_out);
|
||||
/* if !CURLE_OK, clean up, return */
|
||||
if (result) {
|
||||
if(result) {
|
||||
free(decomp);
|
||||
return exit_zlib(z, &k->zlib_init, result);
|
||||
}
|
||||
}
|
||||
|
||||
/* Done? clean up, return */
|
||||
if (status == Z_STREAM_END) {
|
||||
if(status == Z_STREAM_END) {
|
||||
free(decomp);
|
||||
if (inflateEnd(z) == Z_OK)
|
||||
if(inflateEnd(z) == Z_OK)
|
||||
return exit_zlib(z, &k->zlib_init, result);
|
||||
else
|
||||
return exit_zlib(z, &k->zlib_init, process_zlib_error(conn, z));
|
||||
}
|
||||
|
||||
/* Done with these bytes, exit */
|
||||
if (status == Z_OK && z->avail_in == 0) {
|
||||
if(status == Z_OK && z->avail_in == 0) {
|
||||
free(decomp);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
else if (allow_restart && status == Z_DATA_ERROR) {
|
||||
else if(allow_restart && status == Z_DATA_ERROR) {
|
||||
/* some servers seem to not generate zlib headers, so this is an attempt
|
||||
to fix and continue anyway */
|
||||
|
||||
(void) inflateEnd(z); /* don't care about the return code */
|
||||
if (inflateInit2(z, -MAX_WBITS) != Z_OK) {
|
||||
if(inflateInit2(z, -MAX_WBITS) != Z_OK) {
|
||||
return process_zlib_error(conn, z);
|
||||
}
|
||||
z->next_in = orig_in;
|
||||
@@ -152,19 +152,19 @@ inflate_stream(struct connectdata *conn,
|
||||
|
||||
CURLcode
|
||||
Curl_unencode_deflate_write(struct connectdata *conn,
|
||||
struct Curl_transfer_keeper *k,
|
||||
struct SingleRequest *k,
|
||||
ssize_t nread)
|
||||
{
|
||||
z_stream *z = &k->z; /* zlib state structure */
|
||||
|
||||
/* Initialize zlib? */
|
||||
if (k->zlib_init == ZLIB_UNINIT) {
|
||||
if(k->zlib_init == ZLIB_UNINIT) {
|
||||
z->zalloc = (alloc_func)Z_NULL;
|
||||
z->zfree = (free_func)Z_NULL;
|
||||
z->opaque = 0;
|
||||
z->next_in = NULL;
|
||||
z->avail_in = 0;
|
||||
if (inflateInit(z) != Z_OK)
|
||||
if(inflateInit(z) != Z_OK)
|
||||
return process_zlib_error(conn, z);
|
||||
k->zlib_init = ZLIB_INIT;
|
||||
}
|
||||
@@ -189,16 +189,16 @@ static enum {
|
||||
const ssize_t totallen = len;
|
||||
|
||||
/* The shortest header is 10 bytes */
|
||||
if (len < 10)
|
||||
if(len < 10)
|
||||
return GZIP_UNDERFLOW;
|
||||
|
||||
if ((data[0] != GZIP_MAGIC_0) || (data[1] != GZIP_MAGIC_1))
|
||||
if((data[0] != GZIP_MAGIC_0) || (data[1] != GZIP_MAGIC_1))
|
||||
return GZIP_BAD;
|
||||
|
||||
method = data[2];
|
||||
flags = data[3];
|
||||
|
||||
if (method != Z_DEFLATED || (flags & RESERVED) != 0) {
|
||||
if(method != Z_DEFLATED || (flags & RESERVED) != 0) {
|
||||
/* Can't handle this compression method or unknown flag */
|
||||
return GZIP_BAD;
|
||||
}
|
||||
@@ -207,28 +207,28 @@ static enum {
|
||||
len -= 10;
|
||||
data += 10;
|
||||
|
||||
if (flags & EXTRA_FIELD) {
|
||||
if(flags & EXTRA_FIELD) {
|
||||
ssize_t extra_len;
|
||||
|
||||
if (len < 2)
|
||||
if(len < 2)
|
||||
return GZIP_UNDERFLOW;
|
||||
|
||||
extra_len = (data[1] << 8) | data[0];
|
||||
|
||||
if (len < (extra_len+2))
|
||||
if(len < (extra_len+2))
|
||||
return GZIP_UNDERFLOW;
|
||||
|
||||
len -= (extra_len + 2);
|
||||
data += (extra_len + 2);
|
||||
}
|
||||
|
||||
if (flags & ORIG_NAME) {
|
||||
if(flags & ORIG_NAME) {
|
||||
/* Skip over NUL-terminated file name */
|
||||
while (len && *data) {
|
||||
while(len && *data) {
|
||||
--len;
|
||||
++data;
|
||||
}
|
||||
if (!len || *data)
|
||||
if(!len || *data)
|
||||
return GZIP_UNDERFLOW;
|
||||
|
||||
/* Skip over the NUL */
|
||||
@@ -236,13 +236,13 @@ static enum {
|
||||
++data;
|
||||
}
|
||||
|
||||
if (flags & COMMENT) {
|
||||
if(flags & COMMENT) {
|
||||
/* Skip over NUL-terminated comment */
|
||||
while (len && *data) {
|
||||
while(len && *data) {
|
||||
--len;
|
||||
++data;
|
||||
}
|
||||
if (!len || *data)
|
||||
if(!len || *data)
|
||||
return GZIP_UNDERFLOW;
|
||||
|
||||
/* Skip over the NUL */
|
||||
@@ -250,8 +250,8 @@ static enum {
|
||||
++data;
|
||||
}
|
||||
|
||||
if (flags & HEAD_CRC) {
|
||||
if (len < 2)
|
||||
if(flags & HEAD_CRC) {
|
||||
if(len < 2)
|
||||
return GZIP_UNDERFLOW;
|
||||
|
||||
len -= 2;
|
||||
@@ -265,36 +265,36 @@ static enum {
|
||||
|
||||
CURLcode
|
||||
Curl_unencode_gzip_write(struct connectdata *conn,
|
||||
struct Curl_transfer_keeper *k,
|
||||
struct SingleRequest *k,
|
||||
ssize_t nread)
|
||||
{
|
||||
z_stream *z = &k->z; /* zlib state structure */
|
||||
|
||||
/* Initialize zlib? */
|
||||
if (k->zlib_init == ZLIB_UNINIT) {
|
||||
if(k->zlib_init == ZLIB_UNINIT) {
|
||||
z->zalloc = (alloc_func)Z_NULL;
|
||||
z->zfree = (free_func)Z_NULL;
|
||||
z->opaque = 0;
|
||||
z->next_in = NULL;
|
||||
z->avail_in = 0;
|
||||
|
||||
if (strcmp(zlibVersion(), "1.2.0.4") >= 0) {
|
||||
if(strcmp(zlibVersion(), "1.2.0.4") >= 0) {
|
||||
/* zlib ver. >= 1.2.0.4 supports transparent gzip decompressing */
|
||||
if (inflateInit2(z, MAX_WBITS+32) != Z_OK) {
|
||||
if(inflateInit2(z, MAX_WBITS+32) != Z_OK) {
|
||||
return process_zlib_error(conn, z);
|
||||
}
|
||||
k->zlib_init = ZLIB_INIT_GZIP; /* Transparent gzip decompress state */
|
||||
|
||||
} else {
|
||||
/* we must parse the gzip header ourselves */
|
||||
if (inflateInit2(z, -MAX_WBITS) != Z_OK) {
|
||||
if(inflateInit2(z, -MAX_WBITS) != Z_OK) {
|
||||
return process_zlib_error(conn, z);
|
||||
}
|
||||
k->zlib_init = ZLIB_INIT; /* Initial call state */
|
||||
}
|
||||
}
|
||||
|
||||
if (k->zlib_init == ZLIB_INIT_GZIP) {
|
||||
if(k->zlib_init == ZLIB_INIT_GZIP) {
|
||||
/* Let zlib handle the gzip decompression entirely */
|
||||
z->next_in = (Bytef *)k->str;
|
||||
z->avail_in = (uInt)nread;
|
||||
@@ -342,7 +342,7 @@ Curl_unencode_gzip_write(struct connectdata *conn,
|
||||
*/
|
||||
z->avail_in = (uInt)nread;
|
||||
z->next_in = malloc(z->avail_in);
|
||||
if (z->next_in == NULL) {
|
||||
if(z->next_in == NULL) {
|
||||
return exit_zlib(z, &k->zlib_init, CURLE_OUT_OF_MEMORY);
|
||||
}
|
||||
memcpy(z->next_in, k->str, z->avail_in);
|
||||
@@ -366,7 +366,7 @@ Curl_unencode_gzip_write(struct connectdata *conn,
|
||||
|
||||
z->avail_in += nread;
|
||||
z->next_in = realloc(z->next_in, z->avail_in);
|
||||
if (z->next_in == NULL) {
|
||||
if(z->next_in == NULL) {
|
||||
free(oldblock);
|
||||
return exit_zlib(z, &k->zlib_init, CURLE_OUT_OF_MEMORY);
|
||||
}
|
||||
@@ -404,7 +404,7 @@ Curl_unencode_gzip_write(struct connectdata *conn,
|
||||
break;
|
||||
}
|
||||
|
||||
if (z->avail_in == 0) {
|
||||
if(z->avail_in == 0) {
|
||||
/* We don't have any data to inflate; wait until next time */
|
||||
return CURLE_OK;
|
||||
}
|
||||
|
@@ -5,7 +5,7 @@
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2006, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
* Copyright (C) 1998 - 2007, 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
|
||||
@@ -32,10 +32,10 @@
|
||||
#endif
|
||||
|
||||
CURLcode Curl_unencode_deflate_write(struct connectdata *conn,
|
||||
struct Curl_transfer_keeper *k,
|
||||
struct SingleRequest *req,
|
||||
ssize_t nread);
|
||||
|
||||
CURLcode
|
||||
Curl_unencode_gzip_write(struct connectdata *conn,
|
||||
struct Curl_transfer_keeper *k,
|
||||
struct SingleRequest *k,
|
||||
ssize_t nread);
|
||||
|
32
lib/cookie.c
32
lib/cookie.c
@@ -5,7 +5,7 @@
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2007, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
* Copyright (C) 1998 - 2008, 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
|
||||
@@ -483,7 +483,7 @@ Curl_cookie_add(struct SessionHandle *data,
|
||||
/* It turns out, that sometimes the file format allows the path
|
||||
field to remain not filled in, we try to detect this and work
|
||||
around it! Andr<64>s Garc<72>a made us aware of this... */
|
||||
if (strcmp("TRUE", ptr) && strcmp("FALSE", ptr)) {
|
||||
if(strcmp("TRUE", ptr) && strcmp("FALSE", ptr)) {
|
||||
/* only if the path doesn't look like a boolean option! */
|
||||
co->path = strdup(ptr);
|
||||
if(!co->path)
|
||||
@@ -812,7 +812,7 @@ struct Cookie *Curl_cookie_getlist(struct CookieInfo *c,
|
||||
void Curl_cookie_clearall(struct CookieInfo *cookies)
|
||||
{
|
||||
if(cookies) {
|
||||
Curl_cookie_freelist(cookies->cookies);
|
||||
Curl_cookie_freelist(cookies->cookies, TRUE);
|
||||
cookies->cookies = NULL;
|
||||
cookies->numcookies = 0;
|
||||
}
|
||||
@@ -824,16 +824,22 @@ void Curl_cookie_clearall(struct CookieInfo *cookies)
|
||||
*
|
||||
* Free a list of cookies previously returned by Curl_cookie_getlist();
|
||||
*
|
||||
* The 'cookiestoo' argument tells this function whether to just free the
|
||||
* list or actually also free all cookies within the list as well.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
void Curl_cookie_freelist(struct Cookie *co)
|
||||
void Curl_cookie_freelist(struct Cookie *co, bool cookiestoo)
|
||||
{
|
||||
struct Cookie *next;
|
||||
if(co) {
|
||||
while(co) {
|
||||
next = co->next;
|
||||
free(co); /* we only free the struct since the "members" are all
|
||||
just copied! */
|
||||
if(cookiestoo)
|
||||
freecookie(co);
|
||||
else
|
||||
free(co); /* we only free the struct since the "members" are all just
|
||||
pointed out in the main cookie list! */
|
||||
co = next;
|
||||
}
|
||||
}
|
||||
@@ -867,7 +873,7 @@ void Curl_cookie_clearsess(struct CookieInfo *cookies)
|
||||
else
|
||||
prev->next = next;
|
||||
|
||||
free(curr);
|
||||
freecookie(curr);
|
||||
cookies->numcookies--;
|
||||
}
|
||||
else
|
||||
@@ -972,7 +978,7 @@ int Curl_cookie_output(struct CookieInfo *c, const char *dumphere)
|
||||
|
||||
while(co) {
|
||||
format_ptr = get_netscape_format(co);
|
||||
if (format_ptr == NULL) {
|
||||
if(format_ptr == NULL) {
|
||||
fprintf(out, "#\n# Fatal libcurl error\n");
|
||||
fclose(out);
|
||||
return 1;
|
||||
@@ -996,27 +1002,27 @@ struct curl_slist *Curl_cookie_list(struct SessionHandle *data)
|
||||
struct Cookie *c;
|
||||
char *line;
|
||||
|
||||
if ((data->cookies == NULL) ||
|
||||
if((data->cookies == NULL) ||
|
||||
(data->cookies->numcookies == 0))
|
||||
return NULL;
|
||||
|
||||
c = data->cookies->cookies;
|
||||
|
||||
beg = list;
|
||||
while (c) {
|
||||
while(c) {
|
||||
/* fill the list with _all_ the cookies we know */
|
||||
line = get_netscape_format(c);
|
||||
if (line == NULL) {
|
||||
if(line == NULL) {
|
||||
curl_slist_free_all(beg);
|
||||
return NULL;
|
||||
}
|
||||
list = curl_slist_append(list, line);
|
||||
free(line);
|
||||
if (list == NULL) {
|
||||
if(list == NULL) {
|
||||
curl_slist_free_all(beg);
|
||||
return NULL;
|
||||
}
|
||||
else if (beg == NULL) {
|
||||
else if(beg == NULL) {
|
||||
beg = list;
|
||||
}
|
||||
c = c->next;
|
||||
|
@@ -7,7 +7,7 @@
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2006, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
* Copyright (C) 1998 - 2008, 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
|
||||
@@ -91,7 +91,7 @@ struct CookieInfo *Curl_cookie_init(struct SessionHandle *data,
|
||||
const char *, struct CookieInfo *, bool);
|
||||
struct Cookie *Curl_cookie_getlist(struct CookieInfo *, const char *,
|
||||
const char *, bool);
|
||||
void Curl_cookie_freelist(struct Cookie *);
|
||||
void Curl_cookie_freelist(struct Cookie *cookies, bool cookiestoo);
|
||||
void Curl_cookie_clearall(struct CookieInfo *cookies);
|
||||
void Curl_cookie_clearsess(struct CookieInfo *cookies);
|
||||
void Curl_cookie_cleanup(struct CookieInfo *);
|
||||
|
44
lib/dict.c
44
lib/dict.c
@@ -87,7 +87,7 @@
|
||||
* Forward declarations.
|
||||
*/
|
||||
|
||||
static CURLcode Curl_dict(struct connectdata *conn, bool *done);
|
||||
static CURLcode dict_do(struct connectdata *conn, bool *done);
|
||||
|
||||
/*
|
||||
* DICT protocol handler.
|
||||
@@ -96,7 +96,7 @@ static CURLcode Curl_dict(struct connectdata *conn, bool *done);
|
||||
const struct Curl_handler Curl_handler_dict = {
|
||||
"DICT", /* scheme */
|
||||
ZERO_NULL, /* setup_connection */
|
||||
Curl_dict, /* do_it */
|
||||
dict_do, /* do_it */
|
||||
ZERO_NULL, /* done */
|
||||
ZERO_NULL, /* do_more */
|
||||
ZERO_NULL, /* connect_it */
|
||||
@@ -129,7 +129,7 @@ static char *unescape_word(struct SessionHandle *data, const char *inp)
|
||||
for(ptr = newp;
|
||||
(byte = *ptr) != 0;
|
||||
ptr++) {
|
||||
if ((byte <= 32) || (byte == 127) ||
|
||||
if((byte <= 32) || (byte == 127) ||
|
||||
(byte == '\'') || (byte == '\"') || (byte == '\\')) {
|
||||
dictp[olen++] = '\\';
|
||||
}
|
||||
@@ -142,7 +142,7 @@ static char *unescape_word(struct SessionHandle *data, const char *inp)
|
||||
return dictp;
|
||||
}
|
||||
|
||||
static CURLcode Curl_dict(struct connectdata *conn, bool *done)
|
||||
static CURLcode dict_do(struct connectdata *conn, bool *done)
|
||||
{
|
||||
char *word;
|
||||
char *eword;
|
||||
@@ -155,8 +155,8 @@ static CURLcode Curl_dict(struct connectdata *conn, bool *done)
|
||||
struct SessionHandle *data=conn->data;
|
||||
curl_socket_t sockfd = conn->sock[FIRSTSOCKET];
|
||||
|
||||
char *path = data->reqdata.path;
|
||||
curl_off_t *bytecount = &data->reqdata.keep.bytecount;
|
||||
char *path = data->state.path;
|
||||
curl_off_t *bytecount = &data->req.bytecount;
|
||||
|
||||
*done = TRUE; /* unconditionally */
|
||||
|
||||
@@ -164,35 +164,35 @@ static CURLcode Curl_dict(struct connectdata *conn, bool *done)
|
||||
/* AUTH is missing */
|
||||
}
|
||||
|
||||
if (strnequal(path, DICT_MATCH, sizeof(DICT_MATCH)-1) ||
|
||||
if(strnequal(path, DICT_MATCH, sizeof(DICT_MATCH)-1) ||
|
||||
strnequal(path, DICT_MATCH2, sizeof(DICT_MATCH2)-1) ||
|
||||
strnequal(path, DICT_MATCH3, sizeof(DICT_MATCH3)-1)) {
|
||||
|
||||
word = strchr(path, ':');
|
||||
if (word) {
|
||||
if(word) {
|
||||
word++;
|
||||
database = strchr(word, ':');
|
||||
if (database) {
|
||||
if(database) {
|
||||
*database++ = (char)0;
|
||||
strategy = strchr(database, ':');
|
||||
if (strategy) {
|
||||
if(strategy) {
|
||||
*strategy++ = (char)0;
|
||||
nthdef = strchr(strategy, ':');
|
||||
if (nthdef) {
|
||||
if(nthdef) {
|
||||
*nthdef++ = (char)0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ((word == NULL) || (*word == (char)0)) {
|
||||
if((word == NULL) || (*word == (char)0)) {
|
||||
infof(data, "lookup word is missing");
|
||||
word=(char *)"default";
|
||||
}
|
||||
if ((database == NULL) || (*database == (char)0)) {
|
||||
if((database == NULL) || (*database == (char)0)) {
|
||||
database = (char *)"!";
|
||||
}
|
||||
if ((strategy == NULL) || (*strategy == (char)0)) {
|
||||
if((strategy == NULL) || (*strategy == (char)0)) {
|
||||
strategy = (char *)".";
|
||||
}
|
||||
|
||||
@@ -223,28 +223,28 @@ static CURLcode Curl_dict(struct connectdata *conn, bool *done)
|
||||
if(result)
|
||||
return result;
|
||||
}
|
||||
else if (strnequal(path, DICT_DEFINE, sizeof(DICT_DEFINE)-1) ||
|
||||
else if(strnequal(path, DICT_DEFINE, sizeof(DICT_DEFINE)-1) ||
|
||||
strnequal(path, DICT_DEFINE2, sizeof(DICT_DEFINE2)-1) ||
|
||||
strnequal(path, DICT_DEFINE3, sizeof(DICT_DEFINE3)-1)) {
|
||||
|
||||
word = strchr(path, ':');
|
||||
if (word) {
|
||||
if(word) {
|
||||
word++;
|
||||
database = strchr(word, ':');
|
||||
if (database) {
|
||||
if(database) {
|
||||
*database++ = (char)0;
|
||||
nthdef = strchr(database, ':');
|
||||
if (nthdef) {
|
||||
if(nthdef) {
|
||||
*nthdef++ = (char)0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ((word == NULL) || (*word == (char)0)) {
|
||||
if((word == NULL) || (*word == (char)0)) {
|
||||
infof(data, "lookup word is missing");
|
||||
word=(char *)"default";
|
||||
}
|
||||
if ((database == NULL) || (*database == (char)0)) {
|
||||
if((database == NULL) || (*database == (char)0)) {
|
||||
database = (char *)"!";
|
||||
}
|
||||
|
||||
@@ -276,12 +276,12 @@ static CURLcode Curl_dict(struct connectdata *conn, bool *done)
|
||||
else {
|
||||
|
||||
ppath = strchr(path, '/');
|
||||
if (ppath) {
|
||||
if(ppath) {
|
||||
int i;
|
||||
|
||||
ppath++;
|
||||
for (i = 0; ppath[i]; i++) {
|
||||
if (ppath[i] == ':')
|
||||
if(ppath[i] == ':')
|
||||
ppath[i] = ' ';
|
||||
}
|
||||
result = Curl_sendf(sockfd, conn,
|
||||
|
189
lib/easy.c
189
lib/easy.c
@@ -5,7 +5,7 @@
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2007, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
* Copyright (C) 1998 - 2008, 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
|
||||
@@ -127,7 +127,7 @@ static CURLcode win32_init(void)
|
||||
|
||||
err = WSAStartup(wVersionRequested, &wsaData);
|
||||
|
||||
if (err != 0)
|
||||
if(err != 0)
|
||||
/* Tell the user that we couldn't find a useable */
|
||||
/* winsock.dll. */
|
||||
return CURLE_FAILED_INIT;
|
||||
@@ -138,7 +138,7 @@ static CURLcode win32_init(void)
|
||||
/* wVersionRequested in wVersion. wHighVersion contains the */
|
||||
/* highest supported version. */
|
||||
|
||||
if ( LOBYTE( wsaData.wVersion ) != LOBYTE(wVersionRequested) ||
|
||||
if( LOBYTE( wsaData.wVersion ) != LOBYTE(wVersionRequested) ||
|
||||
HIBYTE( wsaData.wVersion ) != HIBYTE(wVersionRequested) ) {
|
||||
/* Tell the user that we couldn't find a useable */
|
||||
|
||||
@@ -168,7 +168,7 @@ static void idna_init (void)
|
||||
char buf[60];
|
||||
UINT cp = GetACP();
|
||||
|
||||
if (!getenv("CHARSET") && cp > 0) {
|
||||
if(!getenv("CHARSET") && cp > 0) {
|
||||
snprintf(buf, sizeof(buf), "CHARSET=cp%u", cp);
|
||||
putenv(buf);
|
||||
}
|
||||
@@ -212,7 +212,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) */
|
||||
@@ -222,14 +222,14 @@ CURLcode curl_global_init(long flags)
|
||||
Curl_cstrdup = (curl_strdup_callback)system_strdup;
|
||||
Curl_ccalloc = (curl_calloc_callback)calloc;
|
||||
|
||||
if (flags & CURL_GLOBAL_SSL)
|
||||
if (!Curl_ssl_init()) {
|
||||
if(flags & CURL_GLOBAL_SSL)
|
||||
if(!Curl_ssl_init()) {
|
||||
DEBUGF(fprintf(stderr, "Error: Curl_ssl_init failed\n"));
|
||||
return CURLE_FAILED_INIT;
|
||||
}
|
||||
|
||||
if (flags & CURL_GLOBAL_WIN32)
|
||||
if (win32_init() != CURLE_OK) {
|
||||
if(flags & CURL_GLOBAL_WIN32)
|
||||
if(win32_init() != CURLE_OK) {
|
||||
DEBUGF(fprintf(stderr, "Error: win32_init failed\n"));
|
||||
return CURLE_FAILED_INIT;
|
||||
}
|
||||
@@ -267,16 +267,16 @@ CURLcode curl_global_init_mem(long flags, curl_malloc_callback m,
|
||||
CURLcode code = CURLE_OK;
|
||||
|
||||
/* Invalid input, return immediately */
|
||||
if (!m || !f || !r || !s || !c)
|
||||
if(!m || !f || !r || !s || !c)
|
||||
return CURLE_FAILED_INIT;
|
||||
|
||||
/* Already initialized, don't do it again */
|
||||
if ( initialized )
|
||||
if( initialized )
|
||||
return CURLE_OK;
|
||||
|
||||
/* Call the actual init function first */
|
||||
code = curl_global_init(flags);
|
||||
if (code == CURLE_OK) {
|
||||
if(code == CURLE_OK) {
|
||||
Curl_cmalloc = m;
|
||||
Curl_cfree = f;
|
||||
Curl_cstrdup = s;
|
||||
@@ -293,18 +293,18 @@ CURLcode curl_global_init_mem(long flags, curl_malloc_callback m,
|
||||
*/
|
||||
void curl_global_cleanup(void)
|
||||
{
|
||||
if (!initialized)
|
||||
if(!initialized)
|
||||
return;
|
||||
|
||||
if (--initialized)
|
||||
if(--initialized)
|
||||
return;
|
||||
|
||||
Curl_global_host_cache_dtor();
|
||||
|
||||
if (init_flags & CURL_GLOBAL_SSL)
|
||||
if(init_flags & CURL_GLOBAL_SSL)
|
||||
Curl_ssl_cleanup();
|
||||
|
||||
if (init_flags & CURL_GLOBAL_WIN32)
|
||||
if(init_flags & CURL_GLOBAL_WIN32)
|
||||
win32_cleanup();
|
||||
|
||||
#ifdef __AMIGA__
|
||||
@@ -324,7 +324,7 @@ CURL *curl_easy_init(void)
|
||||
struct SessionHandle *data;
|
||||
|
||||
/* Make sure we inited the global SSL stuff */
|
||||
if (!initialized) {
|
||||
if(!initialized) {
|
||||
res = curl_global_init(CURL_GLOBAL_DEFAULT);
|
||||
if(res) {
|
||||
/* something in the global init failed, return nothing */
|
||||
@@ -465,17 +465,27 @@ CURLcode curl_easy_perform(CURL *curl)
|
||||
if(!data)
|
||||
return CURLE_BAD_FUNCTION_ARGUMENT;
|
||||
|
||||
if ( ! (data->share && data->share->hostcache) ) {
|
||||
if( ! (data->share && data->share->hostcache) ) {
|
||||
/* this handle is not using a shared dns cache */
|
||||
|
||||
if (Curl_global_host_cache_use(data) &&
|
||||
(data->dns.hostcachetype != HCACHE_GLOBAL)) {
|
||||
if (data->dns.hostcachetype == HCACHE_PRIVATE)
|
||||
if(data->set.global_dns_cache &&
|
||||
(data->dns.hostcachetype != HCACHE_GLOBAL)) {
|
||||
/* global dns cache was requested but still isn't */
|
||||
struct curl_hash *ptr;
|
||||
|
||||
if(data->dns.hostcachetype == HCACHE_PRIVATE)
|
||||
/* if the current cache is private, kill it first */
|
||||
Curl_hash_destroy(data->dns.hostcache);
|
||||
data->dns.hostcache = Curl_global_host_cache_get();
|
||||
data->dns.hostcachetype = HCACHE_GLOBAL;
|
||||
|
||||
ptr = Curl_global_host_cache_init();
|
||||
if(ptr) {
|
||||
/* only do this if the global cache init works */
|
||||
data->dns.hostcache = ptr;
|
||||
data->dns.hostcachetype = HCACHE_GLOBAL;
|
||||
}
|
||||
}
|
||||
|
||||
if (!data->dns.hostcache) {
|
||||
if(!data->dns.hostcache) {
|
||||
data->dns.hostcachetype = HCACHE_PRIVATE;
|
||||
data->dns.hostcache = Curl_mk_dnscache();
|
||||
|
||||
@@ -520,7 +530,7 @@ void Curl_easy_addmulti(struct SessionHandle *data,
|
||||
void *multi)
|
||||
{
|
||||
data->multi = multi;
|
||||
if (multi == NULL)
|
||||
if(multi == NULL)
|
||||
/* the association is cleared, mark the easy handle as not used by an
|
||||
interface */
|
||||
data->state.used_interface = Curl_if_none;
|
||||
@@ -528,9 +538,9 @@ void Curl_easy_addmulti(struct SessionHandle *data,
|
||||
|
||||
void Curl_easy_initHandleData(struct SessionHandle *data)
|
||||
{
|
||||
memset(&data->reqdata, 0, sizeof(struct HandleData));
|
||||
memset(&data->req, 0, sizeof(struct SingleRequest));
|
||||
|
||||
data->reqdata.maxdownload = -1;
|
||||
data->req.maxdownload = -1;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -579,7 +589,7 @@ CURL *curl_easy_duphandle(CURL *incurl)
|
||||
outcurl->state.headersize=HEADERSIZE;
|
||||
|
||||
/* copy all userdefined values */
|
||||
if (Curl_dupset(outcurl, data) != CURLE_OK)
|
||||
if(Curl_dupset(outcurl, data) != CURLE_OK)
|
||||
break;
|
||||
|
||||
if(data->state.used_interface == Curl_if_multi)
|
||||
@@ -600,9 +610,9 @@ CURL *curl_easy_duphandle(CURL *incurl)
|
||||
/* If cookies are enabled in the parent handle, we enable them
|
||||
in the clone as well! */
|
||||
outcurl->cookies = Curl_cookie_init(data,
|
||||
data->cookies->filename,
|
||||
outcurl->cookies,
|
||||
data->set.cookiesession);
|
||||
data->cookies->filename,
|
||||
outcurl->cookies,
|
||||
data->set.cookiesession);
|
||||
if(!outcurl->cookies) {
|
||||
break;
|
||||
}
|
||||
@@ -676,11 +686,11 @@ void curl_easy_reset(CURL *curl)
|
||||
{
|
||||
struct SessionHandle *data = (struct SessionHandle *)curl;
|
||||
|
||||
Curl_safefree(data->reqdata.pathbuffer);
|
||||
data->reqdata.pathbuffer=NULL;
|
||||
Curl_safefree(data->state.pathbuffer);
|
||||
data->state.pathbuffer=NULL;
|
||||
|
||||
Curl_safefree(data->reqdata.proto.generic);
|
||||
data->reqdata.proto.generic=NULL;
|
||||
Curl_safefree(data->state.proto.generic);
|
||||
data->state.proto.generic=NULL;
|
||||
|
||||
/* zero out UserDefined data: */
|
||||
Curl_freeset(data);
|
||||
@@ -744,6 +754,107 @@ void curl_easy_reset(CURL *curl)
|
||||
data->set.new_directory_perms = 0755; /* Default permissions */
|
||||
}
|
||||
|
||||
/*
|
||||
* curl_easy_pause() allows an application to pause or unpause a specific
|
||||
* transfer and direction. This function sets the full new state for the
|
||||
* current connection this easy handle operates on.
|
||||
*
|
||||
* NOTE: if you have the receiving paused and you call this function to remove
|
||||
* the pausing, you may get your write callback called at this point.
|
||||
*
|
||||
* Action is a bitmask consisting of CURLPAUSE_* bits in curl/curl.h
|
||||
*/
|
||||
CURLcode curl_easy_pause(CURL *curl, int action)
|
||||
{
|
||||
struct SessionHandle *data = (struct SessionHandle *)curl;
|
||||
struct SingleRequest *k = &data->req;
|
||||
CURLcode result = CURLE_OK;
|
||||
|
||||
/* first switch off both pause bits */
|
||||
int newstate = k->keepon &~ (KEEP_READ_PAUSE| KEEP_WRITE_PAUSE);
|
||||
|
||||
/* set the new desired pause bits */
|
||||
newstate |= ((action & CURLPAUSE_RECV)?KEEP_READ_PAUSE:0) |
|
||||
((action & CURLPAUSE_SEND)?KEEP_WRITE_PAUSE:0);
|
||||
|
||||
/* put it back in the keepon */
|
||||
k->keepon = newstate;
|
||||
|
||||
if(!(newstate & KEEP_READ_PAUSE) && data->state.tempwrite) {
|
||||
/* we have a buffer for writing that we now seem to be able to deliver since
|
||||
the receive pausing is lifted! */
|
||||
|
||||
/* get the pointer, type and length in local copies since the function may
|
||||
return PAUSE again and then we'll get a new copy allocted and stored in
|
||||
the tempwrite variables */
|
||||
char *tempwrite = data->state.tempwrite;
|
||||
size_t tempsize = data->state.tempwritesize;
|
||||
int temptype = data->state.tempwritetype;
|
||||
size_t chunklen;
|
||||
|
||||
/* clear tempwrite here just to make sure it gets cleared if there's no
|
||||
further use of it, and make sure we don't clear it after the function
|
||||
invoke as it may have been set to a new value by then */
|
||||
data->state.tempwrite = NULL;
|
||||
|
||||
/* since the write callback API is define to never exceed
|
||||
CURL_MAX_WRITE_SIZE bytes in a single call, and since we may in fact
|
||||
have more data than that in our buffer here, we must loop sending the
|
||||
data in multiple calls until there's no data left or we get another
|
||||
pause returned.
|
||||
|
||||
A tricky part is that the function we call will "buffer" the data
|
||||
itself when it pauses on a particular buffer, so we may need to do some
|
||||
extra trickery if we get a pause return here.
|
||||
*/
|
||||
do {
|
||||
chunklen = (tempsize > CURL_MAX_WRITE_SIZE)?CURL_MAX_WRITE_SIZE:tempsize;
|
||||
|
||||
result = Curl_client_write(data->state.current_conn,
|
||||
temptype, tempwrite, chunklen);
|
||||
if(!result)
|
||||
/* failures abort the loop at once */
|
||||
break;
|
||||
|
||||
if(data->state.tempwrite && (tempsize - chunklen)) {
|
||||
/* Ouch, the reading is again paused and the block we send is now
|
||||
"cached". If this is the final chunk we can leave it like this, but
|
||||
if we have more chunks that is cached after this, we need to free
|
||||
the newly cached one and put back a version that is truly the entire
|
||||
contents that is saved for later
|
||||
*/
|
||||
char *newptr;
|
||||
|
||||
free(data->state.tempwrite); /* free the one just cached as it isn't
|
||||
enough */
|
||||
|
||||
/* note that tempsize is still the size as before the callback was
|
||||
used, and thus the whole piece of data to keep */
|
||||
newptr = malloc(tempsize);
|
||||
if(!newptr) {
|
||||
result = CURLE_OUT_OF_MEMORY;
|
||||
/* tempwrite will be freed further down */
|
||||
break;
|
||||
}
|
||||
data->state.tempwrite = newptr; /* store new pointer */
|
||||
memcpy(newptr, tempwrite, tempsize);
|
||||
data->state.tempwritesize = tempsize; /* store new size */
|
||||
/* tempwrite will be freed further down */
|
||||
break; /* go back to pausing until further notice */
|
||||
}
|
||||
else {
|
||||
tempsize -= chunklen; /* left after the call above */
|
||||
tempwrite += chunklen; /* advance the pointer */
|
||||
}
|
||||
|
||||
} while((result == CURLE_OK) && tempsize);
|
||||
|
||||
free(tempwrite); /* this is unconditionally no longer used */
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
#ifdef CURL_DOES_CONVERSIONS
|
||||
/*
|
||||
* Curl_convert_to_network() is an internal function
|
||||
@@ -789,7 +900,7 @@ CURLcode Curl_convert_to_network(struct SessionHandle *data,
|
||||
in_bytes = out_bytes = length;
|
||||
rc = iconv(data->outbound_cd, (const char**)&input_ptr, &in_bytes,
|
||||
&output_ptr, &out_bytes);
|
||||
if ((rc == ICONV_ERROR) || (in_bytes != 0)) {
|
||||
if((rc == ICONV_ERROR) || (in_bytes != 0)) {
|
||||
error = ERRNO;
|
||||
failf(data,
|
||||
"The Curl_convert_to_network iconv call failed with errno %i: %s",
|
||||
@@ -849,7 +960,7 @@ CURLcode Curl_convert_from_network(struct SessionHandle *data,
|
||||
in_bytes = out_bytes = length;
|
||||
rc = iconv(data->inbound_cd, (const char **)&input_ptr, &in_bytes,
|
||||
&output_ptr, &out_bytes);
|
||||
if ((rc == ICONV_ERROR) || (in_bytes != 0)) {
|
||||
if((rc == ICONV_ERROR) || (in_bytes != 0)) {
|
||||
error = ERRNO;
|
||||
failf(data,
|
||||
"The Curl_convert_from_network iconv call failed with errno %i: %s",
|
||||
@@ -910,14 +1021,14 @@ CURLcode Curl_convert_from_utf8(struct SessionHandle *data,
|
||||
in_bytes = out_bytes = length;
|
||||
rc = iconv(data->utf8_cd, &input_ptr, &in_bytes,
|
||||
&output_ptr, &out_bytes);
|
||||
if ((rc == ICONV_ERROR) || (in_bytes != 0)) {
|
||||
if((rc == ICONV_ERROR) || (in_bytes != 0)) {
|
||||
error = ERRNO;
|
||||
failf(data,
|
||||
"The Curl_convert_from_utf8 iconv call failed with errno %i: %s",
|
||||
error, strerror(error));
|
||||
return CURLE_CONV_FAILED;
|
||||
}
|
||||
if (output_ptr < input_ptr) {
|
||||
if(output_ptr < input_ptr) {
|
||||
/* null terminate the now shorter output string */
|
||||
*output_ptr = 0x00;
|
||||
}
|
||||
|
@@ -112,7 +112,7 @@ char *curl_easy_escape(CURL *handle, const char *string, int inlength)
|
||||
|
||||
#ifdef CURL_DOES_CONVERSIONS
|
||||
/* escape sequences are always in ASCII so convert them on non-ASCII hosts */
|
||||
if (!handle ||
|
||||
if(!handle ||
|
||||
(Curl_convert_to_network(handle, &in, 1) != CURLE_OK)) {
|
||||
/* Curl_convert_to_network calls failf if unsuccessful */
|
||||
free(ns);
|
||||
@@ -163,7 +163,7 @@ char *curl_easy_unescape(CURL *handle, const char *string, int length,
|
||||
|
||||
#ifdef CURL_DOES_CONVERSIONS
|
||||
/* escape sequences are always in ASCII so convert them on non-ASCII hosts */
|
||||
if (!handle ||
|
||||
if(!handle ||
|
||||
(Curl_convert_from_network(handle, &in, 1) != CURLE_OK)) {
|
||||
/* Curl_convert_from_network calls failf if unsuccessful */
|
||||
free(ns);
|
||||
|
178
lib/file.c
178
lib/file.c
@@ -5,7 +5,7 @@
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2007, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
* Copyright (C) 1998 - 2008, 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
|
||||
@@ -70,6 +70,7 @@
|
||||
|
||||
#endif
|
||||
|
||||
#include "strtoofft.h"
|
||||
#include "urldata.h"
|
||||
#include <curl/curl.h>
|
||||
#include "progress.h"
|
||||
@@ -94,9 +95,10 @@
|
||||
* Forward declarations.
|
||||
*/
|
||||
|
||||
static CURLcode Curl_file(struct connectdata *, bool *done);
|
||||
static CURLcode Curl_file_done(struct connectdata *conn,
|
||||
CURLcode status, bool premature);
|
||||
static CURLcode file_do(struct connectdata *, bool *done);
|
||||
static CURLcode file_done(struct connectdata *conn,
|
||||
CURLcode status, bool premature);
|
||||
static CURLcode file_connect(struct connectdata *conn, bool *done);
|
||||
|
||||
/*
|
||||
* FILE scheme handler.
|
||||
@@ -105,10 +107,10 @@ static CURLcode Curl_file_done(struct connectdata *conn,
|
||||
const struct Curl_handler Curl_handler_file = {
|
||||
"FILE", /* scheme */
|
||||
ZERO_NULL, /* setup_connection */
|
||||
Curl_file, /* do_it */
|
||||
Curl_file_done, /* done */
|
||||
file_do, /* do_it */
|
||||
file_done, /* done */
|
||||
ZERO_NULL, /* do_more */
|
||||
ZERO_NULL, /* connect_it */
|
||||
file_connect, /* connect_it */
|
||||
ZERO_NULL, /* connecting */
|
||||
ZERO_NULL, /* doing */
|
||||
ZERO_NULL, /* proto_getsock */
|
||||
@@ -118,15 +120,70 @@ const struct Curl_handler Curl_handler_file = {
|
||||
PROT_FILE /* protocol */
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
Check if this is a range download, and if so, set the internal variables
|
||||
properly. This code is copied from the FTP implementation and might as
|
||||
well be factored out.
|
||||
*/
|
||||
static CURLcode file_range(struct connectdata *conn)
|
||||
{
|
||||
curl_off_t from, to;
|
||||
curl_off_t totalsize=-1;
|
||||
char *ptr;
|
||||
char *ptr2;
|
||||
struct SessionHandle *data = conn->data;
|
||||
|
||||
if(data->state.use_range && data->state.range) {
|
||||
from=curlx_strtoofft(data->state.range, &ptr, 0);
|
||||
while(ptr && *ptr && (isspace((int)*ptr) || (*ptr=='-')))
|
||||
ptr++;
|
||||
to=curlx_strtoofft(ptr, &ptr2, 0);
|
||||
if(ptr == ptr2) {
|
||||
/* we didn't get any digit */
|
||||
to=-1;
|
||||
}
|
||||
if((-1 == to) && (from>=0)) {
|
||||
/* X - */
|
||||
data->state.resume_from = from;
|
||||
DEBUGF(infof(data, "RANGE %" FORMAT_OFF_T " to end of file\n",
|
||||
from));
|
||||
}
|
||||
else if(from < 0) {
|
||||
/* -Y */
|
||||
totalsize = -from;
|
||||
data->req.maxdownload = -from;
|
||||
data->state.resume_from = from;
|
||||
DEBUGF(infof(data, "RANGE the last %" FORMAT_OFF_T " bytes\n",
|
||||
totalsize));
|
||||
}
|
||||
else {
|
||||
/* X-Y */
|
||||
totalsize = to-from;
|
||||
data->req.maxdownload = totalsize+1; /* include last byte */
|
||||
data->state.resume_from = from;
|
||||
DEBUGF(infof(data, "RANGE from %" FORMAT_OFF_T
|
||||
" getting %" FORMAT_OFF_T " bytes\n",
|
||||
from, data->req.maxdownload));
|
||||
}
|
||||
DEBUGF(infof(data, "range-download from %" FORMAT_OFF_T
|
||||
" to %" FORMAT_OFF_T ", totally %" FORMAT_OFF_T " bytes\n",
|
||||
from, to, data->req.maxdownload));
|
||||
}
|
||||
else
|
||||
data->req.maxdownload = -1;
|
||||
return CURLE_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
* Curl_file_connect() gets called from Curl_protocol_connect() to allow us to
|
||||
* file_connect() gets called from Curl_protocol_connect() to allow us to
|
||||
* do protocol-specific actions at connect-time. We emulate a
|
||||
* connect-then-transfer protocol and "connect" to the file here
|
||||
*/
|
||||
CURLcode Curl_file_connect(struct connectdata *conn)
|
||||
static CURLcode file_connect(struct connectdata *conn, bool *done)
|
||||
{
|
||||
struct SessionHandle *data = conn->data;
|
||||
char *real_path = curl_easy_unescape(data, data->reqdata.path, 0, NULL);
|
||||
char *real_path = curl_easy_unescape(data, data->state.path, 0, NULL);
|
||||
struct FILEPROTO *file;
|
||||
int fd;
|
||||
#if defined(WIN32) || defined(MSDOS) || defined(__EMX__)
|
||||
@@ -141,17 +198,17 @@ CURLcode Curl_file_connect(struct connectdata *conn)
|
||||
sessionhandle, deal with it */
|
||||
Curl_reset_reqproto(conn);
|
||||
|
||||
if (!data->reqdata.proto.file) {
|
||||
if(!data->state.proto.file) {
|
||||
file = (struct FILEPROTO *)calloc(sizeof(struct FILEPROTO), 1);
|
||||
if(!file) {
|
||||
free(real_path);
|
||||
return CURLE_OUT_OF_MEMORY;
|
||||
}
|
||||
data->reqdata.proto.file = file;
|
||||
data->state.proto.file = file;
|
||||
}
|
||||
else {
|
||||
/* file is not a protocol that can deal with "persistancy" */
|
||||
file = data->reqdata.proto.file;
|
||||
file = data->state.proto.file;
|
||||
Curl_safefree(file->freepath);
|
||||
if(file->fd != -1)
|
||||
close(file->fd);
|
||||
@@ -176,7 +233,7 @@ CURLcode Curl_file_connect(struct connectdata *conn)
|
||||
with a drive letter.
|
||||
*/
|
||||
actual_path = real_path;
|
||||
if ((actual_path[0] == '/') &&
|
||||
if((actual_path[0] == '/') &&
|
||||
actual_path[1] &&
|
||||
(actual_path[2] == ':' || actual_path[2] == '|'))
|
||||
{
|
||||
@@ -186,7 +243,7 @@ CURLcode Curl_file_connect(struct connectdata *conn)
|
||||
|
||||
/* change path separators from '/' to '\\' for DOS, Windows and OS/2 */
|
||||
for (i=0; actual_path[i] != '\0'; ++i)
|
||||
if (actual_path[i] == '/')
|
||||
if(actual_path[i] == '/')
|
||||
actual_path[i] = '\\';
|
||||
|
||||
fd = open(actual_path, O_RDONLY | O_BINARY); /* no CR/LF translation! */
|
||||
@@ -199,18 +256,19 @@ CURLcode Curl_file_connect(struct connectdata *conn)
|
||||
|
||||
file->fd = fd;
|
||||
if(!data->set.upload && (fd == -1)) {
|
||||
failf(data, "Couldn't open file %s", data->reqdata.path);
|
||||
Curl_file_done(conn, CURLE_FILE_COULDNT_READ_FILE, FALSE);
|
||||
failf(data, "Couldn't open file %s", data->state.path);
|
||||
file_done(conn, CURLE_FILE_COULDNT_READ_FILE, FALSE);
|
||||
return CURLE_FILE_COULDNT_READ_FILE;
|
||||
}
|
||||
*done = TRUE;
|
||||
|
||||
return CURLE_OK;
|
||||
}
|
||||
|
||||
static CURLcode Curl_file_done(struct connectdata *conn,
|
||||
static CURLcode file_done(struct connectdata *conn,
|
||||
CURLcode status, bool premature)
|
||||
{
|
||||
struct FILEPROTO *file = conn->data->reqdata.proto.file;
|
||||
struct FILEPROTO *file = conn->data->state.proto.file;
|
||||
(void)status; /* not used */
|
||||
(void)premature; /* not used */
|
||||
Curl_safefree(file->freepath);
|
||||
@@ -218,9 +276,6 @@ static CURLcode Curl_file_done(struct connectdata *conn,
|
||||
if(file->fd != -1)
|
||||
close(file->fd);
|
||||
|
||||
free(file);
|
||||
conn->data->reqdata.proto.file= NULL; /* clear it! */
|
||||
|
||||
return CURLE_OK;
|
||||
}
|
||||
|
||||
@@ -232,7 +287,7 @@ static CURLcode Curl_file_done(struct connectdata *conn,
|
||||
|
||||
static CURLcode file_upload(struct connectdata *conn)
|
||||
{
|
||||
struct FILEPROTO *file = conn->data->reqdata.proto.file;
|
||||
struct FILEPROTO *file = conn->data->state.proto.file;
|
||||
const char *dir = strchr(file->path, DIRSEP);
|
||||
FILE *fp;
|
||||
CURLcode res=CURLE_OK;
|
||||
@@ -251,7 +306,7 @@ static CURLcode file_upload(struct connectdata *conn)
|
||||
*/
|
||||
conn->fread_func = data->set.fread_func;
|
||||
conn->fread_in = data->set.in;
|
||||
conn->data->reqdata.upload_fromhere = buf;
|
||||
conn->data->req.upload_fromhere = buf;
|
||||
|
||||
if(!dir)
|
||||
return CURLE_FILE_COULDNT_READ_FILE; /* fix: better error code */
|
||||
@@ -259,7 +314,7 @@ static CURLcode file_upload(struct connectdata *conn)
|
||||
if(!dir[1])
|
||||
return CURLE_FILE_COULDNT_READ_FILE; /* fix: better error code */
|
||||
|
||||
if(data->reqdata.resume_from)
|
||||
if(data->state.resume_from)
|
||||
fp = fopen( file->path, "ab" );
|
||||
else {
|
||||
int fd;
|
||||
@@ -271,7 +326,7 @@ static CURLcode file_upload(struct connectdata *conn)
|
||||
fd = open(file->path, O_WRONLY|O_CREAT|O_TRUNC,
|
||||
conn->data->set.new_file_perms);
|
||||
#endif /* !(WIN32 || MSDOS || __EMX__) */
|
||||
if (fd < 0) {
|
||||
if(fd < 0) {
|
||||
failf(data, "Can't open %s for writing", file->path);
|
||||
return CURLE_WRITE_ERROR;
|
||||
}
|
||||
@@ -288,38 +343,38 @@ static CURLcode file_upload(struct connectdata *conn)
|
||||
Curl_pgrsSetUploadSize(data, data->set.infilesize);
|
||||
|
||||
/* treat the negative resume offset value as the case of "-" */
|
||||
if(data->reqdata.resume_from < 0){
|
||||
if(stat(file->path, &file_stat)){
|
||||
if(data->state.resume_from < 0) {
|
||||
if(stat(file->path, &file_stat)) {
|
||||
fclose(fp);
|
||||
failf(data, "Can't get the size of %s", file->path);
|
||||
return CURLE_WRITE_ERROR;
|
||||
}
|
||||
else
|
||||
data->reqdata.resume_from = (curl_off_t)file_stat.st_size;
|
||||
data->state.resume_from = (curl_off_t)file_stat.st_size;
|
||||
}
|
||||
|
||||
while (res == CURLE_OK) {
|
||||
while(res == CURLE_OK) {
|
||||
int readcount;
|
||||
res = Curl_fillreadbuffer(conn, BUFSIZE, &readcount);
|
||||
if(res)
|
||||
break;
|
||||
|
||||
if (readcount <= 0) /* fix questionable compare error. curlvms */
|
||||
if(readcount <= 0) /* fix questionable compare error. curlvms */
|
||||
break;
|
||||
|
||||
nread = (size_t)readcount;
|
||||
|
||||
/*skip bytes before resume point*/
|
||||
if(data->reqdata.resume_from) {
|
||||
if( (curl_off_t)nread <= data->reqdata.resume_from ) {
|
||||
data->reqdata.resume_from -= nread;
|
||||
if(data->state.resume_from) {
|
||||
if( (curl_off_t)nread <= data->state.resume_from ) {
|
||||
data->state.resume_from -= nread;
|
||||
nread = 0;
|
||||
buf2 = buf;
|
||||
}
|
||||
else {
|
||||
buf2 = buf + data->reqdata.resume_from;
|
||||
nread -= data->reqdata.resume_from;
|
||||
data->reqdata.resume_from = 0;
|
||||
buf2 = buf + data->state.resume_from;
|
||||
nread -= (size_t)data->state.resume_from;
|
||||
data->state.resume_from = 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -350,14 +405,14 @@ static CURLcode file_upload(struct connectdata *conn)
|
||||
}
|
||||
|
||||
/*
|
||||
* Curl_file() is the protocol-specific function for the do-phase, separated
|
||||
* file_do() is the protocol-specific function for the do-phase, separated
|
||||
* from the connect-phase above. Other protocols merely setup the transfer in
|
||||
* the do-phase, to have it done in the main transfer loop but since some
|
||||
* platforms we support don't allow select()ing etc on file handles (as
|
||||
* opposed to sockets) we instead perform the whole do-operation in this
|
||||
* function.
|
||||
*/
|
||||
static CURLcode Curl_file(struct connectdata *conn, bool *done)
|
||||
static CURLcode file_do(struct connectdata *conn, bool *done)
|
||||
{
|
||||
/* This implementation ignores the host name in conformance with
|
||||
RFC 1738. Only local files (reachable via the standard file system)
|
||||
@@ -371,6 +426,7 @@ static CURLcode Curl_file(struct connectdata *conn, bool *done)
|
||||
curl_off_t expected_size=0;
|
||||
bool fstated=FALSE;
|
||||
ssize_t nread;
|
||||
size_t bytestoread;
|
||||
struct SessionHandle *data = conn->data;
|
||||
char *buf = data->state.buffer;
|
||||
curl_off_t bytecount = 0;
|
||||
@@ -379,7 +435,6 @@ static CURLcode Curl_file(struct connectdata *conn, bool *done)
|
||||
|
||||
*done = TRUE; /* unconditionally */
|
||||
|
||||
Curl_readwrite_init(conn);
|
||||
Curl_initinfo(data);
|
||||
Curl_pgrsStartNow(data);
|
||||
|
||||
@@ -387,7 +442,7 @@ static CURLcode Curl_file(struct connectdata *conn, bool *done)
|
||||
return file_upload(conn);
|
||||
|
||||
/* get the fd from the connection phase */
|
||||
fd = conn->data->reqdata.proto.file->fd;
|
||||
fd = conn->data->state.proto.file->fd;
|
||||
|
||||
/* VMS: This only works reliable for STREAMLF files */
|
||||
if( -1 != fstat(fd, &statbuf)) {
|
||||
@@ -436,14 +491,32 @@ static CURLcode Curl_file(struct connectdata *conn, bool *done)
|
||||
return result;
|
||||
}
|
||||
|
||||
if (data->reqdata.resume_from <= expected_size)
|
||||
expected_size -= data->reqdata.resume_from;
|
||||
/* Check whether file range has been specified */
|
||||
file_range(conn);
|
||||
|
||||
/* Adjust the start offset in case we want to get the N last bytes
|
||||
* of the stream iff the filesize could be determined */
|
||||
if(data->state.resume_from < 0) {
|
||||
if(!fstated) {
|
||||
failf(data, "Can't get the size of file.");
|
||||
return CURLE_READ_ERROR;
|
||||
}
|
||||
else
|
||||
data->state.resume_from += (curl_off_t)statbuf.st_size;
|
||||
}
|
||||
|
||||
if(data->state.resume_from <= expected_size)
|
||||
expected_size -= data->state.resume_from;
|
||||
else {
|
||||
failf(data, "failed to resume file:// transfer");
|
||||
return CURLE_BAD_DOWNLOAD_RESUME;
|
||||
}
|
||||
|
||||
if (fstated && (expected_size == 0))
|
||||
/* A high water mark has been specified so we obey... */
|
||||
if (data->req.maxdownload > 0)
|
||||
expected_size = data->req.maxdownload;
|
||||
|
||||
if(fstated && (expected_size == 0))
|
||||
return CURLE_OK;
|
||||
|
||||
/* The following is a shortcut implementation of file reading
|
||||
@@ -453,24 +526,27 @@ static CURLcode Curl_file(struct connectdata *conn, bool *done)
|
||||
if(fstated)
|
||||
Curl_pgrsSetDownloadSize(data, expected_size);
|
||||
|
||||
if(data->reqdata.resume_from) {
|
||||
if(data->reqdata.resume_from !=
|
||||
lseek(fd, data->reqdata.resume_from, SEEK_SET))
|
||||
if(data->state.resume_from) {
|
||||
if(data->state.resume_from !=
|
||||
lseek(fd, data->state.resume_from, SEEK_SET))
|
||||
return CURLE_BAD_DOWNLOAD_RESUME;
|
||||
}
|
||||
|
||||
Curl_pgrsTime(data, TIMER_STARTTRANSFER);
|
||||
|
||||
while (res == CURLE_OK) {
|
||||
nread = read(fd, buf, BUFSIZE-1);
|
||||
while(res == CURLE_OK) {
|
||||
/* Don't fill a whole buffer if we want less than all data */
|
||||
bytestoread = (expected_size < BUFSIZE-1)?(size_t)expected_size:BUFSIZE-1;
|
||||
nread = read(fd, buf, bytestoread);
|
||||
|
||||
if ( nread > 0)
|
||||
if( nread > 0)
|
||||
buf[nread] = 0;
|
||||
|
||||
if (nread <= 0)
|
||||
if (nread <= 0 || expected_size == 0)
|
||||
break;
|
||||
|
||||
bytecount += nread;
|
||||
expected_size -= nread;
|
||||
|
||||
res = Curl_client_write(conn, CLIENTWRITE_BODY, buf, nread);
|
||||
if(res)
|
||||
|
@@ -25,7 +25,5 @@
|
||||
***************************************************************************/
|
||||
#ifndef CURL_DISABLE_FILE
|
||||
extern const struct Curl_handler Curl_handler_file;
|
||||
|
||||
CURLcode Curl_file_connect(struct connectdata *);
|
||||
#endif
|
||||
#endif
|
||||
|
202
lib/formdata.c
202
lib/formdata.c
@@ -187,7 +187,7 @@ AddHttpPost(char * name, size_t namelength,
|
||||
else
|
||||
return NULL;
|
||||
|
||||
if (parent_post) {
|
||||
if(parent_post) {
|
||||
/* now, point our 'more' to the original 'more' */
|
||||
post->more = parent_post->more;
|
||||
|
||||
@@ -224,16 +224,16 @@ static FormInfo * AddFormInfo(char *value,
|
||||
form_info = (FormInfo *)malloc(sizeof(FormInfo));
|
||||
if(form_info) {
|
||||
memset(form_info, 0, sizeof(FormInfo));
|
||||
if (value)
|
||||
if(value)
|
||||
form_info->value = value;
|
||||
if (contenttype)
|
||||
if(contenttype)
|
||||
form_info->contenttype = contenttype;
|
||||
form_info->flags = HTTPPOST_FILENAME;
|
||||
}
|
||||
else
|
||||
return NULL;
|
||||
|
||||
if (parent_form_info) {
|
||||
if(parent_form_info) {
|
||||
/* now, point our 'more' to the original 'more' */
|
||||
form_info->more = parent_form_info->more;
|
||||
|
||||
@@ -316,7 +316,7 @@ static char *memdup(const char *src, size_t buffer_length)
|
||||
bool add = FALSE;
|
||||
char *buffer;
|
||||
|
||||
if (buffer_length)
|
||||
if(buffer_length)
|
||||
length = buffer_length;
|
||||
else if(src) {
|
||||
length = strlen(src);
|
||||
@@ -327,13 +327,13 @@ static char *memdup(const char *src, size_t buffer_length)
|
||||
return strdup((char *)"");
|
||||
|
||||
buffer = (char*)malloc(length+add);
|
||||
if (!buffer)
|
||||
if(!buffer)
|
||||
return NULL; /* fail */
|
||||
|
||||
memcpy(buffer, src, length);
|
||||
|
||||
/* if length unknown do null termination */
|
||||
if (add)
|
||||
if(add)
|
||||
buffer[length] = '\0';
|
||||
|
||||
return buffer;
|
||||
@@ -418,16 +418,16 @@ CURLFORMcode FormAdd(struct curl_httppost **httppost,
|
||||
/*
|
||||
* Loop through all the options set. Break if we have an error to report.
|
||||
*/
|
||||
while (return_value == CURL_FORMADD_OK) {
|
||||
while(return_value == CURL_FORMADD_OK) {
|
||||
|
||||
/* first see if we have more parts of the array param */
|
||||
if ( array_state ) {
|
||||
if( array_state ) {
|
||||
/* get the upcoming option from the given array */
|
||||
option = forms->option;
|
||||
array_value = (char *)forms->value;
|
||||
|
||||
forms++; /* advance this to next entry */
|
||||
if (CURLFORM_END == option) {
|
||||
if(CURLFORM_END == option) {
|
||||
/* end of array state */
|
||||
array_state = FALSE;
|
||||
continue;
|
||||
@@ -436,7 +436,7 @@ CURLFORMcode FormAdd(struct curl_httppost **httppost,
|
||||
else {
|
||||
/* This is not array-state, get next option */
|
||||
option = va_arg(params, CURLformoption);
|
||||
if (CURLFORM_END == option)
|
||||
if(CURLFORM_END == option)
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -447,7 +447,7 @@ CURLFORMcode FormAdd(struct curl_httppost **httppost,
|
||||
return_value = CURL_FORMADD_ILLEGAL_ARRAY;
|
||||
else {
|
||||
forms = va_arg(params, struct curl_forms *);
|
||||
if (forms)
|
||||
if(forms)
|
||||
array_state = TRUE;
|
||||
else
|
||||
return_value = CURL_FORMADD_NULL;
|
||||
@@ -465,19 +465,19 @@ CURLFORMcode FormAdd(struct curl_httppost **httppost,
|
||||
current_form->flags |= HTTPPOST_PTRNAME; /* fall through */
|
||||
#endif
|
||||
case CURLFORM_COPYNAME:
|
||||
if (current_form->name)
|
||||
if(current_form->name)
|
||||
return_value = CURL_FORMADD_OPTION_TWICE;
|
||||
else {
|
||||
char *name = array_state?
|
||||
array_value:va_arg(params, char *);
|
||||
if (name)
|
||||
if(name)
|
||||
current_form->name = name; /* store for the moment */
|
||||
else
|
||||
return_value = CURL_FORMADD_NULL;
|
||||
}
|
||||
break;
|
||||
case CURLFORM_NAMELENGTH:
|
||||
if (current_form->namelength)
|
||||
if(current_form->namelength)
|
||||
return_value = CURL_FORMADD_OPTION_TWICE;
|
||||
else
|
||||
current_form->namelength =
|
||||
@@ -490,19 +490,19 @@ CURLFORMcode FormAdd(struct curl_httppost **httppost,
|
||||
case CURLFORM_PTRCONTENTS:
|
||||
current_form->flags |= HTTPPOST_PTRCONTENTS; /* fall through */
|
||||
case CURLFORM_COPYCONTENTS:
|
||||
if (current_form->value)
|
||||
if(current_form->value)
|
||||
return_value = CURL_FORMADD_OPTION_TWICE;
|
||||
else {
|
||||
char *value =
|
||||
array_state?array_value:va_arg(params, char *);
|
||||
if (value)
|
||||
if(value)
|
||||
current_form->value = value; /* store for the moment */
|
||||
else
|
||||
return_value = CURL_FORMADD_NULL;
|
||||
}
|
||||
break;
|
||||
case CURLFORM_CONTENTSLENGTH:
|
||||
if (current_form->contentslength)
|
||||
if(current_form->contentslength)
|
||||
return_value = CURL_FORMADD_OPTION_TWICE;
|
||||
else
|
||||
current_form->contentslength =
|
||||
@@ -511,12 +511,12 @@ CURLFORMcode FormAdd(struct curl_httppost **httppost,
|
||||
|
||||
/* Get contents from a given file name */
|
||||
case CURLFORM_FILECONTENT:
|
||||
if (current_form->flags != 0)
|
||||
if(current_form->flags != 0)
|
||||
return_value = CURL_FORMADD_OPTION_TWICE;
|
||||
else {
|
||||
const char *filename = array_state?
|
||||
array_value:va_arg(params, char *);
|
||||
if (filename) {
|
||||
if(filename) {
|
||||
current_form->value = strdup(filename);
|
||||
if(!current_form->value)
|
||||
return_value = CURL_FORMADD_MEMORY;
|
||||
@@ -536,10 +536,10 @@ CURLFORMcode FormAdd(struct curl_httppost **httppost,
|
||||
const char *filename = array_state?array_value:
|
||||
va_arg(params, char *);
|
||||
|
||||
if (current_form->value) {
|
||||
if (current_form->flags & HTTPPOST_FILENAME) {
|
||||
if (filename) {
|
||||
if ((current_form = AddFormInfo(strdup(filename),
|
||||
if(current_form->value) {
|
||||
if(current_form->flags & HTTPPOST_FILENAME) {
|
||||
if(filename) {
|
||||
if((current_form = AddFormInfo(strdup(filename),
|
||||
NULL, current_form)) == NULL)
|
||||
return_value = CURL_FORMADD_MEMORY;
|
||||
}
|
||||
@@ -550,7 +550,7 @@ CURLFORMcode FormAdd(struct curl_httppost **httppost,
|
||||
return_value = CURL_FORMADD_OPTION_TWICE;
|
||||
}
|
||||
else {
|
||||
if (filename) {
|
||||
if(filename) {
|
||||
current_form->value = strdup(filename);
|
||||
if(!current_form->value)
|
||||
return_value = CURL_FORMADD_MEMORY;
|
||||
@@ -570,10 +570,10 @@ CURLFORMcode FormAdd(struct curl_httppost **httppost,
|
||||
const char *filename = array_state?array_value:
|
||||
va_arg(params, char *);
|
||||
|
||||
if (current_form->value) {
|
||||
if (current_form->flags & HTTPPOST_BUFFER) {
|
||||
if (filename) {
|
||||
if ((current_form = AddFormInfo(strdup(filename),
|
||||
if(current_form->value) {
|
||||
if(current_form->flags & HTTPPOST_BUFFER) {
|
||||
if(filename) {
|
||||
if((current_form = AddFormInfo(strdup(filename),
|
||||
NULL, current_form)) == NULL)
|
||||
return_value = CURL_FORMADD_MEMORY;
|
||||
}
|
||||
@@ -584,7 +584,7 @@ CURLFORMcode FormAdd(struct curl_httppost **httppost,
|
||||
return_value = CURL_FORMADD_OPTION_TWICE;
|
||||
}
|
||||
else {
|
||||
if (filename) {
|
||||
if(filename) {
|
||||
current_form->value = strdup(filename);
|
||||
if(!current_form->value)
|
||||
return_value = CURL_FORMADD_MEMORY;
|
||||
@@ -598,12 +598,12 @@ CURLFORMcode FormAdd(struct curl_httppost **httppost,
|
||||
|
||||
case CURLFORM_BUFFERPTR:
|
||||
current_form->flags |= HTTPPOST_PTRBUFFER;
|
||||
if (current_form->buffer)
|
||||
if(current_form->buffer)
|
||||
return_value = CURL_FORMADD_OPTION_TWICE;
|
||||
else {
|
||||
char *buffer =
|
||||
array_state?array_value:va_arg(params, char *);
|
||||
if (buffer)
|
||||
if(buffer)
|
||||
current_form->buffer = buffer; /* store for the moment */
|
||||
else
|
||||
return_value = CURL_FORMADD_NULL;
|
||||
@@ -611,7 +611,7 @@ CURLFORMcode FormAdd(struct curl_httppost **httppost,
|
||||
break;
|
||||
|
||||
case CURLFORM_BUFFERLENGTH:
|
||||
if (current_form->bufferlength)
|
||||
if(current_form->bufferlength)
|
||||
return_value = CURL_FORMADD_OPTION_TWICE;
|
||||
else
|
||||
current_form->bufferlength =
|
||||
@@ -622,10 +622,10 @@ CURLFORMcode FormAdd(struct curl_httppost **httppost,
|
||||
{
|
||||
const char *contenttype =
|
||||
array_state?array_value:va_arg(params, char *);
|
||||
if (current_form->contenttype) {
|
||||
if (current_form->flags & HTTPPOST_FILENAME) {
|
||||
if (contenttype) {
|
||||
if ((current_form = AddFormInfo(NULL,
|
||||
if(current_form->contenttype) {
|
||||
if(current_form->flags & HTTPPOST_FILENAME) {
|
||||
if(contenttype) {
|
||||
if((current_form = AddFormInfo(NULL,
|
||||
strdup(contenttype),
|
||||
current_form)) == NULL)
|
||||
return_value = CURL_FORMADD_MEMORY;
|
||||
@@ -637,7 +637,7 @@ CURLFORMcode FormAdd(struct curl_httppost **httppost,
|
||||
return_value = CURL_FORMADD_OPTION_TWICE;
|
||||
}
|
||||
else {
|
||||
if (contenttype) {
|
||||
if(contenttype) {
|
||||
current_form->contenttype = strdup(contenttype);
|
||||
if(!current_form->contenttype)
|
||||
return_value = CURL_FORMADD_MEMORY;
|
||||
@@ -692,7 +692,7 @@ CURLFORMcode FormAdd(struct curl_httppost **httppost,
|
||||
for(form = first_form;
|
||||
form != NULL;
|
||||
form = form->more) {
|
||||
if ( ((!form->name || !form->value) && !post) ||
|
||||
if( ((!form->name || !form->value) && !post) ||
|
||||
( (form->contentslength) &&
|
||||
(form->flags & HTTPPOST_FILENAME) ) ||
|
||||
( (form->flags & HTTPPOST_FILENAME) &&
|
||||
@@ -709,7 +709,7 @@ CURLFORMcode FormAdd(struct curl_httppost **httppost,
|
||||
break;
|
||||
}
|
||||
else {
|
||||
if ( ((form->flags & HTTPPOST_FILENAME) ||
|
||||
if( ((form->flags & HTTPPOST_FILENAME) ||
|
||||
(form->flags & HTTPPOST_BUFFER)) &&
|
||||
!form->contenttype ) {
|
||||
/* our contenttype is missing */
|
||||
@@ -721,23 +721,23 @@ CURLFORMcode FormAdd(struct curl_httppost **httppost,
|
||||
}
|
||||
form->contenttype_alloc = TRUE;
|
||||
}
|
||||
if ( !(form->flags & HTTPPOST_PTRNAME) &&
|
||||
if( !(form->flags & HTTPPOST_PTRNAME) &&
|
||||
(form == first_form) ) {
|
||||
/* copy name (without strdup; possibly contains null characters) */
|
||||
form->name = memdup(form->name, form->namelength);
|
||||
if (!form->name) {
|
||||
if(!form->name) {
|
||||
return_value = CURL_FORMADD_MEMORY;
|
||||
break;
|
||||
}
|
||||
form->name_alloc = TRUE;
|
||||
}
|
||||
if ( !(form->flags & HTTPPOST_FILENAME) &&
|
||||
if( !(form->flags & HTTPPOST_FILENAME) &&
|
||||
!(form->flags & HTTPPOST_READFILE) &&
|
||||
!(form->flags & HTTPPOST_PTRCONTENTS) &&
|
||||
!(form->flags & HTTPPOST_PTRBUFFER) ) {
|
||||
/* copy value (without strdup; possibly contains null characters) */
|
||||
form->value = memdup(form->value, form->contentslength);
|
||||
if (!form->value) {
|
||||
if(!form->value) {
|
||||
return_value = CURL_FORMADD_MEMORY;
|
||||
break;
|
||||
}
|
||||
@@ -756,7 +756,7 @@ CURLFORMcode FormAdd(struct curl_httppost **httppost,
|
||||
break;
|
||||
}
|
||||
|
||||
if (form->contenttype)
|
||||
if(form->contenttype)
|
||||
prevtype = form->contenttype;
|
||||
}
|
||||
}
|
||||
@@ -780,7 +780,7 @@ CURLFORMcode FormAdd(struct curl_httppost **httppost,
|
||||
|
||||
/* always delete the allocated memory before returning */
|
||||
form = first_form;
|
||||
while (form != NULL) {
|
||||
while(form != NULL) {
|
||||
FormInfo *delete_form;
|
||||
|
||||
delete_form = form;
|
||||
@@ -820,7 +820,7 @@ static CURLcode AddFormData(struct FormData **formp,
|
||||
{
|
||||
struct FormData *newform = (struct FormData *)
|
||||
malloc(sizeof(struct FormData));
|
||||
if (!newform)
|
||||
if(!newform)
|
||||
return CURLE_OUT_OF_MEMORY;
|
||||
newform->next = NULL;
|
||||
|
||||
@@ -829,7 +829,7 @@ static CURLcode AddFormData(struct FormData **formp,
|
||||
length = strlen((char *)line);
|
||||
|
||||
newform->line = (char *)malloc(length+1);
|
||||
if (!newform->line) {
|
||||
if(!newform->line) {
|
||||
free(newform);
|
||||
return CURLE_OUT_OF_MEMORY;
|
||||
}
|
||||
@@ -845,7 +845,7 @@ static CURLcode AddFormData(struct FormData **formp,
|
||||
else
|
||||
*formp = newform;
|
||||
|
||||
if (size) {
|
||||
if(size) {
|
||||
if((type == FORM_DATA) || (type == FORM_CONTENT))
|
||||
*size += length;
|
||||
else {
|
||||
@@ -896,7 +896,7 @@ void Curl_formclean(struct FormData **form_ptr)
|
||||
free(form->line); /* free the line */
|
||||
free(form); /* free the struct */
|
||||
|
||||
} while ((form = next) != NULL); /* continue */
|
||||
} while((form = next) != NULL); /* continue */
|
||||
|
||||
*form_ptr = NULL;
|
||||
}
|
||||
@@ -920,13 +920,13 @@ CURLcode Curl_formconvert(struct SessionHandle *data, struct FormData *form)
|
||||
|
||||
do {
|
||||
next=form->next; /* the following form line */
|
||||
if (form->type == FORM_DATA) {
|
||||
if(form->type == FORM_DATA) {
|
||||
rc = Curl_convert_to_network(data, form->line, form->length);
|
||||
/* Curl_convert_to_network calls failf if unsuccessful */
|
||||
if (rc != CURLE_OK)
|
||||
if(rc != CURLE_OK)
|
||||
return rc;
|
||||
}
|
||||
} while ((form = next) != NULL); /* continue */
|
||||
} while((form = next) != NULL); /* continue */
|
||||
return CURLE_OK;
|
||||
}
|
||||
#endif /* CURL_DOES_CONVERSIONS */
|
||||
@@ -944,11 +944,11 @@ int curl_formget(struct curl_httppost *form, void *arg,
|
||||
struct FormData *data, *ptr;
|
||||
|
||||
rc = Curl_getFormData(&data, form, NULL, &size);
|
||||
if (rc != CURLE_OK)
|
||||
if(rc != CURLE_OK)
|
||||
return (int)rc;
|
||||
|
||||
for (ptr = data; ptr; ptr = ptr->next) {
|
||||
if (ptr->type == FORM_FILE) {
|
||||
if(ptr->type == FORM_FILE) {
|
||||
char buffer[8192];
|
||||
size_t nread;
|
||||
struct Form temp;
|
||||
@@ -957,16 +957,16 @@ int curl_formget(struct curl_httppost *form, void *arg,
|
||||
|
||||
do {
|
||||
nread = readfromfile(&temp, buffer, sizeof(buffer));
|
||||
if ((nread == (size_t) -1) || (nread != append(arg, buffer, nread))) {
|
||||
if (temp.fp) {
|
||||
if((nread == (size_t) -1) || (nread != append(arg, buffer, nread))) {
|
||||
if(temp.fp) {
|
||||
fclose(temp.fp);
|
||||
}
|
||||
Curl_formclean(&data);
|
||||
return -1;
|
||||
}
|
||||
} while (nread == sizeof(buffer));
|
||||
} while(nread == sizeof(buffer));
|
||||
} else {
|
||||
if (ptr->length != append(arg, ptr->line, ptr->length)) {
|
||||
if(ptr->length != append(arg, ptr->line, ptr->length)) {
|
||||
Curl_formclean(&data);
|
||||
return -1;
|
||||
}
|
||||
@@ -1005,7 +1005,7 @@ void curl_formfree(struct curl_httppost *form)
|
||||
free(form->showfilename); /* free the faked file name */
|
||||
free(form); /* free the struct */
|
||||
|
||||
} while ((form = next) != NULL); /* continue */
|
||||
} while((form = next) != NULL); /* continue */
|
||||
}
|
||||
|
||||
#ifndef HAVE_BASENAME
|
||||
@@ -1110,7 +1110,7 @@ CURLcode Curl_getFormData(struct FormData **finalform,
|
||||
"Content-Type: multipart/form-data",
|
||||
boundary);
|
||||
|
||||
if (result) {
|
||||
if(result) {
|
||||
free(boundary);
|
||||
return result;
|
||||
}
|
||||
@@ -1123,13 +1123,13 @@ CURLcode Curl_getFormData(struct FormData **finalform,
|
||||
|
||||
if(size) {
|
||||
result = AddFormDataf(&form, &size, "\r\n");
|
||||
if (result)
|
||||
if(result)
|
||||
break;
|
||||
}
|
||||
|
||||
/* boundary */
|
||||
result = AddFormDataf(&form, &size, "--%s\r\n", boundary);
|
||||
if (result)
|
||||
if(result)
|
||||
break;
|
||||
|
||||
/* Maybe later this should be disabled when a custom_content_type is
|
||||
@@ -1138,16 +1138,16 @@ CURLcode Curl_getFormData(struct FormData **finalform,
|
||||
*/
|
||||
result = AddFormDataf(&form, &size,
|
||||
"Content-Disposition: form-data; name=\"");
|
||||
if (result)
|
||||
if(result)
|
||||
break;
|
||||
|
||||
result = AddFormData(&form, FORM_DATA, post->name, post->namelength,
|
||||
&size);
|
||||
if (result)
|
||||
if(result)
|
||||
break;
|
||||
|
||||
result = AddFormDataf(&form, &size, "\"");
|
||||
if (result)
|
||||
if(result)
|
||||
break;
|
||||
|
||||
if(post->more) {
|
||||
@@ -1160,7 +1160,7 @@ CURLcode Curl_getFormData(struct FormData **finalform,
|
||||
"\r\nContent-Type: multipart/mixed,"
|
||||
" boundary=%s\r\n",
|
||||
fileboundary);
|
||||
if (result)
|
||||
if(result)
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -1183,9 +1183,9 @@ CURLcode Curl_getFormData(struct FormData **finalform,
|
||||
fileboundary,
|
||||
(file->showfilename?file->showfilename:
|
||||
filebasename));
|
||||
if (filebasename)
|
||||
if(filebasename)
|
||||
free(filebasename);
|
||||
if (result)
|
||||
if(result)
|
||||
break;
|
||||
}
|
||||
else if((post->flags & HTTPPOST_FILENAME) ||
|
||||
@@ -1198,10 +1198,10 @@ CURLcode Curl_getFormData(struct FormData **finalform,
|
||||
"; filename=\"%s\"",
|
||||
(post->showfilename?post->showfilename:
|
||||
filebasename));
|
||||
if (filebasename)
|
||||
if(filebasename)
|
||||
free(filebasename);
|
||||
|
||||
if (result)
|
||||
if(result)
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -1210,7 +1210,7 @@ CURLcode Curl_getFormData(struct FormData **finalform,
|
||||
result = AddFormDataf(&form, &size,
|
||||
"\r\nContent-Type: %s",
|
||||
file->contenttype);
|
||||
if (result)
|
||||
if(result)
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -1218,11 +1218,11 @@ CURLcode Curl_getFormData(struct FormData **finalform,
|
||||
while( curList ) {
|
||||
/* Process the additional headers specified for this form */
|
||||
result = AddFormDataf( &form, &size, "\r\n%s", curList->data );
|
||||
if (result)
|
||||
if(result)
|
||||
break;
|
||||
curList = curList->next;
|
||||
}
|
||||
if (result) {
|
||||
if(result) {
|
||||
Curl_formclean(&firstform);
|
||||
free(boundary);
|
||||
return result;
|
||||
@@ -1240,13 +1240,13 @@ CURLcode Curl_getFormData(struct FormData **finalform,
|
||||
/* this is not a text content, mention our binary encoding */
|
||||
result = AddFormDataf(&form, &size,
|
||||
"\r\nContent-Transfer-Encoding: binary");
|
||||
if (result)
|
||||
if(result)
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
||||
result = AddFormDataf(&form, &size, "\r\n\r\n");
|
||||
if (result)
|
||||
if(result)
|
||||
break;
|
||||
|
||||
if((post->flags & HTTPPOST_FILENAME) ||
|
||||
@@ -1278,14 +1278,14 @@ CURLcode Curl_getFormData(struct FormData **finalform,
|
||||
*/
|
||||
size_t nread;
|
||||
char buffer[512];
|
||||
while ((nread = fread(buffer, 1, sizeof(buffer), fileread)) != 0) {
|
||||
while((nread = fread(buffer, 1, sizeof(buffer), fileread)) != 0) {
|
||||
result = AddFormData(&form, FORM_CONTENT, buffer, nread, &size);
|
||||
if (result)
|
||||
if(result)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (result) {
|
||||
if(result) {
|
||||
Curl_formclean(&firstform);
|
||||
free(boundary);
|
||||
return result;
|
||||
@@ -1305,11 +1305,11 @@ CURLcode Curl_getFormData(struct FormData **finalform,
|
||||
}
|
||||
|
||||
}
|
||||
else if (post->flags & HTTPPOST_BUFFER) {
|
||||
else if(post->flags & HTTPPOST_BUFFER) {
|
||||
/* include contents of buffer */
|
||||
result = AddFormData(&form, FORM_CONTENT, post->buffer,
|
||||
post->bufferlength, &size);
|
||||
if (result)
|
||||
if(result)
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -1317,11 +1317,11 @@ CURLcode Curl_getFormData(struct FormData **finalform,
|
||||
/* include the contents we got */
|
||||
result = AddFormData(&form, FORM_CONTENT, post->contents,
|
||||
post->contentslength, &size);
|
||||
if (result)
|
||||
if(result)
|
||||
break;
|
||||
}
|
||||
} while ((file = file->more) != NULL); /* for each specified file for this field */
|
||||
if (result) {
|
||||
} while((file = file->more) != NULL); /* for each specified file for this field */
|
||||
if(result) {
|
||||
Curl_formclean(&firstform);
|
||||
free(boundary);
|
||||
return result;
|
||||
@@ -1334,12 +1334,12 @@ CURLcode Curl_getFormData(struct FormData **finalform,
|
||||
"\r\n--%s--",
|
||||
fileboundary);
|
||||
free(fileboundary);
|
||||
if (result)
|
||||
if(result)
|
||||
break;
|
||||
}
|
||||
|
||||
} while ((post = post->next) != NULL); /* for each field */
|
||||
if (result) {
|
||||
} while((post = post->next) != NULL); /* for each field */
|
||||
if(result) {
|
||||
Curl_formclean(&firstform);
|
||||
free(boundary);
|
||||
return result;
|
||||
@@ -1349,7 +1349,7 @@ CURLcode Curl_getFormData(struct FormData **finalform,
|
||||
result = AddFormDataf(&form, &size,
|
||||
"\r\n--%s--\r\n",
|
||||
boundary);
|
||||
if (result) {
|
||||
if(result) {
|
||||
Curl_formclean(&firstform);
|
||||
free(boundary);
|
||||
return result;
|
||||
@@ -1488,7 +1488,7 @@ int FormAddTest(const char * errormsg,
|
||||
int result;
|
||||
va_list arg;
|
||||
va_start(arg, last_post);
|
||||
if ((result = FormAdd(httppost, last_post, arg)))
|
||||
if((result = FormAdd(httppost, last_post, arg)))
|
||||
fprintf (stderr, "ERROR doing FormAdd ret: %d action: %s\n", result,
|
||||
errormsg);
|
||||
va_end(arg);
|
||||
@@ -1539,11 +1539,11 @@ int main(int argc, argv_item_t argv[])
|
||||
(void) argc;
|
||||
(void) argv;
|
||||
|
||||
if (FormAddTest("simple COPYCONTENTS test", &httppost, &last_post,
|
||||
if(FormAddTest("simple COPYCONTENTS test", &httppost, &last_post,
|
||||
CURLFORM_COPYNAME, name1, CURLFORM_COPYCONTENTS, value1,
|
||||
CURLFORM_END))
|
||||
++errors;
|
||||
if (FormAddTest("COPYCONTENTS + CONTENTTYPE test", &httppost, &last_post,
|
||||
if(FormAddTest("COPYCONTENTS + CONTENTTYPE test", &httppost, &last_post,
|
||||
CURLFORM_COPYNAME, name2, CURLFORM_COPYCONTENTS, value2,
|
||||
CURLFORM_CONTENTTYPE, type2, CURLFORM_END))
|
||||
++errors;
|
||||
@@ -1551,41 +1551,41 @@ int main(int argc, argv_item_t argv[])
|
||||
correctly */
|
||||
name3[1] = '\0';
|
||||
value3[1] = '\0';
|
||||
if (FormAddTest("PTRNAME + NAMELENGTH + COPYNAME + CONTENTSLENGTH test",
|
||||
if(FormAddTest("PTRNAME + NAMELENGTH + COPYNAME + CONTENTSLENGTH test",
|
||||
&httppost, &last_post,
|
||||
CURLFORM_PTRNAME, name3, CURLFORM_COPYCONTENTS, value3,
|
||||
CURLFORM_CONTENTSLENGTH, value3length,
|
||||
CURLFORM_NAMELENGTH, name3length, CURLFORM_END))
|
||||
++errors;
|
||||
if (FormAddTest("simple PTRCONTENTS test", &httppost, &last_post,
|
||||
if(FormAddTest("simple PTRCONTENTS test", &httppost, &last_post,
|
||||
CURLFORM_COPYNAME, name4, CURLFORM_PTRCONTENTS, value4,
|
||||
CURLFORM_END))
|
||||
++errors;
|
||||
/* make null character at start to check that contentslength works
|
||||
correctly */
|
||||
value5[1] = '\0';
|
||||
if (FormAddTest("PTRCONTENTS + CONTENTSLENGTH test", &httppost, &last_post,
|
||||
if(FormAddTest("PTRCONTENTS + CONTENTSLENGTH test", &httppost, &last_post,
|
||||
CURLFORM_COPYNAME, name5, CURLFORM_PTRCONTENTS, value5,
|
||||
CURLFORM_CONTENTSLENGTH, value5length, CURLFORM_END))
|
||||
++errors;
|
||||
/* make null character at start to check that contentslength works
|
||||
correctly */
|
||||
value6[1] = '\0';
|
||||
if (FormAddTest("PTRCONTENTS + CONTENTSLENGTH + CONTENTTYPE test",
|
||||
if(FormAddTest("PTRCONTENTS + CONTENTSLENGTH + CONTENTTYPE test",
|
||||
&httppost, &last_post,
|
||||
CURLFORM_COPYNAME, name6, CURLFORM_PTRCONTENTS, value6,
|
||||
CURLFORM_CONTENTSLENGTH, value6length,
|
||||
CURLFORM_CONTENTTYPE, type6, CURLFORM_END))
|
||||
++errors;
|
||||
if (FormAddTest("FILE + CONTENTTYPE test", &httppost, &last_post,
|
||||
if(FormAddTest("FILE + CONTENTTYPE test", &httppost, &last_post,
|
||||
CURLFORM_COPYNAME, name7, CURLFORM_FILE, value7,
|
||||
CURLFORM_CONTENTTYPE, type7, CURLFORM_END))
|
||||
++errors;
|
||||
if (FormAddTest("FILE1 + FILE2 test", &httppost, &last_post,
|
||||
if(FormAddTest("FILE1 + FILE2 test", &httppost, &last_post,
|
||||
CURLFORM_COPYNAME, name8, CURLFORM_FILE, value7,
|
||||
CURLFORM_FILE, value8, CURLFORM_END))
|
||||
++errors;
|
||||
if (FormAddTest("FILE1 + FILE2 + FILE3 test", &httppost, &last_post,
|
||||
if(FormAddTest("FILE1 + FILE2 + FILE3 test", &httppost, &last_post,
|
||||
CURLFORM_COPYNAME, name9, CURLFORM_FILE, value7,
|
||||
CURLFORM_FILE, value8, CURLFORM_FILE, value7, CURLFORM_END))
|
||||
++errors;
|
||||
@@ -1596,11 +1596,11 @@ int main(int argc, argv_item_t argv[])
|
||||
forms[2].option = CURLFORM_FILE;
|
||||
forms[2].value = value7;
|
||||
forms[3].option = CURLFORM_END;
|
||||
if (FormAddTest("FILE1 + FILE2 + FILE3 ARRAY test", &httppost, &last_post,
|
||||
if(FormAddTest("FILE1 + FILE2 + FILE3 ARRAY test", &httppost, &last_post,
|
||||
CURLFORM_COPYNAME, name10, CURLFORM_ARRAY, forms,
|
||||
CURLFORM_END))
|
||||
++errors;
|
||||
if (FormAddTest("FILECONTENT test", &httppost, &last_post,
|
||||
if(FormAddTest("FILECONTENT test", &httppost, &last_post,
|
||||
CURLFORM_COPYNAME, name11, CURLFORM_FILECONTENT, value7,
|
||||
CURLFORM_END))
|
||||
++errors;
|
||||
@@ -1628,7 +1628,7 @@ int main(int argc, argv_item_t argv[])
|
||||
fprintf(stdout, "size: ");
|
||||
fprintf(stdout, CURL_FORMAT_OFF_T, size);
|
||||
fprintf(stdout, "\n");
|
||||
if (errors)
|
||||
if(errors)
|
||||
fprintf(stdout, "\n==> %d Test(s) failed!\n", errors);
|
||||
else
|
||||
fprintf(stdout, "\nAll Tests seem to have worked (please check output)\n");
|
||||
|
@@ -46,13 +46,13 @@ char *GetEnv(const char *variable)
|
||||
char env[MAX_PATH]; /* MAX_PATH is from windef.h */
|
||||
char *temp = getenv(variable);
|
||||
env[0] = '\0';
|
||||
if (temp != NULL)
|
||||
if(temp != NULL)
|
||||
ExpandEnvironmentStrings(temp, env, sizeof(env));
|
||||
return (env[0] != '\0')?strdup(env):NULL;
|
||||
#else
|
||||
char *env = getenv(variable);
|
||||
#ifdef VMS
|
||||
if (env && strcmp("HOME",variable) == 0)
|
||||
if(env && strcmp("HOME",variable) == 0)
|
||||
env = decc$translate_vms(env);
|
||||
#endif
|
||||
return (env && env[0])?strdup(env):NULL;
|
||||
|
@@ -58,7 +58,7 @@ CURLcode Curl_initinfo(struct SessionHandle *data)
|
||||
info->httpversion=0;
|
||||
info->filetime=-1; /* -1 is an illegal time and thus means unknown */
|
||||
|
||||
if (info->contenttype)
|
||||
if(info->contenttype)
|
||||
free(info->contenttype);
|
||||
info->contenttype = NULL;
|
||||
|
||||
@@ -214,7 +214,7 @@ CURLcode Curl_getinfo(struct SessionHandle *data, CURLINFO info, ...)
|
||||
/* determine if ssl */
|
||||
if(c->ssl[FIRSTSOCKET].use) {
|
||||
/* use the SSL context */
|
||||
if (!Curl_ssl_check_cxn(c))
|
||||
if(!Curl_ssl_check_cxn(c))
|
||||
*param_longp = -1; /* FIN received */
|
||||
}
|
||||
/* Minix 3.1 doesn't support any flags on recv; just assume socket is OK */
|
||||
|
26
lib/gtls.c
26
lib/gtls.c
@@ -97,7 +97,7 @@ int Curl_gtls_init(void)
|
||||
static int _Curl_gtls_init(void)
|
||||
{
|
||||
int ret = 1;
|
||||
if (!gtls_inited) {
|
||||
if(!gtls_inited) {
|
||||
ret = gnutls_global_init()?0:1;
|
||||
#ifdef GTLSDEBUG
|
||||
gnutls_global_set_log_function(tls_log_func);
|
||||
@@ -110,7 +110,7 @@ static int _Curl_gtls_init(void)
|
||||
|
||||
int Curl_gtls_cleanup(void)
|
||||
{
|
||||
if (gtls_inited)
|
||||
if(gtls_inited)
|
||||
gnutls_global_deinit();
|
||||
return 1;
|
||||
}
|
||||
@@ -148,7 +148,7 @@ static CURLcode handshake(struct connectdata *conn,
|
||||
{
|
||||
struct SessionHandle *data = conn->data;
|
||||
int rc;
|
||||
if (!gtls_inited)
|
||||
if(!gtls_inited)
|
||||
_Curl_gtls_init();
|
||||
do {
|
||||
rc = gnutls_handshake(session);
|
||||
@@ -198,7 +198,7 @@ static CURLcode handshake(struct connectdata *conn,
|
||||
break;
|
||||
} while(1);
|
||||
|
||||
if (rc < 0) {
|
||||
if(rc < 0) {
|
||||
failf(data, "gnutls_handshake() failed: %s", gnutls_strerror(rc));
|
||||
return CURLE_SSL_CONNECT_ERROR;
|
||||
}
|
||||
@@ -244,7 +244,7 @@ Curl_gtls_connect(struct connectdata *conn,
|
||||
void *ssl_sessionid;
|
||||
size_t ssl_idsize;
|
||||
|
||||
if (!gtls_inited) _Curl_gtls_init();
|
||||
if(!gtls_inited) _Curl_gtls_init();
|
||||
/* GnuTLS only supports TLSv1 (and SSLv3?) */
|
||||
if(data->set.ssl.version == CURL_SSLVERSION_SSLv2) {
|
||||
failf(data, "GnuTLS does not support SSLv2");
|
||||
@@ -269,7 +269,7 @@ Curl_gtls_connect(struct connectdata *conn,
|
||||
if(rc < 0) {
|
||||
infof(data, "error reading ca cert file %s (%s)\n",
|
||||
data->set.ssl.CAfile, gnutls_strerror(rc));
|
||||
if (data->set.ssl.verifypeer)
|
||||
if(data->set.ssl.verifypeer)
|
||||
return CURLE_SSL_CACERT_BADFILE;
|
||||
}
|
||||
else
|
||||
@@ -365,14 +365,14 @@ Curl_gtls_connect(struct connectdata *conn,
|
||||
gnutls_certificate_set_verify_limits(). */
|
||||
|
||||
rc = gnutls_certificate_verify_peers2(session, &verify_status);
|
||||
if (rc < 0) {
|
||||
if(rc < 0) {
|
||||
failf(data, "server cert verify failed: %d", rc);
|
||||
return CURLE_SSL_CONNECT_ERROR;
|
||||
}
|
||||
|
||||
/* verify_status is a bitmask of gnutls_certificate_status bits */
|
||||
if(verify_status & GNUTLS_CERT_INVALID) {
|
||||
if (data->set.ssl.verifypeer) {
|
||||
if(data->set.ssl.verifypeer) {
|
||||
failf(data, "server certificate verification failed. CAfile: %s",
|
||||
data->set.ssl.CAfile?data->set.ssl.CAfile:"none");
|
||||
return CURLE_SSL_CACERT;
|
||||
@@ -409,7 +409,7 @@ Curl_gtls_connect(struct connectdata *conn,
|
||||
rc = gnutls_x509_crt_check_hostname(x509_cert, conn->host.name);
|
||||
|
||||
if(!rc) {
|
||||
if (data->set.ssl.verifyhost > 1) {
|
||||
if(data->set.ssl.verifyhost > 1) {
|
||||
failf(data, "SSL: certificate subject name (%s) does not match "
|
||||
"target host name '%s'", certbuf, conn->host.dispname);
|
||||
gnutls_x509_crt_deinit(x509_cert);
|
||||
@@ -431,7 +431,7 @@ Curl_gtls_connect(struct connectdata *conn,
|
||||
}
|
||||
|
||||
if(clock < time(NULL)) {
|
||||
if (data->set.ssl.verifypeer) {
|
||||
if(data->set.ssl.verifypeer) {
|
||||
failf(data, "server certificate expiration date has passed.");
|
||||
return CURLE_PEER_FAILED_VERIFICATION;
|
||||
}
|
||||
@@ -449,7 +449,7 @@ Curl_gtls_connect(struct connectdata *conn,
|
||||
}
|
||||
|
||||
if(clock > time(NULL)) {
|
||||
if (data->set.ssl.verifypeer) {
|
||||
if(data->set.ssl.verifypeer) {
|
||||
failf(data, "server certificate not activated yet.");
|
||||
return CURLE_PEER_FAILED_VERIFICATION;
|
||||
}
|
||||
@@ -670,12 +670,12 @@ ssize_t Curl_gtls_recv(struct connectdata *conn, /* connection data */
|
||||
}
|
||||
|
||||
*wouldblock = FALSE;
|
||||
if (!ret) {
|
||||
if(!ret) {
|
||||
failf(conn->data, "Peer closed the TLS connection");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (ret < 0) {
|
||||
if(ret < 0) {
|
||||
failf(conn->data, "GnuTLS recv error (%d): %s",
|
||||
(int)ret, gnutls_strerror(ret));
|
||||
return -1;
|
||||
|
26
lib/hash.c
26
lib/hash.c
@@ -39,7 +39,7 @@ hash_element_dtor(void *user, void *element)
|
||||
struct curl_hash *h = (struct curl_hash *) user;
|
||||
struct curl_hash_element *e = (struct curl_hash_element *) element;
|
||||
|
||||
if (e->key)
|
||||
if(e->key)
|
||||
free(e->key);
|
||||
|
||||
h->dtor(e->ptr);
|
||||
@@ -57,7 +57,7 @@ Curl_hash_init(struct curl_hash *h,
|
||||
{
|
||||
int i;
|
||||
|
||||
if (!slots || !hfunc || !comparator ||!dtor) {
|
||||
if(!slots || !hfunc || !comparator ||!dtor) {
|
||||
return 1; /* failure */
|
||||
}
|
||||
|
||||
@@ -92,12 +92,12 @@ Curl_hash_alloc(int slots,
|
||||
{
|
||||
struct curl_hash *h;
|
||||
|
||||
if (!slots || !hfunc || !comparator ||!dtor) {
|
||||
if(!slots || !hfunc || !comparator ||!dtor) {
|
||||
return NULL; /* failure */
|
||||
}
|
||||
|
||||
h = (struct curl_hash *) malloc(sizeof(struct curl_hash));
|
||||
if (h) {
|
||||
if(h) {
|
||||
if(Curl_hash_init(h, slots, hfunc, comparator, dtor)) {
|
||||
/* failure */
|
||||
free(h);
|
||||
@@ -148,14 +148,14 @@ Curl_hash_add(struct curl_hash *h, void *key, size_t key_len, void *p)
|
||||
|
||||
for (le = l->head; le; le = le->next) {
|
||||
he = (struct curl_hash_element *) le->ptr;
|
||||
if (h->comp_func(he->key, he->key_len, key, key_len)) {
|
||||
if(h->comp_func(he->key, he->key_len, key, key_len)) {
|
||||
h->dtor(p); /* remove the NEW entry */
|
||||
return he->ptr; /* return the EXISTING entry */
|
||||
}
|
||||
}
|
||||
|
||||
he = mk_hash_element(key, key_len, p);
|
||||
if (he) {
|
||||
if(he) {
|
||||
if(Curl_llist_insert_next(l, l->tail, he)) {
|
||||
++h->size;
|
||||
return p; /* return the new entry */
|
||||
@@ -182,7 +182,7 @@ int Curl_hash_delete(struct curl_hash *h, void *key, size_t key_len)
|
||||
|
||||
for (le = l->head; le; le = le->next) {
|
||||
he = le->ptr;
|
||||
if (h->comp_func(he->key, he->key_len, key, key_len)) {
|
||||
if(h->comp_func(he->key, he->key_len, key, key_len)) {
|
||||
Curl_llist_remove(l, le, (void *) h);
|
||||
return 0;
|
||||
}
|
||||
@@ -199,7 +199,7 @@ Curl_hash_pick(struct curl_hash *h, void *key, size_t key_len)
|
||||
|
||||
for (le = l->head; le; le = le->next) {
|
||||
he = le->ptr;
|
||||
if (h->comp_func(he->key, he->key_len, key, key_len)) {
|
||||
if(h->comp_func(he->key, he->key_len, key, key_len)) {
|
||||
return he->ptr;
|
||||
}
|
||||
}
|
||||
@@ -254,7 +254,7 @@ Curl_hash_clean_with_criterium(struct curl_hash *h, void *user,
|
||||
struct curl_hash_element *he = le->ptr;
|
||||
lnext = le->next;
|
||||
/* ask the callback function if we shall remove this entry or not */
|
||||
if (comp(user, he->ptr)) {
|
||||
if(comp(user, he->ptr)) {
|
||||
Curl_llist_remove(list, le, (void *) h);
|
||||
--h->size; /* one less entry in the hash now */
|
||||
}
|
||||
@@ -266,7 +266,7 @@ Curl_hash_clean_with_criterium(struct curl_hash *h, void *user,
|
||||
void
|
||||
Curl_hash_destroy(struct curl_hash *h)
|
||||
{
|
||||
if (!h)
|
||||
if(!h)
|
||||
return;
|
||||
|
||||
Curl_hash_clean(h);
|
||||
@@ -279,7 +279,7 @@ size_t Curl_hash_str(void* key, size_t key_length, size_t slots_num)
|
||||
const char *end = key_str + key_length;
|
||||
unsigned long h = 5381;
|
||||
|
||||
while (key_str < end) {
|
||||
while(key_str < end) {
|
||||
h += h << 5;
|
||||
h ^= (unsigned long) *key_str++;
|
||||
}
|
||||
@@ -292,7 +292,7 @@ size_t Curl_str_key_compare(void*k1, size_t key1_len, void*k2, size_t key2_len)
|
||||
char *key1 = (char *)k1;
|
||||
char *key2 = (char *)k2;
|
||||
|
||||
if (key1_len == key2_len &&
|
||||
if(key1_len == key2_len &&
|
||||
*key1 == *key2 &&
|
||||
memcmp(key1, key2, key1_len) == 0) {
|
||||
return 1;
|
||||
@@ -309,7 +309,7 @@ void Curl_hash_print(struct curl_hash *h,
|
||||
struct curl_llist_element *le;
|
||||
struct curl_llist *list;
|
||||
struct curl_hash_element *he;
|
||||
if (!h)
|
||||
if(!h)
|
||||
return;
|
||||
|
||||
fprintf(stderr, "=Hash dump=\n");
|
||||
|
@@ -244,7 +244,7 @@ CURLcode Curl_wait_for_resolv(struct connectdata *conn,
|
||||
timeout = CURL_TIMEOUT_RESOLVE * 1000; /* default name resolve timeout */
|
||||
|
||||
/* Wait for the name resolve query to complete. */
|
||||
while (1) {
|
||||
while(1) {
|
||||
struct timeval *tvp, tv, store;
|
||||
struct timeval now = Curl_tvnow();
|
||||
long timediff;
|
||||
@@ -262,7 +262,7 @@ CURLcode Curl_wait_for_resolv(struct connectdata *conn,
|
||||
|
||||
timediff = Curl_tvdiff(Curl_tvnow(), now); /* spent time */
|
||||
timeout -= timediff?timediff:1; /* always deduct at least 1 */
|
||||
if (timeout < 0) {
|
||||
if(timeout < 0) {
|
||||
/* our timeout, so we cancel the ares operation */
|
||||
ares_cancel(data->state.areschannel);
|
||||
break;
|
||||
@@ -316,7 +316,7 @@ Curl_addrinfo *Curl_getaddrinfo(struct connectdata *conn,
|
||||
|
||||
*waitp = FALSE;
|
||||
|
||||
if (in != CURL_INADDR_NONE) {
|
||||
if(in != CURL_INADDR_NONE) {
|
||||
/* This is a dotted IP address 123.123.123.123-style */
|
||||
return Curl_ip2addr(in, hostname, port);
|
||||
}
|
||||
|
45
lib/hostip.c
45
lib/hostip.c
@@ -5,7 +5,7 @@
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2007, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
* Copyright (C) 1998 - 2008, 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
|
||||
@@ -127,22 +127,19 @@ static void freednsentry(void *freethis);
|
||||
* Curl_global_host_cache_init() initializes and sets up a global DNS cache.
|
||||
* Global DNS cache is general badness. Do not use. This will be removed in
|
||||
* a future version. Use the share interface instead!
|
||||
*
|
||||
* Returns a struct curl_hash pointer on success, NULL on failure.
|
||||
*/
|
||||
void Curl_global_host_cache_init(void)
|
||||
struct curl_hash *Curl_global_host_cache_init(void)
|
||||
{
|
||||
if (!host_cache_initialized) {
|
||||
Curl_hash_init(&hostname_cache, 7, Curl_hash_str, Curl_str_key_compare,
|
||||
freednsentry);
|
||||
host_cache_initialized = 1;
|
||||
int rc = 0;
|
||||
if(!host_cache_initialized) {
|
||||
rc = Curl_hash_init(&hostname_cache, 7, Curl_hash_str,
|
||||
Curl_str_key_compare, freednsentry);
|
||||
if(!rc)
|
||||
host_cache_initialized = 1;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Return a pointer to the global cache
|
||||
*/
|
||||
struct curl_hash *Curl_global_host_cache_get(void)
|
||||
{
|
||||
return &hostname_cache;
|
||||
return rc?NULL:&hostname_cache;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -150,7 +147,7 @@ struct curl_hash *Curl_global_host_cache_get(void)
|
||||
*/
|
||||
void Curl_global_host_cache_dtor(void)
|
||||
{
|
||||
if (host_cache_initialized) {
|
||||
if(host_cache_initialized) {
|
||||
Curl_hash_clean(&hostname_cache);
|
||||
host_cache_initialized = 0;
|
||||
}
|
||||
@@ -218,7 +215,7 @@ hostcache_timestamp_remove(void *datap, void *hc)
|
||||
(struct hostcache_prune_data *) datap;
|
||||
struct Curl_dns_entry *c = (struct Curl_dns_entry *) hc;
|
||||
|
||||
if ((data->now - c->timestamp < data->cache_timeout) ||
|
||||
if((data->now - c->timestamp < data->cache_timeout) ||
|
||||
c->inuse) {
|
||||
/* please don't remove */
|
||||
return 0;
|
||||
@@ -284,7 +281,7 @@ remove_entry_if_stale(struct SessionHandle *data, struct Curl_dns_entry *dns)
|
||||
time(&user.now);
|
||||
user.cache_timeout = data->set.dns_cache_timeout;
|
||||
|
||||
if ( !hostcache_timestamp_remove(&user,dns) )
|
||||
if( !hostcache_timestamp_remove(&user,dns) )
|
||||
return 0;
|
||||
|
||||
/* ok, we do need to clear the cache. although we need to remove just a
|
||||
@@ -336,13 +333,13 @@ Curl_cache_addr(struct SessionHandle *data,
|
||||
/* Create an entry id, based upon the hostname and port */
|
||||
entry_id = create_hostcache_id(hostname, port);
|
||||
/* If we can't create the entry id, fail */
|
||||
if (!entry_id)
|
||||
if(!entry_id)
|
||||
return NULL;
|
||||
entry_len = strlen(entry_id);
|
||||
|
||||
/* Create a new cache entry */
|
||||
dns = (struct Curl_dns_entry *) calloc(sizeof(struct Curl_dns_entry), 1);
|
||||
if (!dns) {
|
||||
if(!dns) {
|
||||
free(entry_id);
|
||||
return NULL;
|
||||
}
|
||||
@@ -407,7 +404,7 @@ int Curl_resolv(struct connectdata *conn,
|
||||
/* this allows us to time-out from the name resolver, as the timeout
|
||||
will generate a signal and we will siglongjmp() from that here */
|
||||
if(!data->set.no_signal) {
|
||||
if (sigsetjmp(curl_jmpenv, 1)) {
|
||||
if(sigsetjmp(curl_jmpenv, 1)) {
|
||||
/* this is coming from a siglongjmp() */
|
||||
failf(data, "name lookup timed out");
|
||||
return CURLRESOLV_ERROR;
|
||||
@@ -418,7 +415,7 @@ int Curl_resolv(struct connectdata *conn,
|
||||
/* Create an entry id, based upon the hostname and port */
|
||||
entry_id = create_hostcache_id(hostname, port);
|
||||
/* If we can't create the entry id, fail */
|
||||
if (!entry_id)
|
||||
if(!entry_id)
|
||||
return CURLRESOLV_ERROR;
|
||||
|
||||
entry_len = strlen(entry_id);
|
||||
@@ -437,12 +434,12 @@ int Curl_resolv(struct connectdata *conn,
|
||||
|
||||
/* See whether the returned entry is stale. Deliberately done after the
|
||||
locked block */
|
||||
if ( remove_entry_if_stale(data,dns) )
|
||||
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) {
|
||||
if(!dns) {
|
||||
/* The entry was not in the cache. Resolve it to IP address */
|
||||
|
||||
Curl_addrinfo *addr;
|
||||
@@ -458,7 +455,7 @@ int Curl_resolv(struct connectdata *conn,
|
||||
resolve call */
|
||||
addr = Curl_getaddrinfo(conn, hostname, port, &respwait);
|
||||
|
||||
if (!addr) {
|
||||
if(!addr) {
|
||||
if(respwait) {
|
||||
/* the response to our resolve call will come asynchronously at
|
||||
a later time, good or bad */
|
||||
|
14
lib/hostip.h
14
lib/hostip.h
@@ -7,7 +7,7 @@
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2007, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
* Copyright (C) 1998 - 2008, 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
|
||||
@@ -125,11 +125,15 @@ struct hostent;
|
||||
struct SessionHandle;
|
||||
struct connectdata;
|
||||
|
||||
void Curl_global_host_cache_init(void);
|
||||
/*
|
||||
* Curl_global_host_cache_init() initializes and sets up a global DNS cache.
|
||||
* Global DNS cache is general badness. Do not use. This will be removed in
|
||||
* a future version. Use the share interface instead!
|
||||
*
|
||||
* Returns a struct curl_hash pointer on success, NULL on failure.
|
||||
*/
|
||||
struct curl_hash *Curl_global_host_cache_init(void);
|
||||
void Curl_global_host_cache_dtor(void);
|
||||
struct curl_hash *Curl_global_host_cache_get(void);
|
||||
|
||||
#define Curl_global_host_cache_use(__p) ((__p)->set.global_dns_cache)
|
||||
|
||||
struct Curl_dns_entry {
|
||||
Curl_addrinfo *addr;
|
||||
|
@@ -289,7 +289,7 @@ Curl_addrinfo *Curl_getaddrinfo(struct connectdata *conn,
|
||||
#else
|
||||
h = gethostbyname(hostname);
|
||||
#endif
|
||||
if (!h)
|
||||
if(!h)
|
||||
infof(conn->data, "gethostbyname(2) failed for %s\n", hostname);
|
||||
#endif /*HAVE_GETHOSTBYNAME_R */
|
||||
}
|
||||
@@ -297,7 +297,7 @@ Curl_addrinfo *Curl_getaddrinfo(struct connectdata *conn,
|
||||
if(h) {
|
||||
ai = Curl_he2ai(h, port);
|
||||
|
||||
if (buf) /* used a *_r() function */
|
||||
if(buf) /* used a *_r() function */
|
||||
free(buf);
|
||||
}
|
||||
|
||||
|
@@ -185,7 +185,7 @@ bool Curl_ipvalid(struct SessionHandle *data)
|
||||
if(data->set.ip_version == CURL_IPRESOLVE_V6) {
|
||||
/* see if we have an IPv6 stack */
|
||||
curl_socket_t s = socket(PF_INET6, SOCK_DGRAM, 0);
|
||||
if (s == CURL_SOCKET_BAD)
|
||||
if(s == CURL_SOCKET_BAD)
|
||||
/* an ipv6 address was requested and we can't get/use one */
|
||||
return FALSE;
|
||||
sclose(s);
|
||||
@@ -204,7 +204,7 @@ static void dump_addrinfo(struct connectdata *conn, const struct addrinfo *ai)
|
||||
|
||||
printf(" fam %2d, CNAME %s, ",
|
||||
ai->ai_family, ai->ai_canonname ? ai->ai_canonname : "<none>");
|
||||
if (Curl_printable_address(ai, buf, sizeof(buf)))
|
||||
if(Curl_printable_address(ai, buf, sizeof(buf)))
|
||||
printf("%s\n", buf);
|
||||
else
|
||||
printf("failed; %s\n", Curl_strerror(conn, SOCKERRNO));
|
||||
@@ -241,7 +241,7 @@ Curl_addrinfo *Curl_getaddrinfo(struct connectdata *conn,
|
||||
|
||||
/* see if we have an IPv6 stack */
|
||||
s = socket(PF_INET6, SOCK_DGRAM, 0);
|
||||
if (s == CURL_SOCKET_BAD) {
|
||||
if(s == CURL_SOCKET_BAD) {
|
||||
/* Some non-IPv6 stacks have been found to make very slow name resolves
|
||||
* when PF_UNSPEC is used, so thus we switch to a mere PF_INET lookup if
|
||||
* the stack seems to be a non-ipv6 one. */
|
||||
@@ -290,7 +290,7 @@ Curl_addrinfo *Curl_getaddrinfo(struct connectdata *conn,
|
||||
sbufptr=sbuf;
|
||||
}
|
||||
error = getaddrinfo(hostname, sbufptr, &hints, &res);
|
||||
if (error) {
|
||||
if(error) {
|
||||
infof(data, "getaddrinfo(3) failed for %s:%d\n", hostname, port);
|
||||
return NULL;
|
||||
}
|
||||
|
110
lib/hostthre.c
110
lib/hostthre.c
@@ -110,18 +110,18 @@ static bool init_resolve_thread(struct connectdata *conn,
|
||||
defined(DEBUG_THREADING_GETADDRINFO)
|
||||
/* If this is defined, provide tracing */
|
||||
#define TRACE(args) \
|
||||
do { trace_it("%u: ", __LINE__); trace_it args; } while (0)
|
||||
do { trace_it("%u: ", __LINE__); trace_it args; } while(0)
|
||||
|
||||
static void trace_it (const char *fmt, ...)
|
||||
{
|
||||
static int do_trace = -1;
|
||||
va_list args;
|
||||
|
||||
if (do_trace == -1) {
|
||||
if(do_trace == -1) {
|
||||
const char *env = getenv("CURL_TRACE");
|
||||
do_trace = (env && atoi(env) > 0);
|
||||
}
|
||||
if (!do_trace)
|
||||
if(!do_trace)
|
||||
return;
|
||||
va_start (args, fmt);
|
||||
vfprintf (stderr, fmt, args);
|
||||
@@ -141,7 +141,7 @@ static void dump_addrinfo (struct connectdata *conn, const struct addrinfo *ai)
|
||||
|
||||
trace_it(" fam %2d, CNAME %s, ",
|
||||
ai->ai_family, ai->ai_canonname ? ai->ai_canonname : "<none>");
|
||||
if (Curl_printable_address(ai, buf, sizeof(buf)))
|
||||
if(Curl_printable_address(ai, buf, sizeof(buf)))
|
||||
trace_it("%s\n", buf);
|
||||
else
|
||||
trace_it("failed; %s\n", Curl_strerror(conn, SOCKERRNO));
|
||||
@@ -179,13 +179,13 @@ struct thread_sync_data {
|
||||
static
|
||||
void destroy_thread_sync_data(struct thread_sync_data * tsd)
|
||||
{
|
||||
if (tsd->hostname)
|
||||
if(tsd->hostname)
|
||||
free(tsd->hostname);
|
||||
if (tsd->event_terminate)
|
||||
if(tsd->event_terminate)
|
||||
CloseHandle(tsd->event_terminate);
|
||||
if (tsd->mutex_terminate)
|
||||
if(tsd->mutex_terminate)
|
||||
CloseHandle(tsd->mutex_terminate);
|
||||
if (tsd->mutex_waiting)
|
||||
if(tsd->mutex_waiting)
|
||||
CloseHandle(tsd->mutex_waiting);
|
||||
memset(tsd,0,sizeof(*tsd));
|
||||
}
|
||||
@@ -199,21 +199,21 @@ BOOL init_thread_sync_data(struct thread_data * td,
|
||||
HANDLE curr_proc = GetCurrentProcess();
|
||||
|
||||
memset(tsd, 0, sizeof(*tsd));
|
||||
if (!DuplicateHandle(curr_proc, td->mutex_waiting,
|
||||
if(!DuplicateHandle(curr_proc, td->mutex_waiting,
|
||||
curr_proc, &tsd->mutex_waiting, 0, FALSE,
|
||||
DUPLICATE_SAME_ACCESS)) {
|
||||
/* failed to duplicate the mutex, no point in continuing */
|
||||
destroy_thread_sync_data(tsd);
|
||||
return FALSE;
|
||||
}
|
||||
if (!DuplicateHandle(curr_proc, td->mutex_terminate,
|
||||
if(!DuplicateHandle(curr_proc, td->mutex_terminate,
|
||||
curr_proc, &tsd->mutex_terminate, 0, FALSE,
|
||||
DUPLICATE_SAME_ACCESS)) {
|
||||
/* failed to duplicate the mutex, no point in continuing */
|
||||
destroy_thread_sync_data(tsd);
|
||||
return FALSE;
|
||||
}
|
||||
if (!DuplicateHandle(curr_proc, td->event_terminate,
|
||||
if(!DuplicateHandle(curr_proc, td->event_terminate,
|
||||
curr_proc, &tsd->event_terminate, 0, FALSE,
|
||||
DUPLICATE_SAME_ACCESS)) {
|
||||
/* failed to duplicate the event, no point in continuing */
|
||||
@@ -224,7 +224,7 @@ BOOL init_thread_sync_data(struct thread_data * td,
|
||||
* thread during gethostbyname execution.
|
||||
*/
|
||||
tsd->hostname = strdup(hostname);
|
||||
if (!tsd->hostname) {
|
||||
if(!tsd->hostname) {
|
||||
/* Memory allocation failed */
|
||||
destroy_thread_sync_data(tsd);
|
||||
return FALSE;
|
||||
@@ -237,15 +237,15 @@ static
|
||||
BOOL acquire_thread_sync(struct thread_sync_data * tsd)
|
||||
{
|
||||
/* is the thread initiator still waiting for us ? */
|
||||
if (WaitForSingleObject(tsd->mutex_waiting, 0) == WAIT_TIMEOUT) {
|
||||
if(WaitForSingleObject(tsd->mutex_waiting, 0) == WAIT_TIMEOUT) {
|
||||
/* yes, it is */
|
||||
|
||||
/* Waiting access to event_terminate */
|
||||
if (WaitForSingleObject(tsd->mutex_terminate, INFINITE) != WAIT_OBJECT_0) {
|
||||
if(WaitForSingleObject(tsd->mutex_terminate, INFINITE) != WAIT_OBJECT_0) {
|
||||
/* Something went wrong - now just ignoring */
|
||||
}
|
||||
else {
|
||||
if (WaitForSingleObject(tsd->event_terminate, 0) != WAIT_TIMEOUT) {
|
||||
if(WaitForSingleObject(tsd->event_terminate, 0) != WAIT_TIMEOUT) {
|
||||
/* Parent thread signaled us to terminate.
|
||||
* This means that all data in conn->async is now destroyed
|
||||
* and we cannot use it.
|
||||
@@ -287,7 +287,7 @@ static unsigned __stdcall gethostbyname_thread (void *arg)
|
||||
*/
|
||||
struct thread_sync_data tsd = { 0,0,0,NULL };
|
||||
|
||||
if (!init_thread_sync_data(td, conn->async.hostname, &tsd)) {
|
||||
if(!init_thread_sync_data(td, conn->async.hostname, &tsd)) {
|
||||
/* thread synchronization data initialization failed */
|
||||
return (unsigned)-1;
|
||||
}
|
||||
@@ -302,11 +302,11 @@ static unsigned __stdcall gethostbyname_thread (void *arg)
|
||||
he = gethostbyname (tsd.hostname);
|
||||
|
||||
/* is parent thread waiting for us and are we able to access conn members? */
|
||||
if (acquire_thread_sync(&tsd)) {
|
||||
if(acquire_thread_sync(&tsd)) {
|
||||
/* Mark that we have obtained the information, and that we are calling
|
||||
* back with it. */
|
||||
SetEvent(td->event_resolved);
|
||||
if (he) {
|
||||
if(he) {
|
||||
rc = Curl_addrinfo4_callback(conn, CURL_ASYNC_SUCCESS, he);
|
||||
}
|
||||
else {
|
||||
@@ -348,7 +348,7 @@ static unsigned __stdcall getaddrinfo_thread (void *arg)
|
||||
*/
|
||||
struct thread_sync_data tsd = { 0,0,0,NULL };
|
||||
|
||||
if (!init_thread_sync_data(td, conn->async.hostname, &tsd)) {
|
||||
if(!init_thread_sync_data(td, conn->async.hostname, &tsd)) {
|
||||
/* thread synchronization data initialization failed */
|
||||
return -1;
|
||||
}
|
||||
@@ -365,12 +365,12 @@ static unsigned __stdcall getaddrinfo_thread (void *arg)
|
||||
rc = getaddrinfo(tsd.hostname, service, &hints, &res);
|
||||
|
||||
/* is parent thread waiting for us and are we able to access conn members? */
|
||||
if (acquire_thread_sync(&tsd)) {
|
||||
if(acquire_thread_sync(&tsd)) {
|
||||
/* Mark that we have obtained the information, and that we are calling
|
||||
back with it. */
|
||||
SetEvent(td->event_resolved);
|
||||
|
||||
if (rc == 0) {
|
||||
if(rc == 0) {
|
||||
#ifdef DEBUG_THREADING_GETADDRINFO
|
||||
dump_addrinfo (conn, res);
|
||||
#endif
|
||||
@@ -397,16 +397,16 @@ static unsigned __stdcall getaddrinfo_thread (void *arg)
|
||||
*/
|
||||
void Curl_destroy_thread_data (struct Curl_async *async)
|
||||
{
|
||||
if (async->hostname)
|
||||
if(async->hostname)
|
||||
free(async->hostname);
|
||||
|
||||
if (async->os_specific) {
|
||||
if(async->os_specific) {
|
||||
struct thread_data *td = (struct thread_data*) async->os_specific;
|
||||
curl_socket_t sock = td->dummy_sock;
|
||||
|
||||
if (td->mutex_terminate && td->event_terminate) {
|
||||
if(td->mutex_terminate && td->event_terminate) {
|
||||
/* Signaling resolver thread to terminate */
|
||||
if (WaitForSingleObject(td->mutex_terminate, INFINITE) == WAIT_OBJECT_0) {
|
||||
if(WaitForSingleObject(td->mutex_terminate, INFINITE) == WAIT_OBJECT_0) {
|
||||
SetEvent(td->event_terminate);
|
||||
ReleaseMutex(td->mutex_terminate);
|
||||
}
|
||||
@@ -415,24 +415,24 @@ void Curl_destroy_thread_data (struct Curl_async *async)
|
||||
}
|
||||
}
|
||||
|
||||
if (td->mutex_terminate)
|
||||
if(td->mutex_terminate)
|
||||
CloseHandle(td->mutex_terminate);
|
||||
if (td->event_terminate)
|
||||
if(td->event_terminate)
|
||||
CloseHandle(td->event_terminate);
|
||||
if (td->event_thread_started)
|
||||
if(td->event_thread_started)
|
||||
CloseHandle(td->event_thread_started);
|
||||
|
||||
if (sock != CURL_SOCKET_BAD)
|
||||
if(sock != CURL_SOCKET_BAD)
|
||||
sclose(sock);
|
||||
|
||||
/* destroy the synchronization objects */
|
||||
if (td->mutex_waiting)
|
||||
if(td->mutex_waiting)
|
||||
CloseHandle(td->mutex_waiting);
|
||||
td->mutex_waiting = NULL;
|
||||
if (td->event_resolved)
|
||||
if(td->event_resolved)
|
||||
CloseHandle(td->event_resolved);
|
||||
|
||||
if (td->thread_hnd)
|
||||
if(td->thread_hnd)
|
||||
CloseHandle(td->thread_hnd);
|
||||
|
||||
free(async->os_specific);
|
||||
@@ -454,14 +454,14 @@ static bool init_resolve_thread (struct connectdata *conn,
|
||||
struct thread_data *td = calloc(sizeof(*td), 1);
|
||||
HANDLE thread_and_event[2] = {0};
|
||||
|
||||
if (!td) {
|
||||
if(!td) {
|
||||
SET_ERRNO(ENOMEM);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
Curl_safefree(conn->async.hostname);
|
||||
conn->async.hostname = strdup(hostname);
|
||||
if (!conn->async.hostname) {
|
||||
if(!conn->async.hostname) {
|
||||
free(td);
|
||||
SET_ERRNO(ENOMEM);
|
||||
return FALSE;
|
||||
@@ -478,7 +478,7 @@ static bool init_resolve_thread (struct connectdata *conn,
|
||||
* still waiting, and take initial ownership.
|
||||
*/
|
||||
td->mutex_waiting = CreateMutex(NULL, TRUE, NULL);
|
||||
if (td->mutex_waiting == NULL) {
|
||||
if(td->mutex_waiting == NULL) {
|
||||
Curl_destroy_thread_data(&conn->async);
|
||||
SET_ERRNO(EAGAIN);
|
||||
return FALSE;
|
||||
@@ -488,7 +488,7 @@ static bool init_resolve_thread (struct connectdata *conn,
|
||||
* done resolving. Do not signal it.
|
||||
*/
|
||||
td->event_resolved = CreateEvent(NULL, TRUE, FALSE, NULL);
|
||||
if (td->event_resolved == NULL) {
|
||||
if(td->event_resolved == NULL) {
|
||||
Curl_destroy_thread_data(&conn->async);
|
||||
SET_ERRNO(EAGAIN);
|
||||
return FALSE;
|
||||
@@ -497,7 +497,7 @@ static bool init_resolve_thread (struct connectdata *conn,
|
||||
* between us and resolver thread.
|
||||
*/
|
||||
td->mutex_terminate = CreateMutex(NULL, FALSE, NULL);
|
||||
if (td->mutex_terminate == NULL) {
|
||||
if(td->mutex_terminate == NULL) {
|
||||
Curl_destroy_thread_data(&conn->async);
|
||||
SET_ERRNO(EAGAIN);
|
||||
return FALSE;
|
||||
@@ -505,7 +505,7 @@ static bool init_resolve_thread (struct connectdata *conn,
|
||||
/* Create the event used to signal thread that it should terminate.
|
||||
*/
|
||||
td->event_terminate = CreateEvent(NULL, TRUE, FALSE, NULL);
|
||||
if (td->event_terminate == NULL) {
|
||||
if(td->event_terminate == NULL) {
|
||||
Curl_destroy_thread_data(&conn->async);
|
||||
SET_ERRNO(EAGAIN);
|
||||
return FALSE;
|
||||
@@ -513,7 +513,7 @@ static bool init_resolve_thread (struct connectdata *conn,
|
||||
/* Create the event used by thread to inform it has initialized its own data.
|
||||
*/
|
||||
td->event_thread_started = CreateEvent(NULL, TRUE, FALSE, NULL);
|
||||
if (td->event_thread_started == NULL) {
|
||||
if(td->event_thread_started == NULL) {
|
||||
Curl_destroy_thread_data(&conn->async);
|
||||
SET_ERRNO(EAGAIN);
|
||||
return FALSE;
|
||||
@@ -535,7 +535,7 @@ static bool init_resolve_thread (struct connectdata *conn,
|
||||
(void) hints;
|
||||
#endif
|
||||
|
||||
if (!td->thread_hnd) {
|
||||
if(!td->thread_hnd) {
|
||||
#ifdef _WIN32_WCE
|
||||
TRACE(("CreateThread() failed; %s\n", Curl_strerror(conn, ERRNO)));
|
||||
#else
|
||||
@@ -549,7 +549,7 @@ static bool init_resolve_thread (struct connectdata *conn,
|
||||
*/
|
||||
thread_and_event[0] = td->thread_hnd;
|
||||
thread_and_event[1] = td->event_thread_started;
|
||||
if (WaitForMultipleObjects(sizeof(thread_and_event) /
|
||||
if(WaitForMultipleObjects(sizeof(thread_and_event) /
|
||||
sizeof(thread_and_event[0]),
|
||||
(const HANDLE*)thread_and_event, FALSE,
|
||||
INFINITE) == WAIT_FAILED) {
|
||||
@@ -608,9 +608,9 @@ CURLcode Curl_wait_for_resolv(struct connectdata *conn,
|
||||
td->event_resolved = NULL;
|
||||
|
||||
/* has the resolver thread succeeded in resolving our query ? */
|
||||
if (status == WAIT_OBJECT_0) {
|
||||
if(status == WAIT_OBJECT_0) {
|
||||
/* wait for the thread to exit, it's in the callback sequence */
|
||||
if (WaitForSingleObject(td->thread_hnd, 5000) == WAIT_TIMEOUT) {
|
||||
if(WaitForSingleObject(td->thread_hnd, 5000) == WAIT_TIMEOUT) {
|
||||
TerminateThread(td->thread_hnd, 0);
|
||||
conn->async.done = TRUE;
|
||||
td->thread_status = (DWORD)-1;
|
||||
@@ -640,9 +640,9 @@ CURLcode Curl_wait_for_resolv(struct connectdata *conn,
|
||||
|
||||
rc = CURLE_OK;
|
||||
|
||||
if (!conn->async.dns) {
|
||||
if(!conn->async.dns) {
|
||||
/* a name was not resolved */
|
||||
if (td->thread_status == CURLE_OUT_OF_MEMORY) {
|
||||
if(td->thread_status == CURLE_OUT_OF_MEMORY) {
|
||||
rc = CURLE_OUT_OF_MEMORY;
|
||||
failf(data, "Could not resolve host: %s", curl_easy_strerror(rc));
|
||||
}
|
||||
@@ -658,7 +658,7 @@ CURLcode Curl_wait_for_resolv(struct connectdata *conn,
|
||||
rc = CURLE_COULDNT_RESOLVE_HOST;
|
||||
}
|
||||
}
|
||||
else if (td->thread_status == (DWORD)-1 || conn->async.status == NO_DATA) {
|
||||
else if(td->thread_status == (DWORD)-1 || conn->async.status == NO_DATA) {
|
||||
failf(data, "Resolving host timed out: %s", conn->host.name);
|
||||
rc = CURLE_OPERATION_TIMEDOUT;
|
||||
}
|
||||
@@ -684,10 +684,10 @@ CURLcode Curl_is_resolved(struct connectdata *conn,
|
||||
{
|
||||
*entry = NULL;
|
||||
|
||||
if (conn->async.done) {
|
||||
if(conn->async.done) {
|
||||
/* we're done */
|
||||
Curl_destroy_thread_data(&conn->async);
|
||||
if (!conn->async.dns) {
|
||||
if(!conn->async.dns) {
|
||||
TRACE(("Curl_is_resolved(): CURLE_COULDNT_RESOLVE_HOST\n"));
|
||||
return CURLE_COULDNT_RESOLVE_HOST;
|
||||
}
|
||||
@@ -704,7 +704,7 @@ int Curl_resolv_getsock(struct connectdata *conn,
|
||||
const struct thread_data *td =
|
||||
(const struct thread_data *) conn->async.os_specific;
|
||||
|
||||
if (td && td->dummy_sock != CURL_SOCKET_BAD) {
|
||||
if(td && td->dummy_sock != CURL_SOCKET_BAD) {
|
||||
if(numsocks) {
|
||||
/* return one socket waiting for writable, even though this is just
|
||||
a dummy */
|
||||
@@ -731,12 +731,12 @@ Curl_addrinfo *Curl_getaddrinfo(struct connectdata *conn,
|
||||
*waitp = 0; /* don't wait, we act synchronously */
|
||||
|
||||
in = inet_addr(hostname);
|
||||
if (in != CURL_INADDR_NONE)
|
||||
if(in != CURL_INADDR_NONE)
|
||||
/* This is a dotted IP address 123.123.123.123-style */
|
||||
return Curl_ip2addr(in, hostname, port);
|
||||
|
||||
/* fire up a new resolver thread! */
|
||||
if (init_resolve_thread(conn, hostname, port, NULL)) {
|
||||
if(init_resolve_thread(conn, hostname, port, NULL)) {
|
||||
*waitp = TRUE; /* please wait for the response */
|
||||
return NULL;
|
||||
}
|
||||
@@ -746,7 +746,7 @@ Curl_addrinfo *Curl_getaddrinfo(struct connectdata *conn,
|
||||
hostname, Curl_strerror(conn, ERRNO));
|
||||
|
||||
h = gethostbyname(hostname);
|
||||
if (!h) {
|
||||
if(!h) {
|
||||
infof(data, "gethostbyname(2) failed for %s:%d; %s\n",
|
||||
hostname, port, Curl_strerror(conn, SOCKERRNO));
|
||||
return NULL;
|
||||
@@ -775,7 +775,7 @@ Curl_addrinfo *Curl_getaddrinfo(struct connectdata *conn,
|
||||
|
||||
/* see if we have an IPv6 stack */
|
||||
s = socket(PF_INET6, SOCK_DGRAM, 0);
|
||||
if (s == CURL_SOCKET_BAD) {
|
||||
if(s == CURL_SOCKET_BAD) {
|
||||
/* Some non-IPv6 stacks have been found to make very slow name resolves
|
||||
* when PF_UNSPEC is used, so thus we switch to a mere PF_INET lookup if
|
||||
* the stack seems to be a non-ipv6 one. */
|
||||
@@ -813,7 +813,7 @@ Curl_addrinfo *Curl_getaddrinfo(struct connectdata *conn,
|
||||
itoa(port, sbuf, 10);
|
||||
|
||||
/* fire up a new resolver thread! */
|
||||
if (init_resolve_thread(conn, hostname, port, &hints)) {
|
||||
if(init_resolve_thread(conn, hostname, port, &hints)) {
|
||||
*waitp = TRUE; /* please wait for the response */
|
||||
return NULL;
|
||||
}
|
||||
@@ -823,7 +823,7 @@ Curl_addrinfo *Curl_getaddrinfo(struct connectdata *conn,
|
||||
hostname, Curl_strerror(conn, ERRNO));
|
||||
|
||||
error = getaddrinfo(hostname, sbuf, &hints, &res);
|
||||
if (error) {
|
||||
if(error) {
|
||||
infof(data, "getaddrinfo() failed for %s:%d; %s\n",
|
||||
hostname, port, Curl_strerror(conn, SOCKERRNO));
|
||||
return NULL;
|
||||
|
415
lib/http.c
415
lib/http.c
@@ -5,7 +5,7 @@
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2007, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
* Copyright (C) 1998 - 2008, 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
|
||||
@@ -109,9 +109,9 @@
|
||||
* Forward declarations.
|
||||
*/
|
||||
|
||||
static CURLcode Curl_https_connecting(struct connectdata *conn, bool *done);
|
||||
static CURLcode https_connecting(struct connectdata *conn, bool *done);
|
||||
#ifdef USE_SSL
|
||||
static int Curl_https_getsock(struct connectdata *conn,
|
||||
static int https_getsock(struct connectdata *conn,
|
||||
curl_socket_t *socks,
|
||||
int numsocks);
|
||||
#endif
|
||||
@@ -146,9 +146,9 @@ const struct Curl_handler Curl_handler_https = {
|
||||
Curl_http_done, /* done */
|
||||
ZERO_NULL, /* do_more */
|
||||
Curl_http_connect, /* connect_it */
|
||||
Curl_https_connecting, /* connecting */
|
||||
https_connecting, /* connecting */
|
||||
ZERO_NULL, /* doing */
|
||||
Curl_https_getsock, /* proto_getsock */
|
||||
https_getsock, /* proto_getsock */
|
||||
ZERO_NULL, /* doing_getsock */
|
||||
ZERO_NULL, /* disconnect */
|
||||
PORT_HTTPS, /* defport */
|
||||
@@ -176,12 +176,12 @@ static char *checkheaders(struct SessionHandle *data, const char *thisheader)
|
||||
}
|
||||
|
||||
/*
|
||||
* Curl_output_basic() sets up an Authorization: header (or the proxy version)
|
||||
* http_output_basic() sets up an Authorization: header (or the proxy version)
|
||||
* for HTTP Basic authentication.
|
||||
*
|
||||
* Returns CURLcode.
|
||||
*/
|
||||
static CURLcode Curl_output_basic(struct connectdata *conn, bool proxy)
|
||||
static CURLcode http_output_basic(struct connectdata *conn, bool proxy)
|
||||
{
|
||||
char *authorization;
|
||||
struct SessionHandle *data=conn->data;
|
||||
@@ -275,8 +275,7 @@ static bool pickoneauth(struct auth *pick)
|
||||
static CURLcode perhapsrewind(struct connectdata *conn)
|
||||
{
|
||||
struct SessionHandle *data = conn->data;
|
||||
struct HTTP *http = data->reqdata.proto.http;
|
||||
struct Curl_transfer_keeper *k = &data->reqdata.keep;
|
||||
struct HTTP *http = data->state.proto.http;
|
||||
curl_off_t bytessent;
|
||||
curl_off_t expectsend = -1; /* default is unknown */
|
||||
|
||||
@@ -338,7 +337,7 @@ static CURLcode perhapsrewind(struct connectdata *conn)
|
||||
/* This is not NTLM or NTLM with many bytes left to send: close
|
||||
*/
|
||||
conn->bits.close = TRUE;
|
||||
k->size = 0; /* don't download any more than 0 bytes */
|
||||
data->req.size = 0; /* don't download any more than 0 bytes */
|
||||
}
|
||||
|
||||
if(bytessent)
|
||||
@@ -361,7 +360,7 @@ CURLcode Curl_http_auth_act(struct connectdata *conn)
|
||||
bool pickproxy = FALSE;
|
||||
CURLcode code = CURLE_OK;
|
||||
|
||||
if(100 == data->reqdata.keep.httpcode)
|
||||
if(100 == data->req.httpcode)
|
||||
/* this is a transient response code, ignore */
|
||||
return CURLE_OK;
|
||||
|
||||
@@ -369,23 +368,23 @@ CURLcode Curl_http_auth_act(struct connectdata *conn)
|
||||
return data->set.http_fail_on_error?CURLE_HTTP_RETURNED_ERROR:CURLE_OK;
|
||||
|
||||
if(conn->bits.user_passwd &&
|
||||
((data->reqdata.keep.httpcode == 401) ||
|
||||
(conn->bits.authneg && data->reqdata.keep.httpcode < 300))) {
|
||||
((data->req.httpcode == 401) ||
|
||||
(conn->bits.authneg && data->req.httpcode < 300))) {
|
||||
pickhost = pickoneauth(&data->state.authhost);
|
||||
if(!pickhost)
|
||||
data->state.authproblem = TRUE;
|
||||
}
|
||||
if(conn->bits.proxy_user_passwd &&
|
||||
((data->reqdata.keep.httpcode == 407) ||
|
||||
(conn->bits.authneg && data->reqdata.keep.httpcode < 300))) {
|
||||
((data->req.httpcode == 407) ||
|
||||
(conn->bits.authneg && data->req.httpcode < 300))) {
|
||||
pickproxy = pickoneauth(&data->state.authproxy);
|
||||
if(!pickproxy)
|
||||
data->state.authproblem = TRUE;
|
||||
}
|
||||
|
||||
if(pickhost || pickproxy) {
|
||||
data->reqdata.newurl = strdup(data->change.url); /* clone URL */
|
||||
if (!data->reqdata.newurl)
|
||||
data->req.newurl = strdup(data->change.url); /* clone URL */
|
||||
if(!data->req.newurl)
|
||||
return CURLE_OUT_OF_MEMORY;
|
||||
|
||||
if((data->set.httpreq != HTTPREQ_GET) &&
|
||||
@@ -397,7 +396,7 @@ CURLcode Curl_http_auth_act(struct connectdata *conn)
|
||||
}
|
||||
}
|
||||
|
||||
else if((data->reqdata.keep.httpcode < 300) &&
|
||||
else if((data->req.httpcode < 300) &&
|
||||
(!data->state.authhost.done) &&
|
||||
conn->bits.authneg) {
|
||||
/* no (known) authentication available,
|
||||
@@ -406,15 +405,15 @@ CURLcode Curl_http_auth_act(struct connectdata *conn)
|
||||
we didn't try HEAD or GET */
|
||||
if((data->set.httpreq != HTTPREQ_GET) &&
|
||||
(data->set.httpreq != HTTPREQ_HEAD)) {
|
||||
data->reqdata.newurl = strdup(data->change.url); /* clone URL */
|
||||
if (!data->reqdata.newurl)
|
||||
data->req.newurl = strdup(data->change.url); /* clone URL */
|
||||
if(!data->req.newurl)
|
||||
return CURLE_OUT_OF_MEMORY;
|
||||
data->state.authhost.done = TRUE;
|
||||
}
|
||||
}
|
||||
if (Curl_http_should_fail(conn)) {
|
||||
if(Curl_http_should_fail(conn)) {
|
||||
failf (data, "The requested URL returned error: %d",
|
||||
data->reqdata.keep.httpcode);
|
||||
data->req.httpcode);
|
||||
code = CURLE_HTTP_RETURNED_ERROR;
|
||||
}
|
||||
|
||||
@@ -436,11 +435,11 @@ CURLcode Curl_http_auth_act(struct connectdata *conn)
|
||||
* @returns CURLcode
|
||||
*/
|
||||
static CURLcode
|
||||
Curl_http_output_auth(struct connectdata *conn,
|
||||
const char *request,
|
||||
const char *path,
|
||||
bool proxytunnel) /* TRUE if this is the request setting
|
||||
up the proxy tunnel */
|
||||
http_output_auth(struct connectdata *conn,
|
||||
const char *request,
|
||||
const char *path,
|
||||
bool proxytunnel) /* TRUE if this is the request setting
|
||||
up the proxy tunnel */
|
||||
{
|
||||
CURLcode result = CURLE_OK;
|
||||
struct SessionHandle *data = conn->data;
|
||||
@@ -475,7 +474,7 @@ Curl_http_output_auth(struct connectdata *conn,
|
||||
authproxy->picked = authproxy->want;
|
||||
|
||||
/* Send proxy authentication header if needed */
|
||||
if (conn->bits.httpproxy &&
|
||||
if(conn->bits.httpproxy &&
|
||||
(conn->bits.tunnel_proxy == proxytunnel)) {
|
||||
#ifdef HAVE_GSSAPI
|
||||
if((authproxy->picked == CURLAUTH_GSSNEGOTIATE) &&
|
||||
@@ -483,7 +482,7 @@ Curl_http_output_auth(struct connectdata *conn,
|
||||
!GSS_ERROR(data->state.negotiate.status)) {
|
||||
auth="GSS-Negotiate";
|
||||
result = Curl_output_negotiate(conn, TRUE);
|
||||
if (result)
|
||||
if(result)
|
||||
return result;
|
||||
authproxy->done = TRUE;
|
||||
}
|
||||
@@ -503,11 +502,11 @@ Curl_http_output_auth(struct connectdata *conn,
|
||||
if(conn->bits.proxy_user_passwd &&
|
||||
!checkheaders(data, "Proxy-authorization:")) {
|
||||
auth="Basic";
|
||||
result = Curl_output_basic(conn, TRUE);
|
||||
result = http_output_basic(conn, TRUE);
|
||||
if(result)
|
||||
return result;
|
||||
}
|
||||
/* NOTE: Curl_output_basic() should set 'done' TRUE, as the other auth
|
||||
/* NOTE: http_output_basic() should set 'done' TRUE, as the other auth
|
||||
functions work that way */
|
||||
authproxy->done = TRUE;
|
||||
}
|
||||
@@ -552,7 +551,7 @@ Curl_http_output_auth(struct connectdata *conn,
|
||||
!GSS_ERROR(data->state.negotiate.status)) {
|
||||
auth="GSS-Negotiate";
|
||||
result = Curl_output_negotiate(conn, FALSE);
|
||||
if (result)
|
||||
if(result)
|
||||
return result;
|
||||
authhost->done = TRUE;
|
||||
}
|
||||
@@ -583,7 +582,7 @@ Curl_http_output_auth(struct connectdata *conn,
|
||||
if(conn->bits.user_passwd &&
|
||||
!checkheaders(data, "Authorization:")) {
|
||||
auth="Basic";
|
||||
result = Curl_output_basic(conn, FALSE);
|
||||
result = http_output_basic(conn, FALSE);
|
||||
if(result)
|
||||
return result;
|
||||
}
|
||||
@@ -627,7 +626,7 @@ CURLcode Curl_http_input_auth(struct connectdata *conn,
|
||||
const char *start;
|
||||
struct auth *authp;
|
||||
|
||||
if (httpcode == 407) {
|
||||
if(httpcode == 407) {
|
||||
start = header+strlen("Proxy-authenticate:");
|
||||
availp = &data->info.proxyauthavail;
|
||||
authp = &data->state.authproxy;
|
||||
@@ -652,16 +651,16 @@ CURLcode Curl_http_input_auth(struct connectdata *conn,
|
||||
*/
|
||||
|
||||
#ifdef HAVE_GSSAPI
|
||||
if (checkprefix("GSS-Negotiate", start) ||
|
||||
if(checkprefix("GSS-Negotiate", start) ||
|
||||
checkprefix("Negotiate", start)) {
|
||||
*availp |= CURLAUTH_GSSNEGOTIATE;
|
||||
authp->avail |= CURLAUTH_GSSNEGOTIATE;
|
||||
if(authp->picked == CURLAUTH_GSSNEGOTIATE) {
|
||||
/* if exactly this is wanted, go */
|
||||
int neg = Curl_input_negotiate(conn, (bool)(httpcode == 407), start);
|
||||
if (neg == 0) {
|
||||
data->reqdata.newurl = strdup(data->change.url);
|
||||
data->state.authproblem = (data->reqdata.newurl == NULL);
|
||||
if(neg == 0) {
|
||||
data->req.newurl = strdup(data->change.url);
|
||||
data->state.authproblem = (data->req.newurl == NULL);
|
||||
}
|
||||
else {
|
||||
infof(data, "Authentication problem. Ignoring this.\n");
|
||||
@@ -743,33 +742,30 @@ CURLcode Curl_http_input_auth(struct connectdata *conn,
|
||||
int Curl_http_should_fail(struct connectdata *conn)
|
||||
{
|
||||
struct SessionHandle *data;
|
||||
struct Curl_transfer_keeper *k;
|
||||
int httpcode;
|
||||
|
||||
DEBUGASSERT(conn);
|
||||
data = conn->data;
|
||||
DEBUGASSERT(data);
|
||||
|
||||
/*
|
||||
** For readability
|
||||
*/
|
||||
k = &data->reqdata.keep;
|
||||
httpcode = data->req.httpcode;
|
||||
|
||||
/*
|
||||
** If we haven't been asked to fail on error,
|
||||
** don't fail.
|
||||
*/
|
||||
if (!data->set.http_fail_on_error)
|
||||
if(!data->set.http_fail_on_error)
|
||||
return 0;
|
||||
|
||||
/*
|
||||
** Any code < 400 is never terminal.
|
||||
*/
|
||||
if (k->httpcode < 400)
|
||||
if(httpcode < 400)
|
||||
return 0;
|
||||
|
||||
if (data->reqdata.resume_from &&
|
||||
(data->set.httpreq==HTTPREQ_GET) &&
|
||||
(k->httpcode == 416)) {
|
||||
if(data->state.resume_from &&
|
||||
(data->set.httpreq==HTTPREQ_GET) &&
|
||||
(httpcode == 416)) {
|
||||
/* "Requested Range Not Satisfiable", just proceed and
|
||||
pretend this is no error */
|
||||
return 0;
|
||||
@@ -779,14 +775,14 @@ int Curl_http_should_fail(struct connectdata *conn)
|
||||
** Any code >= 400 that's not 401 or 407 is always
|
||||
** a terminal error
|
||||
*/
|
||||
if ((k->httpcode != 401) &&
|
||||
(k->httpcode != 407))
|
||||
if((httpcode != 401) &&
|
||||
(httpcode != 407))
|
||||
return 1;
|
||||
|
||||
/*
|
||||
** All we have left to deal with is 401 and 407
|
||||
*/
|
||||
DEBUGASSERT((k->httpcode == 401) || (k->httpcode == 407));
|
||||
DEBUGASSERT((httpcode == 401) || (httpcode == 407));
|
||||
|
||||
/*
|
||||
** Examine the current authentication state to see if this
|
||||
@@ -807,7 +803,8 @@ int Curl_http_should_fail(struct connectdata *conn)
|
||||
infof(data,"%s: authavail = 0x%08x\n",__FUNCTION__,data->state.authavail);
|
||||
infof(data,"%s: httpcode = %d\n",__FUNCTION__,k->httpcode);
|
||||
infof(data,"%s: authdone = %d\n",__FUNCTION__,data->state.authdone);
|
||||
infof(data,"%s: newurl = %s\n",__FUNCTION__,data->reqdata.newurl ? data->reqdata.newurl : "(null)");
|
||||
infof(data,"%s: newurl = %s\n",__FUNCTION__,data->req.newurl ?
|
||||
data->req.newurl : "(null)");
|
||||
infof(data,"%s: authproblem = %d\n",__FUNCTION__,data->state.authproblem);
|
||||
#endif
|
||||
|
||||
@@ -815,9 +812,9 @@ int Curl_http_should_fail(struct connectdata *conn)
|
||||
** Either we're not authenticating, or we're supposed to
|
||||
** be authenticating something else. This is an error.
|
||||
*/
|
||||
if((k->httpcode == 401) && !conn->bits.user_passwd)
|
||||
if((httpcode == 401) && !conn->bits.user_passwd)
|
||||
return TRUE;
|
||||
if((k->httpcode == 407) && !conn->bits.proxy_user_passwd)
|
||||
if((httpcode == 407) && !conn->bits.proxy_user_passwd)
|
||||
return TRUE;
|
||||
|
||||
return data->state.authproblem;
|
||||
@@ -837,7 +834,7 @@ static size_t readmoredata(char *buffer,
|
||||
void *userp)
|
||||
{
|
||||
struct connectdata *conn = (struct connectdata *)userp;
|
||||
struct HTTP *http = conn->data->reqdata.proto.http;
|
||||
struct HTTP *http = conn->data->state.proto.http;
|
||||
size_t fullsize = size * nitems;
|
||||
|
||||
if(0 == http->postsize)
|
||||
@@ -929,9 +926,10 @@ CURLcode add_buffer_send(send_buffer *in,
|
||||
CURLcode res;
|
||||
char *ptr;
|
||||
size_t size;
|
||||
struct HTTP *http = conn->data->reqdata.proto.http;
|
||||
struct HTTP *http = conn->data->state.proto.http;
|
||||
size_t sendsize;
|
||||
curl_socket_t sockfd;
|
||||
size_t headersize;
|
||||
|
||||
DEBUGASSERT(socketindex <= SECONDARYSOCKET);
|
||||
|
||||
@@ -943,17 +941,20 @@ CURLcode add_buffer_send(send_buffer *in,
|
||||
ptr = in->buffer;
|
||||
size = in->size_used;
|
||||
|
||||
headersize = size - included_body_bytes; /* the initial part that isn't body
|
||||
is header */
|
||||
|
||||
DEBUGASSERT(size > included_body_bytes);
|
||||
|
||||
#ifdef CURL_DOES_CONVERSIONS
|
||||
if(size - included_body_bytes > 0) {
|
||||
res = Curl_convert_to_network(conn->data, ptr, size - included_body_bytes);
|
||||
/* Curl_convert_to_network calls failf if unsuccessful */
|
||||
if(res != CURLE_OK) {
|
||||
/* conversion failed, free memory and return to the caller */
|
||||
if(in->buffer)
|
||||
free(in->buffer);
|
||||
free(in);
|
||||
return res;
|
||||
}
|
||||
res = Curl_convert_to_network(conn->data, ptr, headersize);
|
||||
/* Curl_convert_to_network calls failf if unsuccessful */
|
||||
if(res != CURLE_OK) {
|
||||
/* conversion failed, free memory and return to the caller */
|
||||
if(in->buffer)
|
||||
free(in->buffer);
|
||||
free(in);
|
||||
return res;
|
||||
}
|
||||
#endif /* CURL_DOES_CONVERSIONS */
|
||||
|
||||
@@ -981,20 +982,29 @@ CURLcode add_buffer_send(send_buffer *in,
|
||||
res = Curl_write(conn, sockfd, ptr, sendsize, &amount);
|
||||
|
||||
if(CURLE_OK == res) {
|
||||
/*
|
||||
* Note that we may not send the entire chunk at once, and we have a set
|
||||
* number of data bytes at the end of the big buffer (out of which we may
|
||||
* only send away a part).
|
||||
*/
|
||||
/* how much of the header that was sent */
|
||||
size_t headlen = (size_t)amount>headersize?headersize:(size_t)amount;
|
||||
size_t bodylen = amount - headlen;
|
||||
|
||||
if(conn->data->set.verbose) {
|
||||
/* this data _may_ contain binary stuff */
|
||||
Curl_debug(conn->data, CURLINFO_HEADER_OUT, ptr,
|
||||
(size_t)(amount-included_body_bytes), conn);
|
||||
if (included_body_bytes)
|
||||
Curl_debug(conn->data, CURLINFO_HEADER_OUT, ptr, headlen, conn);
|
||||
if((size_t)amount > headlen) {
|
||||
/* there was body data sent beyond the initial header part, pass that
|
||||
on to the debug callback too */
|
||||
Curl_debug(conn->data, CURLINFO_DATA_OUT,
|
||||
ptr+amount-included_body_bytes,
|
||||
(size_t)included_body_bytes, conn);
|
||||
ptr+headlen, bodylen, conn);
|
||||
}
|
||||
}
|
||||
if (included_body_bytes)
|
||||
if(bodylen)
|
||||
/* since we sent a piece of the body here, up the byte counter for it
|
||||
accordingly */
|
||||
http->writebytecount = included_body_bytes;
|
||||
http->writebytecount += bodylen;
|
||||
|
||||
*bytes_written += amount;
|
||||
|
||||
@@ -1083,9 +1093,28 @@ CURLcode add_buffer(send_buffer *in, const void *inptr, size_t size)
|
||||
char *new_rb;
|
||||
size_t new_size;
|
||||
|
||||
if(~size < in->size_used) {
|
||||
/* If resulting used size of send buffer would wrap size_t, cleanup
|
||||
the whole buffer and return error. Otherwise the required buffer
|
||||
size will fit into a single allocatable memory chunk */
|
||||
Curl_safefree(in->buffer);
|
||||
free(in);
|
||||
return CURLE_OUT_OF_MEMORY;
|
||||
}
|
||||
|
||||
if(!in->buffer ||
|
||||
((in->size_used + size) > (in->size_max - 1))) {
|
||||
new_size = (in->size_used+size)*2;
|
||||
|
||||
/* If current buffer size isn't enough to hold the result, use a
|
||||
buffer size that doubles the required size. If this new size
|
||||
would wrap size_t, then just use the largest possible one */
|
||||
|
||||
if((size > (size_t)-1/2) || (in->size_used > (size_t)-1/2) ||
|
||||
(~(size*2) < (in->size_used*2)))
|
||||
new_size = (size_t)-1;
|
||||
else
|
||||
new_size = (in->size_used+size)*2;
|
||||
|
||||
if(in->buffer)
|
||||
/* we have a buffer, enlarge the existing one */
|
||||
new_rb = (char *)realloc(in->buffer, new_size);
|
||||
@@ -1188,7 +1217,7 @@ CURLcode Curl_proxyCONNECT(struct connectdata *conn,
|
||||
{
|
||||
int subversion=0;
|
||||
struct SessionHandle *data=conn->data;
|
||||
struct Curl_transfer_keeper *k = &data->reqdata.keep;
|
||||
struct SingleRequest *k = &data->req;
|
||||
CURLcode result;
|
||||
int res;
|
||||
long timeout =
|
||||
@@ -1207,19 +1236,19 @@ CURLcode Curl_proxyCONNECT(struct connectdata *conn,
|
||||
conn->bits.proxy_connect_closed = FALSE;
|
||||
|
||||
do {
|
||||
if (!conn->bits.tunnel_connecting) { /* BEGIN CONNECT PHASE */
|
||||
if(!conn->bits.tunnel_connecting) { /* BEGIN CONNECT PHASE */
|
||||
char *host_port;
|
||||
send_buffer *req_buffer;
|
||||
|
||||
infof(data, "Establish HTTP proxy tunnel to %s:%d\n",
|
||||
hostname, remote_port);
|
||||
|
||||
if(data->reqdata.newurl) {
|
||||
if(data->req.newurl) {
|
||||
/* This only happens if we've looped here due to authentication
|
||||
reasons, and we don't really use the newly cloned URL here
|
||||
then. Just free() it. */
|
||||
free(data->reqdata.newurl);
|
||||
data->reqdata.newurl = NULL;
|
||||
free(data->req.newurl);
|
||||
data->req.newurl = NULL;
|
||||
}
|
||||
|
||||
/* initialize a dynamic send-buffer */
|
||||
@@ -1235,7 +1264,7 @@ CURLcode Curl_proxyCONNECT(struct connectdata *conn,
|
||||
}
|
||||
|
||||
/* Setup the proxy-authorization header, if any */
|
||||
result = Curl_http_output_auth(conn, (char *)"CONNECT", host_port, TRUE);
|
||||
result = http_output_auth(conn, (char *)"CONNECT", host_port, TRUE);
|
||||
|
||||
if(CURLE_OK == result) {
|
||||
char *host=(char *)"";
|
||||
@@ -1314,8 +1343,8 @@ CURLcode Curl_proxyCONNECT(struct connectdata *conn,
|
||||
}
|
||||
|
||||
/* if we're in multi-mode and we would block, return instead for a retry */
|
||||
if (Curl_if_multi == data->state.used_interface) {
|
||||
if (0 == Curl_socket_ready(tunnelsocket, CURL_SOCKET_BAD, 0))
|
||||
if(Curl_if_multi == data->state.used_interface) {
|
||||
if(0 == Curl_socket_ready(tunnelsocket, CURL_SOCKET_BAD, 0))
|
||||
/* return so we'll be called again polling-style */
|
||||
return CURLE_OK;
|
||||
else {
|
||||
@@ -1380,8 +1409,15 @@ CURLcode Curl_proxyCONNECT(struct connectdata *conn,
|
||||
keepon = FALSE;
|
||||
else if(gotbytes <= 0) {
|
||||
keepon = FALSE;
|
||||
error = SELECT_ERROR;
|
||||
failf(data, "Proxy CONNECT aborted");
|
||||
if(data->set.proxyauth && data->state.authproxy.avail) {
|
||||
/* proxy auth was requested and there was proxy auth available,
|
||||
then deem this as "mere" proxy disconnect */
|
||||
conn->bits.proxy_connect_closed = TRUE;
|
||||
}
|
||||
else {
|
||||
error = SELECT_ERROR;
|
||||
failf(data, "Proxy CONNECT aborted");
|
||||
}
|
||||
}
|
||||
else {
|
||||
/*
|
||||
@@ -1561,6 +1597,8 @@ CURLcode Curl_proxyCONNECT(struct connectdata *conn,
|
||||
}
|
||||
break;
|
||||
} /* switch */
|
||||
if(Curl_pgrsUpdate(conn))
|
||||
return CURLE_ABORTED_BY_CALLBACK;
|
||||
} /* while there's buffer left and loop is requested */
|
||||
|
||||
if(error)
|
||||
@@ -1571,20 +1609,20 @@ CURLcode Curl_proxyCONNECT(struct connectdata *conn,
|
||||
headers. 'newurl' is set to a new URL if we must loop. */
|
||||
Curl_http_auth_act(conn);
|
||||
|
||||
if (closeConnection && data->reqdata.newurl) {
|
||||
if(closeConnection && data->req.newurl) {
|
||||
/* Connection closed by server. Don't use it anymore */
|
||||
sclose(conn->sock[sockindex]);
|
||||
conn->sock[sockindex] = CURL_SOCKET_BAD;
|
||||
break;
|
||||
}
|
||||
} /* END NEGOTIATION PHASE */
|
||||
} while(data->reqdata.newurl);
|
||||
} while(data->req.newurl);
|
||||
|
||||
if(200 != k->httpcode) {
|
||||
if(200 != data->req.httpcode) {
|
||||
failf(data, "Received HTTP code %d from proxy after CONNECT",
|
||||
k->httpcode);
|
||||
data->req.httpcode);
|
||||
|
||||
if (closeConnection && data->reqdata.newurl)
|
||||
if(closeConnection && data->req.newurl)
|
||||
conn->bits.proxy_connect_closed = TRUE;
|
||||
|
||||
return CURLE_RECV_ERROR;
|
||||
@@ -1599,7 +1637,7 @@ CURLcode Curl_proxyCONNECT(struct connectdata *conn,
|
||||
data->state.authproxy.done = TRUE;
|
||||
|
||||
infof (data, "Proxy replied OK to CONNECT request\n");
|
||||
k->ignorebody = FALSE; /* put it (back) to non-ignore state */
|
||||
data->req.ignorebody = FALSE; /* put it (back) to non-ignore state */
|
||||
return CURLE_OK;
|
||||
}
|
||||
|
||||
@@ -1634,14 +1672,14 @@ CURLcode Curl_http_connect(struct connectdata *conn, bool *done)
|
||||
return result;
|
||||
}
|
||||
|
||||
if (conn->bits.tunnel_connecting) {
|
||||
if(conn->bits.tunnel_connecting) {
|
||||
/* nothing else to do except wait right now - we're not done here. */
|
||||
return CURLE_OK;
|
||||
}
|
||||
|
||||
if(!data->state.this_is_a_follow) {
|
||||
/* this is not a followed location, get the original host name */
|
||||
if (data->state.first_host)
|
||||
if(data->state.first_host)
|
||||
/* Free to avoid leaking memory on multiple requests*/
|
||||
free(data->state.first_host);
|
||||
|
||||
@@ -1653,7 +1691,7 @@ CURLcode Curl_http_connect(struct connectdata *conn, bool *done)
|
||||
if(conn->protocol & PROT_HTTPS) {
|
||||
/* perform SSL initialization */
|
||||
if(data->state.used_interface == Curl_if_multi) {
|
||||
result = Curl_https_connecting(conn, done);
|
||||
result = https_connecting(conn, done);
|
||||
if(result)
|
||||
return result;
|
||||
}
|
||||
@@ -1672,7 +1710,7 @@ CURLcode Curl_http_connect(struct connectdata *conn, bool *done)
|
||||
return CURLE_OK;
|
||||
}
|
||||
|
||||
static CURLcode Curl_https_connecting(struct connectdata *conn, bool *done)
|
||||
static CURLcode https_connecting(struct connectdata *conn, bool *done)
|
||||
{
|
||||
CURLcode result;
|
||||
DEBUGASSERT((conn) && (conn->protocol & PROT_HTTPS));
|
||||
@@ -1688,22 +1726,22 @@ static CURLcode Curl_https_connecting(struct connectdata *conn, bool *done)
|
||||
#ifdef USE_SSLEAY
|
||||
/* This function is OpenSSL-specific. It should be made to query the generic
|
||||
SSL layer instead. */
|
||||
static int Curl_https_getsock(struct connectdata *conn,
|
||||
static int https_getsock(struct connectdata *conn,
|
||||
curl_socket_t *socks,
|
||||
int numsocks)
|
||||
{
|
||||
if (conn->protocol & PROT_HTTPS) {
|
||||
if(conn->protocol & PROT_HTTPS) {
|
||||
struct ssl_connect_data *connssl = &conn->ssl[FIRSTSOCKET];
|
||||
|
||||
if(!numsocks)
|
||||
return GETSOCK_BLANK;
|
||||
|
||||
if (connssl->connecting_state == ssl_connect_2_writing) {
|
||||
if(connssl->connecting_state == ssl_connect_2_writing) {
|
||||
/* write mode */
|
||||
socks[0] = conn->sock[FIRSTSOCKET];
|
||||
return GETSOCK_WRITESOCK(0);
|
||||
}
|
||||
else if (connssl->connecting_state == ssl_connect_2_reading) {
|
||||
else if(connssl->connecting_state == ssl_connect_2_reading) {
|
||||
/* read mode */
|
||||
socks[0] = conn->sock[FIRSTSOCKET];
|
||||
return GETSOCK_READSOCK(0);
|
||||
@@ -1713,7 +1751,7 @@ static int Curl_https_getsock(struct connectdata *conn,
|
||||
}
|
||||
#else
|
||||
#ifdef USE_GNUTLS
|
||||
int Curl_https_getsock(struct connectdata *conn,
|
||||
int https_getsock(struct connectdata *conn,
|
||||
curl_socket_t *socks,
|
||||
int numsocks)
|
||||
{
|
||||
@@ -1724,7 +1762,7 @@ int Curl_https_getsock(struct connectdata *conn,
|
||||
}
|
||||
#else
|
||||
#ifdef USE_NSS
|
||||
int Curl_https_getsock(struct connectdata *conn,
|
||||
int https_getsock(struct connectdata *conn,
|
||||
curl_socket_t *socks,
|
||||
int numsocks)
|
||||
{
|
||||
@@ -1735,7 +1773,7 @@ int Curl_https_getsock(struct connectdata *conn,
|
||||
}
|
||||
#else
|
||||
#ifdef USE_QSOSSL
|
||||
int Curl_https_getsock(struct connectdata *conn,
|
||||
int https_getsock(struct connectdata *conn,
|
||||
curl_socket_t *socks,
|
||||
int numsocks)
|
||||
{
|
||||
@@ -1758,15 +1796,16 @@ CURLcode Curl_http_done(struct connectdata *conn,
|
||||
CURLcode status, bool premature)
|
||||
{
|
||||
struct SessionHandle *data = conn->data;
|
||||
struct HTTP *http =data->reqdata.proto.http;
|
||||
struct Curl_transfer_keeper *k = &data->reqdata.keep;
|
||||
struct HTTP *http =data->state.proto.http;
|
||||
(void)premature; /* not used */
|
||||
|
||||
/* set the proper values (possibly modified on POST) */
|
||||
conn->fread_func = data->set.fread_func; /* restore */
|
||||
conn->fread_in = data->set.in; /* restore */
|
||||
conn->seek_func = data->set.seek_func; /* restore */
|
||||
conn->seek_client = data->set.seek_client; /* restore */
|
||||
|
||||
if (http == NULL)
|
||||
if(http == NULL)
|
||||
return CURLE_OK;
|
||||
|
||||
if(http->send_buffer) {
|
||||
@@ -1778,7 +1817,7 @@ CURLcode Curl_http_done(struct connectdata *conn,
|
||||
}
|
||||
|
||||
if(HTTPREQ_POST_FORM == data->set.httpreq) {
|
||||
k->bytecount = http->readbytecount + http->writebytecount;
|
||||
data->req.bytecount = http->readbytecount + http->writebytecount;
|
||||
|
||||
Curl_formclean(&http->sendit); /* Now free that whole lot */
|
||||
if(http->form.fp) {
|
||||
@@ -1788,15 +1827,15 @@ CURLcode Curl_http_done(struct connectdata *conn,
|
||||
}
|
||||
}
|
||||
else if(HTTPREQ_PUT == data->set.httpreq)
|
||||
k->bytecount = http->readbytecount + http->writebytecount;
|
||||
data->req.bytecount = http->readbytecount + http->writebytecount;
|
||||
|
||||
if (status != CURLE_OK)
|
||||
if(status != CURLE_OK)
|
||||
return (status);
|
||||
|
||||
if(!conn->bits.retry &&
|
||||
((http->readbytecount +
|
||||
data->reqdata.keep.headerbytecount -
|
||||
data->reqdata.keep.deductheadercount)) <= 0) {
|
||||
data->req.headerbytecount -
|
||||
data->req.deductheadercount)) <= 0) {
|
||||
/* If this connection isn't simply closed to be retried, AND nothing was
|
||||
read from the HTTP server (that counts), this can't be right so we
|
||||
return an error here */
|
||||
@@ -1879,7 +1918,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
|
||||
char *buf = data->state.buffer; /* this is a short cut to the buffer */
|
||||
CURLcode result=CURLE_OK;
|
||||
struct HTTP *http;
|
||||
char *ppath = data->reqdata.path;
|
||||
char *ppath = data->state.path;
|
||||
char ftp_typecode[sizeof(";type=?")] = "";
|
||||
char *host = conn->host.name;
|
||||
const char *te = ""; /* transfer-encoding */
|
||||
@@ -1898,18 +1937,18 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
|
||||
sessionhandle, deal with it */
|
||||
Curl_reset_reqproto(conn);
|
||||
|
||||
if(!data->reqdata.proto.http) {
|
||||
if(!data->state.proto.http) {
|
||||
/* Only allocate this struct if we don't already have it! */
|
||||
|
||||
http = (struct HTTP *)calloc(sizeof(struct HTTP), 1);
|
||||
if(!http)
|
||||
return CURLE_OUT_OF_MEMORY;
|
||||
data->reqdata.proto.http = http;
|
||||
data->state.proto.http = http;
|
||||
}
|
||||
else
|
||||
http = data->reqdata.proto.http;
|
||||
http = data->state.proto.http;
|
||||
|
||||
if ( (conn->protocol&(PROT_HTTP|PROT_FTP)) &&
|
||||
if( (conn->protocol&(PROT_HTTP|PROT_FTP)) &&
|
||||
data->set.upload) {
|
||||
httpreq = HTTPREQ_PUT;
|
||||
}
|
||||
@@ -1951,7 +1990,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
|
||||
}
|
||||
|
||||
/* setup the authentication headers */
|
||||
result = Curl_http_output_auth(conn, request, ppath, FALSE);
|
||||
result = http_output_auth(conn, request, ppath, FALSE);
|
||||
if(result)
|
||||
return result;
|
||||
|
||||
@@ -1990,7 +2029,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
|
||||
Curl_compareheader(ptr, "Transfer-Encoding:", "chunked");
|
||||
}
|
||||
else {
|
||||
if (httpreq == HTTPREQ_GET)
|
||||
if(httpreq == HTTPREQ_GET)
|
||||
conn->bits.upload_chunky = FALSE;
|
||||
if(conn->bits.upload_chunky)
|
||||
te = "Transfer-Encoding: chunked\r\n";
|
||||
@@ -2035,7 +2074,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
|
||||
|
||||
if(((conn->protocol&PROT_HTTPS) && (conn->remote_port == PORT_HTTPS)) ||
|
||||
(!(conn->protocol&PROT_HTTPS) && (conn->remote_port == PORT_HTTP)) )
|
||||
/* If (HTTPS on port 443) OR (non-HTTPS on port 80) then don't include
|
||||
/* if(HTTPS on port 443) OR (non-HTTPS on port 80) then don't include
|
||||
the port number in the host string */
|
||||
conn->allocptr.host = aprintf("Host: %s%s%s\r\n",
|
||||
conn->bits.ipv6_ip?"[":"",
|
||||
@@ -2053,7 +2092,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
|
||||
return CURLE_OUT_OF_MEMORY;
|
||||
}
|
||||
|
||||
if (conn->bits.httpproxy && !conn->bits.tunnel_proxy) {
|
||||
if(conn->bits.httpproxy && !conn->bits.tunnel_proxy) {
|
||||
/* Using a proxy but does not tunnel through it */
|
||||
|
||||
/* The path sent to the proxy is in fact the entire URL. But if the remote
|
||||
@@ -2094,22 +2133,24 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
|
||||
}
|
||||
}
|
||||
ppath = data->change.url;
|
||||
/* when doing ftp, append ;type=<a|i> if not present */
|
||||
if (checkprefix("ftp://", ppath) || checkprefix("ftps://", ppath)) {
|
||||
char *p = strstr(ppath, ";type=");
|
||||
if (p && p[6] && p[7] == 0) {
|
||||
switch (toupper((int)((unsigned char)p[6]))) {
|
||||
case 'A':
|
||||
case 'D':
|
||||
case 'I':
|
||||
break;
|
||||
default:
|
||||
p = NULL;
|
||||
if (data->set.proxy_transfer_mode) {
|
||||
/* when doing ftp, append ;type=<a|i> if not present */
|
||||
if(checkprefix("ftp://", ppath) || checkprefix("ftps://", ppath)) {
|
||||
char *p = strstr(ppath, ";type=");
|
||||
if(p && p[6] && p[7] == 0) {
|
||||
switch (toupper((int)((unsigned char)p[6]))) {
|
||||
case 'A':
|
||||
case 'D':
|
||||
case 'I':
|
||||
break;
|
||||
default:
|
||||
p = NULL;
|
||||
}
|
||||
}
|
||||
if(!p)
|
||||
snprintf(ftp_typecode, sizeof(ftp_typecode), ";type=%c",
|
||||
data->set.prefer_ascii ? 'a' : 'i');
|
||||
}
|
||||
if (!p)
|
||||
snprintf(ftp_typecode, sizeof(ftp_typecode), ";type=%c",
|
||||
data->set.prefer_ascii ? 'a' : 'i');
|
||||
}
|
||||
}
|
||||
if(HTTPREQ_POST_FORM == httpreq) {
|
||||
@@ -2137,7 +2178,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
|
||||
if(( (HTTPREQ_POST == httpreq) ||
|
||||
(HTTPREQ_POST_FORM == httpreq) ||
|
||||
(HTTPREQ_PUT == httpreq) ) &&
|
||||
data->reqdata.resume_from) {
|
||||
data->state.resume_from) {
|
||||
/**********************************************************************
|
||||
* Resuming upload in HTTP means that we PUT or POST and that we have
|
||||
* got a resume_from value set. The resume value has already created
|
||||
@@ -2146,44 +2187,55 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
|
||||
* file size before we continue this venture in the dark lands of HTTP.
|
||||
*********************************************************************/
|
||||
|
||||
if(data->reqdata.resume_from < 0 ) {
|
||||
if(data->state.resume_from < 0 ) {
|
||||
/*
|
||||
* This is meant to get the size of the present remote-file by itself.
|
||||
* We don't support this now. Bail out!
|
||||
*/
|
||||
data->reqdata.resume_from = 0;
|
||||
data->state.resume_from = 0;
|
||||
}
|
||||
|
||||
if(data->reqdata.resume_from && !data->state.this_is_a_follow) {
|
||||
if(data->state.resume_from && !data->state.this_is_a_follow) {
|
||||
/* do we still game? */
|
||||
curl_off_t passed=0;
|
||||
|
||||
/* Now, let's read off the proper amount of bytes from the
|
||||
input. If we knew it was a proper file we could've just
|
||||
fseek()ed but we only have a stream here */
|
||||
do {
|
||||
size_t readthisamountnow = (size_t)(data->reqdata.resume_from - passed);
|
||||
size_t actuallyread;
|
||||
input. */
|
||||
if(conn->seek_func) {
|
||||
curl_off_t readthisamountnow = data->state.resume_from;
|
||||
|
||||
if(readthisamountnow > BUFSIZE)
|
||||
readthisamountnow = BUFSIZE;
|
||||
|
||||
actuallyread =
|
||||
data->set.fread_func(data->state.buffer, 1, (size_t)readthisamountnow,
|
||||
data->set.in);
|
||||
|
||||
passed += actuallyread;
|
||||
if(actuallyread != readthisamountnow) {
|
||||
failf(data, "Could only read %" FORMAT_OFF_T
|
||||
" bytes from the input",
|
||||
passed);
|
||||
if(conn->seek_func(conn->seek_client,
|
||||
readthisamountnow, SEEK_SET) != 0) {
|
||||
failf(data, "Could not seek stream");
|
||||
return CURLE_READ_ERROR;
|
||||
}
|
||||
} while(passed != data->reqdata.resume_from); /* loop until done */
|
||||
}
|
||||
else {
|
||||
curl_off_t passed=0;
|
||||
|
||||
do {
|
||||
size_t readthisamountnow = (size_t)(data->state.resume_from - passed);
|
||||
size_t actuallyread;
|
||||
|
||||
if(readthisamountnow > BUFSIZE)
|
||||
readthisamountnow = BUFSIZE;
|
||||
|
||||
actuallyread = data->set.fread_func(data->state.buffer, 1,
|
||||
(size_t)readthisamountnow,
|
||||
data->set.in);
|
||||
|
||||
passed += actuallyread;
|
||||
if(actuallyread != readthisamountnow) {
|
||||
failf(data, "Could only read %" FORMAT_OFF_T
|
||||
" bytes from the input",
|
||||
passed);
|
||||
return CURLE_READ_ERROR;
|
||||
}
|
||||
} while(passed != data->state.resume_from); /* loop until done */
|
||||
}
|
||||
|
||||
/* now, decrease the size of the read */
|
||||
if(data->set.infilesize>0) {
|
||||
data->set.infilesize -= data->reqdata.resume_from;
|
||||
data->set.infilesize -= data->state.resume_from;
|
||||
|
||||
if(data->set.infilesize <= 0) {
|
||||
failf(data, "File already completely uploaded");
|
||||
@@ -2193,7 +2245,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
|
||||
/* we've passed, proceed as normal */
|
||||
}
|
||||
}
|
||||
if(data->reqdata.use_range) {
|
||||
if(data->state.use_range) {
|
||||
/*
|
||||
* A range is selected. We use different headers whether we're downloading
|
||||
* or uploading and we always let customized headers override our internal
|
||||
@@ -2205,7 +2257,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
|
||||
if(conn->allocptr.rangeline)
|
||||
free(conn->allocptr.rangeline);
|
||||
conn->allocptr.rangeline = aprintf("Range: bytes=%s\r\n",
|
||||
data->reqdata.range);
|
||||
data->state.range);
|
||||
}
|
||||
else if((httpreq != HTTPREQ_GET) &&
|
||||
!checkheaders(data, "Content-Range:")) {
|
||||
@@ -2214,14 +2266,14 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
|
||||
if(conn->allocptr.rangeline)
|
||||
free(conn->allocptr.rangeline);
|
||||
|
||||
if(data->reqdata.resume_from) {
|
||||
if(data->state.resume_from) {
|
||||
/* This is because "resume" was selected */
|
||||
curl_off_t total_expected_size=
|
||||
data->reqdata.resume_from + data->set.infilesize;
|
||||
data->state.resume_from + data->set.infilesize;
|
||||
conn->allocptr.rangeline =
|
||||
aprintf("Content-Range: bytes %s%" FORMAT_OFF_T
|
||||
"/%" FORMAT_OFF_T "\r\n",
|
||||
data->reqdata.range, total_expected_size-1,
|
||||
data->state.range, total_expected_size-1,
|
||||
total_expected_size);
|
||||
}
|
||||
else {
|
||||
@@ -2229,7 +2281,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
|
||||
append total size */
|
||||
conn->allocptr.rangeline =
|
||||
aprintf("Content-Range: bytes %s/%" FORMAT_OFF_T "\r\n",
|
||||
data->reqdata.range, data->set.infilesize);
|
||||
data->state.range, data->set.infilesize);
|
||||
}
|
||||
if(!conn->allocptr.rangeline)
|
||||
return CURLE_OUT_OF_MEMORY;
|
||||
@@ -2274,7 +2326,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
|
||||
conn->allocptr.proxyuserpwd?
|
||||
conn->allocptr.proxyuserpwd:"",
|
||||
conn->allocptr.userpwd?conn->allocptr.userpwd:"",
|
||||
(data->reqdata.use_range && conn->allocptr.rangeline)?
|
||||
(data->state.use_range && conn->allocptr.rangeline)?
|
||||
conn->allocptr.rangeline:"",
|
||||
(data->set.str[STRING_USERAGENT] &&
|
||||
*data->set.str[STRING_USERAGENT] && conn->allocptr.uagent)?
|
||||
@@ -2307,7 +2359,8 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
|
||||
Curl_share_lock(data, CURL_LOCK_DATA_COOKIE, CURL_LOCK_ACCESS_SINGLE);
|
||||
co = Curl_cookie_getlist(data->cookies,
|
||||
conn->allocptr.cookiehost?
|
||||
conn->allocptr.cookiehost:host, data->reqdata.path,
|
||||
conn->allocptr.cookiehost:host,
|
||||
data->state.path,
|
||||
(bool)(conn->protocol&PROT_HTTPS?TRUE:FALSE));
|
||||
Curl_share_unlock(data, CURL_LOCK_DATA_COOKIE);
|
||||
}
|
||||
@@ -2330,7 +2383,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
|
||||
}
|
||||
co = co->next; /* next cookie please */
|
||||
}
|
||||
Curl_cookie_freelist(store); /* free the cookie list */
|
||||
Curl_cookie_freelist(store, FALSE); /* free the cookie list */
|
||||
}
|
||||
if(addcookies && (CURLE_OK == result)) {
|
||||
if(!count)
|
||||
@@ -2582,17 +2635,19 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
|
||||
return result;
|
||||
}
|
||||
|
||||
if(data->set.postfields) {
|
||||
/* For really small posts we don't use Expect: headers at all, and for
|
||||
the somewhat bigger ones we allow the app to disable it. Just make
|
||||
sure that the expect100header is always set to the preferred value
|
||||
here. */
|
||||
if(postsize > TINY_INITIAL_POST_SIZE) {
|
||||
result = expect100(data, req_buffer);
|
||||
if(result)
|
||||
return result;
|
||||
}
|
||||
else
|
||||
data->state.expect100header = FALSE;
|
||||
|
||||
/* for really small posts we don't use Expect: headers at all, and for
|
||||
the somewhat bigger ones we allow the app to disable it */
|
||||
if(postsize > TINY_INITIAL_POST_SIZE) {
|
||||
result = expect100(data, req_buffer);
|
||||
if(result)
|
||||
return result;
|
||||
}
|
||||
else
|
||||
data->state.expect100header = FALSE;
|
||||
if(data->set.postfields) {
|
||||
|
||||
if(!data->state.expect100header &&
|
||||
(postsize < MAX_INITIAL_POST_SIZE)) {
|
||||
@@ -2656,9 +2711,13 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
|
||||
/* set the upload size to the progress meter */
|
||||
Curl_pgrsSetUploadSize(data, postsize?postsize:-1);
|
||||
|
||||
/* set the pointer to mark that we will send the post body using
|
||||
the read callback */
|
||||
http->postdata = (char *)&http->postdata;
|
||||
/* set the pointer to mark that we will send the post body using the
|
||||
read callback, but only if we're not in authenticate
|
||||
negotiation */
|
||||
if(!conn->bits.authneg) {
|
||||
http->postdata = (char *)&http->postdata;
|
||||
http->postsize = postsize;
|
||||
}
|
||||
}
|
||||
}
|
||||
/* issue the request */
|
||||
|
@@ -5,7 +5,7 @@
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2007, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
* Copyright (C) 1998 - 2008, 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
|
||||
@@ -109,7 +109,7 @@ CHUNKcode Curl_httpchunk_read(struct connectdata *conn,
|
||||
CURLcode result=CURLE_OK;
|
||||
struct SessionHandle *data = conn->data;
|
||||
struct Curl_chunker *ch = &conn->chunk;
|
||||
struct Curl_transfer_keeper *k = &data->reqdata.keep;
|
||||
struct SingleRequest *k = &data->req;
|
||||
size_t piece;
|
||||
size_t length = (size_t)datalen;
|
||||
size_t *wrote = (size_t *)wrotep;
|
||||
@@ -118,8 +118,11 @@ CHUNKcode Curl_httpchunk_read(struct connectdata *conn,
|
||||
|
||||
/* the original data is written to the client, but we go on with the
|
||||
chunk read process, to properly calculate the content length*/
|
||||
if (data->set.http_te_skip && !k->ignorebody)
|
||||
Curl_client_write(conn, CLIENTWRITE_BODY, datap,datalen);
|
||||
if(data->set.http_te_skip && !k->ignorebody) {
|
||||
result = Curl_client_write(conn, CLIENTWRITE_BODY, datap, datalen);
|
||||
if(result)
|
||||
return CHUNKE_WRITE_ERROR;
|
||||
}
|
||||
|
||||
while(length) {
|
||||
switch(ch->state) {
|
||||
@@ -178,7 +181,7 @@ CHUNKcode Curl_httpchunk_read(struct connectdata *conn,
|
||||
if(*datap == 0x0a) {
|
||||
/* we're now expecting data to come, unless size was zero! */
|
||||
if(0 == ch->datasize) {
|
||||
if (conn->bits.trailerHdrPresent!=TRUE) {
|
||||
if(conn->bits.trailerhdrpresent!=TRUE) {
|
||||
/* No Trailer: header found - revert to original Curl processing */
|
||||
ch->state = CHUNK_STOPCR;
|
||||
|
||||
@@ -217,11 +220,11 @@ CHUNKcode Curl_httpchunk_read(struct connectdata *conn,
|
||||
/* Write the data portion available */
|
||||
#ifdef HAVE_LIBZ
|
||||
switch (conn->data->set.http_ce_skip?
|
||||
IDENTITY : data->reqdata.keep.content_encoding) {
|
||||
IDENTITY : data->req.content_encoding) {
|
||||
case IDENTITY:
|
||||
#endif
|
||||
if(!k->ignorebody) {
|
||||
if ( !data->set.http_te_skip )
|
||||
if( !data->set.http_te_skip )
|
||||
result = Curl_client_write(conn, CLIENTWRITE_BODY, datap,
|
||||
piece);
|
||||
else
|
||||
@@ -231,16 +234,16 @@ CHUNKcode Curl_httpchunk_read(struct connectdata *conn,
|
||||
break;
|
||||
|
||||
case DEFLATE:
|
||||
/* update data->reqdata.keep.str to point to the chunk data. */
|
||||
data->reqdata.keep.str = datap;
|
||||
result = Curl_unencode_deflate_write(conn, &data->reqdata.keep,
|
||||
/* update data->req.keep.str to point to the chunk data. */
|
||||
data->req.str = datap;
|
||||
result = Curl_unencode_deflate_write(conn, &data->req,
|
||||
(ssize_t)piece);
|
||||
break;
|
||||
|
||||
case GZIP:
|
||||
/* update data->reqdata.keep.str to point to the chunk data. */
|
||||
data->reqdata.keep.str = datap;
|
||||
result = Curl_unencode_gzip_write(conn, &data->reqdata.keep,
|
||||
/* update data->req.keep.str to point to the chunk data. */
|
||||
data->req.str = datap;
|
||||
result = Curl_unencode_gzip_write(conn, &data->req,
|
||||
(ssize_t)piece);
|
||||
break;
|
||||
|
||||
@@ -298,7 +301,7 @@ CHUNKcode Curl_httpchunk_read(struct connectdata *conn,
|
||||
case CHUNK_TRAILER:
|
||||
/* conn->trailer is assumed to be freed in url.c on a
|
||||
connection basis */
|
||||
if (conn->trlPos >= conn->trlMax) {
|
||||
if(conn->trlPos >= conn->trlMax) {
|
||||
char *ptr;
|
||||
if(conn->trlMax) {
|
||||
conn->trlMax *= 2;
|
||||
@@ -333,10 +336,10 @@ CHUNKcode Curl_httpchunk_read(struct connectdata *conn,
|
||||
break;
|
||||
|
||||
case CHUNK_TRAILER_POSTCR:
|
||||
if (*datap == 0x0a) {
|
||||
if(*datap == 0x0a) {
|
||||
conn->trailer[conn->trlPos++]=0x0a;
|
||||
conn->trailer[conn->trlPos]=0;
|
||||
if (conn->trlPos==2) {
|
||||
if(conn->trlPos==2) {
|
||||
ch->state = CHUNK_STOP;
|
||||
datap++;
|
||||
length--;
|
||||
@@ -362,9 +365,12 @@ CHUNKcode Curl_httpchunk_read(struct connectdata *conn,
|
||||
return(CHUNKE_BAD_CHUNK);
|
||||
}
|
||||
#endif /* CURL_DOES_CONVERSIONS */
|
||||
if ( !data->set.http_te_skip )
|
||||
Curl_client_write(conn, CLIENTWRITE_HEADER,
|
||||
conn->trailer, conn->trlPos);
|
||||
if(!data->set.http_te_skip) {
|
||||
result = Curl_client_write(conn, CLIENTWRITE_HEADER,
|
||||
conn->trailer, conn->trlPos);
|
||||
if(result)
|
||||
return CHUNKE_WRITE_ERROR;
|
||||
}
|
||||
}
|
||||
ch->state = CHUNK_TRAILER;
|
||||
conn->trlPos=0;
|
||||
@@ -389,7 +395,7 @@ CHUNKcode Curl_httpchunk_read(struct connectdata *conn,
|
||||
break;
|
||||
|
||||
case CHUNK_STOP:
|
||||
if (*datap == 0x0a) {
|
||||
if(*datap == 0x0a) {
|
||||
datap++;
|
||||
length--;
|
||||
|
||||
|
@@ -5,7 +5,7 @@
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2007, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
* Copyright (C) 1998 - 2008, 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
|
||||
@@ -90,19 +90,19 @@ CURLdigest Curl_input_digest(struct connectdata *conn,
|
||||
Curl_digest_cleanup_one(d);
|
||||
|
||||
while(more) {
|
||||
char value[32];
|
||||
char content[128];
|
||||
char value[256];
|
||||
char content[1024];
|
||||
size_t totlen=0;
|
||||
|
||||
while(*header && ISSPACE(*header))
|
||||
header++;
|
||||
|
||||
/* how big can these strings be? */
|
||||
if((2 == sscanf(header, "%31[^=]=\"%127[^\"]\"",
|
||||
if((2 == sscanf(header, "%255[^=]=\"%1023[^\"]\"",
|
||||
value, content)) ||
|
||||
/* try the same scan but without quotes around the content but don't
|
||||
include the possibly trailing comma, newline or carriage return */
|
||||
(2 == sscanf(header, "%31[^=]=%127[^\r\n,]",
|
||||
(2 == sscanf(header, "%255[^=]=%1023[^\r\n,]",
|
||||
value, content)) ) {
|
||||
if(strequal(value, "nonce")) {
|
||||
d->nonce = strdup(content);
|
||||
@@ -133,23 +133,23 @@ CURLdigest Curl_input_digest(struct connectdata *conn,
|
||||
if(!tmp)
|
||||
return CURLDIGEST_NOMEM;
|
||||
token = strtok_r(tmp, ",", &tok_buf);
|
||||
while (token != NULL) {
|
||||
if (strequal(token, "auth")) {
|
||||
while(token != NULL) {
|
||||
if(strequal(token, "auth")) {
|
||||
foundAuth = TRUE;
|
||||
}
|
||||
else if (strequal(token, "auth-int")) {
|
||||
else if(strequal(token, "auth-int")) {
|
||||
foundAuthInt = TRUE;
|
||||
}
|
||||
token = strtok_r(NULL, ",", &tok_buf);
|
||||
}
|
||||
free(tmp);
|
||||
/*select only auth o auth-int. Otherwise, ignore*/
|
||||
if (foundAuth) {
|
||||
if(foundAuth) {
|
||||
d->qop = strdup("auth");
|
||||
if(!d->qop)
|
||||
return CURLDIGEST_NOMEM;
|
||||
}
|
||||
else if (foundAuthInt) {
|
||||
else if(foundAuthInt) {
|
||||
d->qop = strdup("auth-int");
|
||||
if(!d->qop)
|
||||
return CURLDIGEST_NOMEM;
|
||||
@@ -180,6 +180,9 @@ CURLdigest Curl_input_digest(struct connectdata *conn,
|
||||
break; /* we're done here */
|
||||
|
||||
header += totlen;
|
||||
/* pass all additional spaces here */
|
||||
while(*header && ISSPACE(*header))
|
||||
header++;
|
||||
if(',' == *header)
|
||||
/* allow the list to be comma-separated */
|
||||
header++;
|
||||
@@ -243,7 +246,7 @@ CURLcode Curl_output_digest(struct connectdata *conn,
|
||||
*/
|
||||
#define CURL_OUTPUT_DIGEST_CONV(a, b) \
|
||||
rc = Curl_convert_to_network(a, (char *)b, strlen((const char*)b)); \
|
||||
if (rc != CURLE_OK) { \
|
||||
if(rc != CURLE_OK) { \
|
||||
free(b); \
|
||||
return rc; \
|
||||
}
|
||||
@@ -266,7 +269,7 @@ CURLcode Curl_output_digest(struct connectdata *conn,
|
||||
authp = &data->state.authhost;
|
||||
}
|
||||
|
||||
if (*allocuserpwd) {
|
||||
if(*allocuserpwd) {
|
||||
Curl_safefree(*allocuserpwd);
|
||||
*allocuserpwd = NULL;
|
||||
}
|
||||
@@ -353,7 +356,7 @@ CURLcode Curl_output_digest(struct connectdata *conn,
|
||||
return CURLE_OUT_OF_MEMORY;
|
||||
}
|
||||
|
||||
if (d->qop && strequal(d->qop, "auth-int")) {
|
||||
if(d->qop && strequal(d->qop, "auth-int")) {
|
||||
/* We don't support auth-int at the moment. I can't see a easy way to get
|
||||
entity-body here */
|
||||
/* TODO: Append H(entity-body)*/
|
||||
@@ -363,7 +366,7 @@ CURLcode Curl_output_digest(struct connectdata *conn,
|
||||
free(md5this); /* free this again */
|
||||
md5_to_ascii(md5buf, ha2);
|
||||
|
||||
if (d->qop) {
|
||||
if(d->qop) {
|
||||
md5this = (unsigned char *)aprintf("%s:%s:%08x:%s:%s:%s",
|
||||
ha1,
|
||||
d->nonce,
|
||||
@@ -393,7 +396,7 @@ CURLcode Curl_output_digest(struct connectdata *conn,
|
||||
nonce="1053604145", uri="/64", response="c55f7f30d83d774a3d2dcacf725abaca"
|
||||
*/
|
||||
|
||||
if (d->qop) {
|
||||
if(d->qop) {
|
||||
*allocuserpwd =
|
||||
aprintf( "%sAuthorization: Digest "
|
||||
"username=\"%s\", "
|
||||
|
@@ -51,7 +51,8 @@
|
||||
static int
|
||||
get_gss_name(struct connectdata *conn, bool proxy, gss_name_t *server)
|
||||
{
|
||||
struct negotiatedata *neg_ctx = &conn->data->state.negotiate;
|
||||
struct negotiatedata *neg_ctx = proxy?&conn->data->state.proxyneg:
|
||||
&conn->data->state.negotiate;
|
||||
OM_uint32 major_status, minor_status;
|
||||
gss_buffer_desc token = GSS_C_EMPTY_BUFFER;
|
||||
char name[2048];
|
||||
@@ -64,16 +65,18 @@ get_gss_name(struct connectdata *conn, bool proxy, gss_name_t *server)
|
||||
|
||||
/* IIS uses the <service>@<fqdn> form but uses 'http' as the service name */
|
||||
|
||||
if (neg_ctx->gss)
|
||||
if(neg_ctx->gss)
|
||||
service = "KHTTP";
|
||||
else
|
||||
service = "HTTP";
|
||||
|
||||
token.length = strlen(service) + 1 + strlen(proxy ? conn->proxy.name : conn->host.name) + 1;
|
||||
if (token.length + 1 > sizeof(name))
|
||||
token.length = strlen(service) + 1 + strlen(proxy ? conn->proxy.name :
|
||||
conn->host.name) + 1;
|
||||
if(token.length + 1 > sizeof(name))
|
||||
return EMSGSIZE;
|
||||
|
||||
snprintf(name, sizeof(name), "%s@%s", service, proxy ? conn->proxy.name : conn->host.name);
|
||||
snprintf(name, sizeof(name), "%s@%s", service, proxy ? conn->proxy.name :
|
||||
conn->host.name);
|
||||
|
||||
token.value = (void *) name;
|
||||
major_status = gss_import_name(&minor_status,
|
||||
@@ -96,26 +99,28 @@ log_gss_error(struct connectdata *conn, OM_uint32 error_status, char *prefix)
|
||||
snprintf(buf, sizeof(buf), "%s", prefix);
|
||||
len = strlen(buf);
|
||||
do {
|
||||
maj_stat = gss_display_status (&min_stat,
|
||||
error_status,
|
||||
GSS_C_MECH_CODE,
|
||||
GSS_C_NO_OID,
|
||||
&msg_ctx,
|
||||
&status_string);
|
||||
if (sizeof(buf) > len + status_string.length + 1) {
|
||||
maj_stat = gss_display_status(&min_stat,
|
||||
error_status,
|
||||
GSS_C_MECH_CODE,
|
||||
GSS_C_NO_OID,
|
||||
&msg_ctx,
|
||||
&status_string);
|
||||
if(sizeof(buf) > len + status_string.length + 1) {
|
||||
snprintf(buf + len, sizeof(buf) - len,
|
||||
": %s", (char*) status_string.value);
|
||||
len += status_string.length;
|
||||
}
|
||||
gss_release_buffer(&min_stat, &status_string);
|
||||
} while (!GSS_ERROR(maj_stat) && msg_ctx != 0);
|
||||
} while(!GSS_ERROR(maj_stat) && msg_ctx != 0);
|
||||
|
||||
infof(conn->data, "%s", buf);
|
||||
}
|
||||
|
||||
int Curl_input_negotiate(struct connectdata *conn, bool proxy, const char *header)
|
||||
int Curl_input_negotiate(struct connectdata *conn, bool proxy,
|
||||
const char *header)
|
||||
{
|
||||
struct negotiatedata *neg_ctx = &conn->data->state.negotiate;
|
||||
struct negotiatedata *neg_ctx = proxy?&conn->data->state.proxyneg:
|
||||
&conn->data->state.negotiate;
|
||||
OM_uint32 major_status, minor_status, minor_status2;
|
||||
gss_buffer_desc input_token = GSS_C_EMPTY_BUFFER;
|
||||
gss_buffer_desc output_token = GSS_C_EMPTY_BUFFER;
|
||||
@@ -130,15 +135,15 @@ int Curl_input_negotiate(struct connectdata *conn, bool proxy, const char *heade
|
||||
protocol = "GSS-Negotiate";
|
||||
gss = TRUE;
|
||||
}
|
||||
else if (checkprefix("Negotiate", header)) {
|
||||
else if(checkprefix("Negotiate", header)) {
|
||||
protocol = "Negotiate";
|
||||
gss = FALSE;
|
||||
}
|
||||
else
|
||||
return -1;
|
||||
|
||||
if (neg_ctx->context) {
|
||||
if (neg_ctx->gss != gss) {
|
||||
if(neg_ctx->context) {
|
||||
if(neg_ctx->gss != gss) {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
@@ -147,7 +152,7 @@ int Curl_input_negotiate(struct connectdata *conn, bool proxy, const char *heade
|
||||
neg_ctx->gss = gss;
|
||||
}
|
||||
|
||||
if (neg_ctx->context && neg_ctx->status == GSS_S_COMPLETE) {
|
||||
if(neg_ctx->context && neg_ctx->status == GSS_S_COMPLETE) {
|
||||
/* We finished succesfully our part of authentication, but server
|
||||
* rejected it (since we're again here). Exit with an error since we
|
||||
* can't invent anything better */
|
||||
@@ -155,7 +160,7 @@ int Curl_input_negotiate(struct connectdata *conn, bool proxy, const char *heade
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (neg_ctx->server_name == NULL &&
|
||||
if(neg_ctx->server_name == NULL &&
|
||||
(ret = get_gss_name(conn, proxy, &neg_ctx->server_name)))
|
||||
return ret;
|
||||
|
||||
@@ -164,14 +169,15 @@ int Curl_input_negotiate(struct connectdata *conn, bool proxy, const char *heade
|
||||
header++;
|
||||
|
||||
len = strlen(header);
|
||||
if (len > 0) {
|
||||
int rawlen = Curl_base64_decode(header, (unsigned char **)&input_token.value);
|
||||
if (rawlen < 0)
|
||||
if(len > 0) {
|
||||
int rawlen = Curl_base64_decode(header,
|
||||
(unsigned char **)&input_token.value);
|
||||
if(rawlen < 0)
|
||||
return -1;
|
||||
input_token.length = rawlen;
|
||||
|
||||
#ifdef HAVE_SPNEGO /* Handle SPNEGO */
|
||||
if (checkprefix("Negotiate", header)) {
|
||||
if(checkprefix("Negotiate", header)) {
|
||||
ASN1_OBJECT * object = NULL;
|
||||
int rc = 1;
|
||||
unsigned char * spnegoToken = NULL;
|
||||
@@ -180,12 +186,12 @@ int Curl_input_negotiate(struct connectdata *conn, bool proxy, const char *heade
|
||||
size_t mechTokenLength = 0;
|
||||
|
||||
spnegoToken = malloc(input_token.length);
|
||||
if (input_token.value == NULL)
|
||||
if(input_token.value == NULL)
|
||||
return ENOMEM;
|
||||
spnegoTokenLength = input_token.length;
|
||||
|
||||
object = OBJ_txt2obj ("1.2.840.113554.1.2.2", 1);
|
||||
if (!parseSpnegoTargetToken(spnegoToken,
|
||||
if(!parseSpnegoTargetToken(spnegoToken,
|
||||
spnegoTokenLength,
|
||||
NULL,
|
||||
NULL,
|
||||
@@ -224,17 +230,17 @@ int Curl_input_negotiate(struct connectdata *conn, bool proxy, const char *heade
|
||||
&output_token,
|
||||
NULL,
|
||||
NULL);
|
||||
if (input_token.length > 0)
|
||||
if(input_token.length > 0)
|
||||
gss_release_buffer(&minor_status2, &input_token);
|
||||
neg_ctx->status = major_status;
|
||||
if (GSS_ERROR(major_status)) {
|
||||
if(GSS_ERROR(major_status)) {
|
||||
/* Curl_cleanup_negotiate(conn->data) ??? */
|
||||
log_gss_error(conn, minor_status,
|
||||
(char *)"gss_init_sec_context() failed: ");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (output_token.length == 0) {
|
||||
if(output_token.length == 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -247,13 +253,14 @@ int Curl_input_negotiate(struct connectdata *conn, bool proxy, const char *heade
|
||||
|
||||
CURLcode Curl_output_negotiate(struct connectdata *conn, bool proxy)
|
||||
{
|
||||
struct negotiatedata *neg_ctx = &conn->data->state.negotiate;
|
||||
struct negotiatedata *neg_ctx = proxy?&conn->data->state.proxyneg:
|
||||
&conn->data->state.negotiate;
|
||||
OM_uint32 minor_status;
|
||||
char *encoded = NULL;
|
||||
int len;
|
||||
|
||||
#ifdef HAVE_SPNEGO /* Handle SPNEGO */
|
||||
if (checkprefix("Negotiate",neg_ctx->protocol)) {
|
||||
if(checkprefix("Negotiate", neg_ctx->protocol)) {
|
||||
ASN1_OBJECT * object = NULL;
|
||||
int rc = 1;
|
||||
unsigned char * spnegoToken = NULL;
|
||||
@@ -262,14 +269,14 @@ CURLcode Curl_output_negotiate(struct connectdata *conn, bool proxy)
|
||||
size_t responseTokenLength = 0;
|
||||
|
||||
responseToken = malloc(neg_ctx->output_token.length);
|
||||
if ( responseToken == NULL)
|
||||
if( responseToken == NULL)
|
||||
return CURLE_OUT_OF_MEMORY;
|
||||
memcpy(responseToken, neg_ctx->output_token.value,
|
||||
neg_ctx->output_token.length);
|
||||
responseTokenLength = neg_ctx->output_token.length;
|
||||
|
||||
object=OBJ_txt2obj ("1.2.840.113554.1.2.2", 1);
|
||||
if (!makeSpnegoInitialToken (object,
|
||||
if(!makeSpnegoInitialToken (object,
|
||||
responseToken,
|
||||
responseTokenLength,
|
||||
&spnegoToken,
|
||||
@@ -295,33 +302,38 @@ CURLcode Curl_output_negotiate(struct connectdata *conn, bool proxy)
|
||||
neg_ctx->output_token.length,
|
||||
&encoded);
|
||||
|
||||
if (len == 0)
|
||||
if(len == 0)
|
||||
return CURLE_OUT_OF_MEMORY;
|
||||
|
||||
conn->allocptr.userpwd =
|
||||
aprintf("%sAuthorization: %s %s\r\n", proxy ? "Proxy-" : "", neg_ctx->protocol, encoded);
|
||||
aprintf("%sAuthorization: %s %s\r\n", proxy ? "Proxy-" : "",
|
||||
neg_ctx->protocol, encoded);
|
||||
free(encoded);
|
||||
gss_release_buffer(&minor_status, &neg_ctx->output_token);
|
||||
return (conn->allocptr.userpwd == NULL) ? CURLE_OUT_OF_MEMORY : CURLE_OK;
|
||||
}
|
||||
|
||||
void Curl_cleanup_negotiate(struct SessionHandle *data)
|
||||
static void cleanup(struct negotiatedata *neg_ctx)
|
||||
{
|
||||
OM_uint32 minor_status;
|
||||
struct negotiatedata *neg_ctx = &data->state.negotiate;
|
||||
|
||||
if (neg_ctx->context != GSS_C_NO_CONTEXT)
|
||||
if(neg_ctx->context != GSS_C_NO_CONTEXT)
|
||||
gss_delete_sec_context(&minor_status, &neg_ctx->context, GSS_C_NO_BUFFER);
|
||||
|
||||
if (neg_ctx->output_token.length != 0)
|
||||
if(neg_ctx->output_token.length != 0)
|
||||
gss_release_buffer(&minor_status, &neg_ctx->output_token);
|
||||
|
||||
if (neg_ctx->server_name != GSS_C_NO_NAME)
|
||||
if(neg_ctx->server_name != GSS_C_NO_NAME)
|
||||
gss_release_name(&minor_status, &neg_ctx->server_name);
|
||||
|
||||
memset(neg_ctx, 0, sizeof(*neg_ctx));
|
||||
}
|
||||
|
||||
void Curl_cleanup_negotiate(struct SessionHandle *data)
|
||||
{
|
||||
cleanup(&data->state.negotiate);
|
||||
cleanup(&data->state.proxyneg);
|
||||
}
|
||||
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
@@ -198,7 +198,7 @@ static void print_hex(FILE *handle, const char *buf, size_t len)
|
||||
{
|
||||
const char *p = buf;
|
||||
fprintf(stderr, "0x");
|
||||
while (len-- > 0)
|
||||
while(len-- > 0)
|
||||
fprintf(stderr, "%02.2x", (unsigned int)*p++);
|
||||
}
|
||||
#else
|
||||
@@ -263,7 +263,7 @@ CURLntlm Curl_input_ntlm(struct connectdata *conn,
|
||||
|
||||
#ifdef USE_WINDOWS_SSPI
|
||||
ntlm->type_2 = malloc(size+1);
|
||||
if (ntlm->type_2 == NULL) {
|
||||
if(ntlm->type_2 == NULL) {
|
||||
free(buffer);
|
||||
return CURLE_OUT_OF_MEMORY;
|
||||
}
|
||||
@@ -368,7 +368,7 @@ static void mk_lm_hash(struct SessionHandle *data,
|
||||
unsigned int i;
|
||||
size_t len = strlen(password);
|
||||
|
||||
if (len > 14)
|
||||
if(len > 14)
|
||||
len = 14;
|
||||
|
||||
for (i=0; i<len; i++)
|
||||
@@ -425,7 +425,7 @@ static CURLcode mk_nt_hash(struct SessionHandle *data,
|
||||
{
|
||||
size_t len = strlen(password);
|
||||
unsigned char *pw = malloc(len*2);
|
||||
if (!pw)
|
||||
if(!pw)
|
||||
return CURLE_OUT_OF_MEMORY;
|
||||
|
||||
utf8_to_unicode_le(pw, password, len);
|
||||
@@ -465,19 +465,19 @@ static CURLcode mk_nt_hash(struct SessionHandle *data,
|
||||
static void
|
||||
ntlm_sspi_cleanup(struct ntlmdata *ntlm)
|
||||
{
|
||||
if (ntlm->type_2) {
|
||||
if(ntlm->type_2) {
|
||||
free(ntlm->type_2);
|
||||
ntlm->type_2 = NULL;
|
||||
}
|
||||
if (ntlm->has_handles) {
|
||||
if(ntlm->has_handles) {
|
||||
s_pSecFn->DeleteSecurityContext(&ntlm->c_handle);
|
||||
s_pSecFn->FreeCredentialsHandle(&ntlm->handle);
|
||||
ntlm->has_handles = 0;
|
||||
}
|
||||
if (ntlm->p_identity) {
|
||||
if (ntlm->identity.User) free(ntlm->identity.User);
|
||||
if (ntlm->identity.Password) free(ntlm->identity.Password);
|
||||
if (ntlm->identity.Domain) free(ntlm->identity.Domain);
|
||||
if(ntlm->p_identity) {
|
||||
if(ntlm->identity.User) free(ntlm->identity.User);
|
||||
if(ntlm->identity.Password) free(ntlm->identity.Password);
|
||||
if(ntlm->identity.Domain) free(ntlm->identity.Domain);
|
||||
ntlm->p_identity = NULL;
|
||||
}
|
||||
}
|
||||
@@ -546,7 +546,7 @@ CURLcode Curl_output_ntlm(struct connectdata *conn,
|
||||
|
||||
#ifdef USE_WINDOWS_SSPI
|
||||
/* If security interface is not yet initialized try to do this */
|
||||
if (s_hSecDll == NULL) {
|
||||
if(s_hSecDll == NULL) {
|
||||
/* Determine Windows version. Security functions are located in
|
||||
* security.dll on WinNT 4.0 and in secur32.dll on Win9x. Win2K and XP
|
||||
* contain both these DLLs (security.dll just forwards calls to
|
||||
@@ -555,21 +555,21 @@ CURLcode Curl_output_ntlm(struct connectdata *conn,
|
||||
OSVERSIONINFO osver;
|
||||
osver.dwOSVersionInfoSize = sizeof(osver);
|
||||
GetVersionEx(&osver);
|
||||
if (osver.dwPlatformId == VER_PLATFORM_WIN32_NT
|
||||
if(osver.dwPlatformId == VER_PLATFORM_WIN32_NT
|
||||
&& osver.dwMajorVersion == 4)
|
||||
s_hSecDll = LoadLibrary("security.dll");
|
||||
else
|
||||
s_hSecDll = LoadLibrary("secur32.dll");
|
||||
if (s_hSecDll != NULL) {
|
||||
if(s_hSecDll != NULL) {
|
||||
INIT_SECURITY_INTERFACE pInitSecurityInterface;
|
||||
pInitSecurityInterface =
|
||||
(INIT_SECURITY_INTERFACE)GetProcAddress(s_hSecDll,
|
||||
"InitSecurityInterfaceA");
|
||||
if (pInitSecurityInterface != NULL)
|
||||
if(pInitSecurityInterface != NULL)
|
||||
s_pSecFn = pInitSecurityInterface();
|
||||
}
|
||||
}
|
||||
if (s_pSecFn == NULL)
|
||||
if(s_pSecFn == NULL)
|
||||
return CURLE_RECV_ERROR;
|
||||
#endif
|
||||
|
||||
@@ -589,10 +589,10 @@ CURLcode Curl_output_ntlm(struct connectdata *conn,
|
||||
ntlm_sspi_cleanup(ntlm);
|
||||
|
||||
user = strchr(userp, '\\');
|
||||
if (!user)
|
||||
if(!user)
|
||||
user = strchr(userp, '/');
|
||||
|
||||
if (user) {
|
||||
if(user) {
|
||||
domain = userp;
|
||||
domlen = user - userp;
|
||||
user++;
|
||||
@@ -603,19 +603,19 @@ CURLcode Curl_output_ntlm(struct connectdata *conn,
|
||||
domlen = 0;
|
||||
}
|
||||
|
||||
if (user && *user) {
|
||||
if(user && *user) {
|
||||
/* note: initialize all of this before doing the mallocs so that
|
||||
* it can be cleaned up later without leaking memory.
|
||||
*/
|
||||
ntlm->p_identity = &ntlm->identity;
|
||||
memset(ntlm->p_identity, 0, sizeof(*ntlm->p_identity));
|
||||
if ((ntlm->identity.User = (unsigned char *)strdup(user)) == NULL)
|
||||
if((ntlm->identity.User = (unsigned char *)strdup(user)) == NULL)
|
||||
return CURLE_OUT_OF_MEMORY;
|
||||
ntlm->identity.UserLength = strlen(user);
|
||||
if ((ntlm->identity.Password = (unsigned char *)strdup(passwdp)) == NULL)
|
||||
if((ntlm->identity.Password = (unsigned char *)strdup(passwdp)) == NULL)
|
||||
return CURLE_OUT_OF_MEMORY;
|
||||
ntlm->identity.PasswordLength = strlen(passwdp);
|
||||
if ((ntlm->identity.Domain = malloc(domlen+1)) == NULL)
|
||||
if((ntlm->identity.Domain = malloc(domlen+1)) == NULL)
|
||||
return CURLE_OUT_OF_MEMORY;
|
||||
strncpy((char *)ntlm->identity.Domain, domain, domlen);
|
||||
ntlm->identity.Domain[domlen] = '\0';
|
||||
@@ -626,7 +626,7 @@ CURLcode Curl_output_ntlm(struct connectdata *conn,
|
||||
ntlm->p_identity = NULL;
|
||||
}
|
||||
|
||||
if (s_pSecFn->AcquireCredentialsHandle(
|
||||
if(s_pSecFn->AcquireCredentialsHandle(
|
||||
NULL, (char *)"NTLM", SECPKG_CRED_OUTBOUND, NULL, ntlm->p_identity,
|
||||
NULL, NULL, &ntlm->handle, &tsDummy
|
||||
) != SEC_E_OK) {
|
||||
@@ -650,11 +650,11 @@ CURLcode Curl_output_ntlm(struct connectdata *conn,
|
||||
&ntlm->c_handle, &desc,
|
||||
&attrs, &tsDummy);
|
||||
|
||||
if (status == SEC_I_COMPLETE_AND_CONTINUE ||
|
||||
if(status == SEC_I_COMPLETE_AND_CONTINUE ||
|
||||
status == SEC_I_CONTINUE_NEEDED) {
|
||||
s_pSecFn->CompleteAuthToken(&ntlm->c_handle, &desc);
|
||||
}
|
||||
else if (status != SEC_E_OK) {
|
||||
else if(status != SEC_E_OK) {
|
||||
s_pSecFn->FreeCredentialsHandle(&ntlm->handle);
|
||||
return CURLE_RECV_ERROR;
|
||||
}
|
||||
@@ -805,7 +805,7 @@ CURLcode Curl_output_ntlm(struct connectdata *conn,
|
||||
0, &ntlm->c_handle, &type_3_desc,
|
||||
&attrs, &tsDummy);
|
||||
|
||||
if (status != SEC_E_OK)
|
||||
if(status != SEC_E_OK)
|
||||
return CURLE_RECV_ERROR;
|
||||
|
||||
size = type_3.cbBuffer;
|
||||
@@ -827,7 +827,7 @@ CURLcode Curl_output_ntlm(struct connectdata *conn,
|
||||
if(!user)
|
||||
user = strchr(userp, '/');
|
||||
|
||||
if (user) {
|
||||
if(user) {
|
||||
domain = userp;
|
||||
domlen = (user - domain);
|
||||
user++;
|
||||
@@ -836,7 +836,7 @@ CURLcode Curl_output_ntlm(struct connectdata *conn,
|
||||
user = userp;
|
||||
userlen = strlen(user);
|
||||
|
||||
if (gethostname(host, HOSTNAME_MAX)) {
|
||||
if(gethostname(host, HOSTNAME_MAX)) {
|
||||
infof(conn->data, "gethostname() failed, continuing without!");
|
||||
hostlen = 0;
|
||||
}
|
||||
@@ -846,14 +846,14 @@ CURLcode Curl_output_ntlm(struct connectdata *conn,
|
||||
* name, which NTLM doesn't like.
|
||||
*/
|
||||
char *dot = strchr(host, '.');
|
||||
if (dot)
|
||||
if(dot)
|
||||
*dot = '\0';
|
||||
hostlen = strlen(host);
|
||||
}
|
||||
|
||||
#if USE_NTLM2SESSION
|
||||
/* We don't support NTLM2 if we don't have USE_NTRESPONSES */
|
||||
if (ntlm->flags & NTLMFLAG_NEGOTIATE_NTLM2_KEY) {
|
||||
if(ntlm->flags & NTLMFLAG_NEGOTIATE_NTLM2_KEY) {
|
||||
unsigned char ntbuffer[0x18];
|
||||
unsigned char tmp[0x18];
|
||||
unsigned char md5sum[MD5_DIGEST_LENGTH];
|
||||
@@ -878,7 +878,7 @@ CURLcode Curl_output_ntlm(struct connectdata *conn,
|
||||
MD5_Final(md5sum, &MD5pw);
|
||||
/* We shall only use the first 8 bytes of md5sum,
|
||||
but the des code in lm_resp only encrypt the first 8 bytes */
|
||||
if (mk_nt_hash(conn->data, passwdp, ntbuffer) == CURLE_OUT_OF_MEMORY)
|
||||
if(mk_nt_hash(conn->data, passwdp, ntbuffer) == CURLE_OUT_OF_MEMORY)
|
||||
return CURLE_OUT_OF_MEMORY;
|
||||
lm_resp(ntbuffer, md5sum, ntresp);
|
||||
|
||||
@@ -893,7 +893,7 @@ CURLcode Curl_output_ntlm(struct connectdata *conn,
|
||||
unsigned char lmbuffer[0x18];
|
||||
|
||||
#if USE_NTRESPONSES
|
||||
if (mk_nt_hash(conn->data, passwdp, ntbuffer) == CURLE_OUT_OF_MEMORY)
|
||||
if(mk_nt_hash(conn->data, passwdp, ntbuffer) == CURLE_OUT_OF_MEMORY)
|
||||
return CURLE_OUT_OF_MEMORY;
|
||||
lm_resp(ntbuffer, &ntlm->nonce[0], ntresp);
|
||||
#endif
|
||||
@@ -1113,7 +1113,7 @@ Curl_ntlm_cleanup(struct connectdata *conn)
|
||||
#ifdef USE_WINDOWS_SSPI
|
||||
ntlm_sspi_cleanup(&conn->ntlm);
|
||||
ntlm_sspi_cleanup(&conn->proxyntlm);
|
||||
if (s_hSecDll != NULL) {
|
||||
if(s_hSecDll != NULL) {
|
||||
FreeLibrary(s_hSecDll);
|
||||
s_hSecDll = NULL;
|
||||
s_pSecFn = NULL;
|
||||
|
@@ -91,7 +91,7 @@ char *Curl_if2ip(const char *interface, char *buf, int buf_size)
|
||||
return NULL;
|
||||
|
||||
dummy = socket(AF_INET, SOCK_STREAM, 0);
|
||||
if (SYS_ERROR == dummy) {
|
||||
if(SYS_ERROR == dummy) {
|
||||
return NULL;
|
||||
}
|
||||
else {
|
||||
@@ -105,9 +105,9 @@ char *Curl_if2ip(const char *interface, char *buf, int buf_size)
|
||||
memcpy(req.ifr_name, interface, len+1);
|
||||
req.ifr_addr.sa_family = AF_INET;
|
||||
#ifdef IOCTL_3_ARGS
|
||||
if (SYS_ERROR == ioctl(dummy, SIOCGIFADDR, &req)) {
|
||||
if(SYS_ERROR == ioctl(dummy, SIOCGIFADDR, &req)) {
|
||||
#else
|
||||
if (SYS_ERROR == ioctl(dummy, SIOCGIFADDR, &req, sizeof(req))) {
|
||||
if(SYS_ERROR == ioctl(dummy, SIOCGIFADDR, &req, sizeof(req))) {
|
||||
#endif
|
||||
sclose(dummy);
|
||||
return NULL;
|
||||
|
@@ -79,7 +79,7 @@ static char *inet_ntop4 (const unsigned char *src, char *dst, size_t size)
|
||||
#else
|
||||
const char *addr = inet_ntoa(*(struct in_addr*)src);
|
||||
|
||||
if (strlen(addr) >= size)
|
||||
if(strlen(addr) >= size)
|
||||
{
|
||||
SET_ERRNO(ENOSPC);
|
||||
return (NULL);
|
||||
@@ -125,23 +125,23 @@ static char *inet_ntop6 (const unsigned char *src, char *dst, size_t size)
|
||||
|
||||
for (i = 0; i < (IN6ADDRSZ / INT16SZ); i++)
|
||||
{
|
||||
if (words[i] == 0)
|
||||
if(words[i] == 0)
|
||||
{
|
||||
if (cur.base == -1)
|
||||
if(cur.base == -1)
|
||||
cur.base = i, cur.len = 1;
|
||||
else
|
||||
cur.len++;
|
||||
}
|
||||
else if (cur.base != -1)
|
||||
else if(cur.base != -1)
|
||||
{
|
||||
if (best.base == -1 || cur.len > best.len)
|
||||
if(best.base == -1 || cur.len > best.len)
|
||||
best = cur;
|
||||
cur.base = -1;
|
||||
}
|
||||
}
|
||||
if ((cur.base != -1) && (best.base == -1 || cur.len > best.len))
|
||||
if((cur.base != -1) && (best.base == -1 || cur.len > best.len))
|
||||
best = cur;
|
||||
if (best.base != -1 && best.len < 2)
|
||||
if(best.base != -1 && best.len < 2)
|
||||
best.base = -1;
|
||||
|
||||
/* Format the result.
|
||||
@@ -151,24 +151,24 @@ static char *inet_ntop6 (const unsigned char *src, char *dst, size_t size)
|
||||
{
|
||||
/* Are we inside the best run of 0x00's?
|
||||
*/
|
||||
if (best.base != -1 && i >= best.base && i < (best.base + best.len))
|
||||
if(best.base != -1 && i >= best.base && i < (best.base + best.len))
|
||||
{
|
||||
if (i == best.base)
|
||||
if(i == best.base)
|
||||
*tp++ = ':';
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Are we following an initial run of 0x00s or any real hex?
|
||||
*/
|
||||
if (i != 0)
|
||||
if(i != 0)
|
||||
*tp++ = ':';
|
||||
|
||||
/* Is this address an encapsulated IPv4?
|
||||
*/
|
||||
if (i == 6 && best.base == 0 &&
|
||||
if(i == 6 && best.base == 0 &&
|
||||
(best.len == 6 || (best.len == 5 && words[5] == 0xffff)))
|
||||
{
|
||||
if (!inet_ntop4(src+12, tp, sizeof(tmp) - (tp - tmp)))
|
||||
if(!inet_ntop4(src+12, tp, sizeof(tmp) - (tp - tmp)))
|
||||
{
|
||||
SET_ERRNO(ENOSPC);
|
||||
return (NULL);
|
||||
@@ -181,13 +181,13 @@ static char *inet_ntop6 (const unsigned char *src, char *dst, size_t size)
|
||||
|
||||
/* Was it a trailing run of 0x00's?
|
||||
*/
|
||||
if (best.base != -1 && (best.base + best.len) == (IN6ADDRSZ / INT16SZ))
|
||||
if(best.base != -1 && (best.base + best.len) == (IN6ADDRSZ / INT16SZ))
|
||||
*tp++ = ':';
|
||||
*tp++ = '\0';
|
||||
|
||||
/* Check for overflow, copy, and we're done.
|
||||
*/
|
||||
if ((size_t)(tp - tmp) > size)
|
||||
if((size_t)(tp - tmp) > size)
|
||||
{
|
||||
SET_ERRNO(ENOSPC);
|
||||
return (NULL);
|
||||
|
@@ -108,29 +108,31 @@ inet_pton4(const char *src, unsigned char *dst)
|
||||
octets = 0;
|
||||
tp = tmp;
|
||||
*tp = 0;
|
||||
while ((ch = *src++) != '\0') {
|
||||
while((ch = *src++) != '\0') {
|
||||
const char *pch;
|
||||
|
||||
if ((pch = strchr(digits, ch)) != NULL) {
|
||||
if((pch = strchr(digits, ch)) != NULL) {
|
||||
unsigned int val = *tp * 10 + (unsigned int)(pch - digits);
|
||||
|
||||
if (val > 255)
|
||||
if(val > 255)
|
||||
return (0);
|
||||
*tp = (unsigned char)val;
|
||||
if (! saw_digit) {
|
||||
if (++octets > 4)
|
||||
if(! saw_digit) {
|
||||
if(++octets > 4)
|
||||
return (0);
|
||||
saw_digit = 1;
|
||||
}
|
||||
} else if (ch == '.' && saw_digit) {
|
||||
if (octets == 4)
|
||||
}
|
||||
else if(ch == '.' && saw_digit) {
|
||||
if(octets == 4)
|
||||
return (0);
|
||||
*++tp = 0;
|
||||
saw_digit = 0;
|
||||
} else
|
||||
}
|
||||
else
|
||||
return (0);
|
||||
}
|
||||
if (octets < 4)
|
||||
if(octets < 4)
|
||||
return (0);
|
||||
/* bcopy(tmp, dst, INADDRSZ); */
|
||||
memcpy(dst, tmp, INADDRSZ);
|
||||
@@ -165,34 +167,34 @@ inet_pton6(const char *src, unsigned char *dst)
|
||||
endp = tp + IN6ADDRSZ;
|
||||
colonp = NULL;
|
||||
/* Leading :: requires some special handling. */
|
||||
if (*src == ':')
|
||||
if (*++src != ':')
|
||||
if(*src == ':')
|
||||
if(*++src != ':')
|
||||
return (0);
|
||||
curtok = src;
|
||||
saw_xdigit = 0;
|
||||
val = 0;
|
||||
while ((ch = *src++) != '\0') {
|
||||
while((ch = *src++) != '\0') {
|
||||
const char *pch;
|
||||
|
||||
if ((pch = strchr((xdigits = xdigits_l), ch)) == NULL)
|
||||
if((pch = strchr((xdigits = xdigits_l), ch)) == NULL)
|
||||
pch = strchr((xdigits = xdigits_u), ch);
|
||||
if (pch != NULL) {
|
||||
if(pch != NULL) {
|
||||
val <<= 4;
|
||||
val |= (pch - xdigits);
|
||||
if (val > 0xffff)
|
||||
if(val > 0xffff)
|
||||
return (0);
|
||||
saw_xdigit = 1;
|
||||
continue;
|
||||
}
|
||||
if (ch == ':') {
|
||||
if(ch == ':') {
|
||||
curtok = src;
|
||||
if (!saw_xdigit) {
|
||||
if (colonp)
|
||||
if(!saw_xdigit) {
|
||||
if(colonp)
|
||||
return (0);
|
||||
colonp = tp;
|
||||
continue;
|
||||
}
|
||||
if (tp + INT16SZ > endp)
|
||||
if(tp + INT16SZ > endp)
|
||||
return (0);
|
||||
*tp++ = (unsigned char) (val >> 8) & 0xff;
|
||||
*tp++ = (unsigned char) val & 0xff;
|
||||
@@ -200,7 +202,7 @@ inet_pton6(const char *src, unsigned char *dst)
|
||||
val = 0;
|
||||
continue;
|
||||
}
|
||||
if (ch == '.' && ((tp + INADDRSZ) <= endp) &&
|
||||
if(ch == '.' && ((tp + INADDRSZ) <= endp) &&
|
||||
inet_pton4(curtok, tp) > 0) {
|
||||
tp += INADDRSZ;
|
||||
saw_xdigit = 0;
|
||||
@@ -208,13 +210,13 @@ inet_pton6(const char *src, unsigned char *dst)
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
if (saw_xdigit) {
|
||||
if (tp + INT16SZ > endp)
|
||||
if(saw_xdigit) {
|
||||
if(tp + INT16SZ > endp)
|
||||
return (0);
|
||||
*tp++ = (unsigned char) (val >> 8) & 0xff;
|
||||
*tp++ = (unsigned char) val & 0xff;
|
||||
}
|
||||
if (colonp != NULL) {
|
||||
if(colonp != NULL) {
|
||||
/*
|
||||
* Since some memmove()'s erroneously fail to handle
|
||||
* overlapping regions, we'll do the shift by hand.
|
||||
@@ -228,7 +230,7 @@ inet_pton6(const char *src, unsigned char *dst)
|
||||
}
|
||||
tp = endp;
|
||||
}
|
||||
if (tp != endp)
|
||||
if(tp != endp)
|
||||
return (0);
|
||||
/* bcopy(tmp, dst, IN6ADDRSZ); */
|
||||
memcpy(dst, tmp, IN6ADDRSZ);
|
||||
|
14
lib/krb4.c
14
lib/krb4.c
@@ -7,7 +7,7 @@
|
||||
*
|
||||
* Copyright (c) 1995, 1996, 1997, 1998, 1999 Kungliga Tekniska H<>gskolan
|
||||
* (Royal Institute of Technology, Stockholm, Sweden).
|
||||
* Copyright (c) 2004 - 2007 Daniel Stenberg
|
||||
* Copyright (c) 2004 - 2008 Daniel Stenberg
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@@ -97,7 +97,7 @@ strlcpy (char *dst, const char *src, size_t dst_sz)
|
||||
++p, ++src, ++n)
|
||||
*p = *src;
|
||||
*p = '\0';
|
||||
if (*src == '\0')
|
||||
if(*src == '\0')
|
||||
return n;
|
||||
else
|
||||
return n + strlen (src);
|
||||
@@ -228,17 +228,17 @@ krb4_auth(void *app_data, struct connectdata *conn)
|
||||
}
|
||||
|
||||
#ifdef HAVE_KRB_GET_OUR_IP_FOR_REALM
|
||||
if (krb_get_config_bool("nat_in_use")) {
|
||||
if(krb_get_config_bool("nat_in_use")) {
|
||||
struct sockaddr_in *localaddr = (struct sockaddr_in *)LOCAL_ADDR;
|
||||
struct in_addr natAddr;
|
||||
|
||||
if (krb_get_our_ip_for_realm(krb_realmofhost(host),
|
||||
if(krb_get_our_ip_for_realm(krb_realmofhost(host),
|
||||
&natAddr) != KSUCCESS
|
||||
&& krb_get_our_ip_for_realm(NULL, &natAddr) != KSUCCESS)
|
||||
infof(data, "Can't get address for realm %s\n",
|
||||
krb_realmofhost(host));
|
||||
else {
|
||||
if (natAddr.s_addr != localaddr->sin_addr.s_addr) {
|
||||
if(natAddr.s_addr != localaddr->sin_addr.s_addr) {
|
||||
#ifdef HAVE_INET_NTOA_R
|
||||
char ntoa_buf[64];
|
||||
char *ip = (char *)inet_ntoa_r(natAddr, ntoa_buf, sizeof(ntoa_buf));
|
||||
@@ -362,7 +362,7 @@ CURLcode Curl_krb_kauth(struct connectdata *conn)
|
||||
tmp=0;
|
||||
}
|
||||
if(!tmp || !ptr) {
|
||||
Curl_failf(conn->data, "Failed to decode base64 in reply.\n");
|
||||
Curl_failf(conn->data, "Failed to decode base64 in reply");
|
||||
Curl_set_command_prot(conn, save);
|
||||
return CURLE_FTP_WEIRD_SERVER_REPLY;
|
||||
}
|
||||
@@ -387,7 +387,7 @@ CURLcode Curl_krb_kauth(struct connectdata *conn)
|
||||
des_pcbc_encrypt((void *)tkt.dat, (void *)tktcopy.dat,
|
||||
tkt.length,
|
||||
schedule, &key, DES_DECRYPT);
|
||||
if (strcmp ((char*)tktcopy.dat + 8,
|
||||
if(strcmp ((char*)tktcopy.dat + 8,
|
||||
KRB_TICKET_GRANTING_TICKET) != 0) {
|
||||
afs_string_to_key(passwd,
|
||||
krb_realmofhost(conn->host.name),
|
||||
|
146
lib/ldap.c
146
lib/ldap.c
@@ -110,7 +110,7 @@ static void _ldap_free_urldesc (LDAPURLDesc *ludp);
|
||||
#define LDAP_TRACE(x) do { \
|
||||
_ldap_trace ("%u: ", __LINE__); \
|
||||
_ldap_trace x; \
|
||||
} while (0)
|
||||
} while(0)
|
||||
|
||||
static void _ldap_trace (const char *fmt, ...);
|
||||
#else
|
||||
@@ -191,14 +191,14 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done)
|
||||
#else
|
||||
rc = _ldap_url_parse(conn, &ludp);
|
||||
#endif
|
||||
if (rc != 0) {
|
||||
if(rc != 0) {
|
||||
failf(data, "LDAP local: %s", ldap_err2string(rc));
|
||||
status = CURLE_LDAP_INVALID_URL;
|
||||
goto quit;
|
||||
}
|
||||
|
||||
/* Get the URL scheme ( either ldap or ldaps ) */
|
||||
if (strequal(conn->protostr, "LDAPS"))
|
||||
if(strequal(conn->protostr, "LDAPS"))
|
||||
ldap_ssl = 1;
|
||||
infof(data, "LDAP local: trying to establish %s connection\n",
|
||||
ldap_ssl ? "encrypted" : "cleartext");
|
||||
@@ -208,7 +208,7 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done)
|
||||
#endif
|
||||
ldap_set_option(NULL, LDAP_OPT_PROTOCOL_VERSION, &ldap_proto);
|
||||
|
||||
if (ldap_ssl) {
|
||||
if(ldap_ssl) {
|
||||
#ifdef HAVE_LDAP_SSL
|
||||
#ifdef CURL_LDAP_WIN
|
||||
/* Win32 LDAP SDK doesnt support insecure mode without CA! */
|
||||
@@ -219,18 +219,18 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done)
|
||||
char* ldap_ca = data->set.str[STRING_SSL_CAFILE];
|
||||
#if defined(CURL_HAS_NOVELL_LDAPSDK)
|
||||
rc = ldapssl_client_init(NULL, NULL);
|
||||
if (rc != LDAP_SUCCESS) {
|
||||
if(rc != LDAP_SUCCESS) {
|
||||
failf(data, "LDAP local: ldapssl_client_init %s", ldap_err2string(rc));
|
||||
status = CURLE_SSL_CERTPROBLEM;
|
||||
goto quit;
|
||||
}
|
||||
if (data->set.ssl.verifypeer) {
|
||||
if(data->set.ssl.verifypeer) {
|
||||
/* Novell SDK supports DER or BASE64 files. */
|
||||
int cert_type = LDAPSSL_CERT_FILETYPE_B64;
|
||||
if ((data->set.str[STRING_CERT_TYPE]) &&
|
||||
if((data->set.str[STRING_CERT_TYPE]) &&
|
||||
(strequal(data->set.str[STRING_CERT_TYPE], "DER")))
|
||||
cert_type = LDAPSSL_CERT_FILETYPE_DER;
|
||||
if (!ldap_ca) {
|
||||
if(!ldap_ca) {
|
||||
failf(data, "LDAP local: ERROR %s CA cert not set!",
|
||||
(cert_type == LDAPSSL_CERT_FILETYPE_DER ? "DER" : "PEM"));
|
||||
status = CURLE_SSL_CERTPROBLEM;
|
||||
@@ -240,7 +240,7 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done)
|
||||
(cert_type == LDAPSSL_CERT_FILETYPE_DER ? "DER" : "PEM"),
|
||||
ldap_ca);
|
||||
rc = ldapssl_add_trusted_cert(ldap_ca, cert_type);
|
||||
if (rc != LDAP_SUCCESS) {
|
||||
if(rc != LDAP_SUCCESS) {
|
||||
failf(data, "LDAP local: ERROR setting %s CA cert: %s",
|
||||
(cert_type == LDAPSSL_CERT_FILETYPE_DER ? "DER" : "PEM"),
|
||||
ldap_err2string(rc));
|
||||
@@ -252,36 +252,36 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done)
|
||||
ldap_option = LDAPSSL_VERIFY_NONE;
|
||||
}
|
||||
rc = ldapssl_set_verify_mode(ldap_option);
|
||||
if (rc != LDAP_SUCCESS) {
|
||||
if(rc != LDAP_SUCCESS) {
|
||||
failf(data, "LDAP local: ERROR setting cert verify mode: %s",
|
||||
ldap_err2string(rc));
|
||||
status = CURLE_SSL_CERTPROBLEM;
|
||||
goto quit;
|
||||
}
|
||||
server = ldapssl_init(conn->host.name, (int)conn->port, 1);
|
||||
if (server == NULL) {
|
||||
if(server == NULL) {
|
||||
failf(data, "LDAP local: Cannot connect to %s:%d",
|
||||
conn->host.name, conn->port);
|
||||
status = CURLE_COULDNT_CONNECT;
|
||||
goto quit;
|
||||
}
|
||||
#elif defined(LDAP_OPT_X_TLS)
|
||||
if (data->set.ssl.verifypeer) {
|
||||
if(data->set.ssl.verifypeer) {
|
||||
/* OpenLDAP SDK supports BASE64 files. */
|
||||
if ((data->set.str[STRING_CERT_TYPE]) &&
|
||||
if((data->set.str[STRING_CERT_TYPE]) &&
|
||||
(!strequal(data->set.str[STRING_CERT_TYPE], "PEM"))) {
|
||||
failf(data, "LDAP local: ERROR OpenLDAP does only support PEM cert-type!");
|
||||
status = CURLE_SSL_CERTPROBLEM;
|
||||
goto quit;
|
||||
}
|
||||
if (!ldap_ca) {
|
||||
if(!ldap_ca) {
|
||||
failf(data, "LDAP local: ERROR PEM CA cert not set!");
|
||||
status = CURLE_SSL_CERTPROBLEM;
|
||||
goto quit;
|
||||
}
|
||||
infof(data, "LDAP local: using PEM CA cert: %s\n", ldap_ca);
|
||||
rc = ldap_set_option(NULL, LDAP_OPT_X_TLS_CACERTFILE, ldap_ca);
|
||||
if (rc != LDAP_SUCCESS) {
|
||||
if(rc != LDAP_SUCCESS) {
|
||||
failf(data, "LDAP local: ERROR setting PEM CA cert: %s",
|
||||
ldap_err2string(rc));
|
||||
status = CURLE_SSL_CERTPROBLEM;
|
||||
@@ -292,14 +292,14 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done)
|
||||
ldap_option = LDAP_OPT_X_TLS_NEVER;
|
||||
}
|
||||
rc = ldap_set_option(NULL, LDAP_OPT_X_TLS_REQUIRE_CERT, &ldap_option);
|
||||
if (rc != LDAP_SUCCESS) {
|
||||
if(rc != LDAP_SUCCESS) {
|
||||
failf(data, "LDAP local: ERROR setting cert verify mode: %s",
|
||||
ldap_err2string(rc));
|
||||
status = CURLE_SSL_CERTPROBLEM;
|
||||
goto quit;
|
||||
}
|
||||
server = ldap_init(conn->host.name, (int)conn->port);
|
||||
if (server == NULL) {
|
||||
if(server == NULL) {
|
||||
failf(data, "LDAP local: Cannot connect to %s:%d",
|
||||
conn->host.name, conn->port);
|
||||
status = CURLE_COULDNT_CONNECT;
|
||||
@@ -307,7 +307,7 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done)
|
||||
}
|
||||
ldap_option = LDAP_OPT_X_TLS_HARD;
|
||||
rc = ldap_set_option(server, LDAP_OPT_X_TLS, &ldap_option);
|
||||
if (rc != LDAP_SUCCESS) {
|
||||
if(rc != LDAP_SUCCESS) {
|
||||
failf(data, "LDAP local: ERROR setting SSL/TLS mode: %s",
|
||||
ldap_err2string(rc));
|
||||
status = CURLE_SSL_CERTPROBLEM;
|
||||
@@ -315,7 +315,7 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done)
|
||||
}
|
||||
/*
|
||||
rc = ldap_start_tls_s(server, NULL, NULL);
|
||||
if (rc != LDAP_SUCCESS) {
|
||||
if(rc != LDAP_SUCCESS) {
|
||||
failf(data, "LDAP local: ERROR starting SSL/TLS mode: %s",
|
||||
ldap_err2string(rc));
|
||||
status = CURLE_SSL_CERTPROBLEM;
|
||||
@@ -334,7 +334,7 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done)
|
||||
#endif /* CURL_LDAP_USE_SSL */
|
||||
} else {
|
||||
server = ldap_init(conn->host.name, (int)conn->port);
|
||||
if (server == NULL) {
|
||||
if(server == NULL) {
|
||||
failf(data, "LDAP local: Cannot connect to %s:%d",
|
||||
conn->host.name, conn->port);
|
||||
status = CURLE_COULDNT_CONNECT;
|
||||
@@ -348,14 +348,14 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done)
|
||||
rc = ldap_simple_bind_s(server,
|
||||
conn->bits.user_passwd ? conn->user : NULL,
|
||||
conn->bits.user_passwd ? conn->passwd : NULL);
|
||||
if (!ldap_ssl && rc != 0) {
|
||||
if(!ldap_ssl && rc != 0) {
|
||||
ldap_proto = LDAP_VERSION2;
|
||||
ldap_set_option(server, LDAP_OPT_PROTOCOL_VERSION, &ldap_proto);
|
||||
rc = ldap_simple_bind_s(server,
|
||||
conn->bits.user_passwd ? conn->user : NULL,
|
||||
conn->bits.user_passwd ? conn->passwd : NULL);
|
||||
}
|
||||
if (rc != 0) {
|
||||
if(rc != 0) {
|
||||
failf(data, "LDAP local: ldap_simple_bind_s %s", ldap_err2string(rc));
|
||||
status = CURLE_LDAP_CANNOT_BIND;
|
||||
goto quit;
|
||||
@@ -364,7 +364,7 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done)
|
||||
rc = ldap_search_s(server, ludp->lud_dn, ludp->lud_scope,
|
||||
ludp->lud_filter, ludp->lud_attrs, 0, &result);
|
||||
|
||||
if (rc != 0 && rc != LDAP_SIZELIMIT_EXCEEDED) {
|
||||
if(rc != 0 && rc != LDAP_SIZELIMIT_EXCEEDED) {
|
||||
failf(data, "LDAP remote: %s", ldap_err2string(rc));
|
||||
status = CURLE_LDAP_SEARCH_FAILED;
|
||||
goto quit;
|
||||
@@ -389,14 +389,14 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done)
|
||||
{
|
||||
BerValue **vals = ldap_get_values_len(server, entryIterator, attribute);
|
||||
|
||||
if (vals != NULL)
|
||||
if(vals != NULL)
|
||||
{
|
||||
for (i = 0; (vals[i] != NULL); i++)
|
||||
{
|
||||
Curl_client_write(conn, CLIENTWRITE_BODY, (char *)"\t", 1);
|
||||
Curl_client_write(conn, CLIENTWRITE_BODY, (char *) attribute, 0);
|
||||
Curl_client_write(conn, CLIENTWRITE_BODY, (char *)": ", 2);
|
||||
if ((strlen(attribute) > 7) &&
|
||||
if((strlen(attribute) > 7) &&
|
||||
(strcmp(";binary",
|
||||
(char *)attribute +
|
||||
(strlen((char *)attribute) - 7)) == 0)) {
|
||||
@@ -405,7 +405,7 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done)
|
||||
vals[i]->bv_val,
|
||||
vals[i]->bv_len,
|
||||
&val_b64);
|
||||
if (val_b64_sz > 0) {
|
||||
if(val_b64_sz > 0) {
|
||||
Curl_client_write(conn, CLIENTWRITE_BODY, val_b64, val_b64_sz);
|
||||
free(val_b64);
|
||||
}
|
||||
@@ -423,23 +423,23 @@ static CURLcode Curl_ldap(struct connectdata *conn, bool *done)
|
||||
ldap_memfree(attribute);
|
||||
}
|
||||
ldap_memfree(dn);
|
||||
if (ber)
|
||||
if(ber)
|
||||
ber_free(ber, 0);
|
||||
}
|
||||
|
||||
quit:
|
||||
if (result) {
|
||||
if(result) {
|
||||
ldap_msgfree(result);
|
||||
LDAP_TRACE (("Received %d entries\n", num));
|
||||
}
|
||||
if (rc == LDAP_SIZELIMIT_EXCEEDED)
|
||||
if(rc == LDAP_SIZELIMIT_EXCEEDED)
|
||||
infof(data, "There are more than %d entries\n", num);
|
||||
if (ludp)
|
||||
if(ludp)
|
||||
ldap_free_urldesc(ludp);
|
||||
if (server)
|
||||
if(server)
|
||||
ldap_unbind_s(server);
|
||||
#if defined(HAVE_LDAP_SSL) && defined(CURL_HAS_NOVELL_LDAPSDK)
|
||||
if (ldap_ssl)
|
||||
if(ldap_ssl)
|
||||
ldapssl_client_deinit();
|
||||
#endif /* HAVE_LDAP_SSL && CURL_HAS_NOVELL_LDAPSDK */
|
||||
|
||||
@@ -456,11 +456,11 @@ static void _ldap_trace (const char *fmt, ...)
|
||||
static int do_trace = -1;
|
||||
va_list args;
|
||||
|
||||
if (do_trace == -1) {
|
||||
if(do_trace == -1) {
|
||||
const char *env = getenv("CURL_TRACE");
|
||||
do_trace = (env && atoi(env) > 0);
|
||||
}
|
||||
if (!do_trace)
|
||||
if(!do_trace)
|
||||
return;
|
||||
|
||||
va_start (args, fmt);
|
||||
@@ -476,15 +476,15 @@ static void _ldap_trace (const char *fmt, ...)
|
||||
*/
|
||||
static int str2scope (const char *p)
|
||||
{
|
||||
if (!stricmp(p, "one"))
|
||||
if(!stricmp(p, "one"))
|
||||
return LDAP_SCOPE_ONELEVEL;
|
||||
if (!stricmp(p, "onetree"))
|
||||
if(!stricmp(p, "onetree"))
|
||||
return LDAP_SCOPE_ONELEVEL;
|
||||
if (!stricmp(p, "base"))
|
||||
if(!stricmp(p, "base"))
|
||||
return LDAP_SCOPE_BASE;
|
||||
if (!stricmp(p, "sub"))
|
||||
if(!stricmp(p, "sub"))
|
||||
return LDAP_SCOPE_SUBTREE;
|
||||
if (!stricmp( p, "subtree"))
|
||||
if(!stricmp( p, "subtree"))
|
||||
return LDAP_SCOPE_SUBTREE;
|
||||
return (-1);
|
||||
}
|
||||
@@ -502,7 +502,7 @@ static char **split_str (char *str)
|
||||
s = strchr(++s,',');
|
||||
|
||||
res = calloc(i, sizeof(char*));
|
||||
if (!res)
|
||||
if(!res)
|
||||
return NULL;
|
||||
|
||||
for (i = 0, s = strtok_r(str, ",", &lasts); s;
|
||||
@@ -518,31 +518,31 @@ static bool unescape_elements (void *data, LDAPURLDesc *ludp)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (ludp->lud_filter) {
|
||||
if(ludp->lud_filter) {
|
||||
ludp->lud_filter = curl_easy_unescape(data, ludp->lud_filter, 0, NULL);
|
||||
if (!ludp->lud_filter)
|
||||
if(!ludp->lud_filter)
|
||||
return (FALSE);
|
||||
}
|
||||
|
||||
for (i = 0; ludp->lud_attrs && ludp->lud_attrs[i]; i++) {
|
||||
ludp->lud_attrs[i] = curl_easy_unescape(data, ludp->lud_attrs[i], 0, NULL);
|
||||
if (!ludp->lud_attrs[i])
|
||||
if(!ludp->lud_attrs[i])
|
||||
return (FALSE);
|
||||
}
|
||||
|
||||
for (i = 0; ludp->lud_exts && ludp->lud_exts[i]; i++) {
|
||||
ludp->lud_exts[i] = curl_easy_unescape(data, ludp->lud_exts[i], 0, NULL);
|
||||
if (!ludp->lud_exts[i])
|
||||
if(!ludp->lud_exts[i])
|
||||
return (FALSE);
|
||||
}
|
||||
|
||||
if (ludp->lud_dn) {
|
||||
if(ludp->lud_dn) {
|
||||
char *dn = ludp->lud_dn;
|
||||
char *new_dn = curl_easy_unescape(data, dn, 0, NULL);
|
||||
|
||||
free(dn);
|
||||
ludp->lud_dn = new_dn;
|
||||
if (!new_dn)
|
||||
if(!new_dn)
|
||||
return (FALSE);
|
||||
}
|
||||
return (TRUE);
|
||||
@@ -555,7 +555,7 @@ static bool unescape_elements (void *data, LDAPURLDesc *ludp)
|
||||
*
|
||||
* <hostname> already known from 'conn->host.name'.
|
||||
* <port> already known from 'conn->remote_port'.
|
||||
* extract the rest from 'conn->data->reqdata.path+1'. All fields are optional.
|
||||
* extract the rest from 'conn->data->state.path+1'. All fields are optional.
|
||||
* e.g.
|
||||
* ldap://<hostname>:<port>/?<attributes>?<scope>?<filter>
|
||||
* yields ludp->lud_dn = "".
|
||||
@@ -567,9 +567,9 @@ static int _ldap_url_parse2 (const struct connectdata *conn, LDAPURLDesc *ludp)
|
||||
char *p, *q;
|
||||
int i;
|
||||
|
||||
if (!conn->data ||
|
||||
!conn->data->reqdata.path ||
|
||||
conn->data->reqdata.path[0] != '/' ||
|
||||
if(!conn->data ||
|
||||
!conn->data->state.path ||
|
||||
conn->data->state.path[0] != '/' ||
|
||||
!checkprefix(conn->protostr, conn->data->change.url))
|
||||
return LDAP_INVALID_SYNTAX;
|
||||
|
||||
@@ -579,15 +579,15 @@ static int _ldap_url_parse2 (const struct connectdata *conn, LDAPURLDesc *ludp)
|
||||
|
||||
/* parse DN (Distinguished Name).
|
||||
*/
|
||||
ludp->lud_dn = strdup(conn->data->reqdata.path+1);
|
||||
if (!ludp->lud_dn)
|
||||
ludp->lud_dn = strdup(conn->data->state.path+1);
|
||||
if(!ludp->lud_dn)
|
||||
return LDAP_NO_MEMORY;
|
||||
|
||||
p = strchr(ludp->lud_dn, '?');
|
||||
LDAP_TRACE (("DN '%.*s'\n", p ? (size_t)(p-ludp->lud_dn) :
|
||||
strlen(ludp->lud_dn), ludp->lud_dn));
|
||||
|
||||
if (!p)
|
||||
if(!p)
|
||||
goto success;
|
||||
|
||||
*p++ = '\0';
|
||||
@@ -595,12 +595,12 @@ static int _ldap_url_parse2 (const struct connectdata *conn, LDAPURLDesc *ludp)
|
||||
/* parse attributes. skip "??".
|
||||
*/
|
||||
q = strchr(p, '?');
|
||||
if (q)
|
||||
if(q)
|
||||
*q++ = '\0';
|
||||
|
||||
if (*p && *p != '?') {
|
||||
if(*p && *p != '?') {
|
||||
ludp->lud_attrs = split_str(p);
|
||||
if (!ludp->lud_attrs)
|
||||
if(!ludp->lud_attrs)
|
||||
return LDAP_NO_MEMORY;
|
||||
|
||||
for (i = 0; ludp->lud_attrs[i]; i++)
|
||||
@@ -608,52 +608,52 @@ static int _ldap_url_parse2 (const struct connectdata *conn, LDAPURLDesc *ludp)
|
||||
}
|
||||
|
||||
p = q;
|
||||
if (!p)
|
||||
if(!p)
|
||||
goto success;
|
||||
|
||||
/* parse scope. skip "??"
|
||||
*/
|
||||
q = strchr(p, '?');
|
||||
if (q)
|
||||
if(q)
|
||||
*q++ = '\0';
|
||||
|
||||
if (*p && *p != '?') {
|
||||
if(*p && *p != '?') {
|
||||
ludp->lud_scope = str2scope(p);
|
||||
if (ludp->lud_scope == -1)
|
||||
if(ludp->lud_scope == -1)
|
||||
return LDAP_INVALID_SYNTAX;
|
||||
LDAP_TRACE (("scope %d\n", ludp->lud_scope));
|
||||
}
|
||||
|
||||
p = q;
|
||||
if (!p)
|
||||
if(!p)
|
||||
goto success;
|
||||
|
||||
/* parse filter
|
||||
*/
|
||||
q = strchr(p, '?');
|
||||
if (q)
|
||||
if(q)
|
||||
*q++ = '\0';
|
||||
if (!*p)
|
||||
if(!*p)
|
||||
return LDAP_INVALID_SYNTAX;
|
||||
|
||||
ludp->lud_filter = p;
|
||||
LDAP_TRACE (("filter '%s'\n", ludp->lud_filter));
|
||||
|
||||
p = q;
|
||||
if (!p)
|
||||
if(!p)
|
||||
goto success;
|
||||
|
||||
/* parse extensions
|
||||
*/
|
||||
ludp->lud_exts = split_str(p);
|
||||
if (!ludp->lud_exts)
|
||||
if(!ludp->lud_exts)
|
||||
return LDAP_NO_MEMORY;
|
||||
|
||||
for (i = 0; ludp->lud_exts[i]; i++)
|
||||
LDAP_TRACE (("exts[%d] '%s'\n", i, ludp->lud_exts[i]));
|
||||
|
||||
success:
|
||||
if (!unescape_elements(conn->data, ludp))
|
||||
if(!unescape_elements(conn->data, ludp))
|
||||
return LDAP_NO_MEMORY;
|
||||
return LDAP_SUCCESS;
|
||||
}
|
||||
@@ -665,11 +665,11 @@ static int _ldap_url_parse (const struct connectdata *conn,
|
||||
int rc;
|
||||
|
||||
*ludpp = NULL;
|
||||
if (!ludp)
|
||||
if(!ludp)
|
||||
return LDAP_NO_MEMORY;
|
||||
|
||||
rc = _ldap_url_parse2 (conn, ludp);
|
||||
if (rc != LDAP_SUCCESS) {
|
||||
if(rc != LDAP_SUCCESS) {
|
||||
_ldap_free_urldesc(ludp);
|
||||
ludp = NULL;
|
||||
}
|
||||
@@ -681,22 +681,22 @@ static void _ldap_free_urldesc (LDAPURLDesc *ludp)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (!ludp)
|
||||
if(!ludp)
|
||||
return;
|
||||
|
||||
if (ludp->lud_dn)
|
||||
if(ludp->lud_dn)
|
||||
free(ludp->lud_dn);
|
||||
|
||||
if (ludp->lud_filter)
|
||||
if(ludp->lud_filter)
|
||||
free(ludp->lud_filter);
|
||||
|
||||
if (ludp->lud_attrs) {
|
||||
if(ludp->lud_attrs) {
|
||||
for (i = 0; ludp->lud_attrs[i]; i++)
|
||||
free(ludp->lud_attrs[i]);
|
||||
free(ludp->lud_attrs);
|
||||
}
|
||||
|
||||
if (ludp->lud_exts) {
|
||||
if(ludp->lud_exts) {
|
||||
for (i = 0; ludp->lud_exts[i]; i++)
|
||||
free(ludp->lud_exts[i]);
|
||||
free(ludp->lud_exts);
|
||||
|
@@ -5,7 +5,7 @@
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2007, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
* Copyright (C) 1998 - 2008, 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
|
||||
@@ -52,7 +52,8 @@ BEGIN
|
||||
VALUE "OriginalFilename", "libcurl.dll\0"
|
||||
VALUE "ProductName", "The cURL library\0"
|
||||
VALUE "ProductVersion", LIBCURL_VERSION "\0"
|
||||
VALUE "LegalCopyright", "Copyright 1996-2007 by Daniel Stenberg. http://curl.haxx.se/docs/copyright.html\0"
|
||||
VALUE "LegalCopyright", "<EFBFBD> " LIBCURL_COPYRIGHT "\0"
|
||||
VALUE "License", "http://curl.haxx.se/docs/copyright.html\0"
|
||||
END
|
||||
END
|
||||
|
||||
|
65
lib/llist.c
65
lib/llist.c
@@ -5,7 +5,7 @@
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2006, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
* Copyright (C) 1998 - 2008, 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
|
||||
@@ -68,7 +68,7 @@ Curl_llist_insert_next(struct curl_llist *list, struct curl_llist_element *e,
|
||||
return 0;
|
||||
|
||||
ne->ptr = (void *) p;
|
||||
if (list->size == 0) {
|
||||
if(list->size == 0) {
|
||||
list->head = ne;
|
||||
list->head->prev = NULL;
|
||||
list->head->next = NULL;
|
||||
@@ -77,7 +77,7 @@ Curl_llist_insert_next(struct curl_llist *list, struct curl_llist_element *e,
|
||||
else {
|
||||
ne->next = e->next;
|
||||
ne->prev = e;
|
||||
if (e->next) {
|
||||
if(e->next) {
|
||||
e->next->prev = ne;
|
||||
}
|
||||
else {
|
||||
@@ -95,19 +95,19 @@ int
|
||||
Curl_llist_remove(struct curl_llist *list, struct curl_llist_element *e,
|
||||
void *user)
|
||||
{
|
||||
if (e == NULL || list->size == 0)
|
||||
if(e == NULL || list->size == 0)
|
||||
return 1;
|
||||
|
||||
if (e == list->head) {
|
||||
if(e == list->head) {
|
||||
list->head = e->next;
|
||||
|
||||
if (list->head == NULL)
|
||||
if(list->head == NULL)
|
||||
list->tail = NULL;
|
||||
else
|
||||
e->next->prev = NULL;
|
||||
} else {
|
||||
e->prev->next = e->next;
|
||||
if (!e->next)
|
||||
if(!e->next)
|
||||
list->tail = e->prev;
|
||||
else
|
||||
e->next->prev = e->prev;
|
||||
@@ -124,7 +124,7 @@ void
|
||||
Curl_llist_destroy(struct curl_llist *list, void *user)
|
||||
{
|
||||
if(list) {
|
||||
while (list->size > 0)
|
||||
while(list->size > 0)
|
||||
Curl_llist_remove(list, list->tail, user);
|
||||
|
||||
free(list);
|
||||
@@ -136,3 +136,52 @@ Curl_llist_count(struct curl_llist *list)
|
||||
{
|
||||
return list->size;
|
||||
}
|
||||
|
||||
int Curl_llist_move(struct curl_llist *list, struct curl_llist_element *e,
|
||||
struct curl_llist *to_list, struct curl_llist_element *to_e)
|
||||
{
|
||||
/* Remove element from list */
|
||||
if(e == NULL || list->size == 0)
|
||||
return 0;
|
||||
|
||||
if(e == list->head) {
|
||||
list->head = e->next;
|
||||
|
||||
if(list->head == NULL)
|
||||
list->tail = NULL;
|
||||
else
|
||||
e->next->prev = NULL;
|
||||
}
|
||||
else {
|
||||
e->prev->next = e->next;
|
||||
if(!e->next)
|
||||
list->tail = e->prev;
|
||||
else
|
||||
e->next->prev = e->prev;
|
||||
}
|
||||
|
||||
--list->size;
|
||||
|
||||
/* Add element to to_list after to_e */
|
||||
if(to_list->size == 0) {
|
||||
to_list->head = e;
|
||||
to_list->head->prev = NULL;
|
||||
to_list->head->next = NULL;
|
||||
to_list->tail = e;
|
||||
}
|
||||
else {
|
||||
e->next = to_e->next;
|
||||
e->prev = to_e;
|
||||
if(to_e->next) {
|
||||
to_e->next->prev = e;
|
||||
}
|
||||
else {
|
||||
to_list->tail = e;
|
||||
}
|
||||
to_e->next = e;
|
||||
}
|
||||
|
||||
++to_list->size;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
@@ -7,7 +7,7 @@
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
* Copyright (C) 1998 - 2008, 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
|
||||
@@ -56,5 +56,7 @@ int Curl_llist_remove_next(struct curl_llist *, struct curl_llist_element *,
|
||||
void *);
|
||||
size_t Curl_llist_count(struct curl_llist *);
|
||||
void Curl_llist_destroy(struct curl_llist *, void *);
|
||||
int Curl_llist_move(struct curl_llist *, struct curl_llist_element *,
|
||||
struct curl_llist *, struct curl_llist_element *);
|
||||
|
||||
#endif
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user