Compare commits
403 Commits
curl-7_16_
...
curl-7_16_
Author | SHA1 | Date | |
---|---|---|---|
![]() |
b122959c8b | ||
![]() |
84c5e846b3 | ||
![]() |
47f044265e | ||
![]() |
d46d995766 | ||
![]() |
1a0cc60741 | ||
![]() |
7cbbd1b56b | ||
![]() |
5daa6b9367 | ||
![]() |
a7aca2e8af | ||
![]() |
d8d3dc9302 | ||
![]() |
5be7b543d8 | ||
![]() |
910ee13b20 | ||
![]() |
35935d71d2 | ||
![]() |
de17f4436e | ||
![]() |
be5ade5c7a | ||
![]() |
0e05a6329a | ||
![]() |
c518c52aba | ||
![]() |
e4c28abdc1 | ||
![]() |
a11374d994 | ||
![]() |
d9e89e170f | ||
![]() |
47594be5c0 | ||
![]() |
0d635a1119 | ||
![]() |
e9ffa9a3b8 | ||
![]() |
248a5381d4 | ||
![]() |
c1ab3e2d59 | ||
![]() |
c895dc8a19 | ||
![]() |
a0a79ce853 | ||
![]() |
70f9a13ecb | ||
![]() |
c321b9f704 | ||
![]() |
7e74349b86 | ||
![]() |
fd016fb3ee | ||
![]() |
09dd2d3856 | ||
![]() |
5625e5d5b8 | ||
![]() |
8a529bd987 | ||
![]() |
8fe9376d54 | ||
![]() |
a1f72943e9 | ||
![]() |
0969a96732 | ||
![]() |
ec8019b2a8 | ||
![]() |
27d2d78059 | ||
![]() |
7d48d851a2 | ||
![]() |
6a2cecf153 | ||
![]() |
990b15e402 | ||
![]() |
584f3639e3 | ||
![]() |
2886ce96b0 | ||
![]() |
3344142b87 | ||
![]() |
f1b4f5e2ae | ||
![]() |
bcf0af9ddb | ||
![]() |
70550a0572 | ||
![]() |
d7088d1032 | ||
![]() |
d07a874899 | ||
![]() |
c420113795 | ||
![]() |
5c850b825b | ||
![]() |
7bbad0b534 | ||
![]() |
305e03905f | ||
![]() |
161be66c89 | ||
![]() |
4095c9de37 | ||
![]() |
20d33ad7e5 | ||
![]() |
b8c12fe658 | ||
![]() |
e4d4ee8db5 | ||
![]() |
8a7d58378b | ||
![]() |
bdbaedc452 | ||
![]() |
0839621f47 | ||
![]() |
bf2c1e099c | ||
![]() |
6c6e4710b5 | ||
![]() |
5e7164f87a | ||
![]() |
ef10eaeb29 | ||
![]() |
fce4dcccd8 | ||
![]() |
f2beee209b | ||
![]() |
9d8b22d3de | ||
![]() |
5796c7b132 | ||
![]() |
dc2ea33e32 | ||
![]() |
c1f117700a | ||
![]() |
7ea90c46eb | ||
![]() |
4d9e24d1e4 | ||
![]() |
1f236ba108 | ||
![]() |
d27813c2dd | ||
![]() |
453e9b0dce | ||
![]() |
b8626c3df8 | ||
![]() |
f8d78d57a7 | ||
![]() |
371a25eee9 | ||
![]() |
e535a71c71 | ||
![]() |
b9e5fecf5f | ||
![]() |
3af08472ad | ||
![]() |
fdc1b61507 | ||
![]() |
7fd154f094 | ||
![]() |
a209c32bf3 | ||
![]() |
75db459f0a | ||
![]() |
74e54c5a49 | ||
![]() |
6fc151577e | ||
![]() |
3dcc7202d5 | ||
![]() |
40981286ea | ||
![]() |
f55a1c3a6c | ||
![]() |
c5586a65c2 | ||
![]() |
ffb11ad5c6 | ||
![]() |
fbb1e49215 | ||
![]() |
c26320d94f | ||
![]() |
f6e892b1b6 | ||
![]() |
59302d4ba0 | ||
![]() |
c563a53c16 | ||
![]() |
7763bb9172 | ||
![]() |
e37a49086e | ||
![]() |
a1e5c621c0 | ||
![]() |
f776c1d2eb | ||
![]() |
3d5a8515a6 | ||
![]() |
42a7905205 | ||
![]() |
bfa0f8c6c2 | ||
![]() |
869d192ffc | ||
![]() |
60bc103a78 | ||
![]() |
8a0a7ce3a8 | ||
![]() |
31b1e988f4 | ||
![]() |
25c064c888 | ||
![]() |
884171aecf | ||
![]() |
45b2577974 | ||
![]() |
d58c7a8bdd | ||
![]() |
eed47311f8 | ||
![]() |
59eaae42b8 | ||
![]() |
59c620bfa5 | ||
![]() |
4294cac701 | ||
![]() |
282127fbff | ||
![]() |
d49e9fad19 | ||
![]() |
fba4cd0e62 | ||
![]() |
2166645ce4 | ||
![]() |
844f5b6b45 | ||
![]() |
424063235b | ||
![]() |
8272abef28 | ||
![]() |
5fbc93c3eb | ||
![]() |
8851df41c5 | ||
![]() |
a6f4612154 | ||
![]() |
52e5e869e6 | ||
![]() |
12ef1035bb | ||
![]() |
6c56b5301f | ||
![]() |
07b6625573 | ||
![]() |
fa0780bb91 | ||
![]() |
f08ac86834 | ||
![]() |
d6eca89229 | ||
![]() |
2bd1d7e996 | ||
![]() |
3b355421ec | ||
![]() |
0dd1219668 | ||
![]() |
b7131009fb | ||
![]() |
3d528e1b15 | ||
![]() |
f9a339a225 | ||
![]() |
0043e87014 | ||
![]() |
0f634a0c89 | ||
![]() |
047cd1a533 | ||
![]() |
f9eb61e90a | ||
![]() |
34afb0b257 | ||
![]() |
6bb9bd8b69 | ||
![]() |
72175c738f | ||
![]() |
2288094b26 | ||
![]() |
273b2b230b | ||
![]() |
3229a80c9f | ||
![]() |
5eba84eed3 | ||
![]() |
4fb483012c | ||
![]() |
f1a8fd843f | ||
![]() |
8920606b8b | ||
![]() |
90ce18019c | ||
![]() |
fe10cb2ef5 | ||
![]() |
842be6c52f | ||
![]() |
e4b754f64e | ||
![]() |
34ed4642ec | ||
![]() |
248f057137 | ||
![]() |
2b6a0c0a7c | ||
![]() |
072a8b2955 | ||
![]() |
0c817b6614 | ||
![]() |
e9cbd0c366 | ||
![]() |
ff314d7600 | ||
![]() |
d052e545af | ||
![]() |
da2b75a026 | ||
![]() |
0e2d3b7b6c | ||
![]() |
46a50aa001 | ||
![]() |
605a391178 | ||
![]() |
de6f82d094 | ||
![]() |
c1f3edbdd1 | ||
![]() |
a20a6f67c5 | ||
![]() |
75931492c3 | ||
![]() |
800b55c702 | ||
![]() |
a53411c0dd | ||
![]() |
b169aa2992 | ||
![]() |
9189ac1141 | ||
![]() |
5c7c79bd08 | ||
![]() |
8605321d06 | ||
![]() |
d314453037 | ||
![]() |
9cb69f77f1 | ||
![]() |
ee332e0c8e | ||
![]() |
0188493d54 | ||
![]() |
ae07fd2ba8 | ||
![]() |
d76a734043 | ||
![]() |
b66def2b4c | ||
![]() |
20b9ab49a7 | ||
![]() |
c8cd13337e | ||
![]() |
40e9e40cb4 | ||
![]() |
09c70dec08 | ||
![]() |
0dc570862a | ||
![]() |
dbaf4f9361 | ||
![]() |
433575068c | ||
![]() |
40087ce7c0 | ||
![]() |
e12d46ac50 | ||
![]() |
1e55ed5c7d | ||
![]() |
6dd4fe0740 | ||
![]() |
3789e2e6ce | ||
![]() |
1962ebf8e7 | ||
![]() |
7c144d5a7e | ||
![]() |
0f0540d00b | ||
![]() |
3f29ed6d44 | ||
![]() |
1bfa7dfe39 | ||
![]() |
85daec253c | ||
![]() |
389a15a867 | ||
![]() |
74befdfbe0 | ||
![]() |
d31feb8ff9 | ||
![]() |
4c3568bfd6 | ||
![]() |
b4ef5e22e0 | ||
![]() |
23786eae32 | ||
![]() |
c84f84c70d | ||
![]() |
e5f8e5e57a | ||
![]() |
53a3abc76b | ||
![]() |
bfd6474f6b | ||
![]() |
d3b89e114a | ||
![]() |
aeddea2b71 | ||
![]() |
cef5b14baa | ||
![]() |
82d310d0d9 | ||
![]() |
4fdb42377b | ||
![]() |
be8a5d0aef | ||
![]() |
dd433679e6 | ||
![]() |
99dcd33f04 | ||
![]() |
e817eb6cec | ||
![]() |
060f7ca2d2 | ||
![]() |
638c715a51 | ||
![]() |
af9a63287e | ||
![]() |
00f36c5f45 | ||
![]() |
e69d82a5fb | ||
![]() |
d165da07fe | ||
![]() |
15363cd6dc | ||
![]() |
b3272fd799 | ||
![]() |
fa31335926 | ||
![]() |
acc4cf87cd | ||
![]() |
7444342675 | ||
![]() |
ee1235a7cd | ||
![]() |
c514a2a89a | ||
![]() |
e2f0580dfe | ||
![]() |
d165bed2d6 | ||
![]() |
802a5b618e | ||
![]() |
1ca763d1d1 | ||
![]() |
8b26c93a59 | ||
![]() |
b819c72700 | ||
![]() |
d2cfb7fd13 | ||
![]() |
e37973913d | ||
![]() |
8b5295d003 | ||
![]() |
fe0afb211e | ||
![]() |
141b3d0c2f | ||
![]() |
2a6a22a3b0 | ||
![]() |
4937281ddc | ||
![]() |
8e27ed2fdd | ||
![]() |
9bf9617ad6 | ||
![]() |
69565afab0 | ||
![]() |
39aac63521 | ||
![]() |
f19d333ef6 | ||
![]() |
3a634a273a | ||
![]() |
06d1b029f6 | ||
![]() |
45bf417301 | ||
![]() |
48029d7e74 | ||
![]() |
83e078256c | ||
![]() |
2f5e99ca02 | ||
![]() |
6014c21bc9 | ||
![]() |
8c0b1dc3c5 | ||
![]() |
be3c5f0b94 | ||
![]() |
e268e8559e | ||
![]() |
29bb6f65f1 | ||
![]() |
37f07a54bd | ||
![]() |
da8c666e4f | ||
![]() |
c11681becd | ||
![]() |
78a1e5d1a6 | ||
![]() |
116f60e063 | ||
![]() |
7725853446 | ||
![]() |
9993e2121d | ||
![]() |
9a70ce4245 | ||
![]() |
7ba53a4f41 | ||
![]() |
1297c54b26 | ||
![]() |
1045b8d382 | ||
![]() |
d2bdad5945 | ||
![]() |
17e8d60c01 | ||
![]() |
ec1b351317 | ||
![]() |
75fca27f8e | ||
![]() |
f2cd2882a0 | ||
![]() |
07d8a14ec0 | ||
![]() |
31e598d2f3 | ||
![]() |
cbf58d88d0 | ||
![]() |
300cbc2e21 | ||
![]() |
ec9e399668 | ||
![]() |
2691f1efc8 | ||
![]() |
d9bf55570b | ||
![]() |
b54a8531a9 | ||
![]() |
789fd0b74a | ||
![]() |
8103915797 | ||
![]() |
c461254dea | ||
![]() |
3f140a6008 | ||
![]() |
a0a47f2767 | ||
![]() |
213017e9cf | ||
![]() |
69f2f5cb6f | ||
![]() |
d46cab4a94 | ||
![]() |
4dc453c087 | ||
![]() |
a1d5983991 | ||
![]() |
4894ce16fc | ||
![]() |
aa4435c23b | ||
![]() |
dca8f962e0 | ||
![]() |
059b57677c | ||
![]() |
9896421586 | ||
![]() |
6663608d15 | ||
![]() |
d21e4eb8ae | ||
![]() |
d381dd68cf | ||
![]() |
7a97e66fb3 | ||
![]() |
d86e6d3ed2 | ||
![]() |
f99ca90540 | ||
![]() |
e24cb6cb90 | ||
![]() |
b05f408348 | ||
![]() |
c5e7d839d5 | ||
![]() |
e3ade3ccb5 | ||
![]() |
71afe05b9f | ||
![]() |
5a267c4312 | ||
![]() |
fbcf86b83e | ||
![]() |
5c3f36b4b4 | ||
![]() |
9de4e5ebe4 | ||
![]() |
7033a1c072 | ||
![]() |
4efa0d9f68 | ||
![]() |
e021fe9444 | ||
![]() |
23d1041bd8 | ||
![]() |
be71ccbce3 | ||
![]() |
0db485a448 | ||
![]() |
6d05a33ed9 | ||
![]() |
569c169559 | ||
![]() |
ecbc7f89c0 | ||
![]() |
5649b738be | ||
![]() |
0f9f6cf180 | ||
![]() |
7f70dbcad5 | ||
![]() |
28b932fb4e | ||
![]() |
a631741141 | ||
![]() |
c7d0966201 | ||
![]() |
cf491357b6 | ||
![]() |
02c17651bf | ||
![]() |
890b34d22e | ||
![]() |
e89fb10736 | ||
![]() |
48e8b52fbb | ||
![]() |
61f19c6ca3 | ||
![]() |
8c9233f6b2 | ||
![]() |
6fcf98f617 | ||
![]() |
2f4fe0175b | ||
![]() |
9f62ff5df6 | ||
![]() |
4e3f3e751e | ||
![]() |
04e6568a7e | ||
![]() |
7a39b98471 | ||
![]() |
4ab91a93e8 | ||
![]() |
6647ca6ec5 | ||
![]() |
529e01736c | ||
![]() |
078fc4186b | ||
![]() |
fabbb3fc34 | ||
![]() |
1db063e705 | ||
![]() |
1fa9ef246a | ||
![]() |
e12220cc4c | ||
![]() |
77fcad041f | ||
![]() |
e213555c98 | ||
![]() |
3a813b3c3b | ||
![]() |
028a9d6785 | ||
![]() |
d0aca8017f | ||
![]() |
91386937ff | ||
![]() |
0fc51ac5a6 | ||
![]() |
bc2183b440 | ||
![]() |
01c4fba15c | ||
![]() |
9b6474378a | ||
![]() |
5446ed4733 | ||
![]() |
a50414f594 | ||
![]() |
fe7fa8e794 | ||
![]() |
6a175b42db | ||
![]() |
a7748c2024 | ||
![]() |
8f87c15bda | ||
![]() |
82f52e5a6f | ||
![]() |
67d2dd62f9 | ||
![]() |
138b4f27b4 | ||
![]() |
c26ec47e90 | ||
![]() |
8337a375dd | ||
![]() |
8260243be1 | ||
![]() |
ef6f24a7ce | ||
![]() |
abe90019d3 | ||
![]() |
c185cdf2b4 | ||
![]() |
f71c8c7d84 | ||
![]() |
d32f1390b3 | ||
![]() |
68f3c2adca | ||
![]() |
2a8e2edf83 | ||
![]() |
401598c2fe | ||
![]() |
d60848d04b | ||
![]() |
d2dd3d7e16 | ||
![]() |
1c63ceb317 | ||
![]() |
c25283185a | ||
![]() |
54db98c220 | ||
![]() |
5565f45f5e | ||
![]() |
49c4d9c9cd | ||
![]() |
c2639e0738 | ||
![]() |
e485a23a3e | ||
![]() |
d7d5baa0e2 | ||
![]() |
e1e55e4d04 | ||
![]() |
1eb530d8dc | ||
![]() |
bad67830b3 | ||
![]() |
db22c83031 | ||
![]() |
a4b39c6ab8 | ||
![]() |
d10e174fd1 | ||
![]() |
e994c6af75 |
@@ -1,3 +1,4 @@
|
||||
compile
|
||||
config.log
|
||||
Makefile
|
||||
libtool
|
||||
|
309
CHANGES
309
CHANGES
@@ -6,6 +6,315 @@
|
||||
|
||||
Changelog
|
||||
|
||||
Version 7.16.2 (11 April 2007)
|
||||
|
||||
Yang Tse (10 April 2007)
|
||||
- Ravi Pratap provided some fixes for HTTP pipelining
|
||||
|
||||
- configure script will ignore --enable-sspi option for non-native Windows.
|
||||
|
||||
Daniel S (9 April 2007)
|
||||
- Nick Zitzmann did ssh.c cleanups
|
||||
|
||||
Daniel S (3 April 2007)
|
||||
- Rob Jones fixed better #ifdef'ing for a bunch of #include lines.
|
||||
|
||||
Daniel S (2 April 2007)
|
||||
- Nick Zitzmann made the CURLOPT_POSTQUOTE option work for SFTP as well. The
|
||||
accepted commands are as follows:
|
||||
|
||||
chgrp (gid) (path)
|
||||
Changes the group ID of the file or directory at (path) to (gid). (gid)
|
||||
must be a number.
|
||||
|
||||
chmod (perms) (path)
|
||||
Changes the permissions of the file or directory at (path) to
|
||||
(perms). (perms) must be a number in the format used by the chmod Unix
|
||||
command.
|
||||
|
||||
chown (uid) (path)
|
||||
Changes the user ID of the file or directory at (path) to (uid). (uid)
|
||||
must be a number.
|
||||
|
||||
ln (source) (dest)
|
||||
Creates a symbolic link at (dest) that points to the file located at
|
||||
(source).
|
||||
|
||||
mkdir (path)
|
||||
Creates a new directory at (path).
|
||||
|
||||
rename (source) (dest)
|
||||
Moves the file or directory at (source) to (dest).
|
||||
|
||||
rm (path)
|
||||
Deletes the file located at (path).
|
||||
|
||||
rmdir (path)
|
||||
Deletes the directory located at (path). This command will raise an error
|
||||
if the directory is not empty.
|
||||
|
||||
symlink (source) (dest)
|
||||
Same as ln.
|
||||
|
||||
Daniel S (1 April 2007)
|
||||
- Robert Iakobashvili made curl_multi_remove_handle() a lot faster when many
|
||||
easy handles are added to a multi handle, by avoiding the looping over all
|
||||
the handles to find which one to remove.
|
||||
|
||||
- Matt Kraai provided a patch that makes curl build on QNX 6 fine again.
|
||||
|
||||
Daniel S (31 March 2007)
|
||||
- Fixed several minor issues detected by the coverity.com scanner.
|
||||
|
||||
- "Pixel" fixed a problem that appeared when you used -f with user+password
|
||||
embedded in the URL.
|
||||
|
||||
Dan F (29 March 2007)
|
||||
- Don't tear down the ftp connection if the maximum filesize was exceeded
|
||||
and added tests 290 and 291 to check.
|
||||
|
||||
- Added ftps upload and SSL required tests 401 and 402.
|
||||
|
||||
- Send an EOF message before closing an SCP channel, as recommended by
|
||||
RFC4254. Enable libssh2 tracing when ssh debugging is turned on.
|
||||
|
||||
Yang Tse (27 March 2007)
|
||||
- Internal function Curl_select() renamed to Curl_socket_ready()
|
||||
|
||||
New Internal wrapper function Curl_select() around select (2), it
|
||||
uses poll() when a fine poll() is available, so now libcurl can be
|
||||
built without select() support at all if a fine poll() is available.
|
||||
|
||||
Daniel S (25 March 2007)
|
||||
- Daniel Johnson fixed multi code to traverse the easy handle list properly.
|
||||
A left-over bug from the February 21 fix.
|
||||
|
||||
Dan F (23 March 2007)
|
||||
- Added --pubkey option to curl and made --key also work for SCP/SFTP,
|
||||
plus made --pass work on an SSH private key as well.
|
||||
|
||||
- Changed the test harness to attempt to gracefully shut down servers
|
||||
before resorting to the kill -9 hammer.
|
||||
|
||||
- Added test harness infrastructure to support scp/sftp tests, using
|
||||
OpenSSH as the server.
|
||||
|
||||
- Fixed a memory leak when specifying a proxy with a file: URL.
|
||||
|
||||
Yang Tse (20 March 2007)
|
||||
- Fixed: When a signal was caught awaiting for an event using Curl_select()
|
||||
or Curl_poll() with a non-zero timeout both functions would restart the
|
||||
specified timeout. This could even lead to the extreme case that if a
|
||||
signal arrived with a frecuency lower to the specified timeout neither
|
||||
function would ever exit.
|
||||
|
||||
Added experimental symbol definition check CURL_ACKNOWLEDGE_EINTR in
|
||||
Curl_select() and Curl_poll(). When compiled with CURL_ACKNOWLEDGE_EINTR
|
||||
defined both functions will return as soon as a signal is caught. Use it
|
||||
at your own risk, all calls to these functions in the library should be
|
||||
revisited and checked before fully supporting this feature.
|
||||
|
||||
Yang Tse (19 March 2007)
|
||||
- Bryan Henderson fixed the progress function so that it can get called more
|
||||
frequently allowing same calling frecuency for the client progress callback.
|
||||
|
||||
Dan F (15 March 2007)
|
||||
- Various memory leaks plugged and NULL pointer fixes made in the ssh code.
|
||||
|
||||
Daniel (15 March 2007)
|
||||
- Nick made the curl tool accept globbing ranges that only is one number, i.e
|
||||
you can now use [1-1] without curl complaining.
|
||||
|
||||
Daniel (10 March 2007)
|
||||
- Eygene Ryabinkin:
|
||||
|
||||
The problem is the following: when we're calling Curl_done and it decides to
|
||||
keep the connection opened ('left intact'), then the caller is not notified
|
||||
that the connection was done via the NULLifying of the pointer, so some easy
|
||||
handle is keeping the pointer to this connection.
|
||||
|
||||
Later ConnectionExists can select such connection for reuse even if we're
|
||||
not pipelining: pipeLen is zero, so the (pipeLen > 0 && !canPipeline) is
|
||||
false and we can reuse this connection for another easy handle. But thus the
|
||||
connection will be shared between two easy handles if the handle that wants
|
||||
to take the ownership is not the same as was not notified of the connection
|
||||
was done in Curl_done. And when some of these easy handles will get their
|
||||
connection really freed the another one will still keep the pointer.
|
||||
|
||||
My fix was rather trivial: I just added the NULLification to the 'else'
|
||||
branch in the Curl_done. My tests with Git and ElectricFence showed no
|
||||
problems both for HTTP pulling and cloning. Repository size is about 250 Mb,
|
||||
so it was a considerable amount of Curl's work.
|
||||
|
||||
Dan F (9 March 2007)
|
||||
- Updated the test harness to add a new "crypto" feature check and updated the
|
||||
appropriate test case to use it. For now, this is treated the same as the
|
||||
"SSL" feature because curl doesn't list it separately.
|
||||
|
||||
Daniel (9 March 2007)
|
||||
- Robert Iakobashvili fixed CURLOPT_INTERFACE for IPv6.
|
||||
|
||||
- Robert A. Monat improved the maketgz and VC6/8 generating to set the correct
|
||||
machine type too.
|
||||
|
||||
- Justin Fletcher fixed a file descriptor leak in the curl tool when trying to
|
||||
upload a file it couldn't open. Bug #1676581
|
||||
(http://curl.haxx.se/bug/view.cgi?id=1676581)
|
||||
|
||||
Dan F (9 March 2007)
|
||||
- Updated the test harness to check for protocol support before running each
|
||||
test, fixing KNOWN_BUGS #11.
|
||||
|
||||
Dan F (7 March 2007)
|
||||
- Reintroduced (after a 3 year hiatus) an FTPS test case (400) into the test
|
||||
harness. It is very limited as it supports only ftps:// URLs with
|
||||
--ftp-ssl-control specified, which implicitly encrypts the control
|
||||
channel but not the data channels. That allows stunnel to be used with
|
||||
an unmodified ftp server in exactly the same way that the test https
|
||||
server is set up.
|
||||
|
||||
Dan F (7 March 2007)
|
||||
- Honour --ftp-ssl-control on ftps:// URLs to allow encrypted control and
|
||||
unencrypted data connections.
|
||||
|
||||
Dan F (6 March 2007)
|
||||
- Fixed a couple of improper pointer uses detected by valgrind in test
|
||||
cases 181 & 216.
|
||||
|
||||
Daniel (2 March 2007)
|
||||
- Robert A. Monat and Shmulik Regev helped out to fix the new */Makefile.vc8
|
||||
makefiles that are included in the source release archives, generated from
|
||||
the Makefile.vc6 files by the maketgz script. I also modified the root
|
||||
Makefile to have a VC variable that defaults to vc6 but can be overridden to
|
||||
allow it to be used for vc8 as well. Like this:
|
||||
|
||||
nmake VC=vc8 vc
|
||||
|
||||
Daniel (27 February 2007)
|
||||
- Hang Kin Lau found and fixed: When I use libcurl to connect to an https
|
||||
server through a proxy and have the remote https server port set using the
|
||||
CURLOPT_PORT option, protocol gets reset to http from https after the first
|
||||
request.
|
||||
|
||||
User defined URL was modified internally by libcurl and subsequent reuse of
|
||||
the easy handle may lead to connection using a different protocol (if not
|
||||
originally http).
|
||||
|
||||
I found that libcurl hardcoded the protocol to "http" when it tries to
|
||||
regenerate the URL if CURLOPT_PORT is set. I tried to fix the problem as
|
||||
follows and it's working fine so far
|
||||
|
||||
Daniel (25 February 2007)
|
||||
- Adam D. Moss made the HTTP CONNECT procedure less blocking when used from
|
||||
the multi interface. Note that it still does a part of the connection in a
|
||||
blocking manner.
|
||||
|
||||
Daniel (23 February 2007)
|
||||
- Added warning outputs if the command line uses more than one of the options
|
||||
-v, --trace and --trace-ascii, since it could really confuse the user.
|
||||
Clarified this fact in the man page.
|
||||
|
||||
Daniel (21 February 2007)
|
||||
- Ravi Pratap provided work on libcurl making pipelining more robust and
|
||||
fixing some bugs:
|
||||
o Don't mix GET and POST requests in a pipeline
|
||||
o Fix the order in which requests are dispatched from the pipeline
|
||||
o Fixed several curl bugs with pipelining when the server is returning
|
||||
chunked encoding:
|
||||
* Added states to chunked parsing for final CRLF
|
||||
* Rewind buffer after parsing chunk with data remaining
|
||||
* Moved chunked header initializing to a spot just before receiving
|
||||
headers
|
||||
|
||||
Daniel (20 February 2007)
|
||||
- Linus Nielsen Feltzing changed the CURLOPT_FTP_SSL_CCC option to handle
|
||||
active and passive CCC shutdown and added the --ftp-ssl-ccc-mode command
|
||||
line option.
|
||||
|
||||
Daniel (19 February 2007)
|
||||
- Ian Turner fixed the libcurl.m4 macro's support for --with-libcurl.
|
||||
|
||||
- Shmulik Regev found a memory leak in re-used HTTPS connections, at least
|
||||
when the multi interface was used.
|
||||
|
||||
- Robson Braga Araujo made passive FTP transfers work with SOCKS (both 4 and
|
||||
5).
|
||||
|
||||
Daniel (18 February 2007)
|
||||
- Jeff Pohlmeyer identified two problems: first a rather obscure problem with
|
||||
the multi interface and connection re-use that could make a
|
||||
curl_multi_remove_handle() ruin a pointer in another handle.
|
||||
|
||||
The second problem was less of an actual problem but more of minor quirk:
|
||||
the re-using of connections wasn't properly checking if the connection was
|
||||
marked for closure.
|
||||
|
||||
Daniel (16 February 2007)
|
||||
- Duncan Mac-Vicar Prett and Michal Marek reported problems with resetting
|
||||
CURLOPT_RANGE back to no range on an easy handle when using FTP.
|
||||
|
||||
Dan F (14 February 2007)
|
||||
- Fixed curl-config --libs so it doesn't list unnecessary libraries (and
|
||||
therefore introduce unnecessary dependencies) when it's not needed.
|
||||
Also, don't bother adding a library path of /usr/lib
|
||||
|
||||
Daniel (13 February 2007)
|
||||
- The default password for anonymous FTP connections is now changed to be
|
||||
"ftp@example.com".
|
||||
|
||||
- Robert A. Monat made libcurl build fine with VC2005 - it doesn't have
|
||||
gmtime_r() like the older VC versions. He also made use of some machine-
|
||||
specific defines to differentiate the "OS" define.
|
||||
|
||||
Daniel (12 February 2007)
|
||||
- Rob Crittenden added support for NSS (Network Security Service) for the
|
||||
SSL/TLS layer. http://www.mozilla.org/projects/security/pki/nss/
|
||||
|
||||
This is the fourth supported library for TLS/SSL that libcurl supports!
|
||||
|
||||
- Shmulik Regev fixed so that the final CRLF of HTTP response headers are sent
|
||||
to the debug callback.
|
||||
|
||||
- Shmulik Regev added CURLOPT_HTTP_CONTENT_DECODING and
|
||||
CURLOPT_HTTP_TRANSFER_DECODING that if set to zero will disable libcurl's
|
||||
internal decoding of content or transfer encoded content. This may be
|
||||
preferable in cases where you use libcurl for proxy purposes or similar. The
|
||||
command line tool got a --raw option to disable both at once.
|
||||
|
||||
- release tarballs made with maketgz will from now on have a LIBCURL_TIMESTAMP
|
||||
define set to hold the exact date and time of when the tarball was built, as
|
||||
a human readable string using the UTC time zone.
|
||||
|
||||
- Jeff Pohlmeyer fixed a flaw in curl_multi_add_handle() when adding a handle
|
||||
that has an easy handle present in the "closure" list pending closure.
|
||||
|
||||
Daniel (6 February 2007)
|
||||
- Regular file downloads wiht SFTP and SCP are now done using the non-blocking
|
||||
API of libssh2, if the libssh2 headers seem to support them. This will make
|
||||
SCP and SFTP much more responsive and better libcurl citizens when used with
|
||||
the multi interface etc.
|
||||
|
||||
Daniel (5 February 2007)
|
||||
- Michael Wallner added support for CURLOPT_TIMEOUT_MS and
|
||||
CURLOPT_CONNECTTIMEOUT_MS that, as their names suggest, do the timeouts with
|
||||
millisecond resolution. The only restriction to that is the alarm()
|
||||
(sometimes) used to abort name resolves as that uses full seconds. I fixed
|
||||
the FTP response timeout part of the patch.
|
||||
|
||||
Internally we now count and keep the timeouts in milliseconds but it also
|
||||
means we multiply set timeouts with 1000. The effect of this is that no
|
||||
timeout can be set to more than 2^31 milliseconds (on 32 bit systems), which
|
||||
equals 24.86 days. We probably couldn't before either since the code did
|
||||
*1000 on the timeout values on several places already.
|
||||
|
||||
Daniel (3 February 2007)
|
||||
- Yang Tse fixed the cookie expiry date in several test cases that started to
|
||||
fail since they used "1 feb 2007"...
|
||||
|
||||
- Manfred Schwarb reported that socks5 support was broken and help us pinpoint
|
||||
the problem. The code now tries harder to use httproxy and proxy where
|
||||
apppropriate, as not all proxies are HTTP...
|
||||
|
||||
Version 7.16.1 (29 January 2007)
|
||||
|
||||
Daniel (29 January 2007)
|
||||
|
@@ -21,6 +21,8 @@
|
||||
# $Id$
|
||||
###########################################################################
|
||||
|
||||
VC=vc6
|
||||
|
||||
all:
|
||||
./configure
|
||||
make
|
||||
@@ -87,106 +89,106 @@ mingw32-clean:
|
||||
|
||||
vc-clean:
|
||||
cd lib
|
||||
nmake -f Makefile.vc6 clean
|
||||
nmake -f Makefile.$(VC) clean
|
||||
cd ..\src
|
||||
nmake -f Makefile.vc6 clean
|
||||
nmake -f Makefile.$(VC) clean
|
||||
|
||||
vc-all:
|
||||
cd lib
|
||||
nmake -f Makefile.vc6 cfg=release
|
||||
nmake -f Makefile.vc6 cfg=release-ssl
|
||||
nmake -f Makefile.vc6 cfg=release-zlib
|
||||
nmake -f Makefile.vc6 cfg=release-ssl-zlib
|
||||
nmake -f Makefile.vc6 cfg=release-ssl-dll
|
||||
nmake -f Makefile.vc6 cfg=release-zlib-dll
|
||||
nmake -f Makefile.vc6 cfg=release-ssl-dll-zlib-dll
|
||||
nmake -f Makefile.vc6 cfg=release-dll
|
||||
nmake -f Makefile.vc6 cfg=release-dll-ssl-dll
|
||||
nmake -f Makefile.vc6 cfg=release-dll-zlib-dll
|
||||
nmake -f Makefile.vc6 cfg=release-dll-ssl-dll-zlib-dll
|
||||
nmake -f Makefile.vc6 cfg=debug
|
||||
nmake -f Makefile.vc6 cfg=debug-ssl
|
||||
nmake -f Makefile.vc6 cfg=debug-zlib
|
||||
nmake -f Makefile.vc6 cfg=debug-ssl-zlib
|
||||
nmake -f Makefile.vc6 cfg=debug-ssl-dll
|
||||
nmake -f Makefile.vc6 cfg=debug-zlib-dll
|
||||
nmake -f Makefile.vc6 cfg=debug-ssl-dll-zlib-dll
|
||||
nmake -f Makefile.vc6 cfg=debug-dll
|
||||
nmake -f Makefile.vc6 cfg=debug-dll-ssl-dll
|
||||
nmake -f Makefile.vc6 cfg=debug-dll-zlib-dll
|
||||
nmake -f Makefile.vc6 cfg=debug-dll-ssl-dll-zlib-dll
|
||||
nmake -f Makefile.$(VC) cfg=release
|
||||
nmake -f Makefile.$(VC) cfg=release-ssl
|
||||
nmake -f Makefile.$(VC) cfg=release-zlib
|
||||
nmake -f Makefile.$(VC) cfg=release-ssl-zlib
|
||||
nmake -f Makefile.$(VC) cfg=release-ssl-dll
|
||||
nmake -f Makefile.$(VC) cfg=release-zlib-dll
|
||||
nmake -f Makefile.$(VC) cfg=release-ssl-dll-zlib-dll
|
||||
nmake -f Makefile.$(VC) cfg=release-dll
|
||||
nmake -f Makefile.$(VC) cfg=release-dll-ssl-dll
|
||||
nmake -f Makefile.$(VC) cfg=release-dll-zlib-dll
|
||||
nmake -f Makefile.$(VC) cfg=release-dll-ssl-dll-zlib-dll
|
||||
nmake -f Makefile.$(VC) cfg=debug
|
||||
nmake -f Makefile.$(VC) cfg=debug-ssl
|
||||
nmake -f Makefile.$(VC) cfg=debug-zlib
|
||||
nmake -f Makefile.$(VC) cfg=debug-ssl-zlib
|
||||
nmake -f Makefile.$(VC) cfg=debug-ssl-dll
|
||||
nmake -f Makefile.$(VC) cfg=debug-zlib-dll
|
||||
nmake -f Makefile.$(VC) cfg=debug-ssl-dll-zlib-dll
|
||||
nmake -f Makefile.$(VC) cfg=debug-dll
|
||||
nmake -f Makefile.$(VC) cfg=debug-dll-ssl-dll
|
||||
nmake -f Makefile.$(VC) cfg=debug-dll-zlib-dll
|
||||
nmake -f Makefile.$(VC) cfg=debug-dll-ssl-dll-zlib-dll
|
||||
|
||||
vc:
|
||||
cd lib
|
||||
nmake /f Makefile.vc6 cfg=release
|
||||
nmake /f Makefile.$(VC) cfg=release
|
||||
cd ..\src
|
||||
nmake /f Makefile.vc6
|
||||
nmake /f Makefile.$(VC)
|
||||
|
||||
vc-zlib:
|
||||
cd lib
|
||||
nmake /f Makefile.vc6 cfg=release-zlib
|
||||
nmake /f Makefile.$(VC) cfg=release-zlib
|
||||
cd ..\src
|
||||
nmake /f Makefile.vc6 cfg=release-zlib
|
||||
nmake /f Makefile.$(VC) cfg=release-zlib
|
||||
|
||||
vc-ssl:
|
||||
cd lib
|
||||
nmake /f Makefile.vc6 cfg=release-ssl
|
||||
nmake /f Makefile.$(VC) cfg=release-ssl
|
||||
cd ..\src
|
||||
nmake /f Makefile.vc6 cfg=release-ssl
|
||||
nmake /f Makefile.$(VC) cfg=release-ssl
|
||||
|
||||
vc-ssl-zlib:
|
||||
cd lib
|
||||
nmake /f Makefile.vc6 cfg=release-ssl-zlib
|
||||
nmake /f Makefile.$(VC) cfg=release-ssl-zlib
|
||||
cd ..\src
|
||||
nmake /f Makefile.vc6 cfg=release-ssl-zlib
|
||||
nmake /f Makefile.$(VC) cfg=release-ssl-zlib
|
||||
|
||||
vc-ssl-dll:
|
||||
cd lib
|
||||
nmake /f Makefile.vc6 cfg=release-ssl-dll
|
||||
nmake /f Makefile.$(VC) cfg=release-ssl-dll
|
||||
cd ..\src
|
||||
nmake /f Makefile.vc6 cfg=release-ssl-dll
|
||||
nmake /f Makefile.$(VC) cfg=release-ssl-dll
|
||||
|
||||
vc-dll-ssl-dll:
|
||||
cd lib
|
||||
nmake /f Makefile.vc6 cfg=release-dll-ssl-dll
|
||||
nmake /f Makefile.$(VC) cfg=release-dll-ssl-dll
|
||||
cd ..\src
|
||||
nmake /f Makefile.vc6 cfg=release-dll-ssl-dll
|
||||
nmake /f Makefile.$(VC) cfg=release-dll-ssl-dll
|
||||
|
||||
vc-dll:
|
||||
cd lib
|
||||
nmake /f Makefile.vc6 cfg=release-dll
|
||||
nmake /f Makefile.$(VC) cfg=release-dll
|
||||
cd ..\src
|
||||
nmake /f Makefile.vc6 cfg=release-dll
|
||||
nmake /f Makefile.$(VC) cfg=release-dll
|
||||
|
||||
vc-dll-zlib-dll:
|
||||
cd lib
|
||||
nmake /f Makefile.vc6 cfg=release-dll-zlib-dll
|
||||
nmake /f Makefile.$(VC) cfg=release-dll-zlib-dll
|
||||
cd ..\src
|
||||
nmake /f Makefile.vc6 cfg=release-dll-zlib-dll
|
||||
nmake /f Makefile.$(VC) cfg=release-dll-zlib-dll
|
||||
|
||||
vc-dll-ssl-dll-zlib-dll:
|
||||
cd lib
|
||||
nmake /f Makefile.vc6 cfg=release-dll-ssl-dll-zlib-dll
|
||||
nmake /f Makefile.$(VC) cfg=release-dll-ssl-dll-zlib-dll
|
||||
cd ..\src
|
||||
nmake /f Makefile.vc6 cfg=release-dll-ssl-dll-zlib-dll
|
||||
nmake /f Makefile.$(VC) cfg=release-dll-ssl-dll-zlib-dll
|
||||
|
||||
vc-ssl-dll-zlib-dll:
|
||||
cd lib
|
||||
nmake /f Makefile.vc6 cfg=release-ssl-dll-zlib-dll
|
||||
nmake /f Makefile.$(VC) cfg=release-ssl-dll-zlib-dll
|
||||
cd ..\src
|
||||
nmake /f Makefile.vc6 cfg=release-ssl-dll-zlib-dll
|
||||
nmake /f Makefile.$(VC) cfg=release-ssl-dll-zlib-dll
|
||||
|
||||
vc-zlib-dll:
|
||||
cd lib
|
||||
nmake /f Makefile.vc6 cfg=release-zlib-dll
|
||||
nmake /f Makefile.$(VC) cfg=release-zlib-dll
|
||||
cd ..\src
|
||||
nmake /f Makefile.vc6 cfg=release-zlib-dll
|
||||
nmake /f Makefile.$(VC) cfg=release-zlib-dll
|
||||
|
||||
vc-sspi:
|
||||
cd lib
|
||||
nmake /f Makefile.vc6 cfg=release WINDOWS_SSPI=1
|
||||
nmake /f Makefile.$(VC) cfg=release WINDOWS_SSPI=1
|
||||
cd ..\src
|
||||
nmake /f Makefile.vc6 cfg=release WINDOWS_SSPI=1
|
||||
nmake /f Makefile.$(VC) cfg=release WINDOWS_SSPI=1
|
||||
|
||||
djgpp:
|
||||
$(MAKE) -C lib -f Makefile.dj
|
||||
|
112
RELEASE-NOTES
112
RELEASE-NOTES
@@ -1,61 +1,56 @@
|
||||
Curl and libcurl 7.16.1
|
||||
Curl and libcurl 7.16.2
|
||||
|
||||
Public curl release number: 97
|
||||
Releases counted from the very beginning: 124
|
||||
Available command line options: 115
|
||||
Available curl_easy_setopt() options: 137
|
||||
Public curl release number: 98
|
||||
Releases counted from the very beginning: 125
|
||||
Available command line options: 118
|
||||
Available curl_easy_setopt() options: 141
|
||||
Number of public functions in libcurl: 54
|
||||
Amount of public web site mirrors: 39
|
||||
Amount of public web site mirrors: 38
|
||||
Number of known libcurl bindings: 35
|
||||
Number of contributors: 539
|
||||
|
||||
This release includes the following changes:
|
||||
|
||||
o Support for SCP and SFTP were added (powered by libssh2)
|
||||
o CURLOPT_CLOSEPOLICY is now deprecated
|
||||
o --ftp-ssl-ccc and CURLOPT_FTP_SSL_CCC were added
|
||||
o HTTP support for non-ASCII platforms
|
||||
o --libcurl was added
|
||||
o added CURLOPT_TIMEOUT_MS and CURLOPT_CONNECTTIMEOUT_MS
|
||||
o added CURLOPT_HTTP_CONTENT_DECODING, CURLOPT_HTTP_TRANSFER_DECODING and
|
||||
--raw
|
||||
o added support for using the NSS library for TLS/SSL
|
||||
o changed default anonymous FTP password
|
||||
o changed the CURLOPT_FTP_SSL_CCC option to handle active and passive
|
||||
CCC shutdown
|
||||
o added the --ftp-ssl-ccc-mode command line option
|
||||
o includes VC8 Makefiles in the release archive
|
||||
o --ftp-ssl-control is now honoured on ftps:// URLs
|
||||
o added experimental CURL_ACKNOWLEDGE_EINTR symbol definition check
|
||||
o --key and new --pubkey options for SSH public key file logins
|
||||
o --pass now works for a SSH public key file, too
|
||||
o select (2) support no longer needed to build the library if poll() used
|
||||
o CURLOPT_POSTQUOTE works for SFTP
|
||||
|
||||
This release includes the following bugfixes:
|
||||
|
||||
o proxy close during CONNECT authentication is now dealt with nicely
|
||||
o the CURLOPT_DEBUGFUNCTION was sometimes called even when CURLOPT_VERBOSE
|
||||
was not enabled
|
||||
o multiple TFTP transfers on the same (easy or multi) handle could cause a
|
||||
crash
|
||||
o SIGSEGV when disconnecting on a transfer on a re-used handle when the
|
||||
host name didn't resolve
|
||||
o stack overwrite on 64bit Windows in the chunked decoding department
|
||||
o HTTP responses on persistent connections without Content-Length nor chunked
|
||||
encoding are now considered to be without response body
|
||||
o Content-Range: header parsing improved
|
||||
o CPU 100% load when HTTP upload connection broke
|
||||
o active FTP didn't work with multi interface
|
||||
o curl_getdate() could be off one hour for TZ time zones with DST, on windows
|
||||
o CURLOPT_FORBID_REUSE works again
|
||||
o CURLOPT_MAXCONNECTS set to zero caused libcurl to SIGSEGV
|
||||
o rate limiting works better
|
||||
o getting FTP response code errors when using the multi-interface caused
|
||||
libcurl to leak memory
|
||||
o no more SIGPIPE when GnuTLS is used
|
||||
o FTP downloading 2 zero byte files in a row
|
||||
o using proxy and URLs without protocol prefixes
|
||||
o first using a proxy and then accessing a site that 'no_proxy' matched,
|
||||
would still make libcurl use the proxy...
|
||||
o curl_easy_duphandle() now makes a handle that is valid for the multi
|
||||
interface since the magic number is set fine
|
||||
o libcurl.pc now uses Libs.private for "private" libs
|
||||
o --limit-rate (CURLOPT_MAX_SEND_SPEED_LARGE and CURLOPT_MAX_RECV_SPEED_LARGE)
|
||||
now work on windows again
|
||||
o improved download performance by avoiding the unconditional "double copying"
|
||||
o base64 encoding/decoding works on non-ASCII platforms
|
||||
o large file downloads
|
||||
o CURLOPT_COOKIELIST set to "ALL" crash
|
||||
o easy handle removal from multi handle before completion
|
||||
o TFTP upload memory leak
|
||||
o curl_easy_reset() now resets the CA bundle path correctly
|
||||
o two User-Agent headers in CONNECT requests with custom User-Agent
|
||||
o in testsuite, update test cookies expiration from 2007-Feb-1 to year 2035
|
||||
o socks5 works
|
||||
o builds fine with VC2005
|
||||
o CURLOPT_RANGE set to NULL resets the range for FTP
|
||||
o curl_multi_remove_handle() rare crash
|
||||
o passive FTP transfers work with SOCKS
|
||||
o multi interface HTTPS connection re-use memory leak
|
||||
o libcurl.m4's --with-libcurl is improved
|
||||
o curl-config --libs and libcurl.pc no longer list unnecessary dependencies
|
||||
o fixed an issue with CCC not working on some servers
|
||||
o several HTTP pipelining problems
|
||||
o HTTP CONNECT thru a proxy is now less blocking when the multi interface is
|
||||
used
|
||||
o HTTP Digest header parsing fix for unquoted last word ending with CRLF
|
||||
o CURLOPT_PORT, HTTP proxy, re-using connections and non-HTTP protocols
|
||||
o CURLOPT_INTERFACE for ipv6
|
||||
o use-after-free issue with HTTP transfers with the multi interface
|
||||
o the progress callback can get called more frequently
|
||||
o timeout would restart when signal caught while awaiting socket events
|
||||
o curl -f with user+password embedded in the URL
|
||||
o 26 flaws identified by coverity.com
|
||||
o builds on QNX 6 again
|
||||
|
||||
This release includes the following known bugs:
|
||||
|
||||
@@ -63,24 +58,21 @@ This release includes the following known bugs:
|
||||
|
||||
Other curl-related news:
|
||||
|
||||
o TclCurl 7.16.0 was released:
|
||||
http://personal1.iddeo.es/andresgarci/tclcurl/english/
|
||||
o Curb - Libcurl bindings for Ruby: http://curb.rubyforge.org/
|
||||
o pycurl 7.16.1 was released: http://pycurl.sf.net/
|
||||
|
||||
New curl mirrors:
|
||||
|
||||
o curl.miroir-francais.fr is a new French web mirror
|
||||
o curl.dsmirror.nl is a new Dutch web mirror
|
||||
o http://curl.basemirror.de is a new mirror in Germany
|
||||
o http://curl.xxtracker.org is a new mirror in The Netherlands
|
||||
|
||||
This release would not have looked like this without help, code, reports and
|
||||
advice from friends like these:
|
||||
|
||||
James Housley, Olaf Stueben, Yang Tse, Gisle Vanem, Bradford Bruce,
|
||||
Ciprian Badescu, Dmitriy Sergeyev, Nir Soffer, Venkat Akella, Toon Verwaest,
|
||||
Matt Witherspoon, Alexey Simak, Martin Skinner, Sh Diao, Jared Lundell,
|
||||
Stefan Krause, Sebastien Willemijns, Alexey Simak, Brendan Jurd,
|
||||
Robson Braga Araujo, David McCreedy, Robert Foreman, Nathanael Nerode,
|
||||
Victor Snezhko, Linus Nielsen Feltzing, Toby Peterson, Dan Fandrich,
|
||||
Armel Asselin, Michael Wallner, Guenter Knauf
|
||||
Yang Tse, Manfred Schwarb, Michael Wallner, Jeff Pohlmeyer, Shmulik Regev,
|
||||
Rob Crittenden, Robert A. Monat, Dan Fandrich, Duncan Mac-Vicar Prett,
|
||||
Michal Marek, Robson Braga Araujo, Ian Turner, Linus Nielsen Feltzing,
|
||||
Ravi Pratap, Adam D. Moss, Jose Kahan, Hang Kin Lau, Justin Fletcher,
|
||||
Robert Iakobashvili, Bryan Henderson, Eygene Ryabinkin, Daniel Johnson,
|
||||
Matt Kraai, Nick Zitzmann, Rob Jones
|
||||
|
||||
Thanks! (and sorry if I forgot to mention someone)
|
||||
|
@@ -1,4 +1,5 @@
|
||||
To get fixed in 7.16.1 (planned release: January 2007)
|
||||
======================
|
||||
To be addressed before 7.16.3 (planned release: June 2007)
|
||||
=============================
|
||||
|
||||
93 -
|
||||
|
||||
82 -
|
||||
|
113
acinclude.m4
113
acinclude.m4
@@ -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
|
||||
@@ -685,7 +685,7 @@ AC_DEFUN([CURL_CHECK_FUNC_RECV], [
|
||||
])
|
||||
#
|
||||
if test "$curl_cv_recv" = "yes"; then
|
||||
AC_CACHE_CHECK([types of arguments and return type for recv],
|
||||
AC_CACHE_CHECK([types of args and return type for recv],
|
||||
[curl_cv_func_recv_args], [
|
||||
curl_cv_func_recv_args="unknown"
|
||||
for recv_retv in 'int' 'ssize_t'; do
|
||||
@@ -815,7 +815,7 @@ AC_DEFUN([CURL_CHECK_FUNC_SEND], [
|
||||
])
|
||||
#
|
||||
if test "$curl_cv_send" = "yes"; then
|
||||
AC_CACHE_CHECK([types of arguments and return type for send],
|
||||
AC_CACHE_CHECK([types of args and return type for send],
|
||||
[curl_cv_func_send_args], [
|
||||
curl_cv_func_send_args="unknown"
|
||||
for send_retv in 'int' 'ssize_t'; do
|
||||
@@ -1851,7 +1851,8 @@ AC_DEFUN([CURL_DLLIB_NAME],
|
||||
AC_MSG_CHECKING([name of dynamic library $2])
|
||||
dnl The shared library extension variable name changes from version to
|
||||
dnl version of libtool. Try a few names then just set one statically.
|
||||
test -z "$shared_ext" && shared_ext="$shrext_cmds"
|
||||
test -z "$shared_ext" && eval shared_ext=\"$shrext_cmds\"
|
||||
test -z "$shared_ext" && shared_ext="$std_shrext"
|
||||
test -z "$shared_ext" && shared_ext="$shrext"
|
||||
test -z "$shared_ext" && shared_ext=".so"
|
||||
|
||||
@@ -1859,12 +1860,16 @@ dnl Create the library link name of the correct form for this platform
|
||||
LIBNAME_LINK_SPEC=`echo "$library_names_spec" | $SED 's/^.* //'`
|
||||
DLGUESSLIB=`name=$2 eval echo "$libname_spec"`
|
||||
DLGUESSFILE=`libname="$DLGUESSLIB" release="" major="" versuffix="" eval echo "$LIBNAME_LINK_SPEC"`
|
||||
dnl Last resort in case libtool knows nothing about shared libs on this platform
|
||||
test -z "$DLGUESSFILE" && DLGUESSFILE="$DLGUESSLIB$shared_ext"
|
||||
|
||||
dnl Synthesize a likely dynamic library name in case we can't find an actual one
|
||||
SO_NAME_SPEC="$soname_spec"
|
||||
dnl soname_spec undefined when identical to the 1st entry in library_names_spec
|
||||
test -z "$SO_NAME_SPEC" && SO_NAME_SPEC=`echo "$library_names_spec" | $SED 's/ .*$//'`
|
||||
DLGUESSSOFILE=`libname="$DLGUESSLIB" release="" major="" versuffix="" eval echo "$SO_NAME_SPEC"`
|
||||
dnl Last resort in case libtool knows nothing about shared libs on this platform
|
||||
test -z "$DLGUESSSOFILE" && DLGUESSSOFILE="$DLGUESSFILE"
|
||||
|
||||
if test "$cross_compiling" = yes; then
|
||||
dnl Can't look at filesystem when cross-compiling
|
||||
@@ -1949,3 +1954,103 @@ main()
|
||||
dnl if this test fails, configure has already stopped
|
||||
fi
|
||||
])
|
||||
|
||||
|
||||
dnl CURL_CHECK_VARIADIC_MACROS
|
||||
dnl -------------------------------------------------
|
||||
dnl Check compiler support of variadic macros
|
||||
|
||||
AC_DEFUN([CURL_CHECK_VARIADIC_MACROS], [
|
||||
AC_CACHE_CHECK([for compiler support of C99 variadic macro style],
|
||||
[curl_cv_variadic_macros_c99], [
|
||||
AC_COMPILE_IFELSE([
|
||||
AC_LANG_PROGRAM([
|
||||
#define c99_vmacro3(first, ...) fun3(first, __VA_ARGS__)
|
||||
#define c99_vmacro2(first, ...) fun2(first, __VA_ARGS__)
|
||||
int fun3(int arg1, int arg2, int arg3);
|
||||
int fun2(int arg1, int arg2);
|
||||
int fun3(int arg1, int arg2, int arg3)
|
||||
{ return arg1 + arg2 + arg3; }
|
||||
int fun2(int arg1, int arg2)
|
||||
{ return arg1 + arg2; }
|
||||
],[
|
||||
int res3 = c99_vmacro3(1, 2, 3);
|
||||
int res2 = c99_vmacro2(1, 2);
|
||||
])
|
||||
],[
|
||||
curl_cv_variadic_macros_c99="yes"
|
||||
],[
|
||||
curl_cv_variadic_macros_c99="no"
|
||||
])
|
||||
])
|
||||
case "$curl_cv_variadic_macros_c99" in
|
||||
yes)
|
||||
AC_DEFINE_UNQUOTED(HAVE_VARIADIC_MACROS_C99, 1,
|
||||
[Define to 1 if compiler supports C99 variadic macro style.])
|
||||
;;
|
||||
esac
|
||||
AC_CACHE_CHECK([for compiler support of old gcc variadic macro style],
|
||||
[curl_cv_variadic_macros_gcc], [
|
||||
AC_COMPILE_IFELSE([
|
||||
AC_LANG_PROGRAM([
|
||||
#define gcc_vmacro3(first, args...) fun3(first, args)
|
||||
#define gcc_vmacro2(first, args...) fun2(first, args)
|
||||
int fun3(int arg1, int arg2, int arg3);
|
||||
int fun2(int arg1, int arg2);
|
||||
int fun3(int arg1, int arg2, int arg3)
|
||||
{ return arg1 + arg2 + arg3; }
|
||||
int fun2(int arg1, int arg2)
|
||||
{ return arg1 + arg2; }
|
||||
],[
|
||||
int res3 = gcc_vmacro3(1, 2, 3);
|
||||
int res2 = gcc_vmacro2(1, 2);
|
||||
])
|
||||
],[
|
||||
curl_cv_variadic_macros_gcc="yes"
|
||||
],[
|
||||
curl_cv_variadic_macros_gcc="no"
|
||||
])
|
||||
])
|
||||
case "$curl_cv_variadic_macros_gcc" in
|
||||
yes)
|
||||
AC_DEFINE_UNQUOTED(HAVE_VARIADIC_MACROS_GCC, 1,
|
||||
[Define to 1 if compiler supports old gcc variadic macro style.])
|
||||
;;
|
||||
esac
|
||||
])
|
||||
|
||||
|
||||
dnl CURL_CHECK_NATIVE_WINDOWS
|
||||
dnl -------------------------------------------------
|
||||
dnl Check if building a native Windows target
|
||||
|
||||
AC_DEFUN([CURL_CHECK_NATIVE_WINDOWS], [
|
||||
AC_REQUIRE([CURL_CHECK_HEADER_WINDOWS])dnl
|
||||
AC_CACHE_CHECK([whether build target is a native Windows one], [ac_cv_native_windows], [
|
||||
if test "$ac_cv_header_windows_h" = "no"; then
|
||||
ac_cv_native_windows="no"
|
||||
else
|
||||
AC_COMPILE_IFELSE([
|
||||
AC_LANG_PROGRAM([
|
||||
],[
|
||||
#ifdef __MINGW32__
|
||||
int dummy=1;
|
||||
#else
|
||||
Not a native Windows build target.
|
||||
#endif
|
||||
])
|
||||
],[
|
||||
ac_cv_native_windows="yes"
|
||||
],[
|
||||
ac_cv_native_windows="no"
|
||||
])
|
||||
fi
|
||||
])
|
||||
case "$ac_cv_native_windows" in
|
||||
yes)
|
||||
AC_DEFINE_UNQUOTED(NATIVE_WINDOWS, 1,
|
||||
[Define to 1 if you are building a native Windows target.])
|
||||
;;
|
||||
esac
|
||||
])
|
||||
|
||||
|
10
ares/CHANGES
10
ares/CHANGES
@@ -1,5 +1,15 @@
|
||||
Changelog for the c-ares project
|
||||
|
||||
* February 19
|
||||
|
||||
- Vlad Dinulescu added ares_parse_ns_reply().
|
||||
|
||||
* February 13
|
||||
|
||||
- Yang Tse: Fix failure to get the search sequence of /etc/hosts and
|
||||
DNS from /etc/nsswitch.conf, /etc/host.conf or /etc/svc.conf when
|
||||
/etc/resolv.conf did not exist or was unable to read it.
|
||||
|
||||
* November 22
|
||||
|
||||
- Install ares_dns.h too
|
||||
|
147
ares/Makefile.dj
147
ares/Makefile.dj
@@ -4,6 +4,8 @@
|
||||
#
|
||||
# $Id$
|
||||
|
||||
TOPDIR = ..
|
||||
|
||||
include ../packages/DOS/common.dj
|
||||
|
||||
include Makefile.inc
|
||||
@@ -11,19 +13,23 @@ include Makefile.inc
|
||||
CFLAGS += -DWATT32 -DHAVE_AF_INET6 -DHAVE_PF_INET6 -DHAVE_FIONBIO \
|
||||
-DHAVE_STRUCT_IN6_ADDR -DHAVE_SOCKADDR_IN6_SIN6_SCOPE_ID \
|
||||
-DHAVE_SYS_TIME_H -DHAVE_STRUCT_SOCKADDR_IN6 -DHAVE_STRUCT_ADDRINFO \
|
||||
-DHAVE_SIGNAL_H -DHAVE_SIG_ATOMIC_T -DRETSIGTYPE='void' \
|
||||
-DHAVE_SIGNAL_H -DHAVE_SIG_ATOMIC_T -DRETSIGTYPE='void' -DHAVE_PROCESS_H \
|
||||
-DHAVE_ARPA_NAMESER_H -DNS_INADDRSZ=4 -DHAVE_RECV -DHAVE_SEND \
|
||||
-DSEND_TYPE_ARG1='int' -DSEND_QUAL_ARG2='const' \
|
||||
-DSEND_TYPE_ARG2='void*' -DSEND_TYPE_ARG3='int' \
|
||||
-DSEND_TYPE_ARG4='int' -DSEND_TYPE_RETV='int' \
|
||||
-DRECV_TYPE_ARG1='int' -DRECV_TYPE_ARG2='void*' \
|
||||
-DRECV_TYPE_ARG3='int' -DRECV_TYPE_ARG4='int' \
|
||||
-DRECV_TYPE_RETV='int' -UHAVE_CONFIG_H -Dselect=select_s
|
||||
-DRECV_TYPE_RETV='int' -DHAVE_STRUCT_TIMEVAL \
|
||||
-UHAVE_CONFIG_H
|
||||
|
||||
LDFLAGS = -s
|
||||
|
||||
ifeq ($(USE_DEBUG),1)
|
||||
EX_LIBS = ../lib/libcurl.a
|
||||
EX_LIBS = ../lib/libcurl.a
|
||||
OBJ_HACK = $(OBJECTS)
|
||||
else
|
||||
OBJ_HACK = libcares.a
|
||||
endif
|
||||
|
||||
ifeq ($(USE_SSL),1)
|
||||
@@ -49,10 +55,10 @@ all: $(OBJ_DIR) libcares.a ahost.exe adig.exe
|
||||
libcares.a: $(OBJECTS)
|
||||
ar rs $@ $?
|
||||
|
||||
ahost.exe: ahost.c libcares.a
|
||||
ahost.exe: ahost.c $(OBJ_HACK)
|
||||
$(CC) $(LDFLAGS) $(CFLAGS) -o $@ $^ $(EX_LIBS)
|
||||
|
||||
adig.exe: adig.c libcares.a
|
||||
adig.exe: adig.c $(OBJ_HACK)
|
||||
$(CC) $(LDFLAGS) $(CFLAGS) -o $@ $^ $(EX_LIBS)
|
||||
|
||||
clean:
|
||||
@@ -62,132 +68,5 @@ vclean realclean: clean
|
||||
rm -f ahost.exe adig.exe depend.dj
|
||||
- rmdir $(OBJ_DIR)
|
||||
|
||||
# DO NOT DELETE THIS LINE
|
||||
$(OBJ_DIR)/ares_fds.o: ares_fds.c setup.h setup_once.h ares.h ares_private.h \
|
||||
ares_ipv6.h ../lib/memdebug.h ../lib/setup.h \
|
||||
../include/curl/stdcheaders.h ../include/curl/curl.h \
|
||||
../include/curl/curlver.h ../include/curl/easy.h \
|
||||
../include/curl/multi.h ../include/curl/curl.h
|
||||
$(OBJ_DIR)/ares_getsock.o: ares_getsock.c setup.h setup_once.h ares.h ares_private.h \
|
||||
ares_ipv6.h ../lib/memdebug.h ../lib/setup.h \
|
||||
../include/curl/stdcheaders.h ../include/curl/curl.h \
|
||||
../include/curl/curlver.h ../include/curl/easy.h \
|
||||
../include/curl/multi.h ../include/curl/curl.h
|
||||
$(OBJ_DIR)/ares_process.o: ares_process.c setup.h setup_once.h ares.h ares_dns.h \
|
||||
ares_private.h ares_ipv6.h ../lib/memdebug.h ../lib/setup.h \
|
||||
../include/curl/stdcheaders.h ../include/curl/curl.h \
|
||||
../include/curl/curlver.h ../include/curl/easy.h \
|
||||
../include/curl/multi.h ../include/curl/curl.h
|
||||
$(OBJ_DIR)/ares_free_hostent.o: ares_free_hostent.c setup.h setup_once.h ares.h \
|
||||
ares_private.h ares_ipv6.h ../lib/memdebug.h ../lib/setup.h \
|
||||
../include/curl/stdcheaders.h ../include/curl/curl.h \
|
||||
../include/curl/curlver.h ../include/curl/easy.h \
|
||||
../include/curl/multi.h ../include/curl/curl.h
|
||||
$(OBJ_DIR)/ares_query.o: ares_query.c setup.h setup_once.h ares.h ares_dns.h \
|
||||
ares_private.h ares_ipv6.h ../lib/memdebug.h ../lib/setup.h \
|
||||
../include/curl/stdcheaders.h ../include/curl/curl.h \
|
||||
../include/curl/curlver.h ../include/curl/easy.h \
|
||||
../include/curl/multi.h ../include/curl/curl.h
|
||||
$(OBJ_DIR)/ares__close_sockets.o: ares__close_sockets.c setup.h setup_once.h ares.h \
|
||||
ares_private.h ares_ipv6.h ../lib/memdebug.h ../lib/setup.h \
|
||||
../include/curl/stdcheaders.h ../include/curl/curl.h \
|
||||
../include/curl/curlver.h ../include/curl/easy.h \
|
||||
../include/curl/multi.h ../include/curl/curl.h
|
||||
$(OBJ_DIR)/ares_free_string.o: ares_free_string.c setup.h setup_once.h ares.h \
|
||||
ares_private.h ares_ipv6.h ../lib/memdebug.h ../lib/setup.h \
|
||||
../include/curl/stdcheaders.h ../include/curl/curl.h \
|
||||
../include/curl/curlver.h ../include/curl/easy.h \
|
||||
../include/curl/multi.h ../include/curl/curl.h
|
||||
$(OBJ_DIR)/ares_search.o: ares_search.c setup.h setup_once.h ares.h ares_private.h \
|
||||
ares_ipv6.h ../lib/memdebug.h ../lib/setup.h \
|
||||
../include/curl/stdcheaders.h ../include/curl/curl.h \
|
||||
../include/curl/curlver.h ../include/curl/easy.h \
|
||||
../include/curl/multi.h ../include/curl/curl.h
|
||||
$(OBJ_DIR)/ares__get_hostent.o: ares__get_hostent.c setup.h setup_once.h ares.h \
|
||||
ares_private.h ares_ipv6.h ../lib/memdebug.h ../lib/setup.h \
|
||||
../include/curl/stdcheaders.h ../include/curl/curl.h \
|
||||
../include/curl/curlver.h ../include/curl/easy.h \
|
||||
../include/curl/multi.h ../include/curl/curl.h inet_net_pton.h
|
||||
$(OBJ_DIR)/ares_gethostbyaddr.o: ares_gethostbyaddr.c setup.h setup_once.h ares.h \
|
||||
ares_private.h ares_ipv6.h ../lib/memdebug.h ../lib/setup.h \
|
||||
../include/curl/stdcheaders.h ../include/curl/curl.h \
|
||||
../include/curl/curlver.h ../include/curl/easy.h \
|
||||
../include/curl/multi.h ../include/curl/curl.h inet_net_pton.h
|
||||
$(OBJ_DIR)/ares_send.o: ares_send.c setup.h setup_once.h ares.h ares_dns.h \
|
||||
ares_private.h ares_ipv6.h ../lib/memdebug.h ../lib/setup.h \
|
||||
../include/curl/stdcheaders.h ../include/curl/curl.h \
|
||||
../include/curl/curlver.h ../include/curl/easy.h \
|
||||
../include/curl/multi.h ../include/curl/curl.h
|
||||
$(OBJ_DIR)/ares__read_line.o: ares__read_line.c setup.h setup_once.h ares.h \
|
||||
ares_private.h ares_ipv6.h ../lib/memdebug.h ../lib/setup.h \
|
||||
../include/curl/stdcheaders.h ../include/curl/curl.h \
|
||||
../include/curl/curlver.h ../include/curl/easy.h \
|
||||
../include/curl/multi.h ../include/curl/curl.h
|
||||
$(OBJ_DIR)/ares_gethostbyname.o: ares_gethostbyname.c setup.h setup_once.h ares.h \
|
||||
ares_private.h ares_ipv6.h ../lib/memdebug.h ../lib/setup.h \
|
||||
../include/curl/stdcheaders.h ../include/curl/curl.h \
|
||||
../include/curl/curlver.h ../include/curl/easy.h \
|
||||
../include/curl/multi.h ../include/curl/curl.h inet_net_pton.h \
|
||||
bitncmp.h
|
||||
$(OBJ_DIR)/ares_strerror.o: ares_strerror.c setup.h setup_once.h ares.h
|
||||
$(OBJ_DIR)/ares_cancel.o: ares_cancel.c setup.h setup_once.h ares.h ares_private.h \
|
||||
ares_ipv6.h ../lib/memdebug.h ../lib/setup.h \
|
||||
../include/curl/stdcheaders.h ../include/curl/curl.h \
|
||||
../include/curl/curlver.h ../include/curl/easy.h \
|
||||
../include/curl/multi.h ../include/curl/curl.h
|
||||
$(OBJ_DIR)/ares_init.o: ares_init.c setup.h setup_once.h ares.h ares_private.h \
|
||||
ares_ipv6.h ../lib/memdebug.h ../lib/setup.h \
|
||||
../include/curl/stdcheaders.h ../include/curl/curl.h \
|
||||
../include/curl/curlver.h ../include/curl/easy.h \
|
||||
../include/curl/multi.h ../include/curl/curl.h inet_net_pton.h
|
||||
$(OBJ_DIR)/ares_timeout.o: ares_timeout.c setup.h setup_once.h ares.h ares_private.h \
|
||||
ares_ipv6.h ../lib/memdebug.h ../lib/setup.h \
|
||||
../include/curl/stdcheaders.h ../include/curl/curl.h \
|
||||
../include/curl/curlver.h ../include/curl/easy.h \
|
||||
../include/curl/multi.h ../include/curl/curl.h
|
||||
$(OBJ_DIR)/ares_destroy.o: ares_destroy.c setup.h setup_once.h ares.h ares_private.h \
|
||||
ares_ipv6.h ../lib/memdebug.h ../lib/setup.h \
|
||||
../include/curl/stdcheaders.h ../include/curl/curl.h \
|
||||
../include/curl/curlver.h ../include/curl/easy.h \
|
||||
../include/curl/multi.h ../include/curl/curl.h
|
||||
$(OBJ_DIR)/ares_mkquery.o: ares_mkquery.c setup.h setup_once.h ares.h ares_dns.h \
|
||||
ares_private.h ares_ipv6.h ../lib/memdebug.h ../lib/setup.h \
|
||||
../include/curl/stdcheaders.h ../include/curl/curl.h \
|
||||
../include/curl/curlver.h ../include/curl/easy.h \
|
||||
../include/curl/multi.h ../include/curl/curl.h
|
||||
$(OBJ_DIR)/ares_version.o: ares_version.c setup.h setup_once.h ares_version.h
|
||||
$(OBJ_DIR)/ares_expand_name.o: ares_expand_name.c setup.h setup_once.h ares.h \
|
||||
ares_private.h ares_ipv6.h ../lib/memdebug.h ../lib/setup.h \
|
||||
../include/curl/stdcheaders.h ../include/curl/curl.h \
|
||||
../include/curl/curlver.h ../include/curl/easy.h \
|
||||
../include/curl/multi.h ../include/curl/curl.h
|
||||
$(OBJ_DIR)/ares_parse_a_reply.o: ares_parse_a_reply.c setup.h setup_once.h ares.h \
|
||||
ares_dns.h ares_private.h ares_ipv6.h ../lib/memdebug.h ../lib/setup.h \
|
||||
../include/curl/stdcheaders.h ../include/curl/curl.h \
|
||||
../include/curl/curlver.h ../include/curl/easy.h \
|
||||
../include/curl/multi.h ../include/curl/curl.h
|
||||
$(OBJ_DIR)/windows_port.o: windows_port.c setup.h setup_once.h
|
||||
$(OBJ_DIR)/ares_expand_string.o: ares_expand_string.c setup.h setup_once.h ares.h \
|
||||
ares_private.h ares_ipv6.h ../lib/memdebug.h ../lib/setup.h \
|
||||
../include/curl/stdcheaders.h ../include/curl/curl.h \
|
||||
../include/curl/curlver.h ../include/curl/easy.h \
|
||||
../include/curl/multi.h ../include/curl/curl.h
|
||||
$(OBJ_DIR)/ares_parse_ptr_reply.o: ares_parse_ptr_reply.c setup.h setup_once.h \
|
||||
ares.h ares_dns.h ares_private.h ares_ipv6.h ../lib/memdebug.h \
|
||||
../lib/setup.h ../include/curl/stdcheaders.h ../include/curl/curl.h \
|
||||
../include/curl/curlver.h ../include/curl/easy.h \
|
||||
../include/curl/multi.h ../include/curl/curl.h
|
||||
$(OBJ_DIR)/ares_parse_aaaa_reply.o: ares_parse_aaaa_reply.c setup.h setup_once.h \
|
||||
ares.h ares_dns.h inet_net_pton.h ares_private.h ares_ipv6.h \
|
||||
../lib/memdebug.h ../lib/setup.h ../include/curl/stdcheaders.h \
|
||||
../include/curl/curl.h ../include/curl/curlver.h ../include/curl/easy.h \
|
||||
../include/curl/multi.h ../include/curl/curl.h
|
||||
$(OBJ_DIR)/ares_getnameinfo.o: ares_getnameinfo.c setup.h setup_once.h ares.h \
|
||||
ares_private.h ares_ipv6.h ../lib/memdebug.h ../lib/setup.h \
|
||||
../include/curl/stdcheaders.h ../include/curl/curl.h \
|
||||
../include/curl/curlver.h ../include/curl/easy.h \
|
||||
../include/curl/multi.h ../include/curl/curl.h inet_ntop.h
|
||||
$(OBJ_DIR)/inet_net_pton.o: inet_net_pton.c setup.h setup_once.h ares_ipv6.h \
|
||||
inet_net_pton.h
|
||||
$(OBJ_DIR)/bitncmp.o: bitncmp.c bitncmp.h
|
||||
$(OBJ_DIR)/inet_ntop.o: inet_ntop.c setup.h setup_once.h ares_ipv6.h inet_ntop.h
|
||||
-include depend.dj
|
||||
|
||||
|
@@ -5,17 +5,18 @@ ares_gethostbyname.c ares_strerror.c ares_cancel.c ares_init.c \
|
||||
ares_timeout.c ares_destroy.c ares_mkquery.c ares_version.c \
|
||||
ares_expand_name.c ares_parse_a_reply.c windows_port.c \
|
||||
ares_expand_string.c ares_parse_ptr_reply.c ares_parse_aaaa_reply.c \
|
||||
ares_getnameinfo.c inet_net_pton.c bitncmp.c inet_ntop.c
|
||||
ares_getnameinfo.c inet_net_pton.c bitncmp.c inet_ntop.c \
|
||||
ares_parse_ns_reply.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
|
||||
|
||||
MANPAGES= ares_destroy.3 ares_expand_name.3 ares_expand_string.3 ares_fds.3 \
|
||||
ares_free_hostent.3 ares_free_string.3 ares_gethostbyaddr.3 \
|
||||
ares_gethostbyname.3 ares_init.3 ares_init_options.3 ares_mkquery.3 \
|
||||
ares_parse_a_reply.3 ares_parse_ptr_reply.3 ares_process.3 \
|
||||
ares_query.3 ares_search.3 ares_send.3 ares_strerror.3 ares_timeout.3 \
|
||||
ares_free_hostent.3 ares_free_string.3 ares_gethostbyaddr.3 \
|
||||
ares_gethostbyname.3 ares_init.3 ares_init_options.3 ares_mkquery.3 \
|
||||
ares_parse_a_reply.3 ares_parse_ptr_reply.3 ares_process.3 \
|
||||
ares_query.3 ares_search.3 ares_send.3 ares_strerror.3 ares_timeout.3 \
|
||||
ares_version.3 ares_cancel.3 ares_parse_aaaa_reply.3 ares_getnameinfo.3 \
|
||||
ares_getsock.3
|
||||
ares_getsock.3 ares_parse_ns_reply.3
|
||||
|
||||
|
@@ -1,9 +1,10 @@
|
||||
#################################################################
|
||||
# $Id$
|
||||
#
|
||||
## Makefile for building libares.lib (NetWare version - gnu make)
|
||||
## Makefile for building libares (NetWare version - gnu make)
|
||||
## Use: make -f Makefile.netware
|
||||
##
|
||||
## Comments to: Guenter Knauf <eflash@gmx.net>
|
||||
## Comments to: Guenter Knauf http://www.gknw.de/phpbb
|
||||
#
|
||||
#################################################################
|
||||
|
||||
@@ -18,7 +19,7 @@ endif
|
||||
|
||||
# Edit the vars below to change NLM target settings.
|
||||
TARGETS = adig.nlm ahost.nlm
|
||||
LTARGET = libcares.lib
|
||||
LTARGET = libcares.$(LIBEXT)
|
||||
VERSION = $(LIBCARES_VERSION)
|
||||
COPYR = Copyright (C) 1996 - 2007, Daniel Stenberg, <daniel@haxx.se>
|
||||
DESCR = cURL $(subst .def,,$(notdir $@)) $(LIBCARES_VERSION_STR) - http://curl.haxx.se
|
||||
@@ -72,6 +73,7 @@ LD = mwldnlm
|
||||
LDFLAGS = -nostdlib $(PRELUDE) $(OBJS) $(<:.def=.o) -o $@ -commandfile
|
||||
AR = mwldnlm
|
||||
ARFLAGS = -type library -w nocmdline $(OBJDIR)/*.o -o
|
||||
LIBEXT = lib
|
||||
CFLAGS += -msgstyle gcc -gccinc -inline off -opt nointrinsics -proc 586
|
||||
CFLAGS += -relax_pointers
|
||||
#CFLAGS += -w on
|
||||
@@ -88,6 +90,7 @@ LD = nlmconv
|
||||
LDFLAGS = -T
|
||||
AR = ar
|
||||
ARFLAGS = -cq
|
||||
LIBEXT = a
|
||||
CFLAGS += -fno-builtin -fpcc-struct-return -fno-strict-aliasing
|
||||
CFLAGS += -Wall -Wno-format -Wno-uninitialized # -pedantic
|
||||
ifeq ($(LIBARCH),LIBC)
|
||||
@@ -155,7 +158,7 @@ clean:
|
||||
-$(RM) -r $(OBJDIR)
|
||||
-$(RM) -r arpa
|
||||
|
||||
%.lib: $(OBJS)
|
||||
%.$(LIBEXT): $(OBJS)
|
||||
@echo Creating $@
|
||||
@-$(RM) $@
|
||||
@$(AR) $(ARFLAGS) $@ $^
|
||||
@@ -255,6 +258,9 @@ config.h: Makefile.netware
|
||||
@echo $(DL)** Do not edit this file - it is created by make!$(DL) >> $@
|
||||
@echo $(DL)** All your changes will be lost!!$(DL) >> $@
|
||||
@echo $(DL)*/$(DL) >> $@
|
||||
@echo $(DL)#ifndef NETWARE$(DL) >> $@
|
||||
@echo $(DL)#error This $(notdir $@) is created for NetWare platform!$(DL) >> $@
|
||||
@echo $(DL)#endif$(DL) >> $@
|
||||
@echo $(DL)#define OS "i586-pc-NetWare"$(DL) >> $@
|
||||
@echo $(DL)#define VERSION "$(LIBCARES_VERSION_STR)"$(DL) >> $@
|
||||
@echo $(DL)#define PACKAGE_BUGREPORT "a suitable curl mailing list => http://curl.haxx.se/mail/"$(DL) >> $@
|
||||
@@ -332,6 +338,11 @@ else
|
||||
@echo $(DL)#define HAVE_SYS_SOCKIO_H 1$(DL) >> $@
|
||||
@echo $(DL)#define HAVE_NETDB_H 1$(DL) >> $@
|
||||
endif
|
||||
@echo $(DL)#ifdef __GNUC__$(DL) >> $@
|
||||
@echo $(DL)#define HAVE_VARIADIC_MACROS_GCC 1$(DL) >> $@
|
||||
@echo $(DL)#else$(DL) >> $@
|
||||
@echo $(DL)#define HAVE_VARIADIC_MACROS_C99 1$(DL) >> $@
|
||||
@echo $(DL)#endif$(DL) >> $@
|
||||
ifdef OLD_NOVELLSDK
|
||||
@echo $(DL)#define socklen_t int$(DL) >> $@
|
||||
endif
|
||||
|
@@ -67,6 +67,7 @@ OBJECTS = $(OBJ_DIR)\ares_fds.obj \
|
||||
$(OBJ_DIR)\ares_expand_name.obj \
|
||||
$(OBJ_DIR)\ares_parse_a_reply.obj \
|
||||
$(OBJ_DIR)\ares_parse_aaaa_reply.obj \
|
||||
$(OBJ_DIR)\ares_parse_ns_reply.obj \
|
||||
$(OBJ_DIR)\windows_port.obj \
|
||||
$(OBJ_DIR)\ares_expand_string.obj \
|
||||
$(OBJ_DIR)\ares_parse_ptr_reply.obj \
|
||||
@@ -75,6 +76,7 @@ OBJECTS = $(OBJ_DIR)\ares_fds.obj \
|
||||
$(OBJ_DIR)\inet_ntop.obj
|
||||
|
||||
all: $(OBJ_DIR) cares.lib cares.dll cares_imp.lib ahost.exe adig.exe
|
||||
@echo Welcome to c-ares library and examples
|
||||
|
||||
$(OBJ_DIR):
|
||||
mkdir $(OBJ_DIR)
|
||||
@@ -105,6 +107,7 @@ $(DEF_FILE): $(OBJECTS) Makefile.VC6
|
||||
@echo ares_mkquery >> $@
|
||||
@echo ares_parse_a_reply >> $@
|
||||
@echo ares_parse_ptr_reply >> $@
|
||||
@echo ares_parse_ns_reply >> $@
|
||||
@echo ares_process >> $@
|
||||
@echo ares_query >> $@
|
||||
@echo ares_search >> $@
|
||||
@@ -142,56 +145,87 @@ vclean realclean: clean
|
||||
#
|
||||
$(OBJ_DIR)\ares_fds.obj: ares_fds.c setup.h setup_once.h ares.h ares_private.h \
|
||||
ares_ipv6.h
|
||||
|
||||
$(OBJ_DIR)\ares_process.obj: ares_process.c setup.h setup_once.h nameser.h \
|
||||
ares.h ares_dns.h ares_private.h ares_ipv6.h
|
||||
|
||||
$(OBJ_DIR)\ares_free_hostent.obj: ares_free_hostent.c setup.h setup_once.h \
|
||||
ares.h ares_private.h ares_ipv6.h
|
||||
|
||||
$(OBJ_DIR)\ares_query.obj: ares_query.c setup.h setup_once.h nameser.h \
|
||||
ares.h ares_dns.h ares_private.h ares_ipv6.h
|
||||
|
||||
$(OBJ_DIR)\ares__close_sockets.obj: ares__close_sockets.c setup.h setup_once.h \
|
||||
ares.h ares_private.h ares_ipv6.h
|
||||
|
||||
$(OBJ_DIR)\ares_free_string.obj: ares_free_string.c setup.h setup_once.h ares.h
|
||||
|
||||
$(OBJ_DIR)\ares_search.obj: ares_search.c setup.h setup_once.h nameser.h \
|
||||
ares.h ares_private.h ares_ipv6.h
|
||||
|
||||
$(OBJ_DIR)\ares__get_hostent.obj: ares__get_hostent.c setup.h setup_once.h \
|
||||
ares.h ares_private.h ares_ipv6.h inet_net_pton.h
|
||||
|
||||
$(OBJ_DIR)\ares_gethostbyaddr.obj: ares_gethostbyaddr.c setup.h setup_once.h \
|
||||
nameser.h ares.h ares_private.h ares_ipv6.h inet_net_pton.h
|
||||
|
||||
$(OBJ_DIR)\ares_send.obj: ares_send.c setup.h setup_once.h nameser.h ares.h \
|
||||
ares_dns.h ares_private.h ares_ipv6.h
|
||||
|
||||
$(OBJ_DIR)\ares__read_line.obj: ares__read_line.c setup.h setup_once.h ares.h \
|
||||
ares_private.h ares_ipv6.h
|
||||
|
||||
$(OBJ_DIR)\ares_gethostbyname.obj: ares_gethostbyname.c setup.h setup_once.h \
|
||||
nameser.h ares.h ares_private.h ares_ipv6.h inet_net_pton.h bitncmp.h
|
||||
|
||||
$(OBJ_DIR)\ares_strerror.obj: ares_strerror.c setup.h setup_once.h ares.h
|
||||
|
||||
$(OBJ_DIR)\ares_cancel.obj: ares_cancel.c setup.h setup_once.h ares.h \
|
||||
ares_private.h ares_ipv6.h
|
||||
|
||||
$(OBJ_DIR)\ares_init.obj: ares_init.c setup.h setup_once.h nameser.h ares.h \
|
||||
ares_private.h ares_ipv6.h inet_net_pton.h
|
||||
|
||||
$(OBJ_DIR)\ares_timeout.obj: ares_timeout.c setup.h setup_once.h ares.h \
|
||||
ares_private.h ares_ipv6.h
|
||||
|
||||
$(OBJ_DIR)\ares_destroy.obj: ares_destroy.c setup.h setup_once.h ares.h \
|
||||
ares_private.h ares_ipv6.h
|
||||
|
||||
$(OBJ_DIR)\ares_mkquery.obj: ares_mkquery.c setup.h setup_once.h nameser.h \
|
||||
ares.h ares_dns.h
|
||||
|
||||
$(OBJ_DIR)\ares_version.obj: ares_version.c setup.h setup_once.h ares_version.h
|
||||
|
||||
$(OBJ_DIR)\ares_expand_name.obj: ares_expand_name.c setup.h setup_once.h \
|
||||
nameser.h ares.h ares_private.h ares_ipv6.h
|
||||
|
||||
$(OBJ_DIR)\ares_parse_a_reply.obj: ares_parse_a_reply.c setup.h setup_once.h \
|
||||
nameser.h ares.h ares_dns.h ares_private.h ares_ipv6.h
|
||||
|
||||
$(OBJ_DIR)\windows_port.obj: windows_port.c setup.h setup_once.h nameser.h \
|
||||
ares.h ares_private.h ares_ipv6.h
|
||||
|
||||
$(OBJ_DIR)\ares_expand_string.obj: ares_expand_string.c setup.h setup_once.h \
|
||||
nameser.h ares.h ares_private.h ares_ipv6.h
|
||||
|
||||
$(OBJ_DIR)\ares_parse_ptr_reply.obj: ares_parse_ptr_reply.c setup.h \
|
||||
setup_once.h nameser.h ares.h ares_dns.h ares_private.h ares_ipv6.h
|
||||
|
||||
$(OBJ_DIR)\ares_parse_aaaa_reply.obj: ares_parse_aaaa_reply.c setup.h \
|
||||
setup_once.h nameser.h ares.h ares_dns.h inet_net_pton.h ares_private.h \
|
||||
ares_ipv6.h
|
||||
|
||||
$(OBJ_DIR)\ares_parse_ns_reply.obj: ares_parse_ns_reply.c setup.h \
|
||||
setup_once.h nameser.h ares.h ares_dns.h ares_private.h ares_ipv6.h
|
||||
|
||||
$(OBJ_DIR)\ares_getnameinfo.obj: ares_getnameinfo.c setup.h setup_once.h \
|
||||
nameser.h ares.h ares_private.h ares_ipv6.h inet_ntop.h
|
||||
|
||||
$(OBJ_DIR)\inet_net_pton.obj: inet_net_pton.c setup.h setup_once.h nameser.h \
|
||||
ares_ipv6.h inet_net_pton.h
|
||||
|
||||
$(OBJ_DIR)\bitncmp.obj: bitncmp.c bitncmp.h
|
||||
|
||||
$(OBJ_DIR)\inet_ntop.obj: inet_ntop.c setup.h setup_once.h nameser.h \
|
||||
ares_ipv6.h inet_ntop.h
|
||||
|
@@ -663,7 +663,7 @@ AC_DEFUN([CURL_CHECK_FUNC_RECV], [
|
||||
])
|
||||
#
|
||||
if test "$curl_cv_recv" = "yes"; then
|
||||
AC_CACHE_CHECK([types of arguments and return type for recv],
|
||||
AC_CACHE_CHECK([types of args and return type for recv],
|
||||
[curl_cv_func_recv_args], [
|
||||
curl_cv_func_recv_args="unknown"
|
||||
for recv_retv in 'int' 'ssize_t'; do
|
||||
@@ -793,7 +793,7 @@ AC_DEFUN([CURL_CHECK_FUNC_SEND], [
|
||||
])
|
||||
#
|
||||
if test "$curl_cv_send" = "yes"; then
|
||||
AC_CACHE_CHECK([types of arguments and return type for send],
|
||||
AC_CACHE_CHECK([types of args and return type for send],
|
||||
[curl_cv_func_send_args], [
|
||||
curl_cv_func_send_args="unknown"
|
||||
for send_retv in 'int' 'ssize_t'; do
|
||||
@@ -1197,43 +1197,6 @@ dnl end of non-blocking try-compile test
|
||||
])
|
||||
|
||||
|
||||
dnl TYPE_SOCKADDR_STORAGE
|
||||
dnl -------------------------------------------------
|
||||
dnl Check for struct sockaddr_storage. Most IPv6-enabled hosts have it, but
|
||||
dnl AIX 4.3 is one known exception.
|
||||
AC_DEFUN([TYPE_SOCKADDR_STORAGE],
|
||||
[
|
||||
AC_CHECK_TYPE([struct sockaddr_storage],
|
||||
AC_DEFINE(HAVE_STRUCT_SOCKADDR_STORAGE, 1,
|
||||
[if struct sockaddr_storage is defined]), ,
|
||||
[
|
||||
#undef inline
|
||||
#ifdef HAVE_WINDOWS_H
|
||||
#ifndef WIN32_LEAN_AND_MEAN
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#endif
|
||||
#include <windows.h>
|
||||
#ifdef HAVE_WINSOCK2_H
|
||||
#include <winsock2.h>
|
||||
#endif
|
||||
#else
|
||||
#ifdef HAVE_SYS_TYPES_H
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
#ifdef HAVE_SYS_SOCKET_H
|
||||
#include <sys/socket.h>
|
||||
#endif
|
||||
#ifdef HAVE_NETINET_IN_H
|
||||
#include <netinet/in.h>
|
||||
#endif
|
||||
#ifdef HAVE_ARPA_INET_H
|
||||
#include <arpa/inet.h>
|
||||
#endif
|
||||
#endif
|
||||
])
|
||||
])
|
||||
|
||||
|
||||
dnl TYPE_IN_ADDR_T
|
||||
dnl -------------------------------------------------
|
||||
dnl Check for in_addr_t: it is used to receive the return code of inet_addr()
|
||||
@@ -1316,12 +1279,39 @@ AC_DEFUN([TYPE_IN_ADDR_T],
|
||||
#ifdef HAVE_ARPA_INET_H
|
||||
#include <arpa/inet.h>
|
||||
#endif
|
||||
|
||||
#endif
|
||||
]) dnl AC_CHECK_TYPE
|
||||
]) dnl AC_DEFUN
|
||||
|
||||
|
||||
dnl **********************************************************************
|
||||
dnl CURL_DETECT_ICC ([ACTION-IF-YES])
|
||||
dnl
|
||||
dnl check if this is the Intel ICC compiler, and if so run the ACTION-IF-YES
|
||||
dnl sets the $ICC variable to "yes" or "no"
|
||||
dnl **********************************************************************
|
||||
AC_DEFUN([CURL_DETECT_ICC],
|
||||
[
|
||||
ICC="no"
|
||||
AC_MSG_CHECKING([for icc in use])
|
||||
if test "$GCC" = "yes"; then
|
||||
dnl check if this is icc acting as gcc in disguise
|
||||
AC_EGREP_CPP([^__INTEL_COMPILER], [__INTEL_COMPILER],
|
||||
dnl action if the text is found, this it has not been replaced by the
|
||||
dnl cpp
|
||||
ICC="no",
|
||||
dnl the text was not found, it was replaced by the cpp
|
||||
ICC="yes"
|
||||
AC_MSG_RESULT([yes])
|
||||
[$1]
|
||||
)
|
||||
fi
|
||||
if test "$ICC" = "no"; then
|
||||
# this is not ICC
|
||||
AC_MSG_RESULT([no])
|
||||
fi
|
||||
])
|
||||
|
||||
dnl We create a function for detecting which compiler we use and then set as
|
||||
dnl pendantic compiler options as possible for that particular compiler. The
|
||||
dnl options are only used for debug-builds.
|
||||
@@ -1332,6 +1322,10 @@ dnl is changed.
|
||||
|
||||
AC_DEFUN([CURL_CC_DEBUG_OPTS],
|
||||
[
|
||||
if test "z$ICC" = "z"; then
|
||||
CURL_DETECT_ICC
|
||||
fi
|
||||
|
||||
if test "$GCC" = "yes"; then
|
||||
|
||||
dnl figure out gcc version!
|
||||
@@ -1342,58 +1336,73 @@ AC_DEFUN([CURL_CC_DEBUG_OPTS],
|
||||
gccnum=`(expr $num1 "*" 100 + $num2) 2>/dev/null`
|
||||
AC_MSG_RESULT($gccver)
|
||||
|
||||
AC_MSG_CHECKING([if this is icc in disguise])
|
||||
AC_EGREP_CPP([^__INTEL_COMPILER], [__INTEL_COMPILER],
|
||||
dnl action if the text is found, this it has not been replaced by the
|
||||
dnl cpp
|
||||
ICC="no"
|
||||
AC_MSG_RESULT([no]),
|
||||
dnl the text was not found, it was replaced by the cpp
|
||||
ICC="yes"
|
||||
AC_MSG_RESULT([yes])
|
||||
)
|
||||
|
||||
if test "$ICC" = "yes"; then
|
||||
dnl this is icc, not gcc.
|
||||
|
||||
dnl ICC warnings we ignore:
|
||||
dnl * 279 warns on static conditions in while expressions
|
||||
dnl * 269 warns on our "%Od" printf formatters for curl_off_t output:
|
||||
dnl "invalid format string conversion"
|
||||
dnl * 279 warns on static conditions in while expressions
|
||||
dnl * 981 warns on "operands are evaluated in unspecified order"
|
||||
dnl * 1418 "external definition with no prior declaration"
|
||||
dnl * 1419 warns on "external declaration in primary source file"
|
||||
dnl which we know and do on purpose.
|
||||
|
||||
WARN="-wd279,269"
|
||||
WARN="-wd279,269,981,1418,1419"
|
||||
|
||||
if test "$gccnum" -gt "600"; then
|
||||
dnl icc 6.0 and older doesn't have the -Wall flag
|
||||
WARN="-Wall $WARN"
|
||||
fi
|
||||
else dnl $ICC = yes
|
||||
dnl
|
||||
WARN="-W -Wall -Wwrite-strings -pedantic -Wno-long-long -Wundef -Wpointer-arith -Wnested-externs -Winline -Wmissing-declarations -Wmissing-prototypes -Wsign-compare"
|
||||
dnl this is a set of options we believe *ALL* gcc versions support:
|
||||
WARN="-W -Wall -Wwrite-strings -pedantic -Wpointer-arith -Wnested-externs -Winline -Wmissing-prototypes"
|
||||
|
||||
dnl -Wcast-align is a bit too annoying ;-)
|
||||
dnl -Wcast-align is a bit too annoying on all gcc versions ;-)
|
||||
|
||||
if test "$gccnum" -ge "207"; then
|
||||
dnl gcc 2.7 or later
|
||||
WARN="$WARN -Wmissing-declarations"
|
||||
fi
|
||||
|
||||
if test "$gccnum" -gt "295"; then
|
||||
dnl only if the compiler is newer than 2.95 since we got lots of
|
||||
dnl "`_POSIX_C_SOURCE' is not defined" in system headers with
|
||||
dnl gcc 2.95.4 on FreeBSD 4.9!
|
||||
WARN="$WARN -Wundef -Wno-long-long -Wsign-compare"
|
||||
fi
|
||||
|
||||
if test "$gccnum" -ge "296"; then
|
||||
dnl gcc 2.96 or later
|
||||
WARN="$WARN -Wfloat-equal"
|
||||
fi
|
||||
|
||||
if test "$gccnum" -gt "296"; then
|
||||
dnl this option does not exist in 2.96
|
||||
WARN="$WARN -Wno-format-nonliteral"
|
||||
fi
|
||||
if test "$gccnum" -gt "296"; then
|
||||
dnl this option does not exist in 2.96
|
||||
WARN="$WARN -Wno-format-nonliteral"
|
||||
fi
|
||||
|
||||
dnl -Wunreachable-code seems totally unreliable on my gcc 3.3.2 on
|
||||
dnl on i686-Linux as it gives us heaps with false positives
|
||||
if test "$gccnum" -ge "303"; then
|
||||
dnl gcc 3.3 and later
|
||||
WARN="$WARN -Wendif-labels -Wstrict-prototypes"
|
||||
fi
|
||||
dnl -Wunreachable-code seems totally unreliable on my gcc 3.3.2 on
|
||||
dnl on i686-Linux as it gives us heaps with false positives.
|
||||
dnl Also, on gcc 4.0.X it is totally unbearable and complains all
|
||||
dnl over making it unusable for generic purposes. Let's not use it.
|
||||
|
||||
if test "$gccnum" -ge "303"; then
|
||||
dnl gcc 3.3 and later
|
||||
WARN="$WARN -Wendif-labels -Wstrict-prototypes"
|
||||
fi
|
||||
|
||||
if test "$gccnum" -ge "304"; then
|
||||
# try these on gcc 3.4
|
||||
WARN="$WARN -Wdeclaration-after-statement"
|
||||
fi
|
||||
|
||||
for flag in $CPPFLAGS; do
|
||||
case "$flag" in
|
||||
-I*)
|
||||
dnl include path
|
||||
dnl Include path, provide a -isystem option for the same dir
|
||||
dnl to prevent warnings in those dirs. The -isystem was not very
|
||||
dnl reliable on earlier gcc versions.
|
||||
add=`echo $flag | sed 's/^-I/-isystem /g'`
|
||||
WARN="$WARN $add"
|
||||
;;
|
||||
@@ -1404,6 +1413,12 @@ AC_DEFUN([CURL_CC_DEBUG_OPTS],
|
||||
|
||||
CFLAGS="$CFLAGS $WARN"
|
||||
|
||||
AC_MSG_NOTICE([Added this set of compiler options: $WARN])
|
||||
|
||||
else dnl $GCC = yes
|
||||
|
||||
AC_MSG_NOTICE([Added no extra compiler options])
|
||||
|
||||
fi dnl $GCC = yes
|
||||
|
||||
dnl strip off optimizer flags
|
||||
@@ -1516,39 +1531,3 @@ else
|
||||
fi
|
||||
])
|
||||
|
||||
# Prevent libtool for checking how to run C++ compiler and check for other
|
||||
# tools we don't want to use. We do this by m4-defining the _LT_AC_TAGCONFIG
|
||||
# variable to the code to run, as by default it uses a much more complicated
|
||||
# approach. The code below that is actually added seems to be used for cases
|
||||
# where configure has trouble figuring out what C compiler to use but where
|
||||
# the installed libtool has an idea.
|
||||
#
|
||||
# This function is a re-implemented version of the Paolo Bonzini fix posted to
|
||||
# the c-ares mailing list by Bram Matthys on May 6 2006. My version removes
|
||||
# redundant code but also adds the LTCFLAGS check that wasn't in that patch.
|
||||
#
|
||||
# Some code in this function was extracted from the generated configure script.
|
||||
#
|
||||
# CARES_CLEAR_LIBTOOL_TAGS
|
||||
AC_DEFUN([CARES_CLEAR_LIBTOOL_TAGS],
|
||||
[m4_define([_LT_AC_TAGCONFIG], [
|
||||
if test -f "$ltmain"; then
|
||||
if test ! -f "${ofile}"; then
|
||||
AC_MSG_WARN([output file `$ofile' does not exist])
|
||||
fi
|
||||
|
||||
if test -z "$LTCC"; then
|
||||
eval "`$SHELL ${ofile} --config | grep '^LTCC='`"
|
||||
if test -z "$LTCC"; then
|
||||
AC_MSG_WARN([output file `$ofile' does not look like a libtool
|
||||
script])
|
||||
else
|
||||
AC_MSG_WARN([using `LTCC=$LTCC', extracted from `$ofile'])
|
||||
fi
|
||||
fi
|
||||
if test -z "$LTCFLAGS"; then
|
||||
eval "`$SHELL ${ofile} --config | grep '^LTCFLAGS='`"
|
||||
fi
|
||||
fi
|
||||
])]
|
||||
)
|
||||
|
21
ares/adig.c
21
ares/adig.c
@@ -16,17 +16,20 @@
|
||||
*/
|
||||
|
||||
#include "setup.h"
|
||||
#include <sys/types.h>
|
||||
|
||||
#if defined(WIN32) && !defined(WATT32)
|
||||
#include "nameser.h"
|
||||
#else
|
||||
#ifdef HAVE_SYS_TIME_H
|
||||
#include <sys/time.h>
|
||||
#endif
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <arpa/nameser.h>
|
||||
#ifdef HAVE_UNISTD_H
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
#include <netdb.h>
|
||||
#endif
|
||||
#ifdef HAVE_GETOPT_H
|
||||
@@ -47,10 +50,6 @@
|
||||
#undef WIN32 /* Redefined in MingW headers */
|
||||
#endif
|
||||
|
||||
#ifndef INADDR_NONE
|
||||
#define INADDR_NONE 0xffffffff
|
||||
#endif
|
||||
|
||||
/* Mac OS X portability check */
|
||||
#ifndef T_SRV
|
||||
#define T_SRV 33 /* server selection */
|
||||
@@ -285,7 +284,7 @@ int main(int argc, char **argv)
|
||||
break;
|
||||
tvp = ares_timeout(channel, NULL, &tv);
|
||||
count = select(nfds, &read_fds, &write_fds, NULL, tvp);
|
||||
if (count < 0 && errno != EINVAL)
|
||||
if (count < 0 && SOCKERRNO != EINVAL)
|
||||
{
|
||||
perror("select");
|
||||
return 1;
|
||||
@@ -294,6 +293,11 @@ int main(int argc, char **argv)
|
||||
}
|
||||
|
||||
ares_destroy(channel);
|
||||
|
||||
#ifdef USE_WINSOCK
|
||||
WSACleanup();
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -551,8 +555,9 @@ static const unsigned char *display_rr(const unsigned char *aptr,
|
||||
if (p + 20 > aptr + dlen)
|
||||
return NULL;
|
||||
printf("\t\t\t\t\t\t( %lu %lu %lu %lu %lu )",
|
||||
DNS__32BIT(p), DNS__32BIT(p+4), DNS__32BIT(p+8),
|
||||
DNS__32BIT(p+12), DNS__32BIT(p+16));
|
||||
(unsigned long)DNS__32BIT(p), (unsigned long)DNS__32BIT(p+4),
|
||||
(unsigned long)DNS__32BIT(p+8), (unsigned long)DNS__32BIT(p+12),
|
||||
(unsigned long)DNS__32BIT(p+16));
|
||||
break;
|
||||
|
||||
case T_TXT:
|
||||
|
22
ares/ahost.c
22
ares/ahost.c
@@ -16,16 +16,19 @@
|
||||
*/
|
||||
|
||||
#include "setup.h"
|
||||
#include <sys/types.h>
|
||||
|
||||
#if !defined(WIN32) || defined(WATT32)
|
||||
#ifdef HAVE_SYS_TIME_H
|
||||
#include <sys/time.h>
|
||||
#endif
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <netdb.h>
|
||||
#ifdef HAVE_UNISTD_H
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
@@ -40,8 +43,9 @@
|
||||
#include "inet_ntop.h"
|
||||
#include "inet_net_pton.h"
|
||||
|
||||
#ifndef INADDR_NONE
|
||||
#define INADDR_NONE 0xffffffff
|
||||
#ifndef optind
|
||||
extern int optind;
|
||||
extern char *optarg;
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_STRUCT_IN6_ADDR
|
||||
@@ -69,10 +73,15 @@ int main(int argc, char **argv)
|
||||
WSAStartup(wVersionRequested, &wsaData);
|
||||
#endif
|
||||
|
||||
while ((c = getopt(argc,argv,"t:h")) != -1)
|
||||
while ((c = getopt(argc,argv,"dt:h")) != -1)
|
||||
{
|
||||
switch (c)
|
||||
{
|
||||
case 'd':
|
||||
#ifdef WATT32
|
||||
dbug_init();
|
||||
#endif
|
||||
break;
|
||||
case 't':
|
||||
if (!strcasecmp(optarg,"a"))
|
||||
addr_family = AF_INET;
|
||||
@@ -133,6 +142,11 @@ int main(int argc, char **argv)
|
||||
}
|
||||
|
||||
ares_destroy(channel);
|
||||
|
||||
#ifdef USE_WINSOCK
|
||||
WSACleanup();
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@@ -213,6 +213,8 @@ int ares_parse_aaaa_reply(const unsigned char *abuf, int alen,
|
||||
struct hostent **host);
|
||||
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,
|
||||
struct hostent **host);
|
||||
void ares_free_string(void *str);
|
||||
void ares_free_hostent(struct hostent *host);
|
||||
const char *ares_strerror(int code);
|
||||
|
@@ -16,7 +16,6 @@
|
||||
*/
|
||||
|
||||
#include "setup.h"
|
||||
#include <sys/types.h>
|
||||
|
||||
#if !defined(WIN32) || defined(WATT32)
|
||||
#include <sys/socket.h>
|
||||
|
@@ -21,12 +21,13 @@
|
||||
#define DNS__16BIT(p) (((p)[0] << 8) | (p)[1])
|
||||
#define DNS__32BIT(p) (((p)[0] << 24) | ((p)[1] << 16) | \
|
||||
((p)[2] << 8) | (p)[3])
|
||||
#define DNS__SET16BIT(p, v) (((p)[0] = ((v) >> 8) & 0xff), \
|
||||
((p)[1] = (v) & 0xff))
|
||||
#define DNS__SET32BIT(p, v) (((p)[0] = ((v) >> 24) & 0xff), \
|
||||
((p)[1] = ((v) >> 16) & 0xff), \
|
||||
((p)[2] = ((v) >> 8) & 0xff), \
|
||||
((p)[3] = (v) & 0xff))
|
||||
|
||||
#define DNS__SET16BIT(p, v) (((p)[0] = (unsigned char)(((v) >> 8) & 0xff)), \
|
||||
((p)[1] = (unsigned char)((v) & 0xff)))
|
||||
#define DNS__SET32BIT(p, v) (((p)[0] = (unsigned char)(((v) >> 24) & 0xff)), \
|
||||
((p)[1] = (unsigned char)(((v) >> 16) & 0xff)), \
|
||||
((p)[2] = (unsigned char)(((v) >> 8) & 0xff)), \
|
||||
((p)[3] = (unsigned char)((v) & 0xff)))
|
||||
|
||||
#if 0
|
||||
/* we cannot use this approach on systems where we can't access 16/32 bit
|
||||
@@ -53,19 +54,19 @@
|
||||
#define DNS_HEADER_ARCOUNT(h) DNS__16BIT((h) + 10)
|
||||
|
||||
/* Macros for constructing a DNS header */
|
||||
#define DNS_HEADER_SET_QID(h, v) DNS__SET16BIT(h, v)
|
||||
#define DNS_HEADER_SET_QR(h, v) ((h)[2] |= (((v) & 0x1) << 7))
|
||||
#define DNS_HEADER_SET_OPCODE(h, v) ((h)[2] |= (((v) & 0xf) << 3))
|
||||
#define DNS_HEADER_SET_AA(h, v) ((h)[2] |= (((v) & 0x1) << 2))
|
||||
#define DNS_HEADER_SET_TC(h, v) ((h)[2] |= (((v) & 0x1) << 1))
|
||||
#define DNS_HEADER_SET_RD(h, v) ((h)[2] |= (((v) & 0x1)))
|
||||
#define DNS_HEADER_SET_RA(h, v) ((h)[3] |= (((v) & 0x1) << 7))
|
||||
#define DNS_HEADER_SET_Z(h, v) ((h)[3] |= (((v) & 0x7) << 4))
|
||||
#define DNS_HEADER_SET_RCODE(h, v) ((h)[3] |= (((v) & 0xf)))
|
||||
#define DNS_HEADER_SET_QDCOUNT(h, v) DNS__SET16BIT((h) + 4, v)
|
||||
#define DNS_HEADER_SET_ANCOUNT(h, v) DNS__SET16BIT((h) + 6, v)
|
||||
#define DNS_HEADER_SET_NSCOUNT(h, v) DNS__SET16BIT((h) + 8, v)
|
||||
#define DNS_HEADER_SET_ARCOUNT(h, v) DNS__SET16BIT((h) + 10, v)
|
||||
#define DNS_HEADER_SET_QID(h, v) DNS__SET16BIT(h, v)
|
||||
#define DNS_HEADER_SET_QR(h, v) ((h)[2] |= (unsigned char)(((v) & 0x1) << 7))
|
||||
#define DNS_HEADER_SET_OPCODE(h, v) ((h)[2] |= (unsigned char)(((v) & 0xf) << 3))
|
||||
#define DNS_HEADER_SET_AA(h, v) ((h)[2] |= (unsigned char)(((v) & 0x1) << 2))
|
||||
#define DNS_HEADER_SET_TC(h, v) ((h)[2] |= (unsigned char)(((v) & 0x1) << 1))
|
||||
#define DNS_HEADER_SET_RD(h, v) ((h)[2] |= (unsigned char)((v) & 0x1))
|
||||
#define DNS_HEADER_SET_RA(h, v) ((h)[3] |= (unsigned char)(((v) & 0x1) << 7))
|
||||
#define DNS_HEADER_SET_Z(h, v) ((h)[3] |= (unsigned char)(((v) & 0x7) << 4))
|
||||
#define DNS_HEADER_SET_RCODE(h, v) ((h)[3] |= (unsigned char)((v) & 0xf))
|
||||
#define DNS_HEADER_SET_QDCOUNT(h, v) DNS__SET16BIT((h) + 4, v)
|
||||
#define DNS_HEADER_SET_ANCOUNT(h, v) DNS__SET16BIT((h) + 6, v)
|
||||
#define DNS_HEADER_SET_NSCOUNT(h, v) DNS__SET16BIT((h) + 8, v)
|
||||
#define DNS_HEADER_SET_ARCOUNT(h, v) DNS__SET16BIT((h) + 10, v)
|
||||
|
||||
/* Macros for parsing the fixed part of a DNS question */
|
||||
#define DNS_QUESTION_TYPE(q) DNS__16BIT(q)
|
||||
|
@@ -16,7 +16,6 @@
|
||||
*/
|
||||
|
||||
#include "setup.h"
|
||||
#include <sys/types.h>
|
||||
|
||||
#if defined(WIN32) && !defined(WATT32)
|
||||
#include "nameser.h"
|
||||
|
@@ -16,7 +16,6 @@
|
||||
*/
|
||||
|
||||
#include "setup.h"
|
||||
#include <sys/types.h>
|
||||
|
||||
#if defined(WIN32) && !defined(WATT32)
|
||||
#include "nameser.h"
|
||||
|
@@ -16,7 +16,6 @@
|
||||
*/
|
||||
|
||||
#include "setup.h"
|
||||
#include <sys/types.h>
|
||||
|
||||
#ifdef HAVE_SYS_TIME_H
|
||||
#include <sys/time.h>
|
||||
|
@@ -29,7 +29,7 @@ void ares_free_hostent(struct hostent *host)
|
||||
{
|
||||
char **p;
|
||||
|
||||
free(host->h_name);
|
||||
free((char *)(host->h_name));
|
||||
for (p = host->h_aliases; *p; p++)
|
||||
free(*p);
|
||||
free(host->h_aliases);
|
||||
|
@@ -15,7 +15,6 @@
|
||||
* without express or implied warranty.
|
||||
*/
|
||||
#include "setup.h"
|
||||
#include <sys/types.h>
|
||||
|
||||
#if defined(WIN32) && !defined(WATT32)
|
||||
#include "nameser.h"
|
||||
@@ -186,6 +185,7 @@ static int file_lookup(union ares_addr *addr, int family, struct hostent **host)
|
||||
{
|
||||
FILE *fp;
|
||||
int status;
|
||||
int error;
|
||||
|
||||
#ifdef WIN32
|
||||
char PATH_HOSTS[MAX_PATH];
|
||||
@@ -218,7 +218,22 @@ static int file_lookup(union ares_addr *addr, int family, struct hostent **host)
|
||||
|
||||
fp = fopen(PATH_HOSTS, "r");
|
||||
if (!fp)
|
||||
return ARES_ENOTFOUND;
|
||||
{
|
||||
error = ERRNO;
|
||||
switch(error)
|
||||
{
|
||||
case ENOENT:
|
||||
case ESRCH:
|
||||
return ARES_ENOTFOUND;
|
||||
default:
|
||||
DEBUGF(fprintf(stderr, "fopen() failed with error: %d %s\n",
|
||||
error, strerror(error)));
|
||||
DEBUGF(fprintf(stderr, "Error opening file: %s\n",
|
||||
PATH_HOSTS));
|
||||
*host = NULL;
|
||||
return ARES_EFILE;
|
||||
}
|
||||
}
|
||||
while ((status = ares__get_hostent(fp, family, host)) == ARES_SUCCESS)
|
||||
{
|
||||
if (family != (*host)->h_addrtype)
|
||||
|
@@ -16,7 +16,6 @@
|
||||
*/
|
||||
|
||||
#include "setup.h"
|
||||
#include <sys/types.h>
|
||||
|
||||
#if defined(WIN32) && !defined(WATT32)
|
||||
#include "nameser.h"
|
||||
@@ -239,7 +238,7 @@ static int fake_hostent(const char *name, int family, ares_host_callback callbac
|
||||
hostent.h_addr_list = addrs;
|
||||
callback(arg, ARES_SUCCESS, &hostent);
|
||||
|
||||
free(hostent.h_name);
|
||||
free((char *)(hostent.h_name));
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -248,6 +247,7 @@ static int file_lookup(const char *name, int family, struct hostent **host)
|
||||
FILE *fp;
|
||||
char **alias;
|
||||
int status;
|
||||
int error;
|
||||
|
||||
#ifdef WIN32
|
||||
char PATH_HOSTS[MAX_PATH];
|
||||
@@ -280,8 +280,22 @@ static int file_lookup(const char *name, int family, struct hostent **host)
|
||||
|
||||
fp = fopen(PATH_HOSTS, "r");
|
||||
if (!fp)
|
||||
return ARES_ENOTFOUND;
|
||||
|
||||
{
|
||||
error = ERRNO;
|
||||
switch(error)
|
||||
{
|
||||
case ENOENT:
|
||||
case ESRCH:
|
||||
return ARES_ENOTFOUND;
|
||||
default:
|
||||
DEBUGF(fprintf(stderr, "fopen() failed with error: %d %s\n",
|
||||
error, strerror(error)));
|
||||
DEBUGF(fprintf(stderr, "Error opening file: %s\n",
|
||||
PATH_HOSTS));
|
||||
*host = NULL;
|
||||
return ARES_EFILE;
|
||||
}
|
||||
}
|
||||
while ((status = ares__get_hostent(fp, family, host)) == ARES_SUCCESS)
|
||||
{
|
||||
if (strcasecmp((*host)->h_name, name) == 0)
|
||||
|
@@ -15,8 +15,6 @@
|
||||
* without express or implied warranty.
|
||||
*/
|
||||
#include "setup.h"
|
||||
#include <sys/types.h>
|
||||
#include <ctype.h>
|
||||
|
||||
#if defined(WIN32) && !defined(WATT32)
|
||||
#include "nameser.h"
|
||||
@@ -110,7 +108,8 @@ void ares_getnameinfo(ares_channel channel, const struct sockaddr *sa, socklen_t
|
||||
port = addr->sin_port;
|
||||
else
|
||||
port = addr6->sin6_port;
|
||||
service = lookup_service(port, flags, buf, sizeof(buf));
|
||||
service = lookup_service((unsigned short)(port & 0xffff),
|
||||
flags, buf, sizeof(buf));
|
||||
callback(arg, ARES_SUCCESS, NULL, service);
|
||||
return;
|
||||
}
|
||||
@@ -151,7 +150,8 @@ void ares_getnameinfo(ares_channel channel, const struct sockaddr *sa, socklen_t
|
||||
}
|
||||
/* They also want a service */
|
||||
if (flags & ARES_NI_LOOKUPSERVICE)
|
||||
service = lookup_service(port, flags, srvbuf, sizeof(srvbuf));
|
||||
service = lookup_service((unsigned short)(port & 0xffff),
|
||||
flags, srvbuf, sizeof(srvbuf));
|
||||
callback(arg, ARES_SUCCESS, ipbuf, service);
|
||||
return;
|
||||
}
|
||||
@@ -220,7 +220,8 @@ static void nameinfo_callback(void *arg, int status, struct hostent *host)
|
||||
*end = 0;
|
||||
}
|
||||
}
|
||||
niquery->callback(niquery->arg, ARES_SUCCESS, host->h_name, service);
|
||||
niquery->callback(niquery->arg, ARES_SUCCESS, (char *)(host->h_name),
|
||||
service);
|
||||
return;
|
||||
}
|
||||
/* We couldn't find the host, but it's OK, we can use the IP */
|
||||
@@ -302,7 +303,7 @@ static char *lookup_service(unsigned short port, int flags,
|
||||
strcpy(tmpbuf, sep->s_name);
|
||||
else
|
||||
/* get port as a string */
|
||||
sprintf(tmpbuf, "%u", ntohs(port));
|
||||
sprintf(tmpbuf, "%u", (unsigned int)ntohs(port));
|
||||
if (strlen(tmpbuf) < buflen)
|
||||
/* return it if buffer big enough */
|
||||
strcpy(buf, tmpbuf);
|
||||
@@ -319,6 +320,9 @@ static char *lookup_service(unsigned short port, int flags,
|
||||
static void append_scopeid(struct sockaddr_in6 *addr6, unsigned int flags,
|
||||
char *buf, size_t buflen)
|
||||
{
|
||||
#ifdef HAVE_IF_INDEXTONAME
|
||||
int is_ll, is_mcll;
|
||||
#endif
|
||||
char fmt_u[] = "%u";
|
||||
char fmt_lu[] = "%lu";
|
||||
char tmpbuf[IF_NAMESIZE + 2];
|
||||
@@ -328,9 +332,10 @@ static void append_scopeid(struct sockaddr_in6 *addr6, unsigned int flags,
|
||||
tmpbuf[0] = '%';
|
||||
|
||||
#ifdef HAVE_IF_INDEXTONAME
|
||||
is_ll = IN6_IS_ADDR_LINKLOCAL(&addr6->sin6_addr);
|
||||
is_mcll = IN6_IS_ADDR_MC_LINKLOCAL(&addr6->sin6_addr);
|
||||
if ((flags & ARES_NI_NUMERICSCOPE) ||
|
||||
(!IN6_IS_ADDR_LINKLOCAL(&addr6->sin6_addr)
|
||||
&& !IN6_IS_ADDR_MC_LINKLOCAL(&addr6->sin6_addr)))
|
||||
(!is_ll && !is_mcll))
|
||||
{
|
||||
sprintf(&tmpbuf[1], fmt, addr6->sin6_scope_id);
|
||||
}
|
||||
@@ -356,6 +361,7 @@ static void append_scopeid(struct sockaddr_in6 *addr6, unsigned int flags,
|
||||
static char *ares_striendstr(const char *s1, const char *s2)
|
||||
{
|
||||
const char *c1, *c2, *c1_begin;
|
||||
int lo1, lo2;
|
||||
size_t s1_len = strlen(s1), s2_len = strlen(s2);
|
||||
|
||||
/* If the substr is longer than the full str, it can't match */
|
||||
@@ -368,7 +374,9 @@ static char *ares_striendstr(const char *s1, const char *s2)
|
||||
c2 = s2;
|
||||
while (c2 < s2+s2_len)
|
||||
{
|
||||
if (tolower(*c1) != tolower(*c2))
|
||||
lo1 = tolower(*c1);
|
||||
lo2 = tolower(*c2);
|
||||
if (lo1 != lo2)
|
||||
return NULL;
|
||||
else
|
||||
{
|
||||
|
@@ -1,6 +1,6 @@
|
||||
/* $Id$ */
|
||||
|
||||
/* Copyright (C) 2005 - 2006, Daniel Stenberg
|
||||
/* Copyright (C) 2005 - 2007, Daniel Stenberg
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software and its
|
||||
* documentation for any purpose and without fee is hereby granted, provided
|
||||
@@ -14,7 +14,6 @@
|
||||
*/
|
||||
|
||||
#include "setup.h"
|
||||
#include <sys/types.h>
|
||||
|
||||
#ifdef HAVE_SYS_TIME_H
|
||||
#include <sys/time.h>
|
||||
|
162
ares/ares_init.c
162
ares/ares_init.c
@@ -16,7 +16,6 @@
|
||||
*/
|
||||
|
||||
#include "setup.h"
|
||||
#include <sys/types.h>
|
||||
|
||||
#if defined(WIN32) && !defined(WATT32)
|
||||
#include "nameser.h"
|
||||
@@ -43,6 +42,9 @@
|
||||
#ifdef HAVE_UNISTD_H
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
#ifdef HAVE_PROCESS_H
|
||||
#include <process.h> /* Some have getpid() here */
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
@@ -91,7 +93,8 @@ int ares_init_options(ares_channel *channelptr, struct ares_options *options,
|
||||
int optmask)
|
||||
{
|
||||
ares_channel channel;
|
||||
int i, status;
|
||||
int i;
|
||||
int status = ARES_SUCCESS;
|
||||
struct server_state *server;
|
||||
struct timeval tv;
|
||||
|
||||
@@ -106,8 +109,10 @@ int ares_init_options(ares_channel *channelptr, struct ares_options *options,
|
||||
#endif
|
||||
|
||||
channel = malloc(sizeof(struct ares_channeldata));
|
||||
if (!channel)
|
||||
if (!channel) {
|
||||
*channelptr = NULL;
|
||||
return ARES_ENOMEM;
|
||||
}
|
||||
|
||||
/* Set everything to distinguished values so we know they haven't
|
||||
* been set yet.
|
||||
@@ -132,13 +137,31 @@ int ares_init_options(ares_channel *channelptr, struct ares_options *options,
|
||||
/* Initialize configuration by each of the four sources, from highest
|
||||
* precedence to lowest.
|
||||
*/
|
||||
|
||||
if (status == ARES_SUCCESS) {
|
||||
status = init_by_options(channel, options, optmask);
|
||||
if (status == ARES_SUCCESS)
|
||||
if (status != ARES_SUCCESS)
|
||||
DEBUGF(fprintf(stderr, "Error: init_by_options failed: %s\n",
|
||||
ares_strerror(status)));
|
||||
}
|
||||
if (status == ARES_SUCCESS) {
|
||||
status = init_by_environment(channel);
|
||||
if (status == ARES_SUCCESS)
|
||||
if (status != ARES_SUCCESS)
|
||||
DEBUGF(fprintf(stderr, "Error: init_by_environment failed: %s\n",
|
||||
ares_strerror(status)));
|
||||
}
|
||||
if (status == ARES_SUCCESS) {
|
||||
status = init_by_resolv_conf(channel);
|
||||
if (status == ARES_SUCCESS)
|
||||
if (status != ARES_SUCCESS)
|
||||
DEBUGF(fprintf(stderr, "Error: init_by_resolv_conf failed: %s\n",
|
||||
ares_strerror(status)));
|
||||
}
|
||||
if (status == ARES_SUCCESS) {
|
||||
status = init_by_defaults(channel);
|
||||
if (status != ARES_SUCCESS)
|
||||
DEBUGF(fprintf(stderr, "Error: init_by_defaults failed: %s\n",
|
||||
ares_strerror(status)));
|
||||
}
|
||||
if (status != ARES_SUCCESS)
|
||||
{
|
||||
/* Something failed; clean up memory we may have allocated. */
|
||||
@@ -181,7 +204,7 @@ int ares_init_options(ares_channel *channelptr, struct ares_options *options,
|
||||
*/
|
||||
gettimeofday(&tv, NULL);
|
||||
channel->next_id = (unsigned short)
|
||||
(tv.tv_sec ^ tv.tv_usec ^ getpid()) & 0xffff;
|
||||
((tv.tv_sec ^ tv.tv_usec ^ getpid()) & 0xffff);
|
||||
|
||||
channel->queries = NULL;
|
||||
|
||||
@@ -550,7 +573,7 @@ DhcpNameServer
|
||||
do {
|
||||
space = strchr(pos, ' ');
|
||||
if (space)
|
||||
*space = 0;
|
||||
*space = '\0';
|
||||
status = config_nameserver(&servers, &nservers, pos);
|
||||
if (status != ARES_SUCCESS)
|
||||
break;
|
||||
@@ -586,32 +609,47 @@ DhcpNameServer
|
||||
char *p;
|
||||
FILE *fp;
|
||||
int linesize;
|
||||
int error;
|
||||
|
||||
fp = fopen(PATH_RESOLV_CONF, "r");
|
||||
if (!fp)
|
||||
return (errno == ENOENT) ? ARES_SUCCESS : ARES_EFILE;
|
||||
while ((status = ares__read_line(fp, &line, &linesize)) == ARES_SUCCESS)
|
||||
{
|
||||
if ((p = try_config(line, "domain")) && channel->ndomains == -1)
|
||||
status = config_domain(channel, p);
|
||||
else if ((p = try_config(line, "lookup")) && !channel->lookups)
|
||||
status = config_lookup(channel, p, "bind", "file");
|
||||
else if ((p = try_config(line, "search")) && channel->ndomains == -1)
|
||||
status = set_search(channel, p);
|
||||
else if ((p = try_config(line, "nameserver")) && channel->nservers == -1)
|
||||
status = config_nameserver(&servers, &nservers, p);
|
||||
else if ((p = try_config(line, "sortlist")) && channel->nsort == -1)
|
||||
status = config_sortlist(&sortlist, &nsort, p);
|
||||
else if ((p = try_config(line, "options")))
|
||||
status = set_options(channel, p);
|
||||
else
|
||||
status = ARES_SUCCESS;
|
||||
if (status != ARES_SUCCESS)
|
||||
break;
|
||||
if (fp) {
|
||||
while ((status = ares__read_line(fp, &line, &linesize)) == ARES_SUCCESS)
|
||||
{
|
||||
if ((p = try_config(line, "domain")) && channel->ndomains == -1)
|
||||
status = config_domain(channel, p);
|
||||
else if ((p = try_config(line, "lookup")) && !channel->lookups)
|
||||
status = config_lookup(channel, p, "bind", "file");
|
||||
else if ((p = try_config(line, "search")) && channel->ndomains == -1)
|
||||
status = set_search(channel, p);
|
||||
else if ((p = try_config(line, "nameserver")) && channel->nservers == -1)
|
||||
status = config_nameserver(&servers, &nservers, p);
|
||||
else if ((p = try_config(line, "sortlist")) && channel->nsort == -1)
|
||||
status = config_sortlist(&sortlist, &nsort, p);
|
||||
else if ((p = try_config(line, "options")))
|
||||
status = set_options(channel, p);
|
||||
else
|
||||
status = ARES_SUCCESS;
|
||||
if (status != ARES_SUCCESS)
|
||||
break;
|
||||
}
|
||||
fclose(fp);
|
||||
}
|
||||
else {
|
||||
error = ERRNO;
|
||||
switch(error) {
|
||||
case ENOENT:
|
||||
case ESRCH:
|
||||
status = ARES_EOF;
|
||||
break;
|
||||
default:
|
||||
DEBUGF(fprintf(stderr, "fopen() failed with error: %d %s\n",
|
||||
error, strerror(error)));
|
||||
DEBUGF(fprintf(stderr, "Error opening file: %s\n", PATH_RESOLV_CONF));
|
||||
status = ARES_EFILE;
|
||||
}
|
||||
}
|
||||
fclose(fp);
|
||||
|
||||
if (!channel->lookups) {
|
||||
if ((status == ARES_EOF) && (!channel->lookups)) {
|
||||
/* Many systems (Solaris, Linux, BSD's) use nsswitch.conf */
|
||||
fp = fopen("/etc/nsswitch.conf", "r");
|
||||
if (fp) {
|
||||
@@ -622,9 +660,23 @@ DhcpNameServer
|
||||
}
|
||||
fclose(fp);
|
||||
}
|
||||
else {
|
||||
error = ERRNO;
|
||||
switch(error) {
|
||||
case ENOENT:
|
||||
case ESRCH:
|
||||
status = ARES_EOF;
|
||||
break;
|
||||
default:
|
||||
DEBUGF(fprintf(stderr, "fopen() failed with error: %d %s\n",
|
||||
error, strerror(error)));
|
||||
DEBUGF(fprintf(stderr, "Error opening file: %s\n", "/etc/nsswitch.conf"));
|
||||
status = ARES_EFILE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!channel->lookups) {
|
||||
if ((status == ARES_EOF) && (!channel->lookups)) {
|
||||
/* Linux / GNU libc 2.x and possibly others have host.conf */
|
||||
fp = fopen("/etc/host.conf", "r");
|
||||
if (fp) {
|
||||
@@ -635,9 +687,23 @@ DhcpNameServer
|
||||
}
|
||||
fclose(fp);
|
||||
}
|
||||
else {
|
||||
error = ERRNO;
|
||||
switch(error) {
|
||||
case ENOENT:
|
||||
case ESRCH:
|
||||
status = ARES_EOF;
|
||||
break;
|
||||
default:
|
||||
DEBUGF(fprintf(stderr, "fopen() failed with error: %d %s\n",
|
||||
error, strerror(error)));
|
||||
DEBUGF(fprintf(stderr, "Error opening file: %s\n", "/etc/host.conf"));
|
||||
status = ARES_EFILE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!channel->lookups) {
|
||||
if ((status == ARES_EOF) && (!channel->lookups)) {
|
||||
/* Tru64 uses /etc/svc.conf */
|
||||
fp = fopen("/etc/svc.conf", "r");
|
||||
if (fp) {
|
||||
@@ -648,6 +714,20 @@ DhcpNameServer
|
||||
}
|
||||
fclose(fp);
|
||||
}
|
||||
else {
|
||||
error = ERRNO;
|
||||
switch(error) {
|
||||
case ENOENT:
|
||||
case ESRCH:
|
||||
status = ARES_EOF;
|
||||
break;
|
||||
default:
|
||||
DEBUGF(fprintf(stderr, "fopen() failed with error: %d %s\n",
|
||||
error, strerror(error)));
|
||||
DEBUGF(fprintf(stderr, "Error opening file: %s\n", "/etc/svc.conf"));
|
||||
status = ARES_EFILE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(line)
|
||||
@@ -761,7 +841,7 @@ static int config_domain(ares_channel channel, char *str)
|
||||
q = str;
|
||||
while (*q && !ISSPACE(*q))
|
||||
q++;
|
||||
*q = 0;
|
||||
*q = '\0';
|
||||
return set_search(channel, str);
|
||||
}
|
||||
|
||||
@@ -788,7 +868,7 @@ static int config_lookup(ares_channel channel, const char *str,
|
||||
while (*p && (ISSPACE(*p) || (*p == ',')))
|
||||
p++;
|
||||
}
|
||||
*l = 0;
|
||||
*l = '\0';
|
||||
channel->lookups = strdup(lookups);
|
||||
return (channel->lookups) ? ARES_SUCCESS : ARES_ENOMEM;
|
||||
}
|
||||
@@ -815,7 +895,7 @@ static int config_nameserver(struct server_state **servers, int *nservers,
|
||||
|
||||
if (*p)
|
||||
{
|
||||
*p = 0;
|
||||
*p = '\0';
|
||||
more = 1;
|
||||
}
|
||||
|
||||
@@ -873,7 +953,7 @@ static int config_sortlist(struct apattern **sortlist, int *nsort,
|
||||
while (*q && *q != '/' && *q != ';' && !ISSPACE(*q))
|
||||
q++;
|
||||
memcpy(ipbuf, str, (int)(q-str));
|
||||
ipbuf[(int)(q-str)] = 0;
|
||||
ipbuf[(int)(q-str)] = '\0';
|
||||
/* Find the prefix */
|
||||
if (*q == '/')
|
||||
{
|
||||
@@ -881,11 +961,11 @@ static int config_sortlist(struct apattern **sortlist, int *nsort,
|
||||
while (*q && *q != ';' && !ISSPACE(*q))
|
||||
q++;
|
||||
memcpy(ipbufpfx, str, (int)(q-str));
|
||||
ipbufpfx[(int)(q-str)] = 0;
|
||||
ipbufpfx[(int)(q-str)] = '\0';
|
||||
str = str2;
|
||||
}
|
||||
else
|
||||
ipbufpfx[0] = 0;
|
||||
ipbufpfx[0] = '\0';
|
||||
/* Lets see if it is CIDR */
|
||||
/* First we'll try IPv6 */
|
||||
if ((bits = ares_inet_net_pton(AF_INET6, ipbufpfx ? ipbufpfx : ipbuf,
|
||||
@@ -893,7 +973,7 @@ static int config_sortlist(struct apattern **sortlist, int *nsort,
|
||||
sizeof(pat.addr.addr6))) > 0)
|
||||
{
|
||||
pat.type = PATTERN_CIDR;
|
||||
pat.mask.bits = bits;
|
||||
pat.mask.bits = (unsigned short)bits;
|
||||
pat.family = AF_INET6;
|
||||
if (!sortlist_alloc(sortlist, nsort, &pat))
|
||||
return ARES_ENOMEM;
|
||||
@@ -903,7 +983,7 @@ static int config_sortlist(struct apattern **sortlist, int *nsort,
|
||||
sizeof(pat.addr.addr4))) > 0)
|
||||
{
|
||||
pat.type = PATTERN_CIDR;
|
||||
pat.mask.bits = bits;
|
||||
pat.mask.bits = (unsigned short)bits;
|
||||
pat.family = AF_INET;
|
||||
if (!sortlist_alloc(sortlist, nsort, &pat))
|
||||
return ARES_ENOMEM;
|
||||
@@ -914,7 +994,7 @@ static int config_sortlist(struct apattern **sortlist, int *nsort,
|
||||
if (ipbufpfx)
|
||||
{
|
||||
memcpy(ipbuf, str, (int)(q-str));
|
||||
ipbuf[(int)(q-str)] = 0;
|
||||
ipbuf[(int)(q-str)] = '\0';
|
||||
if (ip_addr(ipbuf, (int)(q - str), &pat.mask.addr.addr4) != 0)
|
||||
natural_mask(&pat);
|
||||
}
|
||||
|
@@ -16,7 +16,6 @@
|
||||
*/
|
||||
|
||||
#include "setup.h"
|
||||
#include <sys/types.h>
|
||||
|
||||
#if defined(WIN32) && !defined(WATT32)
|
||||
#include "nameser.h"
|
||||
@@ -115,7 +114,12 @@ int ares_mkquery(const char *name, int dnsclass, int type, unsigned short id,
|
||||
memset(q, 0, HFIXEDSZ);
|
||||
DNS_HEADER_SET_QID(q, id);
|
||||
DNS_HEADER_SET_OPCODE(q, QUERY);
|
||||
DNS_HEADER_SET_RD(q, (rd) ? 1 : 0);
|
||||
if (rd) {
|
||||
DNS_HEADER_SET_RD(q, 1);
|
||||
}
|
||||
else {
|
||||
DNS_HEADER_SET_RD(q, 0);
|
||||
}
|
||||
DNS_HEADER_SET_QDCOUNT(q, 1);
|
||||
|
||||
/* A name of "." is a screw case for the loop below, so adjust it. */
|
||||
@@ -141,7 +145,7 @@ int ares_mkquery(const char *name, int dnsclass, int type, unsigned short id,
|
||||
return ARES_EBADNAME;
|
||||
|
||||
/* Encode the length and copy the data. */
|
||||
*q++ = len;
|
||||
*q++ = (unsigned char)len;
|
||||
for (p = name; *p && *p != '.'; p++)
|
||||
{
|
||||
if (*p == '\\' && *(p + 1) != 0)
|
||||
|
@@ -16,7 +16,6 @@
|
||||
*/
|
||||
|
||||
#include "setup.h"
|
||||
#include <sys/types.h>
|
||||
|
||||
#if defined(WIN32) && !defined(WATT32)
|
||||
#include "nameser.h"
|
||||
|
@@ -16,7 +16,6 @@
|
||||
*/
|
||||
|
||||
#include "setup.h"
|
||||
#include <sys/types.h>
|
||||
|
||||
#if defined(WIN32) && !defined(WATT32)
|
||||
#include "nameser.h"
|
||||
|
66
ares/ares_parse_ns_reply.3
Normal file
66
ares/ares_parse_ns_reply.3
Normal file
@@ -0,0 +1,66 @@
|
||||
.\"
|
||||
.\" Copyright 1998 by the Massachusetts Institute of Technology.
|
||||
.\"
|
||||
.\" Permission to use, copy, modify, and distribute this
|
||||
.\" software and its documentation for any purpose and without
|
||||
.\" fee is hereby granted, provided that the above copyright
|
||||
.\" notice appear in all copies and that both that copyright
|
||||
.\" notice and this permission notice appear in supporting
|
||||
.\" documentation, and that the name of M.I.T. not be used in
|
||||
.\" advertising or publicity pertaining to distribution of the
|
||||
.\" software without specific, written prior permission.
|
||||
.\" M.I.T. makes no representations about the suitability of
|
||||
.\" this software for any purpose. It is provided "as is"
|
||||
.\" without express or implied warranty.
|
||||
.\"
|
||||
.TH ARES_PARSE_NS_REPLY 3 "10 February 2007"
|
||||
.SH NAME
|
||||
ares_parse_ns_reply \- Parse a reply to a DNS query of type NS into a hostent
|
||||
.SH SYNOPSIS
|
||||
.nf
|
||||
.B #include <ares.h>
|
||||
.PP
|
||||
.B int ares_parse_ns_reply(const unsigned char *\fIabuf\fP, int \fIalen\fP,
|
||||
.B struct hostent **\fIhost\fP);
|
||||
.fi
|
||||
.SH DESCRIPTION
|
||||
The
|
||||
.B ares_parse_ns_reply
|
||||
function parses the response to a query of type NS into a
|
||||
.BR "struct hostent" .
|
||||
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 .
|
||||
The nameservers are stored into the
|
||||
.BR aliases
|
||||
field of the
|
||||
.IR host
|
||||
structure.
|
||||
It is the caller's responsibility to free the resulting host structure
|
||||
using
|
||||
.BR ares_free_hostent (3)
|
||||
when it is no longer needed.
|
||||
.SH RETURN VALUES
|
||||
.B ares_parse_ns_reply
|
||||
can return any of the following values:
|
||||
.TP 15
|
||||
.B ARES_SUCCESS
|
||||
The response was successfully parsed.
|
||||
.TP 15
|
||||
.B ARES_EBADRESP
|
||||
The response was malformatted.
|
||||
.TP 15
|
||||
.B ARES_ENODATA
|
||||
The response did not contain an answer to the query.
|
||||
.TP 15
|
||||
.B ARES_ENOMEM
|
||||
Memory was exhausted.
|
||||
.SH SEE ALSO
|
||||
.BR ares_query (3),
|
||||
.BR ares_free_hostent (3)
|
||||
.SH AUTHOR
|
||||
Written by Vlad Dinulescu <vlad.dinulescu@avira.com>, on behalf of AVIRA Gmbh http://www.avira.com
|
171
ares/ares_parse_ns_reply.c
Normal file
171
ares/ares_parse_ns_reply.c
Normal file
@@ -0,0 +1,171 @@
|
||||
/* Copyright 1998 by the Massachusetts Institute of Technology.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
/*
|
||||
* ares_parse_ns_reply created by Vlad Dinulescu <vlad.dinulescu@avira.com>
|
||||
* on behalf of AVIRA Gmbh - http://www.avira.com
|
||||
*/
|
||||
|
||||
#include "setup.h"
|
||||
|
||||
#if defined(WIN32) && !defined(WATT32)
|
||||
#include "nameser.h"
|
||||
#else
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <netdb.h>
|
||||
#include <arpa/nameser.h>
|
||||
#ifdef HAVE_ARPA_NAMESER_COMPAT_H
|
||||
#include <arpa/nameser_compat.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include "ares.h"
|
||||
#include "ares_dns.h"
|
||||
#include "ares_private.h"
|
||||
|
||||
int ares_parse_ns_reply( const unsigned char* abuf, int alen,
|
||||
struct hostent** host )
|
||||
{
|
||||
unsigned int qdcount, ancount;
|
||||
int status, i, rr_type, rr_class, rr_len;
|
||||
int nameservers_num;
|
||||
long len;
|
||||
const unsigned char *aptr;
|
||||
char* hostname, *rr_name, *rr_data, **nameservers;
|
||||
struct hostent *hostent;
|
||||
|
||||
/* Set *host to NULL for all failure cases. */
|
||||
*host = NULL;
|
||||
|
||||
/* Give up if abuf doesn't have room for a header. */
|
||||
if ( alen < HFIXEDSZ )
|
||||
return ARES_EBADRESP;
|
||||
|
||||
/* Fetch the question and answer count from the header. */
|
||||
qdcount = DNS_HEADER_QDCOUNT( abuf );
|
||||
ancount = DNS_HEADER_ANCOUNT( abuf );
|
||||
if ( qdcount != 1 )
|
||||
return ARES_EBADRESP;
|
||||
|
||||
/* Expand the name from the question, and skip past the question. */
|
||||
aptr = abuf + HFIXEDSZ;
|
||||
status = ares_expand_name( aptr, abuf, alen, &hostname, &len );
|
||||
if ( status != ARES_SUCCESS )
|
||||
return status;
|
||||
if ( aptr + len + QFIXEDSZ > abuf + alen )
|
||||
{
|
||||
free( hostname );
|
||||
return ARES_EBADRESP;
|
||||
}
|
||||
aptr += len + QFIXEDSZ;
|
||||
|
||||
/* Allocate nameservers array; ancount gives an upper bound */
|
||||
nameservers = malloc( ( ancount + 1 ) * sizeof( char * ) );
|
||||
if ( !nameservers )
|
||||
{
|
||||
free( hostname );
|
||||
return ARES_ENOMEM;
|
||||
}
|
||||
nameservers_num = 0;
|
||||
|
||||
/* Examine each answer resource record (RR) in turn. */
|
||||
for ( i = 0; i < ( int ) ancount; i++ )
|
||||
{
|
||||
/* Decode the RR up to the data field. */
|
||||
status = ares_expand_name( aptr, abuf, alen, &rr_name, &len );
|
||||
if ( status != ARES_SUCCESS )
|
||||
break;
|
||||
aptr += len;
|
||||
if ( aptr + RRFIXEDSZ > abuf + alen )
|
||||
{
|
||||
status = ARES_EBADRESP;
|
||||
break;
|
||||
}
|
||||
rr_type = DNS_RR_TYPE( aptr );
|
||||
rr_class = DNS_RR_CLASS( aptr );
|
||||
rr_len = DNS_RR_LEN( aptr );
|
||||
aptr += RRFIXEDSZ;
|
||||
|
||||
if ( rr_class == C_IN && rr_type == T_NS )
|
||||
{
|
||||
/* Decode the RR data and add it to the nameservers list */
|
||||
status = ares_expand_name( aptr, abuf, alen, &rr_data, &len );
|
||||
if ( status != ARES_SUCCESS )
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
nameservers[nameservers_num] = malloc(strlen(rr_data)+1);
|
||||
|
||||
if (nameservers[nameservers_num]==NULL)
|
||||
{
|
||||
free(rr_name);
|
||||
free(rr_data);
|
||||
status=ARES_ENOMEM;
|
||||
break;
|
||||
}
|
||||
strcpy(nameservers[nameservers_num],rr_data);
|
||||
free(rr_data);
|
||||
|
||||
nameservers_num++;
|
||||
}
|
||||
|
||||
free( rr_name );
|
||||
|
||||
aptr += rr_len;
|
||||
if ( aptr > abuf + alen )
|
||||
{
|
||||
status = ARES_EBADRESP;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if ( status == ARES_SUCCESS && nameservers_num == 0 )
|
||||
{
|
||||
status = ARES_ENODATA;
|
||||
}
|
||||
if ( status == ARES_SUCCESS )
|
||||
{
|
||||
/* We got our answer. Allocate memory to build the host entry. */
|
||||
nameservers[nameservers_num] = NULL;
|
||||
hostent = malloc( sizeof( struct hostent ) );
|
||||
if ( hostent )
|
||||
{
|
||||
hostent->h_addr_list = malloc( 1 * sizeof( char * ) );
|
||||
if ( hostent->h_addr_list )
|
||||
{
|
||||
/* Fill in the hostent and return successfully. */
|
||||
hostent->h_name = hostname;
|
||||
hostent->h_aliases = nameservers;
|
||||
hostent->h_addrtype = AF_INET;
|
||||
hostent->h_length = sizeof( struct in_addr );
|
||||
hostent->h_addr_list[0] = NULL;
|
||||
*host = hostent;
|
||||
return ARES_SUCCESS;
|
||||
}
|
||||
free( hostent );
|
||||
}
|
||||
status = ARES_ENOMEM;
|
||||
}
|
||||
for ( i = 0; i < nameservers_num; i++ )
|
||||
free( nameservers[i] );
|
||||
free( nameservers );
|
||||
free( hostname );
|
||||
return status;
|
||||
}
|
@@ -16,7 +16,6 @@
|
||||
*/
|
||||
|
||||
#include "setup.h"
|
||||
#include <sys/types.h>
|
||||
|
||||
#if defined(WIN32) && !defined(WATT32)
|
||||
#include "nameser.h"
|
||||
|
@@ -16,7 +16,6 @@
|
||||
*/
|
||||
|
||||
#include "setup.h"
|
||||
#include <sys/types.h>
|
||||
|
||||
#if defined(WIN32) && !defined(WATT32)
|
||||
#include "nameser.h"
|
||||
@@ -54,16 +53,6 @@
|
||||
#include "ares_dns.h"
|
||||
#include "ares_private.h"
|
||||
|
||||
#ifndef TRUE
|
||||
/* at least Solaris 7 does not have TRUE at this point */
|
||||
#define TRUE 1
|
||||
#endif
|
||||
|
||||
#ifdef USE_WINSOCK
|
||||
#define GET_ERRNO() WSAGetLastError()
|
||||
#else
|
||||
#define GET_ERRNO() errno
|
||||
#endif
|
||||
|
||||
static int try_again(int errnum);
|
||||
static void write_tcp_data(ares_channel channel, fd_set *write_fds,
|
||||
@@ -97,7 +86,7 @@ void ares_process(ares_channel channel, fd_set *read_fds, fd_set *write_fds)
|
||||
process_timeouts(channel, now);
|
||||
}
|
||||
|
||||
/* Return 1 if the specified errno describes a readiness error, or 0
|
||||
/* Return 1 if the specified error number describes a readiness error, or 0
|
||||
* otherwise. This is mostly for HP-UX, which could return EAGAIN or
|
||||
* EWOULDBLOCK. See this man page
|
||||
*
|
||||
@@ -164,7 +153,7 @@ static void write_tcp_data(ares_channel channel, fd_set *write_fds, time_t now)
|
||||
free(vec);
|
||||
if (wcount < 0)
|
||||
{
|
||||
if (!try_again(GET_ERRNO()))
|
||||
if (!try_again(SOCKERRNO))
|
||||
handle_error(channel, i, now);
|
||||
continue;
|
||||
}
|
||||
@@ -200,7 +189,7 @@ static void write_tcp_data(ares_channel channel, fd_set *write_fds, time_t now)
|
||||
scount = swrite(server->tcp_socket, sendreq->data, sendreq->len);
|
||||
if (scount < 0)
|
||||
{
|
||||
if (!try_again(GET_ERRNO()))
|
||||
if (!try_again(SOCKERRNO))
|
||||
handle_error(channel, i, now);
|
||||
continue;
|
||||
}
|
||||
@@ -253,7 +242,7 @@ static void read_tcp_data(ares_channel channel, fd_set *read_fds, time_t now)
|
||||
2 - server->tcp_lenbuf_pos);
|
||||
if (count <= 0)
|
||||
{
|
||||
if (!(count == -1 && try_again(GET_ERRNO())))
|
||||
if (!(count == -1 && try_again(SOCKERRNO)))
|
||||
handle_error(channel, i, now);
|
||||
continue;
|
||||
}
|
||||
@@ -280,7 +269,7 @@ static void read_tcp_data(ares_channel channel, fd_set *read_fds, time_t now)
|
||||
server->tcp_length - server->tcp_buffer_pos);
|
||||
if (count <= 0)
|
||||
{
|
||||
if (!(count == -1 && try_again(GET_ERRNO())))
|
||||
if (!(count == -1 && try_again(SOCKERRNO)))
|
||||
handle_error(channel, i, now);
|
||||
continue;
|
||||
}
|
||||
@@ -322,7 +311,7 @@ static void read_udp_packets(ares_channel channel, fd_set *read_fds,
|
||||
continue;
|
||||
|
||||
count = sread(server->udp_socket, buf, sizeof(buf));
|
||||
if (count == -1 && try_again(GET_ERRNO()))
|
||||
if (count == -1 && try_again(SOCKERRNO))
|
||||
continue;
|
||||
else if (count <= 0)
|
||||
handle_error(channel, i, now);
|
||||
@@ -538,7 +527,7 @@ static int nonblock(ares_socket_t sockfd, /* operate on this */
|
||||
int flags;
|
||||
|
||||
flags = fcntl(sockfd, F_GETFL, 0);
|
||||
if (TRUE == nonblock)
|
||||
if (FALSE != nonblock)
|
||||
return fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);
|
||||
else
|
||||
return fcntl(sockfd, F_SETFL, flags & (~O_NONBLOCK));
|
||||
@@ -557,8 +546,12 @@ static int nonblock(ares_socket_t sockfd, /* operate on this */
|
||||
#endif
|
||||
|
||||
#if defined(HAVE_IOCTLSOCKET) && (SETBLOCK == 0)
|
||||
#ifdef WATT32
|
||||
char flags;
|
||||
#else
|
||||
/* Windows? */
|
||||
unsigned long flags;
|
||||
#endif
|
||||
flags = nonblock;
|
||||
|
||||
return ioctlsocket(sockfd, FIONBIO, &flags);
|
||||
@@ -609,9 +602,9 @@ static int open_tcp_socket(ares_channel channel, struct server_state *server)
|
||||
memset(&sockin, 0, sizeof(sockin));
|
||||
sockin.sin_family = AF_INET;
|
||||
sockin.sin_addr = server->addr;
|
||||
sockin.sin_port = channel->tcp_port;
|
||||
sockin.sin_port = (unsigned short)(channel->tcp_port & 0xffff);
|
||||
if (connect(s, (struct sockaddr *) &sockin, sizeof(sockin)) == -1) {
|
||||
int err = GET_ERRNO();
|
||||
int err = SOCKERRNO;
|
||||
|
||||
if (err != EINPROGRESS && err != EWOULDBLOCK) {
|
||||
closesocket(s);
|
||||
@@ -642,7 +635,7 @@ static int open_udp_socket(ares_channel channel, struct server_state *server)
|
||||
memset(&sockin, 0, sizeof(sockin));
|
||||
sockin.sin_family = AF_INET;
|
||||
sockin.sin_addr = server->addr;
|
||||
sockin.sin_port = channel->udp_port;
|
||||
sockin.sin_port = (unsigned short)(channel->udp_port & 0xffff);
|
||||
if (connect(s, (struct sockaddr *) &sockin, sizeof(sockin)) == -1)
|
||||
{
|
||||
closesocket(s);
|
||||
|
@@ -16,7 +16,6 @@
|
||||
*/
|
||||
|
||||
#include "setup.h"
|
||||
#include <sys/types.h>
|
||||
|
||||
#if defined(WIN32) && !defined(WATT32)
|
||||
#include "nameser.h"
|
||||
|
@@ -20,6 +20,7 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
#include <errno.h>
|
||||
|
||||
#if defined(WIN32) && !defined(WATT32)
|
||||
#include "nameser.h"
|
||||
@@ -216,6 +217,7 @@ static int single_domain(ares_channel channel, const char *name, char **s)
|
||||
char *line = NULL;
|
||||
int linesize, status;
|
||||
const char *p, *q;
|
||||
int error;
|
||||
|
||||
/* If the name contains a trailing dot, then the single query is the name
|
||||
* sans the trailing dot.
|
||||
@@ -265,6 +267,23 @@ static int single_domain(ares_channel channel, const char *name, char **s)
|
||||
if (status != ARES_SUCCESS)
|
||||
return status;
|
||||
}
|
||||
else
|
||||
{
|
||||
error = ERRNO;
|
||||
switch(error)
|
||||
{
|
||||
case ENOENT:
|
||||
case ESRCH:
|
||||
break;
|
||||
default:
|
||||
DEBUGF(fprintf(stderr, "fopen() failed with error: %d %s\n",
|
||||
error, strerror(error)));
|
||||
DEBUGF(fprintf(stderr, "Error opening file: %s\n",
|
||||
hostaliases));
|
||||
*s = NULL;
|
||||
return ARES_EFILE;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -16,7 +16,6 @@
|
||||
*/
|
||||
|
||||
#include "setup.h"
|
||||
#include <sys/types.h>
|
||||
|
||||
#if defined(WIN32) && !defined(WATT32)
|
||||
#include "nameser.h"
|
||||
@@ -73,14 +72,14 @@ void ares_send(ares_channel channel, const unsigned char *qbuf, int qlen,
|
||||
}
|
||||
|
||||
/* Compute the query ID. Start with no timeout. */
|
||||
query->qid = DNS_HEADER_QID(qbuf);
|
||||
query->qid = (unsigned short)DNS_HEADER_QID(qbuf);
|
||||
query->timeout = 0;
|
||||
|
||||
/* Form the TCP query buffer by prepending qlen (as two
|
||||
* network-order bytes) to qbuf.
|
||||
*/
|
||||
query->tcpbuf[0] = (qlen >> 8) & 0xff;
|
||||
query->tcpbuf[1] = qlen & 0xff;
|
||||
query->tcpbuf[0] = (unsigned char)((qlen >> 8) & 0xff);
|
||||
query->tcpbuf[1] = (unsigned char)(qlen & 0xff);
|
||||
memcpy(query->tcpbuf + 2, qbuf, qlen);
|
||||
query->tcplen = qlen + 2;
|
||||
|
||||
|
@@ -41,9 +41,11 @@ const char *ares_strerror(int code)
|
||||
"Out of memory",
|
||||
"Channel is being destroyed",
|
||||
"Misformatted string",
|
||||
"Illegal flags specified"
|
||||
"Illegal flags specified",
|
||||
"Given hostname is not numeric",
|
||||
"Illegal hints flags specified"
|
||||
};
|
||||
|
||||
assert(code >= 0 && code < (int)(sizeof(errtext) / sizeof(*errtext)));
|
||||
DEBUGASSERT(code >= 0 && code < (int)(sizeof(errtext) / sizeof(*errtext)));
|
||||
return errtext[code];
|
||||
}
|
||||
|
@@ -16,7 +16,6 @@
|
||||
*/
|
||||
|
||||
#include "setup.h"
|
||||
#include <sys/types.h>
|
||||
|
||||
#ifdef HAVE_SYS_TIME_H
|
||||
#include <sys/time.h>
|
||||
|
@@ -19,9 +19,7 @@
|
||||
|
||||
#ifndef HAVE_BITNCMP
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include "setup.h"
|
||||
#include "bitncmp.h"
|
||||
|
||||
/*
|
||||
|
@@ -38,6 +38,9 @@
|
||||
/* Define if you have the <time.h> header file. */
|
||||
#define HAVE_TIME_H 1
|
||||
|
||||
/* Define if you have the <process.h> header file. */
|
||||
#define HAVE_PROCESS_H 1
|
||||
|
||||
/* Define if you have the <unistd.h> header file. */
|
||||
#if defined(__MINGW32__) || defined(__WATCOMC__) || defined(__LCC__) || \
|
||||
defined(__POCC__)
|
||||
|
@@ -7,6 +7,15 @@ AM_CONFIG_HEADER(config.h)
|
||||
AM_MAINTAINER_MODE
|
||||
AM_INIT_AUTOMAKE(c-ares, CVS)
|
||||
|
||||
dnl
|
||||
dnl Detect the canonical host and target build environment
|
||||
dnl
|
||||
|
||||
AC_CANONICAL_HOST
|
||||
dnl Get system canonical name
|
||||
AC_DEFINE_UNQUOTED(OS, "${host}", [cpu-machine-OS])
|
||||
|
||||
AC_AIX
|
||||
AC_PROG_CC
|
||||
AC_PROG_INSTALL
|
||||
|
||||
@@ -16,6 +25,7 @@ solaris*)
|
||||
;;
|
||||
esac
|
||||
|
||||
dnl support building of Windows DLLs
|
||||
AC_LIBTOOL_WIN32_DLL
|
||||
|
||||
dnl ************************************************************
|
||||
@@ -61,8 +71,31 @@ AC_HELP_STRING([--disable-debug],[Disable debug options]),
|
||||
AC_MSG_RESULT(no)
|
||||
)
|
||||
|
||||
dnl skip libtool C++ and Fortran compiler checks
|
||||
m4_ifdef([AC_PROG_CXX], [m4_undefine([AC_PROG_CXX])])
|
||||
m4_defun([AC_PROG_CXX],[])
|
||||
m4_ifdef([AC_PROG_F77], [m4_undefine([AC_PROG_F77])])
|
||||
m4_defun([AC_PROG_F77],[])
|
||||
|
||||
dnl skip libtool C++ and Fortran linker checks
|
||||
m4_ifdef([AC_LIBTOOL_CXX], [m4_undefine([AC_LIBTOOL_CXX])])
|
||||
m4_defun([AC_LIBTOOL_CXX],[])
|
||||
m4_ifdef([AC_LIBTOOL_F77], [m4_undefine([AC_LIBTOOL_F77])])
|
||||
m4_defun([AC_LIBTOOL_F77],[])
|
||||
|
||||
dnl force libtool to build static libraries with PIC on AMD64-linux
|
||||
AC_MSG_CHECKING([if arch-OS host is AMD64-linux (to build static libraries with PIC)])
|
||||
case $host in
|
||||
x86_64*linux*)
|
||||
AC_MSG_RESULT([yes])
|
||||
with_pic=yes
|
||||
;;
|
||||
*)
|
||||
AC_MSG_RESULT([no])
|
||||
;;
|
||||
esac
|
||||
|
||||
dnl libtool setup
|
||||
CARES_CLEAR_LIBTOOL_TAGS
|
||||
AC_PROG_LIBTOOL
|
||||
|
||||
AC_MSG_CHECKING([if we need -no-undefined])
|
||||
@@ -77,6 +110,13 @@ esac
|
||||
AC_MSG_RESULT($need_no_undefined)
|
||||
AM_CONDITIONAL(NO_UNDEFINED, test x$need_no_undefined = xyes)
|
||||
|
||||
dnl **********************************************************************
|
||||
dnl check if this is the Intel ICC compiler, and if so make it stricter
|
||||
dnl (convert warning 147 into an error) so that it properly can detect the
|
||||
dnl gethostbyname_r() version
|
||||
dnl **********************************************************************
|
||||
CURL_DETECT_ICC([CFLAGS="$CFLAGS -we 147"])
|
||||
|
||||
dnl **********************************************************************
|
||||
dnl Checks for libraries.
|
||||
dnl **********************************************************************
|
||||
@@ -198,6 +238,77 @@ AC_HELP_STRING([--enable-libgcc],[use libgcc when linking]),
|
||||
AC_MSG_RESULT(no)
|
||||
)
|
||||
|
||||
|
||||
dnl Default is to try the thread-safe versions of a few functions
|
||||
OPT_THREAD=on
|
||||
|
||||
dnl detect AIX 4.3 or later
|
||||
AC_MSG_CHECKING([AIX 4.3 or later])
|
||||
AC_PREPROC_IFELSE([
|
||||
#if defined(_AIX) && defined(_AIX43)
|
||||
printf("just fine");
|
||||
#else
|
||||
#error "this is not AIX 4.3 or later"
|
||||
#endif
|
||||
],
|
||||
[ AC_MSG_RESULT([yes])
|
||||
RECENTAIX=yes
|
||||
OPT_THREAD=off ],
|
||||
[ AC_MSG_RESULT([no]) ]
|
||||
)
|
||||
|
||||
AC_ARG_ENABLE(thread,dnl
|
||||
AC_HELP_STRING([--disable-thread],[don't look for thread-safe functions])
|
||||
AC_HELP_STRING([--enable-thread],[look for thread-safe functions]),
|
||||
[ case "$enableval" in
|
||||
no)
|
||||
OPT_THREAD=off
|
||||
AC_MSG_WARN(c-ares will not get built using thread-safe functions)
|
||||
;;
|
||||
*)
|
||||
;;
|
||||
esac
|
||||
]
|
||||
)
|
||||
|
||||
if test X"$OPT_THREAD" = Xoff
|
||||
then
|
||||
AC_DEFINE(DISABLED_THREADSAFE, 1,
|
||||
[Set to explicitly specify we don't want to use thread-safe functions])
|
||||
fi
|
||||
|
||||
dnl for recent AIX versions, we skip all the thread-safe checks above since
|
||||
dnl they claim a thread-safe libc using the standard API. But there are
|
||||
dnl some functions still not thread-safe. Check for these!
|
||||
|
||||
dnl Let's hope this split URL remains working:
|
||||
dnl http://publibn.boulder.ibm.com/doc_link/en_US/a_doc_lib/aixprggd/ \
|
||||
dnl genprogc/thread_quick_ref.htm
|
||||
|
||||
if test "x$RECENTAIX" = "xyes"; then
|
||||
|
||||
AC_DEFINE(_THREAD_SAFE, 1, [define this if you need it to compile thread-safe code])
|
||||
|
||||
dnl check if this is the IBM xlc compiler
|
||||
dnl Details thanks to => http://predef.sourceforge.net/
|
||||
AC_MSG_CHECKING([if this is the xlc compiler])
|
||||
AC_EGREP_CPP([^__xlC__], [__xlC__],
|
||||
dnl action if the text is found, this it has not been replaced by the
|
||||
dnl cpp
|
||||
XLC="no"
|
||||
AC_MSG_RESULT([no]),
|
||||
dnl the text was not found, it was replaced by the cpp
|
||||
XLC="yes"
|
||||
AC_MSG_RESULT([yes])
|
||||
CFLAGS="$CFLAGS -qthreaded"
|
||||
dnl AIX xlc has to have strict aliasing turned off. If not,
|
||||
dnl the optimizer assumes that pointers can only point to
|
||||
dnl an object of the same type.
|
||||
CFLAGS="$CFLAGS -qnoansialias"
|
||||
)
|
||||
fi
|
||||
|
||||
|
||||
dnl **********************************************************************
|
||||
dnl Back to "normal" configuring
|
||||
dnl **********************************************************************
|
||||
@@ -229,6 +340,8 @@ AC_CHECK_HEADERS(
|
||||
netdb.h \
|
||||
netinet/in.h \
|
||||
net/if.h \
|
||||
errno.h \
|
||||
stdbool.h \
|
||||
arpa/nameser.h \
|
||||
arpa/nameser_compat.h \
|
||||
arpa/inet.h,
|
||||
@@ -290,6 +403,19 @@ fi
|
||||
AC_CHECK_TYPE(ssize_t, ,
|
||||
AC_DEFINE(ssize_t, int, [the signed version of size_t]))
|
||||
|
||||
# check for bool type
|
||||
AC_CHECK_TYPE([bool],[
|
||||
AC_DEFINE(HAVE_BOOL_T, 1,
|
||||
[Define to 1 if bool is an available type.])
|
||||
], ,[
|
||||
#ifdef HAVE_SYS_TYPES_H
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
#ifdef HAVE_STDBOOL_H
|
||||
#include <stdbool.h>
|
||||
#endif
|
||||
])
|
||||
|
||||
# Check for socklen_t or equivalent
|
||||
CURL_CHECK_TYPE_SOCKLEN_T
|
||||
|
||||
|
@@ -19,9 +19,6 @@
|
||||
|
||||
#include "setup.h"
|
||||
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
#if defined(WIN32) && !defined(WATT32)
|
||||
#include "nameser.h"
|
||||
#else
|
||||
@@ -66,6 +63,11 @@
|
||||
* note:
|
||||
* network byte order assumed. this means 192.5.5.240/28 has
|
||||
* 0b11110000 in its fourth octet.
|
||||
* note:
|
||||
* On Windows we store the error in the thread errno, not
|
||||
* in the winsock error code. This is to avoid loosing the
|
||||
* actual last winsock error. So use macro ERRNO to fetch the
|
||||
* errno this funtion sets when returning (-1), not SOCKERRNO.
|
||||
* author:
|
||||
* Paul Vixie (ISC), June 1996
|
||||
*/
|
||||
@@ -86,7 +88,7 @@ inet_net_pton_ipv4(const char *src, unsigned char *dst, size_t size)
|
||||
dirty = 0;
|
||||
src++; /* skip x or X. */
|
||||
while ((ch = *src++) != '\0' && ISXDIGIT(ch)) {
|
||||
if (isupper(ch))
|
||||
if (ISUPPER(ch))
|
||||
ch = tolower(ch);
|
||||
n = (int)(strchr(xdigits, ch) - xdigits);
|
||||
if (dirty == 0)
|
||||
@@ -186,11 +188,11 @@ inet_net_pton_ipv4(const char *src, unsigned char *dst, size_t size)
|
||||
return (bits);
|
||||
|
||||
enoent:
|
||||
errno = ENOENT;
|
||||
SET_ERRNO(ENOENT);
|
||||
return (-1);
|
||||
|
||||
emsgsize:
|
||||
errno = EMSGSIZE;
|
||||
SET_ERRNO(EMSGSIZE);
|
||||
return (-1);
|
||||
}
|
||||
|
||||
@@ -252,7 +254,7 @@ getv4(const char *src, unsigned char *dst, int *bitsp)
|
||||
if (ch == '.' || ch == '/') {
|
||||
if (dst - odst > 3) /* too many octets? */
|
||||
return (0);
|
||||
*dst++ = val;
|
||||
*dst++ = (unsigned char)val;
|
||||
if (ch == '/')
|
||||
return (getbits(src, bitsp));
|
||||
val = 0;
|
||||
@@ -265,7 +267,7 @@ getv4(const char *src, unsigned char *dst, int *bitsp)
|
||||
return (0);
|
||||
if (dst - odst > 3) /* too many octets? */
|
||||
return (0);
|
||||
*dst++ = val;
|
||||
*dst++ = (unsigned char)val;
|
||||
return (1);
|
||||
}
|
||||
|
||||
@@ -321,8 +323,8 @@ inet_net_pton_ipv6(const char *src, unsigned char *dst, size_t size)
|
||||
goto enoent;
|
||||
if (tp + NS_INT16SZ > endp)
|
||||
return (0);
|
||||
*tp++ = (unsigned char) (val >> 8) & 0xff;
|
||||
*tp++ = (unsigned char) val & 0xff;
|
||||
*tp++ = (unsigned char)((val >> 8) & 0xff);
|
||||
*tp++ = (unsigned char)(val & 0xff);
|
||||
saw_xdigit = 0;
|
||||
digits = 0;
|
||||
val = 0;
|
||||
@@ -342,8 +344,8 @@ inet_net_pton_ipv6(const char *src, unsigned char *dst, size_t size)
|
||||
if (saw_xdigit) {
|
||||
if (tp + NS_INT16SZ > endp)
|
||||
goto enoent;
|
||||
*tp++ = (unsigned char) (val >> 8) & 0xff;
|
||||
*tp++ = (unsigned char) val & 0xff;
|
||||
*tp++ = (unsigned char)((val >> 8) & 0xff);
|
||||
*tp++ = (unsigned char)(val & 0xff);
|
||||
}
|
||||
if (bits == -1)
|
||||
bits = 128;
|
||||
@@ -381,11 +383,11 @@ inet_net_pton_ipv6(const char *src, unsigned char *dst, size_t size)
|
||||
return (bits);
|
||||
|
||||
enoent:
|
||||
errno = ENOENT;
|
||||
SET_ERRNO(ENOENT);
|
||||
return (-1);
|
||||
|
||||
emsgsize:
|
||||
errno = EMSGSIZE;
|
||||
SET_ERRNO(EMSGSIZE);
|
||||
return (-1);
|
||||
}
|
||||
|
||||
@@ -399,6 +401,11 @@ inet_net_pton_ipv6(const char *src, unsigned char *dst, size_t size)
|
||||
* number of bits, either imputed classfully or specified with /CIDR,
|
||||
* or -1 if some failure occurred (check errno). ENOENT means it was
|
||||
* not a valid network specification.
|
||||
* note:
|
||||
* On Windows we store the error in the thread errno, not
|
||||
* in the winsock error code. This is to avoid loosing the
|
||||
* actual last winsock error. So use macro ERRNO to fetch the
|
||||
* errno this funtion sets when returning (-1), not SOCKERRNO.
|
||||
* author:
|
||||
* Paul Vixie (ISC), June 1996
|
||||
*/
|
||||
@@ -411,7 +418,7 @@ ares_inet_net_pton(int af, const char *src, void *dst, size_t size)
|
||||
case AF_INET6:
|
||||
return (inet_net_pton_ipv6(src, dst, size));
|
||||
default:
|
||||
errno = EAFNOSUPPORT;
|
||||
SET_ERRNO(EAFNOSUPPORT);
|
||||
return (-1);
|
||||
}
|
||||
}
|
||||
@@ -429,11 +436,11 @@ int ares_inet_pton(int af, const char *src, void *dst)
|
||||
size = sizeof(struct in6_addr);
|
||||
else
|
||||
{
|
||||
errno = EAFNOSUPPORT;
|
||||
SET_ERRNO(EAFNOSUPPORT);
|
||||
return -1;
|
||||
}
|
||||
result = ares_inet_net_pton(af, src, dst, size);
|
||||
if (result == -1 && errno == ENOENT)
|
||||
if (result == -1 && ERRNO == ENOENT)
|
||||
return 0;
|
||||
return (result > -1 ? 1 : -1);
|
||||
}
|
||||
|
@@ -18,8 +18,6 @@
|
||||
|
||||
#include "setup.h"
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
#if defined(WIN32) && !defined(WATT32)
|
||||
#include "nameser.h"
|
||||
#else
|
||||
@@ -68,6 +66,11 @@ static const char *inet_ntop6(const unsigned char *src, char *dst, size_t size);
|
||||
* convert a network format address to presentation format.
|
||||
* return:
|
||||
* pointer to presentation format address (`dst'), or NULL (see errno).
|
||||
* note:
|
||||
* On Windows we store the error in the thread errno, not
|
||||
* in the winsock error code. This is to avoid loosing the
|
||||
* actual last winsock error. So use macro ERRNO to fetch the
|
||||
* errno this funtion sets when returning NULL, not SOCKERRNO.
|
||||
* author:
|
||||
* Paul Vixie, 1996.
|
||||
*/
|
||||
@@ -81,7 +84,7 @@ ares_inet_ntop(int af, const void *src, char *dst, size_t size)
|
||||
case AF_INET6:
|
||||
return (inet_ntop6(src, dst, size));
|
||||
default:
|
||||
errno = EAFNOSUPPORT;
|
||||
SET_ERRNO(EAFNOSUPPORT);
|
||||
return (NULL);
|
||||
}
|
||||
/* NOTREACHED */
|
||||
@@ -106,7 +109,7 @@ inet_ntop4(const unsigned char *src, char *dst, size_t size)
|
||||
|
||||
if (SPRINTF((tmp, fmt, src[0], src[1], src[2], src[3])) > size)
|
||||
{
|
||||
errno = ENOSPC;
|
||||
SET_ERRNO(ENOSPC);
|
||||
return (NULL);
|
||||
}
|
||||
strcpy(dst, tmp);
|
||||
@@ -218,7 +221,7 @@ inet_ntop6(const unsigned char *src, char *dst, size_t size)
|
||||
*/
|
||||
if ((size_t)(tp - tmp) > size)
|
||||
{
|
||||
errno = ENOSPC;
|
||||
SET_ERRNO(ENOSPC);
|
||||
return (NULL);
|
||||
}
|
||||
strcpy(dst, tmp);
|
||||
|
@@ -18,11 +18,6 @@
|
||||
|
||||
#define MAXHOSTNAMELEN 256
|
||||
|
||||
#define EINPROGRESS WSAEINPROGRESS
|
||||
#define EWOULDBLOCK WSAEWOULDBLOCK
|
||||
#define EMSGSIZE WSAEMSGSIZE
|
||||
#define EAFNOSUPPORT WSAEAFNOSUPPORT
|
||||
|
||||
/* Structure for scatter/gather I/O. */
|
||||
struct iovec
|
||||
{
|
||||
@@ -30,7 +25,9 @@ struct iovec
|
||||
size_t iov_len; /* Length of data. */
|
||||
};
|
||||
|
||||
#ifndef __WATCOMC__
|
||||
#define getpid() _getpid()
|
||||
#endif
|
||||
|
||||
int ares_writev (SOCKET s, const struct iovec *vector, size_t count);
|
||||
#define writev(s,vect,count) ares_writev(s,vect,count)
|
||||
|
@@ -133,7 +133,7 @@ typedef int ares_socket_t;
|
||||
* Assume a few thing unless they're set by configure
|
||||
*/
|
||||
|
||||
#if !defined(HAVE_SYS_TIME_H) && !defined(_MSC_VER)
|
||||
#if !defined(HAVE_SYS_TIME_H) && !defined(_MSC_VER) && !defined(__WATCOMC__)
|
||||
#define HAVE_SYS_TIME_H
|
||||
#endif
|
||||
|
||||
|
@@ -27,6 +27,58 @@
|
||||
********************************************************************/
|
||||
|
||||
|
||||
/*
|
||||
* Inclusion of common header files.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdarg.h>
|
||||
#include <ctype.h>
|
||||
#include <errno.h>
|
||||
|
||||
#ifdef HAVE_SYS_TYPES_H
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_SYS_STAT_H
|
||||
#include <sys/stat.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_SYS_TIME_H
|
||||
#include <sys/time.h>
|
||||
#ifdef TIME_WITH_SYS_TIME
|
||||
#include <time.h>
|
||||
#endif
|
||||
#else
|
||||
#ifdef HAVE_TIME_H
|
||||
#include <time.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef WIN32
|
||||
#include <io.h>
|
||||
#include <fcntl.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_STDBOOL_H
|
||||
#include <stdbool.h>
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* Definition of timeval struct for platforms that don't have it.
|
||||
*/
|
||||
|
||||
#ifndef HAVE_STRUCT_TIMEVAL
|
||||
struct timeval {
|
||||
long tv_sec;
|
||||
long tv_usec;
|
||||
};
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* If we have the MSG_NOSIGNAL define, make sure we use
|
||||
* it as the fourth argument of function send()
|
||||
@@ -121,6 +173,33 @@
|
||||
#define ISGRAPH(x) (isgraph((int) ((unsigned char)x)))
|
||||
#define ISALPHA(x) (isalpha((int) ((unsigned char)x)))
|
||||
#define ISPRINT(x) (isprint((int) ((unsigned char)x)))
|
||||
#define ISUPPER(x) (isupper((int) ((unsigned char)x)))
|
||||
#define ISLOWER(x) (islower((int) ((unsigned char)x)))
|
||||
|
||||
#define ISBLANK(x) (int)((((unsigned char)x) == ' ') || \
|
||||
(((unsigned char)x) == '\t'))
|
||||
|
||||
|
||||
/*
|
||||
* Typedef to 'unsigned char' if bool is not an available 'typedefed' type.
|
||||
*/
|
||||
|
||||
#ifndef HAVE_BOOL_T
|
||||
typedef unsigned char bool;
|
||||
#define HAVE_BOOL_T
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* Default definition of uppercase TRUE and FALSE.
|
||||
*/
|
||||
|
||||
#ifndef TRUE
|
||||
#define TRUE 1
|
||||
#endif
|
||||
#ifndef FALSE
|
||||
#define FALSE 0
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
@@ -133,6 +212,17 @@ typedef int sig_atomic_t;
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* Convenience SIG_ATOMIC_T definition
|
||||
*/
|
||||
|
||||
#ifdef HAVE_SIG_ATOMIC_T_VOLATILE
|
||||
#define SIG_ATOMIC_T static sig_atomic_t
|
||||
#else
|
||||
#define SIG_ATOMIC_T static volatile sig_atomic_t
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* Default return type for signal handlers.
|
||||
*/
|
||||
@@ -142,5 +232,110 @@ typedef int sig_atomic_t;
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* Macro used to include code only in debug builds.
|
||||
*/
|
||||
|
||||
#ifdef CURLDEBUG
|
||||
#define DEBUGF(x) x
|
||||
#else
|
||||
#define DEBUGF(x) do { } while (0)
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* Macro used to include assertion code only in debug builds.
|
||||
*/
|
||||
|
||||
#if defined(CURLDEBUG) && defined(HAVE_ASSERT_H)
|
||||
#define DEBUGASSERT(x) assert(x)
|
||||
#else
|
||||
#define DEBUGASSERT(x) do { } while (0)
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* Macro SOCKERRNO / SET_SOCKERRNO() returns / sets the *socket-related* errno
|
||||
* (or equivalent) on this platform to hide platform details to code using it.
|
||||
*/
|
||||
|
||||
#ifdef USE_WINSOCK
|
||||
#define SOCKERRNO ((int)WSAGetLastError())
|
||||
#define SET_SOCKERRNO(x) (WSASetLastError((int)(x)))
|
||||
#else
|
||||
#define SOCKERRNO (errno)
|
||||
#define SET_SOCKERRNO(x) (errno = (x))
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* Macro ERRNO / SET_ERRNO() returns / sets the NOT *socket-related* errno
|
||||
* (or equivalent) on this platform to hide platform details to code using it.
|
||||
*/
|
||||
|
||||
#ifdef WIN32
|
||||
#define ERRNO ((int)GetLastError())
|
||||
#define SET_ERRNO(x) (SetLastError((DWORD)(x)))
|
||||
#else
|
||||
#define ERRNO (errno)
|
||||
#define SET_ERRNO(x) (errno = (x))
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* Portable error number symbolic names defined to Winsock error codes.
|
||||
*/
|
||||
|
||||
#ifdef USE_WINSOCK
|
||||
#undef EBADF /* override definition in errno.h */
|
||||
#define EBADF WSAEBADF
|
||||
#undef EINTR /* override definition in errno.h */
|
||||
#define EINTR WSAEINTR
|
||||
#undef EINVAL /* override definition in errno.h */
|
||||
#define EINVAL WSAEINVAL
|
||||
#define EWOULDBLOCK WSAEWOULDBLOCK
|
||||
#define EINPROGRESS WSAEINPROGRESS
|
||||
#define EALREADY WSAEALREADY
|
||||
#define ENOTSOCK WSAENOTSOCK
|
||||
#define EDESTADDRREQ WSAEDESTADDRREQ
|
||||
#define EMSGSIZE WSAEMSGSIZE
|
||||
#define EPROTOTYPE WSAEPROTOTYPE
|
||||
#define ENOPROTOOPT WSAENOPROTOOPT
|
||||
#define EPROTONOSUPPORT WSAEPROTONOSUPPORT
|
||||
#define ESOCKTNOSUPPORT WSAESOCKTNOSUPPORT
|
||||
#define EOPNOTSUPP WSAEOPNOTSUPP
|
||||
#define EPFNOSUPPORT WSAEPFNOSUPPORT
|
||||
#define EAFNOSUPPORT WSAEAFNOSUPPORT
|
||||
#define EADDRINUSE WSAEADDRINUSE
|
||||
#define EADDRNOTAVAIL WSAEADDRNOTAVAIL
|
||||
#define ENETDOWN WSAENETDOWN
|
||||
#define ENETUNREACH WSAENETUNREACH
|
||||
#define ENETRESET WSAENETRESET
|
||||
#define ECONNABORTED WSAECONNABORTED
|
||||
#define ECONNRESET WSAECONNRESET
|
||||
#define ENOBUFS WSAENOBUFS
|
||||
#define EISCONN WSAEISCONN
|
||||
#define ENOTCONN WSAENOTCONN
|
||||
#define ESHUTDOWN WSAESHUTDOWN
|
||||
#define ETOOMANYREFS WSAETOOMANYREFS
|
||||
#define ETIMEDOUT WSAETIMEDOUT
|
||||
#define ECONNREFUSED WSAECONNREFUSED
|
||||
#define ELOOP WSAELOOP
|
||||
#ifndef ENAMETOOLONG /* possible previous definition in errno.h */
|
||||
#define ENAMETOOLONG WSAENAMETOOLONG
|
||||
#endif
|
||||
#define EHOSTDOWN WSAEHOSTDOWN
|
||||
#define EHOSTUNREACH WSAEHOSTUNREACH
|
||||
#ifndef ENOTEMPTY /* possible previous definition in errno.h */
|
||||
#define ENOTEMPTY WSAENOTEMPTY
|
||||
#endif
|
||||
#define EPROCLIM WSAEPROCLIM
|
||||
#define EUSERS WSAEUSERS
|
||||
#define EDQUOT WSAEDQUOT
|
||||
#define ESTALE WSAESTALE
|
||||
#define EREMOTE WSAEREMOTE
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* __SETUP_ONCE_H */
|
||||
|
||||
|
@@ -20,6 +20,20 @@
|
||||
#include "ares.h"
|
||||
#include "ares_private.h"
|
||||
|
||||
#ifdef __WATCOMC__
|
||||
/*
|
||||
* Watcom needs a DllMain() in order to initialise the clib startup code.
|
||||
*/
|
||||
BOOL
|
||||
WINAPI DllMain (HINSTANCE hnd, DWORD reason, LPVOID reserved)
|
||||
{
|
||||
(void) hnd;
|
||||
(void) reason;
|
||||
(void) reserved;
|
||||
return (TRUE);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef __MINGW32__
|
||||
int
|
||||
ares_strncasecmp(const char *a, const char *b, int n)
|
||||
@@ -27,8 +41,8 @@ ares_strncasecmp(const char *a, const char *b, int n)
|
||||
int i;
|
||||
|
||||
for (i = 0; i < n; i++) {
|
||||
int c1 = isupper(a[i]) ? tolower(a[i]) : a[i];
|
||||
int c2 = isupper(b[i]) ? tolower(b[i]) : b[i];
|
||||
int c1 = ISUPPER(a[i]) ? tolower(a[i]) : a[i];
|
||||
int c2 = ISUPPER(b[i]) ? tolower(b[i]) : b[i];
|
||||
if (c1 != c2) return c1-c2;
|
||||
}
|
||||
return 0;
|
||||
@@ -91,7 +105,7 @@ ares_writev (ares_socket_t s, const struct iovec *vector, size_t count)
|
||||
buffer = bp = (char*) alloca (bytes);
|
||||
if (!buffer)
|
||||
{
|
||||
errno = ENOMEM;
|
||||
SET_ERRNO(ENOMEM);
|
||||
return (-1);
|
||||
}
|
||||
|
||||
|
414
configure.ac
414
configure.ac
@@ -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
|
||||
@@ -90,6 +90,11 @@ dnl initialize all the info variables
|
||||
curl_verbose_msg="enabled (--disable-verbose)"
|
||||
curl_sspi_msg="no (--enable-sspi)"
|
||||
|
||||
dnl
|
||||
dnl Save anything in $LIBS for later
|
||||
dnl
|
||||
ALL_LIBS=$LIBS
|
||||
|
||||
dnl
|
||||
dnl Detect the canonical host and target build environment
|
||||
dnl
|
||||
@@ -107,9 +112,33 @@ AC_PROG_CC
|
||||
dnl check for how to do large files
|
||||
AC_SYS_LARGEFILE
|
||||
|
||||
dnl check for cygwin stuff
|
||||
dnl support building of Windows DLLs
|
||||
AC_LIBTOOL_WIN32_DLL
|
||||
|
||||
dnl skip libtool C++ and Fortran compiler checks
|
||||
m4_ifdef([AC_PROG_CXX], [m4_undefine([AC_PROG_CXX])])
|
||||
m4_defun([AC_PROG_CXX],[])
|
||||
m4_ifdef([AC_PROG_F77], [m4_undefine([AC_PROG_F77])])
|
||||
m4_defun([AC_PROG_F77],[])
|
||||
|
||||
dnl skip libtool C++ and Fortran linker checks
|
||||
m4_ifdef([AC_LIBTOOL_CXX], [m4_undefine([AC_LIBTOOL_CXX])])
|
||||
m4_defun([AC_LIBTOOL_CXX],[])
|
||||
m4_ifdef([AC_LIBTOOL_F77], [m4_undefine([AC_LIBTOOL_F77])])
|
||||
m4_defun([AC_LIBTOOL_F77],[])
|
||||
|
||||
dnl force libtool to build static libraries with PIC on AMD64-linux
|
||||
AC_MSG_CHECKING([if arch-OS host is AMD64-linux (to build static libraries with PIC)])
|
||||
case $host in
|
||||
x86_64*linux*)
|
||||
AC_MSG_RESULT([yes])
|
||||
with_pic=yes
|
||||
;;
|
||||
*)
|
||||
AC_MSG_RESULT([no])
|
||||
;;
|
||||
esac
|
||||
|
||||
dnl libtool setup
|
||||
AC_PROG_LIBTOOL
|
||||
|
||||
@@ -158,6 +187,15 @@ case $host in
|
||||
;;
|
||||
esac
|
||||
|
||||
# Determine whether all dependent libraries must be specified when linking
|
||||
if test "X$enable_shared" = "Xyes" -a "X$link_all_deplibs" = "Xno"
|
||||
then
|
||||
REQUIRE_LIB_DEPS=no
|
||||
else
|
||||
REQUIRE_LIB_DEPS=yes
|
||||
fi
|
||||
AC_SUBST(REQUIRE_LIB_DEPS)
|
||||
|
||||
dnl The install stuff has already been taken care of by the automake stuff
|
||||
dnl AC_PROG_INSTALL
|
||||
AC_PROG_MAKE_SET
|
||||
@@ -418,15 +456,20 @@ 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) ])
|
||||
dnl **********************************************************************
|
||||
dnl The preceding library checks are all potentially useful for test
|
||||
dnl servers (for providing networking support). Save the list of required
|
||||
dnl libraries at this point for use while linking those test servers.
|
||||
dnl **********************************************************************
|
||||
TEST_SERVER_LIBS=$LIBS
|
||||
|
||||
dnl **********************************************************************
|
||||
AC_MSG_CHECKING([whether to use libgcc])
|
||||
AC_ARG_ENABLE(libgcc,
|
||||
AC_HELP_STRING([--enable-libgcc],[use libgcc when linking]),
|
||||
[ case "$enableval" in
|
||||
yes)
|
||||
LIBS="$LIBS -lgcc"
|
||||
ALL_LIBS="$ALL_LIBS -lgcc"
|
||||
AC_MSG_RESULT(yes)
|
||||
;;
|
||||
*) AC_MSG_RESULT(no)
|
||||
@@ -435,6 +478,9 @@ AC_HELP_STRING([--enable-libgcc],[use libgcc when linking]),
|
||||
AC_MSG_RESULT(no)
|
||||
)
|
||||
|
||||
dnl dl lib?
|
||||
AC_CHECK_FUNC(dlclose, , [ AC_CHECK_LIB(dl, dlopen) ])
|
||||
|
||||
dnl **********************************************************************
|
||||
dnl Check for the name of dynamic OpenLDAP libraries
|
||||
dnl **********************************************************************
|
||||
@@ -1022,12 +1068,35 @@ if test X"$OPT_SSL" != Xno; then
|
||||
])
|
||||
|
||||
dnl these can only exist if openssl exists
|
||||
dnl yassl doesn't have SSL_get_shutdown
|
||||
|
||||
AC_CHECK_FUNCS( RAND_status \
|
||||
RAND_screen \
|
||||
RAND_egd \
|
||||
CRYPTO_cleanup_all_ex_data )
|
||||
CRYPTO_cleanup_all_ex_data \
|
||||
SSL_get_shutdown )
|
||||
|
||||
dnl Make an attempt to detect if this is actually yassl's headers and
|
||||
dnl OpenSSL emulation layer. We still leave everything else believing
|
||||
dnl and acting like OpenSSL.
|
||||
|
||||
AC_MSG_CHECKING([for yaSSL using OpenSSL compatibility mode])
|
||||
AC_TRY_COMPILE([
|
||||
#include <openssl/ssl.h>
|
||||
],[
|
||||
#if defined(YASSL_VERSION) && defined(OPENSSL_VERSION_NUMBER)
|
||||
int dummy = SSL_ERROR_NONE;
|
||||
#else
|
||||
Not the yaSSL OpenSSL compatibility header.
|
||||
#endif
|
||||
],[
|
||||
AC_MSG_RESULT([yes])
|
||||
AC_DEFINE_UNQUOTED(USE_YASSLEMUL, 1,
|
||||
[Define to 1 if using yaSSL in OpenSSL compatibility mode.])
|
||||
curl_ssl_msg="enabled (OpenSSL emulation by yaSSL)"
|
||||
],[
|
||||
AC_MSG_RESULT([no])
|
||||
])
|
||||
fi
|
||||
|
||||
if test "$OPENSSL_ENABLED" = "1"; then
|
||||
@@ -1044,6 +1113,91 @@ if test X"$OPT_SSL" != Xno; then
|
||||
|
||||
fi
|
||||
|
||||
dnl **********************************************************************
|
||||
dnl Check for the presence of ZLIB libraries and headers
|
||||
dnl **********************************************************************
|
||||
|
||||
dnl Check for & handle argument to --with-zlib.
|
||||
|
||||
_cppflags=$CPPFLAGS
|
||||
_ldflags=$LDFLAGS
|
||||
AC_ARG_WITH(zlib,
|
||||
AC_HELP_STRING([--with-zlib=PATH],[search for zlib in PATH])
|
||||
AC_HELP_STRING([--without-zlib],[disable use of zlib]),
|
||||
[OPT_ZLIB="$withval"])
|
||||
|
||||
if test "$OPT_ZLIB" = "no" ; then
|
||||
AC_MSG_WARN([zlib disabled])
|
||||
else
|
||||
if test "$OPT_ZLIB" = "yes" ; then
|
||||
OPT_ZLIB=""
|
||||
fi
|
||||
|
||||
if test -z "$OPT_ZLIB" ; then
|
||||
dnl check for the lib first without setting any new path, since many
|
||||
dnl people have it in the default path
|
||||
|
||||
AC_CHECK_LIB(z, inflateEnd,
|
||||
dnl libz found, set the variable
|
||||
[HAVE_LIBZ="1"],
|
||||
dnl if no lib found, try /usr/local
|
||||
[OPT_ZLIB="/usr/local"])
|
||||
|
||||
fi
|
||||
|
||||
dnl Add a nonempty path to the compiler flags
|
||||
if test -n "$OPT_ZLIB"; then
|
||||
CPPFLAGS="$CPPFLAGS -I$OPT_ZLIB/include"
|
||||
LDFLAGS="$LDFLAGS -L$OPT_ZLIB/lib$libsuff"
|
||||
fi
|
||||
|
||||
AC_CHECK_HEADER(zlib.h,
|
||||
[
|
||||
dnl zlib.h was found
|
||||
HAVE_ZLIB_H="1"
|
||||
dnl if the lib wasn't found already, try again with the new paths
|
||||
if test "$HAVE_LIBZ" != "1"; then
|
||||
AC_CHECK_LIB(z, gzread,
|
||||
[
|
||||
dnl the lib was found!
|
||||
HAVE_LIBZ="1"
|
||||
],
|
||||
[ CPPFLAGS=$_cppflags
|
||||
LDFLAGS=$_ldflags])
|
||||
fi
|
||||
],
|
||||
[
|
||||
dnl zlib.h was not found, restore the flags
|
||||
CPPFLAGS=$_cppflags
|
||||
LDFLAGS=$_ldflags]
|
||||
)
|
||||
|
||||
if test "$HAVE_LIBZ" = "1" && test "$HAVE_ZLIB_H" != "1"
|
||||
then
|
||||
AC_MSG_WARN([configure found only the libz lib, not the header file!])
|
||||
elif test "$HAVE_LIBZ" != "1" && test "$HAVE_ZLIB_H" = "1"
|
||||
then
|
||||
AC_MSG_WARN([configure found only the libz header file, not the lib!])
|
||||
elif test "$HAVE_LIBZ" = "1" && test "$HAVE_ZLIB_H" = "1"
|
||||
then
|
||||
dnl both header and lib were found!
|
||||
AC_SUBST(HAVE_LIBZ)
|
||||
AC_DEFINE(HAVE_ZLIB_H, 1, [if you have the zlib.h header file])
|
||||
AC_DEFINE(HAVE_LIBZ, 1, [if zlib is available])
|
||||
|
||||
CURL_LIBS="$CURL_LIBS -lz"
|
||||
LIBS="$LIBS -lz"
|
||||
|
||||
dnl replace 'HAVE_LIBZ' in the automake makefile.ams
|
||||
AMFIXLIB="1"
|
||||
AC_MSG_NOTICE([found both libz and libz.h header])
|
||||
curl_zlib_msg="enabled"
|
||||
fi
|
||||
fi
|
||||
|
||||
dnl set variable for use in automakefile(s)
|
||||
AM_CONDITIONAL(HAVE_LIBZ, test x"$AMFIXLIB" = x1)
|
||||
|
||||
dnl **********************************************************************
|
||||
dnl Check for the presence of LIBSSH2 libraries and headers
|
||||
dnl **********************************************************************
|
||||
@@ -1080,23 +1234,16 @@ if test X"$OPT_LIBSSH2" != Xno; then
|
||||
;;
|
||||
esac
|
||||
|
||||
if test X"$HAVECRYPTO" = X"yes"; then
|
||||
dnl This is only reasonable to do if crypto actually is there: check for
|
||||
dnl LIBSSH2 libs NOTE: it is important to do this AFTER the crypto lib
|
||||
AC_CHECK_LIB(ssh2, libssh2_channel_open_ex)
|
||||
|
||||
AC_CHECK_HEADERS(libssh2.h,
|
||||
curl_ssh_msg="enabled (libSSH2)"
|
||||
LIBSSH2_ENABLED=1
|
||||
AC_DEFINE(USE_LIBSSH2, 1, [if libSSH2 is in use]))
|
||||
|
||||
AC_CHECK_LIB(ssh2, libssh2_channel_open_ex)
|
||||
|
||||
AC_CHECK_HEADERS(libssh2.h,
|
||||
curl_ssh_msg="enabled (libSSH2)"
|
||||
LIBSSH2_ENABLED=1
|
||||
AC_DEFINE(USE_LIBSSH2, 1, [if libSSH2 is in use]))
|
||||
|
||||
if test X"$OPT_LIBSSH2" != Xoff &&
|
||||
test "$LIBSSH2_ENABLED" != "1"; then
|
||||
AC_MSG_ERROR([libSSH2 libs and/or directories were not found where specified!])
|
||||
fi
|
||||
else
|
||||
AC_MSG_WARN([without the use of OpenSSL libs, libssh2 cannot work])
|
||||
if test X"$OPT_LIBSSH2" != Xoff &&
|
||||
test "$LIBSSH2_ENABLED" != "1"; then
|
||||
AC_MSG_ERROR([libSSH2 libs and/or directories were not found where specified!])
|
||||
fi
|
||||
|
||||
if test "$LIBSSH2_ENABLED" = "1"; then
|
||||
@@ -1190,6 +1337,7 @@ if test "$OPENSSL_ENABLED" != "1"; then
|
||||
[
|
||||
AC_DEFINE(USE_GNUTLS, 1, [if GnuTLS is enabled])
|
||||
AC_SUBST(USE_GNUTLS, [1])
|
||||
GNUTLS_ENABLED = 1
|
||||
USE_GNUTLS="yes"
|
||||
curl_ssl_msg="enabled (GnuTLS)"
|
||||
],
|
||||
@@ -1215,13 +1363,85 @@ if test "$OPENSSL_ENABLED" != "1"; then
|
||||
|
||||
fi dnl GNUTLS not disabled
|
||||
|
||||
if test X"$USE_GNUTLS" != "Xyes"; then
|
||||
AC_MSG_WARN([SSL disabled, you will not be able to use HTTPS, FTPS, NTLM and more.])
|
||||
AC_MSG_WARN([Use --with-ssl or --with-gnutls to address this.])
|
||||
fi
|
||||
|
||||
fi dnl OPENSSL != 1
|
||||
|
||||
dnl ----------------------------------------------------
|
||||
dnl NSS. Only check if GnuTLS and OpenSSL are not enabled
|
||||
dnl ----------------------------------------------------
|
||||
|
||||
dnl Default to compiler & linker defaults for NSS files & libraries.
|
||||
OPT_NSS=no
|
||||
|
||||
AC_ARG_WITH(nss,dnl
|
||||
AC_HELP_STRING([--with-nss=PATH],[where to look for NSS, PATH points to the installation root (default: /usr/local/)])
|
||||
AC_HELP_STRING([--without-nss], [disable NSS detection]),
|
||||
OPT_NSS=$withval)
|
||||
|
||||
if test "$OPENSSL_ENABLED" != "1" -a "$GNUTLS_ENABLED" != "1"; then
|
||||
|
||||
if test X"$OPT_NSS" != Xno; then
|
||||
if test "x$OPT_NSS" = "xyes"; then
|
||||
check=`pkg-config --version 2>/dev/null`
|
||||
if test -n "$check"; then
|
||||
addlib=`pkg-config --libs nss`
|
||||
addcflags=`pkg-config --cflags nss`
|
||||
version=`pkg-config --modversion nss`
|
||||
nssprefix=`pkg-config --variable=prefix nss`
|
||||
fi
|
||||
else
|
||||
# Without pkg-config, we'll kludge in some defaults
|
||||
addlib="-lssl3 -lsmime3 -lnss3 -lplds4 -lplc4 -lnspr4 -lpthread -ldl"
|
||||
addcflags="-I$OPT_NSS/include"
|
||||
version="unknown"
|
||||
gtlsprefix=$OPT_GNUTLS
|
||||
fi
|
||||
if test -n "$addlib"; then
|
||||
|
||||
CLEANLIBS="$LIBS"
|
||||
CLEANCPPFLAGS="$CPPFLAGS"
|
||||
|
||||
LIBS="$LIBS $addlib"
|
||||
if test "$addcflags" != "-I/usr/include"; then
|
||||
CPPFLAGS="$CPPFLAGS $addcflags"
|
||||
fi
|
||||
|
||||
AC_CHECK_LIB(nss3, NSS_Initialize,
|
||||
[
|
||||
AC_DEFINE(USE_NSS, 1, [if NSS is enabled])
|
||||
AC_SUBST(USE_NSS, [1])
|
||||
USE_NSS="yes"
|
||||
NSS_ENABLED=1
|
||||
curl_ssl_msg="enabled (NSS)"
|
||||
],
|
||||
[
|
||||
LIBS="$CLEANLIBS"
|
||||
CPPFLAGS="$CLEANCPPFLAGS"
|
||||
])
|
||||
|
||||
if test "x$USE_NSS" = "xyes"; then
|
||||
AC_MSG_NOTICE([detected NSS version $version])
|
||||
|
||||
dnl when shared libs were found in a path that the run-time
|
||||
dnl linker doesn't search through, we need to add it to
|
||||
dnl LD_LIBRARY_PATH to prevent further configure tests to fail
|
||||
dnl due to this
|
||||
|
||||
LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$nssprefix/lib$libsuff"
|
||||
export LD_LIBRARY_PATH
|
||||
AC_MSG_NOTICE([Added $nssprefix/lib$libsuff to LD_LIBRARY_PATH])
|
||||
fi
|
||||
|
||||
fi
|
||||
|
||||
fi dnl NSS not disabled
|
||||
|
||||
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.])
|
||||
fi
|
||||
|
||||
dnl **********************************************************************
|
||||
dnl Check for the CA bundle
|
||||
dnl **********************************************************************
|
||||
@@ -1251,93 +1471,10 @@ fi dnl only done if some kind of SSL was enabled
|
||||
|
||||
AM_CONDITIONAL(CABUNDLE, test x$ca != xno)
|
||||
|
||||
|
||||
|
||||
|
||||
dnl **********************************************************************
|
||||
dnl Check for the presence of ZLIB libraries and headers
|
||||
dnl Check for the presence of IDN libraries and headers
|
||||
dnl **********************************************************************
|
||||
|
||||
dnl Check for & handle argument to --with-zlib.
|
||||
|
||||
_cppflags=$CPPFLAGS
|
||||
_ldflags=$LDFLAGS
|
||||
AC_ARG_WITH(zlib,
|
||||
AC_HELP_STRING([--with-zlib=PATH],[search for zlib in PATH])
|
||||
AC_HELP_STRING([--without-zlib],[disable use of zlib]),
|
||||
[OPT_ZLIB="$withval"])
|
||||
|
||||
if test "$OPT_ZLIB" = "no" ; then
|
||||
AC_MSG_WARN([zlib disabled])
|
||||
else
|
||||
if test "$OPT_ZLIB" = "yes" ; then
|
||||
OPT_ZLIB=""
|
||||
fi
|
||||
|
||||
if test -z "$OPT_ZLIB" ; then
|
||||
dnl check for the lib first without setting any new path, since many
|
||||
dnl people have it in the default path
|
||||
|
||||
AC_CHECK_LIB(z, inflateEnd,
|
||||
dnl libz found, set the variable
|
||||
[HAVE_LIBZ="1"],
|
||||
dnl if no lib found, try /usr/local
|
||||
[OPT_ZLIB="/usr/local"])
|
||||
|
||||
fi
|
||||
|
||||
dnl Add a nonempty path to the compiler flags
|
||||
if test -n "$OPT_ZLIB"; then
|
||||
CPPFLAGS="$CPPFLAGS -I$OPT_ZLIB/include"
|
||||
LDFLAGS="$LDFLAGS -L$OPT_ZLIB/lib$libsuff"
|
||||
fi
|
||||
|
||||
AC_CHECK_HEADER(zlib.h,
|
||||
[
|
||||
dnl zlib.h was found
|
||||
HAVE_ZLIB_H="1"
|
||||
dnl if the lib wasn't found already, try again with the new paths
|
||||
if test "$HAVE_LIBZ" != "1"; then
|
||||
AC_CHECK_LIB(z, gzread,
|
||||
[
|
||||
dnl the lib was found!
|
||||
HAVE_LIBZ="1"
|
||||
],
|
||||
[ CPPFLAGS=$_cppflags
|
||||
LDFLAGS=$_ldflags])
|
||||
fi
|
||||
],
|
||||
[
|
||||
dnl zlib.h was not found, restore the flags
|
||||
CPPFLAGS=$_cppflags
|
||||
LDFLAGS=$_ldflags]
|
||||
)
|
||||
|
||||
if test "$HAVE_LIBZ" = "1" && test "$HAVE_ZLIB_H" != "1"
|
||||
then
|
||||
AC_MSG_WARN([configure found only the libz lib, not the header file!])
|
||||
elif test "$HAVE_LIBZ" != "1" && test "$HAVE_ZLIB_H" = "1"
|
||||
then
|
||||
AC_MSG_WARN([configure found only the libz header file, not the lib!])
|
||||
elif test "$HAVE_LIBZ" = "1" && test "$HAVE_ZLIB_H" = "1"
|
||||
then
|
||||
dnl both header and lib were found!
|
||||
AC_SUBST(HAVE_LIBZ)
|
||||
AC_DEFINE(HAVE_ZLIB_H, 1, [if you have the zlib.h header file])
|
||||
AC_DEFINE(HAVE_LIBZ, 1, [if zlib is available])
|
||||
|
||||
LIBS="$LIBS -lz"
|
||||
|
||||
dnl replace 'HAVE_LIBZ' in the automake makefile.ams
|
||||
AMFIXLIB="1"
|
||||
AC_MSG_NOTICE([found both libz and libz.h header])
|
||||
curl_zlib_msg="enabled"
|
||||
fi
|
||||
fi
|
||||
|
||||
dnl set variable for use in automakefile(s)
|
||||
AM_CONDITIONAL(HAVE_LIBZ, test x"$AMFIXLIB" = x1)
|
||||
|
||||
AC_MSG_CHECKING([whether to build with libidn])
|
||||
AC_ARG_WITH(libidn,
|
||||
AC_HELP_STRING([--with-libidn=PATH],[Enable libidn usage])
|
||||
@@ -1466,6 +1603,10 @@ if test "x$RECENTAIX" = "xyes"; then
|
||||
XLC="yes"
|
||||
AC_MSG_RESULT([yes])
|
||||
CFLAGS="$CFLAGS -qthreaded"
|
||||
dnl AIX xlc has to have strict aliasing turned off. If not,
|
||||
dnl the optimizer assumes that pointers can only point to
|
||||
dnl an object of the same type.
|
||||
CFLAGS="$CFLAGS -qnoansialias"
|
||||
)
|
||||
|
||||
|
||||
@@ -1482,7 +1623,7 @@ if test x$cross_compiling != xyes; then
|
||||
|
||||
if test x$checkfor_gmtime_r = xyes; then
|
||||
|
||||
dnl if gmtime_r was found, verify that it actuall works, as (at least) HPUX
|
||||
dnl if gmtime_r was found, verify that it actually works, as (at least) HPUX
|
||||
dnl 10.20 is known to have a buggy one. If it doesn't work, disable use of
|
||||
dnl it.
|
||||
|
||||
@@ -1565,6 +1706,7 @@ AC_CHECK_HEADERS(
|
||||
libgen.h \
|
||||
locale.h \
|
||||
errno.h \
|
||||
stdbool.h \
|
||||
arpa/tftp.h \
|
||||
sys/filio.h \
|
||||
setjmp.h,
|
||||
@@ -1594,6 +1736,7 @@ dnl default includes
|
||||
|
||||
dnl Checks for typedefs, structures, and compiler characteristics.
|
||||
AC_C_CONST
|
||||
CURL_CHECK_VARIADIC_MACROS
|
||||
AC_TYPE_SIZE_T
|
||||
AC_HEADER_TIME
|
||||
CURL_CHECK_STRUCT_TIMEVAL
|
||||
@@ -1626,6 +1769,19 @@ fi
|
||||
AC_CHECK_TYPE(ssize_t, ,
|
||||
AC_DEFINE(ssize_t, int, [the signed version of size_t]))
|
||||
|
||||
# check for bool type
|
||||
AC_CHECK_TYPE([bool],[
|
||||
AC_DEFINE(HAVE_BOOL_T, 1,
|
||||
[Define to 1 if bool is an available type.])
|
||||
], ,[
|
||||
#ifdef HAVE_SYS_TYPES_H
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
#ifdef HAVE_STDBOOL_H
|
||||
#include <stdbool.h>
|
||||
#endif
|
||||
])
|
||||
|
||||
# Check for socklen_t or equivalent
|
||||
CURL_CHECK_TYPE_SOCKLEN_T
|
||||
|
||||
@@ -1691,7 +1847,8 @@ AC_CHECK_FUNCS( strtoll \
|
||||
getprotobyname \
|
||||
getrlimit \
|
||||
setrlimit \
|
||||
fork,
|
||||
fork \
|
||||
setmode,
|
||||
dnl if found
|
||||
[],
|
||||
dnl if not found, $ac_func is the name we check for
|
||||
@@ -1967,19 +2124,26 @@ AC_HELP_STRING([--disable-verbose],[Disable verbose strings]),
|
||||
AC_MSG_RESULT(yes)
|
||||
)
|
||||
|
||||
CURL_CHECK_NATIVE_WINDOWS
|
||||
|
||||
dnl ************************************************************
|
||||
dnl enable SSPI support
|
||||
dnl
|
||||
AC_MSG_CHECKING([whether to enable SSPI support (win32 builds only)])
|
||||
AC_MSG_CHECKING([whether to enable SSPI support (Windows native builds only)])
|
||||
AC_ARG_ENABLE(sspi,
|
||||
AC_HELP_STRING([--enable-sspi],[Enable SSPI])
|
||||
AC_HELP_STRING([--disable-sspi],[Disable SSPI]),
|
||||
[ case "$enableval" in
|
||||
yes)
|
||||
AC_MSG_RESULT(yes)
|
||||
AC_DEFINE(USE_WINDOWS_SSPI, 1, [to enable SSPI support])
|
||||
AC_SUBST(USE_WINDOWS_SSPI)
|
||||
curl_sspi_msg="yes"
|
||||
if test "$ac_cv_native_windows" = "yes"; then
|
||||
AC_MSG_RESULT(yes)
|
||||
AC_DEFINE(USE_WINDOWS_SSPI, 1, [to enable SSPI support])
|
||||
AC_SUBST(USE_WINDOWS_SSPI)
|
||||
curl_sspi_msg="yes"
|
||||
else
|
||||
AC_MSG_RESULT(no)
|
||||
AC_MSG_WARN([--enable-sspi Ignored. Only supported on native Windows builds.])
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
AC_MSG_RESULT(no)
|
||||
@@ -2105,9 +2269,23 @@ if test "x$ws2" = "xyes"; then
|
||||
dnl end.
|
||||
|
||||
LIBS="$LIBS -lws2_32"
|
||||
TEST_SERVER_LIBS="$TEST_SERVER_LIBS -lws2_32"
|
||||
|
||||
fi
|
||||
|
||||
dnl
|
||||
dnl All the library dependencies put into $LIB apply to libcurl only.
|
||||
dnl Those in $CURL_LIBS apply to the curl command-line client only.
|
||||
dnl Those in $TEST_SERVER_LIBS apply to test servers only.
|
||||
dnl Those in $ALL_LIBS apply to all targets, including test targets.
|
||||
dnl
|
||||
LIBCURL_LIBS=$LIBS
|
||||
|
||||
AC_SUBST(LIBCURL_LIBS)
|
||||
AC_SUBST(CURL_LIBS)
|
||||
AC_SUBST(TEST_SERVER_LIBS)
|
||||
LIBS=$ALL_LIBS dnl LIBS is a magic variable that's used for every link
|
||||
|
||||
AM_CONDITIONAL(CROSSCOMPILING, test x$cross_compiling = xyes)
|
||||
|
||||
AC_CONFIG_FILES([Makefile \
|
||||
|
@@ -6,7 +6,7 @@
|
||||
# | (__| |_| | _ <| |___
|
||||
# \___|\___/|_| \_\_____|
|
||||
#
|
||||
# Copyright (C) 2001 - 2006, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
# Copyright (C) 2001 - 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
|
||||
@@ -181,8 +181,17 @@ while test $# -gt 0; do
|
||||
;;
|
||||
|
||||
--libs)
|
||||
echo -L@libdir@ -lcurl @LDFLAGS@ @LIBS@
|
||||
;;
|
||||
if test "X@libdir@" != "X/usr/lib"; then
|
||||
CURLLIBDIR="-L@libdir@ "
|
||||
else
|
||||
CURLLIBDIR=""
|
||||
fi
|
||||
if test "X@REQUIRE_LIB_DEPS@" = "Xyes"; then
|
||||
echo ${CURLLIBDIR}-lcurl @LDFLAGS@ @LIBCURL_LIBS@ @LIBS@
|
||||
else
|
||||
echo ${CURLLIBDIR}-lcurl @LDFLAGS@ @LIBS@
|
||||
fi
|
||||
;;
|
||||
|
||||
*)
|
||||
echo "unknown option: $1"
|
||||
|
@@ -182,7 +182,7 @@ Q
|
||||
wxWidgets
|
||||
|
||||
Written by Casey O'Donnell
|
||||
http://homepage.mac.com/codonnell/wxcurldav/
|
||||
http://wxcode.sourceforge.net/components/wxcurl/
|
||||
|
||||
XBLite
|
||||
|
||||
|
@@ -17,7 +17,9 @@ Join the Community
|
||||
you start sending patches! We prefer patches and discussions being held on
|
||||
the mailing list(s), not sent to individuals.
|
||||
|
||||
The License Issue
|
||||
We also hang out on IRC in #curl on irc.freenode.net
|
||||
|
||||
License
|
||||
|
||||
When contributing with code, you agree to put your changes and new code under
|
||||
the same license curl and libcurl is already using unless stated and agreed
|
||||
@@ -43,9 +45,10 @@ The License Issue
|
||||
|
||||
What To Read
|
||||
|
||||
Source code, the man pages, the INTERNALS document, the TODO, the most recent
|
||||
CHANGES. Just lurking on the libcurl mailing list is gonna give you a lot of
|
||||
insights on what's going on right now. Asking there is a good idea too.
|
||||
Source code, the man pages, the INTERNALS document, TODO, KNOWN_BUGS, the
|
||||
most recent CHANGES. Just lurking on the libcurl mailing list is gonna give
|
||||
you a lot of insights on what's going on right now. Asking there is a good
|
||||
idea too.
|
||||
|
||||
Naming
|
||||
|
||||
@@ -170,3 +173,21 @@ How To Make a Patch
|
||||
|
||||
http://gnuwin32.sourceforge.net/packages/patch.htm
|
||||
http://gnuwin32.sourceforge.net/packages/diffutils.htm
|
||||
|
||||
How to get your patches into the libcurl sources
|
||||
|
||||
1. Submit your patch to the curl-library mailing list
|
||||
|
||||
2. Make the patch against as recent sources as possible.
|
||||
|
||||
3. Make sure your patch adheres to the source indent and coding style of
|
||||
already existing source code. Failing to do so just adds more work for me.
|
||||
|
||||
4. Respond to replies on the list about the patch and answer questions and/or
|
||||
fix nits/flaws. This is very important. I will take lack of replies as a
|
||||
sign that you're not very anxious to get your patch accepted and I tend to
|
||||
simply drop such patches from my TODO list.
|
||||
|
||||
5. If you've followed the above mentioned paragraphs and your patch still
|
||||
hasn't been incorporated after some weeks, consider resubmitting them to
|
||||
the list.
|
||||
|
@@ -1,11 +1,11 @@
|
||||
Date: May 15, 2006
|
||||
Date: February 11, 2007
|
||||
Author: Daniel Stenberg <daniel@haxx.se>
|
||||
URL: http://curl.haxx.se/legal/distro-dilemma.html
|
||||
|
||||
Condition
|
||||
|
||||
This document is written to describe the situation as it is right
|
||||
now. libcurl 7.15.3 is currently the latest version available. Things may of
|
||||
This document is written to describe the situation as it is right now.
|
||||
libcurl 7.16.1 is currently the latest version available. Things may of
|
||||
course change in the future.
|
||||
|
||||
This document reflects my view and understanding of these things. Please tell
|
||||
@@ -48,24 +48,34 @@ Part of the Operating System
|
||||
Debian does however not take this stance and has officially(?) claimed that
|
||||
OpenSSL is not a required part of the Debian operating system
|
||||
|
||||
Some people claim that this paragraph cannot be exploited this way by a Linux
|
||||
distro, but I am not a lawyer and that is a discussion left outside of this
|
||||
document.
|
||||
|
||||
GnuTLS
|
||||
|
||||
With the release of libcurl 7.14.0 (May 2005), libcurl can now get built to
|
||||
use GnuTLS instead of OpenSSL. GnuTLS is an LGPL[7] licensed library that
|
||||
offers a matching set of features as OpenSSL does. Now, you can build and
|
||||
distribute an TLS/SSL capable libcurl without including any Original BSD
|
||||
licensed code.
|
||||
Since May 2005 libcurl can get built to use GnuTLS instead of OpenSSL. GnuTLS
|
||||
is an LGPL[7] licensed library that offers a matching set of features as
|
||||
OpenSSL does. Now, you can build and distribute an TLS/SSL capable libcurl
|
||||
without including any Original BSD licensed code.
|
||||
|
||||
I believe Debian is the first distro to provide libcurl/GnutTLS packages.
|
||||
I believe Debian is the first (only?) distro that provides libcurl/GnutTLS
|
||||
packages.
|
||||
|
||||
GnuTLS vs OpenSSL
|
||||
yassl
|
||||
|
||||
While these two libraries offer similar features, they are not equal. Both
|
||||
libraries have features the other one lacks. libcurl does not (yet) offer a
|
||||
standardized stable ABI if you decide to switch from using libcurl-openssl to
|
||||
libcurl-gnutls or vice versa. The GnuTLS support is very recent in libcurl
|
||||
and it has not been tested nor used very extensively, while the OpenSSL
|
||||
equivalent code has been used and thus matured for more than seven (7) years.
|
||||
libcurl can get also get built to use yassl for the TLS/SSL layer. yassl is a
|
||||
GPL[3] licensed library.
|
||||
|
||||
|
||||
GnuTLS vs OpenSSL vs yassl
|
||||
|
||||
While these three libraries offer similar features, they are not equal.
|
||||
libcurl does not (yet) offer a standardized stable ABI if you decide to
|
||||
switch from using libcurl-openssl to libcurl-gnutls or vice versa. The GnuTLS
|
||||
and yassl support is very recent in libcurl and it has not been tested nor
|
||||
used very extensively, while the OpenSSL equivalent code has been used and
|
||||
thus matured since 1999.
|
||||
|
||||
GnuTLS
|
||||
- LGPL licensened
|
||||
@@ -82,7 +92,12 @@ GnuTLS vs OpenSSL
|
||||
- provides crypto functions libcurl uses for NTLM
|
||||
- libcurl can do non-blocking connects with it in 7.15.4 and later
|
||||
|
||||
The Better License, Original BSD or LGPL?
|
||||
yassl
|
||||
- GPL licensed
|
||||
- much untested and unproven in the real work by (lib)curl users so we don't
|
||||
know a lot about restrictions or benefits from using this
|
||||
|
||||
The Better License, Original BSD, GPL or LGPL?
|
||||
|
||||
It isn't obvious or without debate to any objective interested party that
|
||||
either of these licenses are the "better" or even the "preferred" one in a
|
||||
@@ -91,8 +106,8 @@ The Better License, Original BSD or LGPL?
|
||||
Instead, I think we should accept the fact that the SSL/TLS libraries and
|
||||
their different licenses will fit different applications and their authors
|
||||
differently depending on the applications' licenses and their general usage
|
||||
pattern (considering how LGPL libraries for example can be burdensome for
|
||||
embedded systems usage).
|
||||
pattern (considering how GPL and LGPL libraries for example can be burdensome
|
||||
for embedded systems usage).
|
||||
|
||||
In Debian land, there seems to be a common opinion that LGPL is "maximally
|
||||
compatible" with apps while Original BSD is not. Like this:
|
||||
@@ -101,8 +116,8 @@ The Better License, Original BSD or LGPL?
|
||||
|
||||
More SSL Libraries
|
||||
|
||||
In libcurl, there's no stopping us here. There are at least a few more Open
|
||||
Source/Free SSL/TLS libraries and we would very much like to support them as
|
||||
In libcurl, there's no stopping us here. There are more Open Source/Free
|
||||
SSL/TLS libraries out there and we would very much like to support them as
|
||||
well, to offer application authors an even wider scope of choice.
|
||||
|
||||
Application Angle of this Problem
|
||||
@@ -137,7 +152,7 @@ Project cURL Angle of this Problem
|
||||
Distro Angle of this Problem
|
||||
|
||||
To my knowledge there is only one distro that ships libcurl built with either
|
||||
one of the SSL libs supported.
|
||||
OpenSSL or GnuTLS.
|
||||
|
||||
Debian Linux is now (since mid September 2005) providing two different
|
||||
libcurl packages, one for libcurl built with OpenSSL and one built with
|
||||
@@ -145,56 +160,6 @@ Distro Angle of this Problem
|
||||
single system simultaneously. This has been said to be a transitional system
|
||||
not desired to keep in the long run.
|
||||
|
||||
Fixing the Only Problem
|
||||
|
||||
The only problem is thus for distributions that want to offer libcurl
|
||||
versions built with more than one SSL/TLS library.
|
||||
|
||||
Since multiple libcurl binaries using different names are ruled out, we need
|
||||
to come up with a way to have one single libcurl that someone uses different
|
||||
underlying libraries. The best(?) approach currently suggested involves this:
|
||||
|
||||
A new intermediate library (named lib2 so far in the discussions) with the
|
||||
single purpose of providing libcurl with SSL/TLS capabilities. It would have
|
||||
a unified API and ABI no matter what underlying library it would use.
|
||||
|
||||
There would be one lib2 binary provided for each supported SSL/TLS library.
|
||||
For example: lib2-openssl, lib2-gnutls, lib2-yassl, lib2-matrixssl and
|
||||
lib2-nossl. Yes, take note of the last one that provides the lib2 ABI but
|
||||
that lacks the actual powers.
|
||||
|
||||
When libcurl is built and linked, it will be linked against a lib2 with the
|
||||
set ABI.
|
||||
|
||||
When you link an app against libcurl, it would also need to provide one of
|
||||
the (many) lib2 libs to decide what approach that fits the app. An app that
|
||||
doesn't want SSL at all would still need to link with the lib2-nossl lib.
|
||||
|
||||
GPL apps can pick the lib2-gnutls, others may pick the lib2-openssl.
|
||||
|
||||
This concept works equally well both for shared and static libraries.
|
||||
|
||||
A positive side effect of this approach could be a more generic "de facto"
|
||||
standard API for SSL/TLS libraries.
|
||||
|
||||
When Will This Happen
|
||||
|
||||
This is not a problem in curl, it doesn't solve any actual technical problems
|
||||
in our project. Don't hold your breath for this to happen very soon (if at
|
||||
all) unless you step forward and contribute.
|
||||
|
||||
The suggestion that is outlined above is still only a suggestion. Feel free
|
||||
to bring a better idea!
|
||||
|
||||
Also, to keep in mind: I don't want this new concept to have too much of an
|
||||
impact on the existing code. Preferably it should be possible to build the
|
||||
code like today (without the use of lib2), should you decide to ignore the
|
||||
problems outlined in this document.
|
||||
|
||||
Work on this was suggested by Richard Atterer:
|
||||
|
||||
http://curl.haxx.se/mail/lib-2005-09/0066.html
|
||||
|
||||
Footnotes
|
||||
|
||||
[1] = http://www.xfree86.org/3.3.6/COPYRIGHT2.html#6
|
||||
|
59
docs/FAQ
59
docs/FAQ
@@ -1,4 +1,4 @@
|
||||
Updated: November 2, 2005 (http://curl.haxx.se/docs/faq.html)
|
||||
Updated: February 11, 2007 (http://curl.haxx.se/docs/faq.html)
|
||||
_ _ ____ _
|
||||
___| | | | _ \| |
|
||||
/ __| | | | |_) | |
|
||||
@@ -114,10 +114,10 @@ FAQ
|
||||
libcurl
|
||||
|
||||
A free and easy-to-use client-side URL transfer library, supporting FTP,
|
||||
FTPS, HTTP, HTTPS, TELNET, DICT, FILE and LDAP. libcurl supports
|
||||
HTTPS certificates, HTTP POST, HTTP PUT, FTP uploading, kerberos, HTTP
|
||||
form based upload, proxies, cookies, user+password authentication, file
|
||||
transfer resume, http proxy tunneling and more!
|
||||
FTPS, HTTP, HTTPS, SCP, SFTP, TFTP, TELNET, DICT, FILE and LDAP. libcurl
|
||||
supports HTTPS certificates, HTTP POST, HTTP PUT, FTP uploading, kerberos,
|
||||
HTTP form based upload, proxies, cookies, user+password authentication,
|
||||
file transfer resume, http proxy tunneling and more!
|
||||
|
||||
libcurl is highly portable, it builds and works identically on numerous
|
||||
platforms, including Solaris, NetBSD, FreeBSD, OpenBSD, Darwin, HPUX,
|
||||
@@ -132,7 +132,8 @@ FAQ
|
||||
A command line tool for getting or sending files using URL syntax.
|
||||
|
||||
Since curl uses libcurl, it supports a range of common Internet protocols,
|
||||
currently including HTTP, HTTPS, FTP, FTPS, LDAP, DICT, TELNET and FILE.
|
||||
currently including HTTP, HTTPS, FTP, FTPS, SCP, SFTP, TFTP, LDAP, DICT,
|
||||
TELNET and FILE.
|
||||
|
||||
We pronounce curl and cURL with an initial k sound: [kurl].
|
||||
|
||||
@@ -156,7 +157,7 @@ FAQ
|
||||
|
||||
1.3 What is curl not?
|
||||
|
||||
Curl is *not* a wget clone. That is a common misconception. Never, during
|
||||
Curl is not a wget clone. That is a common misconception. Never, during
|
||||
curl's development, have we intended curl to replace wget or compete on its
|
||||
market. Curl is targeted at single-shot file transfers.
|
||||
|
||||
@@ -171,9 +172,10 @@ FAQ
|
||||
Curl is not a PHP tool, even though it works perfectly well when used from
|
||||
or with PHP (when using the PHP/CURL module).
|
||||
|
||||
Curl is not a single-OS program. Curl exists, compiles, builds and runs
|
||||
under a wide range of operating systems, including all modern Unixes (and a
|
||||
bunch of older ones too), Windows, Amiga, BeOS, OS/2, OS X, QNX etc.
|
||||
Curl is not a program for a single operating system. Curl exists, compiles,
|
||||
builds and runs under a wide range of operating systems, including all
|
||||
modern Unixes (and a bunch of older ones too), Windows, Amiga, BeOS, OS/2,
|
||||
OS X, QNX etc.
|
||||
|
||||
1.4 When will you make curl do XXXX ?
|
||||
|
||||
@@ -211,7 +213,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 450 contributors is found in the docs/THANKS
|
||||
The full list of the more than 530 contributors is found in the docs/THANKS
|
||||
file.
|
||||
|
||||
curl is developed by a community, with Daniel at the wheel.
|
||||
@@ -287,13 +289,13 @@ FAQ
|
||||
|
||||
Some facts to use as input to the math:
|
||||
|
||||
curl packages have been downloaded from the curl.haxx.se site well over a
|
||||
million times. curl is installed by default with most Linux
|
||||
curl packages are downloaded from the curl.haxx.se and mirrors almost one
|
||||
million times per year. curl is installed by default with most Linux
|
||||
distributions. curl is installed by default with Mac OS X. curl and libcurl
|
||||
as used by numerous applications that include libcurl binaries in their
|
||||
distribution packages (like Adobe Acrobat Reader and Google Earth).
|
||||
|
||||
More than 40 known named companies use curl in commercial environments and
|
||||
More than 60 known named companies use curl in commercial environments and
|
||||
products. More than 100 known named open source projects depend on
|
||||
(lib)curl.
|
||||
|
||||
@@ -305,6 +307,9 @@ FAQ
|
||||
based web servers. A guess is that a fair amount of these Linux
|
||||
installations have curl installed.
|
||||
|
||||
All this taken together, there is no doubt that there are millions of
|
||||
(lib)curl users.
|
||||
|
||||
http://curl.haxx.se/docs/companies.html
|
||||
http://curl.haxx.se/docs/programs.html
|
||||
http://curl.haxx.se/libcurl/using/apps.html
|
||||
@@ -338,8 +343,6 @@ FAQ
|
||||
./configure places the -L/usr/local/ssl/lib early enough in the command
|
||||
line to make things work
|
||||
|
||||
Solution submitted by: Bob Allison <allisonb@users.sourceforge.net>
|
||||
|
||||
2.1.2 only the libssl lib is missing
|
||||
|
||||
If all include files and the libcrypto lib is present, with only the
|
||||
@@ -355,10 +358,10 @@ FAQ
|
||||
|
||||
2.2 Does curl work/build with other SSL libraries?
|
||||
|
||||
Curl has been written to use OpenSSL or GnuTLS, although there should not be
|
||||
many problems using a different library. If anyone does "port" curl to use a
|
||||
different SSL library, we are of course very interested in getting the
|
||||
patch!
|
||||
Curl has been written to use OpenSSL, GnuTLS, yassl or NSS, although there
|
||||
should not be many problems using a different library. If anyone does "port"
|
||||
curl to use a different SSL library, we are of course very interested in
|
||||
getting the patch!
|
||||
|
||||
2.3 Where can I find a copy of LIBEAY32.DLL?
|
||||
|
||||
@@ -464,10 +467,12 @@ FAQ
|
||||
install and use them, in the libcurl section of the curl web site:
|
||||
http://curl.haxx.se/libcurl/
|
||||
|
||||
In February 2003, there are interfaces available for the following
|
||||
languages: Basic, C, C++, Cocoa, Dylan, Euphoria, Java, Lua, Object-Pascal,
|
||||
Pascal, Perl, PHP, PostgreSQL, Python, Rexx, Ruby, Scheme and Tcl. By the
|
||||
time you read this, additional ones may have appeared!
|
||||
In February 2007, there are interfaces available for the following
|
||||
languages: Ada95, Basic, C, C++, Ch, Cocoa, D, Dylan, Euphoria, Ferite,
|
||||
Gambas, glib/GTK+, Java, Lisp, Lua, Mono, .NET, Object-Pascal, O'Caml,
|
||||
Pascal, Perl, PHP, PostgreSQL, Python, R, Rexx, Ruby, Scheme, S-Lang,
|
||||
Smalltalk, SPL, Tcl, Visual Basic, Q, wxwidgets and XBLite. By the time you
|
||||
read this, additional ones may have appeared!
|
||||
|
||||
3.10 What about SOAP, WebDAV, XML-RPC or similar protocols over HTTP?
|
||||
|
||||
@@ -839,6 +844,8 @@ FAQ
|
||||
|
||||
http://www.gnu.org/software/gnutls/manual/html_node/Multi_002dthreaded-applications.html
|
||||
|
||||
No special locking is needed with a NSS-powered libcurl. NSS is thread-safe.
|
||||
|
||||
5.2 How can I receive all data into a large memory chunk?
|
||||
|
||||
[ See also the examples/getinmemory.c source ]
|
||||
@@ -896,8 +903,6 @@ FAQ
|
||||
Similarly, if you use CURLOPT_READDATA you must also specify
|
||||
CURLOPT_READFUNCTION.
|
||||
|
||||
(Provided by Joel DeYoung and Bob Schader)
|
||||
|
||||
5.6 What about Keep-Alive or persistent connections?
|
||||
|
||||
curl and libcurl have excellent support for persistent connections when
|
||||
@@ -916,8 +921,6 @@ FAQ
|
||||
options to the command line compiler. /MD (linking against MSVCRT dll) seems
|
||||
to be the most commonly used option.
|
||||
|
||||
(Provided by Andrew Francis)
|
||||
|
||||
When building an application that uses the static libcurl library, you must
|
||||
add -DCURL_STATICLIB to your CFLAGS. Otherwise the linker will look for
|
||||
dynamic import symbols. If you get linker error like "unknown symbol
|
||||
|
@@ -116,10 +116,10 @@ FILE
|
||||
FOOTNOTES
|
||||
=========
|
||||
|
||||
*1 = requires OpenSSL or GnuTLS
|
||||
*1 = requires OpenSSL, GnuTLS or NSS
|
||||
*2 = requires OpenLDAP
|
||||
*3 = requires a GSSAPI-compliant library, such as Heimdal or similar.
|
||||
*4 = requires FBopenssl
|
||||
*5 = requires a krb4 library, such as the MIT one or similar.
|
||||
*6 = requires c-ares
|
||||
*7 = requires OpenSSL specificly, as GnuTLS only supports SSLv3 and TLSv1
|
||||
*7 = requires OpenSSL or NSS, as GnuTLS only supports SSLv3 and TLSv1
|
||||
|
26
docs/INSTALL
26
docs/INSTALL
@@ -140,10 +140,36 @@ UNIX
|
||||
yassl with its OpenSSL emulation enabled and point to that directory root
|
||||
with configure --with-ssl.
|
||||
|
||||
To build with NSS support instead of OpenSSL for SSL/TLS, note that
|
||||
you need to use both --without-ssl and --with-nss.
|
||||
|
||||
|
||||
Win32
|
||||
=====
|
||||
|
||||
Building Windows DLLs and C run-time (CRT) linkage issues
|
||||
---------------------------------------------------------
|
||||
|
||||
As a general rule, building a DLL with static CRT linkage is highly
|
||||
discouraged, and intermixing CRTs in the same app is something to
|
||||
avoid at any cost.
|
||||
|
||||
Reading and comprehension of Microsoft Knowledge Base articles
|
||||
KB94248 and KB140584 is a must for any Windows developer. Especially
|
||||
important is full understanding if you are not going to follow the
|
||||
advice given above.
|
||||
|
||||
KB94248 - How To Use the C Run-Time
|
||||
http://support.microsoft.com/kb/94248/en-us
|
||||
|
||||
KB140584 - How to link with the correct C Run-Time (CRT) library
|
||||
http://support.microsoft.com/kb/140584/en-us
|
||||
|
||||
If your app is misbehaving in some strange way, or it is suffering
|
||||
from memory corruption, before asking for further help, please try
|
||||
first to rebuild every single library your app uses as well as your
|
||||
app using the debug multithreaded dynamic C runtime.
|
||||
|
||||
MingW32
|
||||
-------
|
||||
|
||||
|
@@ -3,11 +3,13 @@ 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!
|
||||
|
||||
41. Jeff Pohlmeyer's curl_multi_socket crashing case. Recipe and instructions
|
||||
here: http://curl.haxx.se/mail/lib-2007-01/0022.html
|
||||
41. When doing an operation over FTP that requires the ACCT command (but not
|
||||
when logging in), the operation will fail since libcurl doesn't detect this
|
||||
and thus fails to issue the correct command:
|
||||
http://curl.haxx.se/bug/view.cgi?id=1693337
|
||||
|
||||
40. HTTP Pipelining, NULL content
|
||||
http://curl.haxx.se/bug/view.cgi?id=1631566
|
||||
40. Mac OS X test failures (Daniel Johnson)
|
||||
http://curl.haxx.se/mail/lib-2007-03/0095.html
|
||||
|
||||
39. Steffen Rumler's Race Condition in Curl_proxyCONNECT:
|
||||
http://curl.haxx.se/mail/lib-2007-01/0045.html
|
||||
@@ -63,11 +65,14 @@ may have been fixed since this was written!
|
||||
"system context" will make it use wrong(?) user name - at least when compared
|
||||
to what winhttp does. See http://curl.haxx.se/bug/view.cgi?id=1281867
|
||||
|
||||
23. We don't support SOCKS for IPv6. We don't support FTPS over a SOCKS proxy.
|
||||
We don't have any test cases for SOCKS proxy. We probably have even more
|
||||
bugs and lack of features when a SOCKS proxy is used. And there seem to be a
|
||||
problem with SOCKS when doing FTP: See
|
||||
http://curl.haxx.se/bug/view.cgi?id=1371540
|
||||
23. SOCKS-related problems:
|
||||
A) libcurl doesn't support SOCKS for IPv6.
|
||||
B) libcurl doesn't support FTPS over a SOCKS proxy.
|
||||
C) We don't have any test cases for SOCKS proxy.
|
||||
E) libcurl doesn't support active FTP over a SOCKS proxy
|
||||
|
||||
We probably have even more bugs and lack of features when a SOCKS proxy is
|
||||
used.
|
||||
|
||||
22. Sending files to a FTP server using curl on VMS, might lead to curl
|
||||
complaining on "unaligned file size" on completion. The problem is related
|
||||
@@ -109,9 +114,6 @@ may have been fixed since this was written!
|
||||
acknowledged after the actual TCP connect (during the SOCKS "negotiate"
|
||||
phase).
|
||||
|
||||
11. Using configure --disable-[protocol] may cause 'make test' to fail for
|
||||
tests using the disabled protocol(s).
|
||||
|
||||
10. To get HTTP Negotiate authentication to work fine, you need to provide a
|
||||
(fake) user name (this concerns both curl and the lib) because the code
|
||||
wrongly only considers authentication if there's a user name provided.
|
||||
|
@@ -16,7 +16,7 @@ clause). You may still build your own copies that use them all, but
|
||||
distributing them as binaries would be to violate the GPL license - unless you
|
||||
accompany your license with an exception[2]. This particular problem was
|
||||
addressed when the Modified BSD license was created, which does not have the
|
||||
annoncement clause that collides with GPL.
|
||||
announcement clause that collides with GPL.
|
||||
|
||||
libcurl http://curl.haxx.se/docs/copyright.html
|
||||
|
||||
@@ -28,7 +28,7 @@ libcurl http://curl.haxx.se/docs/copyright.html
|
||||
OpenSSL http://www.openssl.org/source/license.html
|
||||
|
||||
(May be used for SSL/TLS support) Uses an Original BSD-style license
|
||||
with an announement clause that makes it "incompatible" with GPL. You
|
||||
with an announcement clause that makes it "incompatible" with GPL. You
|
||||
are not allowed to ship binaries that link with OpenSSL that includes
|
||||
GPL code (unless that specific GPL code includes an exception for
|
||||
OpenSSL - a habit that is growing more and more common). If OpenSSL's
|
||||
@@ -47,6 +47,14 @@ yassl http://www.yassl.com/
|
||||
(May be used for SSL/TLS support) Uses the GPL[1] license. If this is
|
||||
a problem for you, consider using OpenSSL or GnuTLS instead.
|
||||
|
||||
NSS http://www.mozilla.org/projects/security/pki/nss/
|
||||
|
||||
(May be used for SSL/TLS support) Is covered by the MPL[4] license,
|
||||
the GPL[1] license and the LGPL[3] license. You may choose to license
|
||||
the code under MPL terms, GPL terms, or LGPL terms. These licenses
|
||||
grant you different permissions and impose different obligations. You
|
||||
should select the license that best meets your needs.
|
||||
|
||||
c-ares http://daniel.haxx.se/projects/c-ares/license.html
|
||||
|
||||
(Used for asynchronous name resolves) Uses an MIT license that is very
|
||||
@@ -88,10 +96,10 @@ fbopenssl
|
||||
that it uses the OpenSSL license and thus shares the same issues as
|
||||
described for OpenSSL above.
|
||||
|
||||
libidn http://www.gnu.org/licenses/lgpl.html
|
||||
libidn http://josefsson.org/libidn/
|
||||
|
||||
(Used for IDNA support) Uses the GNU Lesser General Public
|
||||
License. LGPL is a variation of GPL with slightly less aggressive
|
||||
License [3]. LGPL is a variation of GPL with slightly less aggressive
|
||||
"copyleft". This license requires more requirements to be met when
|
||||
distributing binaries, see the license for details. Also note that if
|
||||
you distribute a binary that includes this library, you must also
|
||||
@@ -104,9 +112,15 @@ OpenLDAP http://www.openldap.org/software/release/license.html
|
||||
libcurl uses OpenLDAP as a shared library only, I have not heard of
|
||||
anyone that ships OpenLDAP linked with libcurl in an app.
|
||||
|
||||
libssh2 http://www.libssh2.org/
|
||||
|
||||
(Used for scp and sftp support) libssh2 uses a Modified BSD-style
|
||||
license.
|
||||
|
||||
[1] = GPL - GNU General Public License: http://www.gnu.org/licenses/gpl.html
|
||||
[2] = http://www.fsf.org/licenses/gpl-faq.html#GPLIncompatibleLibs details on
|
||||
how to write such an exception to the GPL
|
||||
[3] = LGPL - GNU Lesser General Public License:
|
||||
http://www.gnu.org/licenses/lgpl.html
|
||||
[4] = MPL - Mozilla Public License:
|
||||
http://www.mozilla.org/MPL/
|
||||
|
20
docs/MANUAL
20
docs/MANUAL
@@ -7,7 +7,7 @@ LATEST VERSION
|
||||
|
||||
SIMPLE USAGE
|
||||
|
||||
Get the main page from netscape's web-server:
|
||||
Get the main page from Netscape's web-server:
|
||||
|
||||
curl http://www.netscape.com/
|
||||
|
||||
@@ -39,6 +39,15 @@ SIMPLE USAGE
|
||||
|
||||
curl --ftp-ssl ftp://files.are.secure.com/secrets.txt
|
||||
|
||||
Get a file from an SSH server using SFTP:
|
||||
|
||||
curl -u username sftp://shell.example.com/etc/issue
|
||||
|
||||
Get a file from an SSH server using SCP using a private key to authenticate:
|
||||
|
||||
curl -u username: --key ~/.ssh/id_dsa --pubkey ~/.ssh/id_dsa.pub \
|
||||
scp://shell.example.com/~/personal.txt
|
||||
|
||||
|
||||
DOWNLOAD TO A FILE
|
||||
|
||||
@@ -79,9 +88,8 @@ USING PASSWORDS
|
||||
|
||||
HTTP
|
||||
|
||||
The HTTP URL doesn't support user and password in the URL string. Curl
|
||||
does support that anyway to provide a ftp-style interface and thus you can
|
||||
pick a file like:
|
||||
Curl also supports user and password in HTTP URLs, thus you can pick a file
|
||||
like:
|
||||
|
||||
curl http://name:passwd@machine.domain/full/path/to/file
|
||||
|
||||
@@ -700,9 +708,9 @@ TIME CONDITIONS
|
||||
curl -z -local.html http://remote.server.com/remote.html
|
||||
|
||||
You can specify a "free text" date as condition. Tell curl to only download
|
||||
the file if it was updated since yesterday:
|
||||
the file if it was updated since January 12, 2012:
|
||||
|
||||
curl -z yesterday http://remote.server.com/remote.html
|
||||
curl -z "Jan 12 2012" http://remote.server.com/remote.html
|
||||
|
||||
Curl will then accept a wide range of date formats. You always make the date
|
||||
check the other way around by prepending it with a dash '-'.
|
||||
|
10
docs/TODO
10
docs/TODO
@@ -157,18 +157,14 @@ TODO
|
||||
Clark)
|
||||
|
||||
* Make curl's SSL layer capable of using other free SSL libraries. Such as
|
||||
Mozilla Security Services
|
||||
(http://www.mozilla.org/projects/security/pki/nss/), MatrixSSL
|
||||
(http://www.matrixssl.org/) or yaSSL (http://yassl.com/). At least the
|
||||
latter two could be alternatives for those looking to reduce the footprint
|
||||
of libcurl built with OpenSSL or GnuTLS.
|
||||
MatrixSSL (http://www.matrixssl.org/).
|
||||
|
||||
* Peter Sylvester's patch for SRP on the TLS layer.
|
||||
Awaits OpenSSL support for this, no need to support this in libcurl before
|
||||
there's an OpenSSL release that does it.
|
||||
|
||||
* make the configure --with-ssl option first check for OpenSSL and then for
|
||||
GnuTLS if OpenSSL wasn't detected.
|
||||
* make the configure --with-ssl option first check for OpenSSL, then GnuTLS,
|
||||
then NSS...
|
||||
|
||||
GnuTLS
|
||||
|
||||
|
71
docs/curl.1
71
docs/curl.1
@@ -21,7 +21,7 @@
|
||||
.\" * $Id$
|
||||
.\" **************************************************************************
|
||||
.\"
|
||||
.TH curl 1 "3 Nov 2006" "Curl 7.16.1" "Curl Manual"
|
||||
.TH curl 1 "28 Feb 2007" "Curl 7.16.2" "Curl Manual"
|
||||
.SH NAME
|
||||
curl \- transfer a URL
|
||||
.SH SYNOPSIS
|
||||
@@ -167,6 +167,10 @@ difference.
|
||||
must be using valid ciphers. Read up on SSL cipher list details on this URL:
|
||||
\fIhttp://www.openssl.org/docs/apps/ciphers.html\fP
|
||||
|
||||
NSS ciphers are done differently than OpenSSL and GnuTLS. The full list of
|
||||
NSS ciphers is in the NSSCipherSuite entry at this URL:
|
||||
\fIhttp://directory.fedora.redhat.com/docs/mod_nss.html#Directives\fP
|
||||
|
||||
If this option is used several times, the last one will override the others.
|
||||
.IP "--compressed"
|
||||
(HTTP) Request a compressed response using one of the algorithms libcurl
|
||||
@@ -323,6 +327,10 @@ this option assumes a \&"certificate" file that is the private key and the
|
||||
private certificate concatenated! See \fI--cert\fP and \fI--key\fP to specify
|
||||
them independently.
|
||||
|
||||
If curl is built against the NSS SSL library then this option tells
|
||||
curl the nickname of the certificate to use within the NSS database defined
|
||||
by --cacert.
|
||||
|
||||
If this option is used several times, the last one will be used.
|
||||
.IP "--cert-type <type>"
|
||||
(SSL) Tells curl what certificate type the provided certificate is in. PEM,
|
||||
@@ -342,6 +350,9 @@ The windows version of curl will automatically look for a CA certs file named
|
||||
\'curl-ca-bundle.crt\', either in the same directory as curl.exe, or in the
|
||||
Current Working Directory, or in any folder along your PATH.
|
||||
|
||||
If curl is built against the NSS SSL library then this option tells
|
||||
curl the directory that the NSS certificate database resides in.
|
||||
|
||||
If this option is used several times, the last one will be used.
|
||||
.IP "--capath <CA certificate directory>"
|
||||
(SSL) Tells curl to use the specified certificate directory to verify the
|
||||
@@ -437,10 +448,18 @@ If this option is used twice, the second will again disable this.
|
||||
(FTP) Use CCC (Clear Command Channel)
|
||||
Shuts down the SSL/TLS layer after authenticating. The rest of the
|
||||
control channel communication will be unencrypted. This allows
|
||||
NAT routers to follow the FTP transaction.
|
||||
NAT routers to follow the FTP transaction. The default mode is
|
||||
passive. See --ftp-ssl-ccc-mode for other modes.
|
||||
(Added in 7.16.1)
|
||||
|
||||
If this option is used twice, the second will again disable this.
|
||||
.IP "--ftp-ssl-ccc-mode [active/passive]"
|
||||
(FTP) Use CCC (Clear Command Channel)
|
||||
Sets the CCC mode. The passive mode will not initiate the shutdown, but
|
||||
instead wait for the server to do it, and will not reply to the
|
||||
shutdown from the server. The active mode initiates the shutdown and
|
||||
waits for a reply from the server.
|
||||
(Added in 7.16.2)
|
||||
.IP "-F/--form <name=content>"
|
||||
(HTTP) This lets curl emulate a filled in form in which a user has pressed the
|
||||
submit button. This causes curl to POST data using the Content-Type
|
||||
@@ -563,7 +582,7 @@ See this online resource for further details:
|
||||
|
||||
If this option is used twice, the second time will again disable it.
|
||||
.IP "--key <key>"
|
||||
(SSL) Private key file name. Allows you to provide your private key in this
|
||||
(SSL/SSH) Private key file name. Allows you to provide your private key in this
|
||||
separate file.
|
||||
|
||||
If this option is used several times, the last one will be used.
|
||||
@@ -589,9 +608,11 @@ 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
|
||||
first column of a config line is a '#' character, the rest of the line will be
|
||||
treated as a comment.
|
||||
treated as a comment. Only write one option per physical line in the config
|
||||
file.
|
||||
|
||||
Specify the filename as '-' to make curl read the file from stdin.
|
||||
Specify the filename to -K/--config as '-' to make curl read the file from
|
||||
stdin.
|
||||
|
||||
Note that to be able to specify a URL in the config file, you need to specify
|
||||
it using the \fI--url\fP option, and not by simply writing the URL on its own
|
||||
@@ -599,7 +620,8 @@ line. So, it could look similar to this:
|
||||
|
||||
url = "http://curl.haxx.se/docs/"
|
||||
|
||||
This option can be used multiple times to load multiple config files.
|
||||
Long option names can optionally be given in the config file without the
|
||||
initial double dashes.
|
||||
|
||||
When curl is invoked, it always (unless \fI-q\fP is used) checks for a default
|
||||
config file and uses it if found. The default config file is checked for in
|
||||
@@ -614,6 +636,22 @@ resort the '%USERPROFILE%\Application Data'.
|
||||
2) On windows, if there is no _curlrc file in the home dir, it checks for one
|
||||
in the same dir the executable curl is placed. On unix-like systems, it will
|
||||
simply try to load .curlrc from the determined home dir.
|
||||
|
||||
.nf
|
||||
# --- Example file ---
|
||||
# this is a comment
|
||||
url = "curl.haxx.se"
|
||||
output = "curlhere.html"
|
||||
user-agent = "superagent/1.0"
|
||||
|
||||
# and fetch another URL too
|
||||
url = "curl.haxx.se/docs/manpage.html"
|
||||
-O
|
||||
referer = "http://nowhereatall.com/"
|
||||
# --- End of example file ---
|
||||
.fi
|
||||
|
||||
This option can be used multiple times to load multiple config files.
|
||||
.IP "--libcurl <file>"
|
||||
Append this option to any ordinary curl command line, and you will get a
|
||||
libcurl-using source code written to the file that does the equivalent
|
||||
@@ -787,7 +825,7 @@ nothing else.
|
||||
|
||||
You may use this option as many times as you have number of URLs.
|
||||
.IP "--pass <phrase>"
|
||||
(SSL) Pass phrase for the private key
|
||||
(SSL/SSH) Pass phrase for the private key
|
||||
|
||||
If this option is used several times, the last one will be used.
|
||||
.IP "--proxy-anyauth"
|
||||
@@ -822,6 +860,11 @@ CONNECT request and requires that the proxy allows direct connect to the
|
||||
remote port number curl wants to tunnel through to.
|
||||
|
||||
If this option is used twice, the second will again disable proxy tunnel.
|
||||
.IP "--pubkey <key>"
|
||||
(SSH) Public key file name. Allows you to provide your public key in this
|
||||
separate file.
|
||||
|
||||
If this option is used several times, the last one will be used.
|
||||
.IP "-P/--ftp-port <address>"
|
||||
(FTP) Reverses the initiator/listener roles when connecting with ftp. This
|
||||
switch makes Curl use the PORT command instead of PASV. In practice, PORT
|
||||
@@ -901,6 +944,11 @@ FTP range downloads only support the simple syntax 'start-stop' (optionally
|
||||
with one of the numbers omitted). It depends on the non-RFC command SIZE.
|
||||
|
||||
If this option is used several times, the last one will be used.
|
||||
.IP "--raw"
|
||||
When used, it disables all internal HTTP decoding of content or transfer
|
||||
encodings and instead makes them passed on unaltered, raw. (Added in 7.16.2)
|
||||
|
||||
If this option is used several times, each occurrence toggles this on/off.
|
||||
.IP "-R/--remote-time"
|
||||
When used, this will make libcurl attempt to figure out the timestamp of the
|
||||
remote file, and if that is available make the local file get that same
|
||||
@@ -1009,6 +1057,9 @@ Enables a full trace dump of all incoming and outgoing data, including
|
||||
descriptive information, to the given output file. Use "-" as filename to have
|
||||
the output sent to stdout.
|
||||
|
||||
This option overrides previous uses of \fI-v/--verbose\fP or
|
||||
\fI--trace-ascii\fP.
|
||||
|
||||
If this option is used several times, the last one will be used.
|
||||
.IP "--trace-ascii <file>"
|
||||
Enables a full trace dump of all incoming and outgoing data, including
|
||||
@@ -1019,6 +1070,8 @@ This is very similar to \fI--trace\fP, but leaves out the hex part and only
|
||||
shows the ASCII part of the dump. It makes smaller output that might be easier
|
||||
to read for untrained humans.
|
||||
|
||||
This option overrides previous uses of \fI-v/--verbose\fP or \fI--trace\fP.
|
||||
|
||||
If this option is used several times, the last one will be used.
|
||||
.IP "--trace-time"
|
||||
Prepends a time stamp to each trace or verbose line that curl displays.
|
||||
@@ -1060,7 +1113,9 @@ might be option you're looking for.
|
||||
If you think this option still doesn't give you enough details, consider using
|
||||
\fI--trace\fP or \fI--trace-ascii\fP instead.
|
||||
|
||||
If this option is used twice, the second will again disable verbose.
|
||||
This option overrides previous uses of \fI--trace-ascii\fP or \fI--trace\fP.
|
||||
|
||||
If this option is used twice, the second will do nothing extra.
|
||||
.IP "-V/--version"
|
||||
Displays information about curl and the libcurl version it uses.
|
||||
|
||||
|
@@ -1,13 +1,16 @@
|
||||
# $Id$
|
||||
#
|
||||
# Adapted for djgpp / Watt-32 / DOS by
|
||||
# Gisle Vanem <giva@bgnett.no>
|
||||
#
|
||||
|
||||
include ../../packages/DOS/common.dj
|
||||
TOPDIR = ../..
|
||||
|
||||
CFLAGS += -I../../include -DFALSE=0 -DTRUE=1
|
||||
include $(TOPDIR)/packages/DOS/common.dj
|
||||
|
||||
LIBS = ../../lib/libcurl.a
|
||||
CFLAGS += -DFALSE=0 -DTRUE=1
|
||||
|
||||
LIBS = $(TOPDIR)/lib/libcurl.a
|
||||
|
||||
ifeq ($(USE_SSL),1)
|
||||
LIBS += $(OPENSSL_ROOT)/lib/libssl.a $(OPENSSL_ROOT)/lib/libcrypt.a
|
||||
@@ -15,22 +18,24 @@ endif
|
||||
|
||||
LIBS += $(WATT32_ROOT)/lib/libwatt.a $(ZLIB_ROOT)/libz.a
|
||||
|
||||
CSOURCES = fopen.c ftpget.c ftpgetresp.c ftpupload.c getinmemory.c \
|
||||
http-post.c httpput.c multi-app.c multi-double.c multi-post.c \
|
||||
multi-single.c persistant.c post-callback.c postit2.c \
|
||||
sepheaders.c simple.c simplessl.c https.c ftp3rdparty.c \
|
||||
getinfo.c anyauthput.c cookie_interface.c 10-at-a-time.c
|
||||
CSOURCES = fopen.c ftpget.c ftpgetresp.c ftpupload.c getinmemory.c \
|
||||
http-post.c httpput.c https.c multi-app.c multi-double.c \
|
||||
multi-post.c multi-single.c persistant.c post-callback.c \
|
||||
postit2.c sepheaders.c simple.c simplepost.c simplessl.c \
|
||||
multi-debugcallback.c fileupload.c getinfo.c anyauthput.c \
|
||||
10-at-a-time.c # ftpuploadresume.c ftp3rdparty.c cookie_interface.c
|
||||
|
||||
PROGRAMS = $(CSOURCES:.c=.exe)
|
||||
|
||||
all: $(PROGRAMS)
|
||||
@echo Welcome to libcurl example program
|
||||
|
||||
%.exe: %.c
|
||||
$(CC) $(CFLAGS) -o $@ $^ $(LIBS)
|
||||
@echo
|
||||
|
||||
clean:
|
||||
rm -f $(PROGRAMS)
|
||||
clean vclean realclean:
|
||||
- rm -f $(PROGRAMS) depend.dj
|
||||
|
||||
# DO NOT DELETE THIS LINE
|
||||
-include depend.dj
|
||||
|
||||
|
@@ -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
|
||||
@@ -98,13 +98,13 @@ downloaded. The amount is only for the latest transfer and will be reset again
|
||||
for each new transfer.
|
||||
.IP CURLINFO_SPEED_DOWNLOAD
|
||||
Pass a pointer to a double to receive the average download speed that curl
|
||||
measured for the complete download.
|
||||
measured for the complete download. Measured in bytes/second.
|
||||
.IP CURLINFO_SPEED_UPLOAD
|
||||
Pass a pointer to a double to receive the average upload speed that curl
|
||||
measured for the complete upload.
|
||||
measured for the complete upload. Measured in bytes/second.
|
||||
.IP CURLINFO_HEADER_SIZE
|
||||
Pass a pointer to a long to receive the total size of all the headers
|
||||
received.
|
||||
received. Measured in number of bytes.
|
||||
.IP CURLINFO_REQUEST_SIZE
|
||||
Pass a pointer to a long to receive the total size of the issued
|
||||
requests. This is so far only for HTTP requests. Note that this may be more
|
||||
|
@@ -21,7 +21,7 @@
|
||||
.\" * $Id$
|
||||
.\" **************************************************************************
|
||||
.\"
|
||||
.TH curl_easy_setopt 3 "2 Nov 2006" "libcurl 7.16.1" "libcurl Manual"
|
||||
.TH curl_easy_setopt 3 "22 Feb 2007" "libcurl 7.16.2" "libcurl Manual"
|
||||
.SH NAME
|
||||
curl_easy_setopt \- set options for a curl easy handle
|
||||
.SH SYNOPSIS
|
||||
@@ -389,10 +389,12 @@ libcurl respects the environment variables \fBhttp_proxy\fP, \fBftp_proxy\fP,
|
||||
\fBall_proxy\fP etc, if any of those is set. The \fICURLOPT_PROXY\fP option
|
||||
does however override any possibly set environment variables.
|
||||
|
||||
Starting with 7.14.1, the proxy host string given in environment variables can
|
||||
be specified the exact same way as the proxy can be set with
|
||||
\fICURLOPT_PROXY\fP, include protocol prefix (http://) and embedded user +
|
||||
password.
|
||||
Setting the proxy string to "" (an empty string) will explicitly disable the
|
||||
use of a proxy, even if there is an environment variable set for it.
|
||||
|
||||
Since 7.14.1, the proxy host string given in environment variables can be
|
||||
specified the exact same way as the proxy can be set with \fICURLOPT_PROXY\fP,
|
||||
include protocol prefix (http://) and embedded user + password.
|
||||
.IP CURLOPT_PROXYPORT
|
||||
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.
|
||||
@@ -815,6 +817,16 @@ servers) which will report incorrect content length for files over 2
|
||||
gigabytes. If this option is used, curl will not be able to accurately report
|
||||
progress, and will simply stop the download when the server ends the
|
||||
connection. (added in 7.14.1)
|
||||
.IP CURLOPT_HTTP_CONTENT_DECODING
|
||||
Pass a long to tell libcurl how to act on content decoding. If set to zero,
|
||||
content decoding will be disabled. If set to 1 it is enabled. Note however
|
||||
that libcurl has no default content decoding but requires you to use
|
||||
\fICURLOPT_ENCODING\fP for that. (added in 7.16.2)
|
||||
.IP CURLOPT_HTTP_TRANSFER_DECODING
|
||||
Pass a long to tell libcurl how to act on transfer decoding. If set to zero,
|
||||
transfer decoding will be disabled, if set to 1 it is enabled
|
||||
(default). libcurl does chunked transfer decoding by default unless this
|
||||
option is set to zero. (added in 7.16.2)
|
||||
.RE
|
||||
.SH FTP OPTIONS
|
||||
.IP CURLOPT_FTPPORT
|
||||
@@ -926,11 +938,20 @@ Try "AUTH SSL" first, and only if that fails try "AUTH TLS"
|
||||
Try "AUTH TLS" first, and only if that fails try "AUTH SSL"
|
||||
.RE
|
||||
.IP CURLOPT_FTP_SSL_CCC
|
||||
Pass a long that is set to 0 to disable and 1 to enable. If enabled, this
|
||||
option makes libcurl use CCC (Clear Command Channel). It shuts down the
|
||||
SSL/TLS layer after authenticating. The rest of the control channel
|
||||
communication will be unencrypted. This allows NAT routers to follow the FTP
|
||||
transaction. (Added in 7.16.1)
|
||||
If enabled, this option makes libcurl use CCC (Clear Command Channel). It
|
||||
shuts down the SSL/TLS layer after authenticating. The rest of the
|
||||
control channel communication will be unencrypted. This allows NAT routers
|
||||
to follow the FTP transaction. Pass a long using one of the values below.
|
||||
(Added in 7.16.1)
|
||||
.RS
|
||||
.IP CURLFTPSSL_CCC_NONE
|
||||
Don't attempt to use CCC.
|
||||
.IP CURLFTPSSL_CCC_PASSIVE
|
||||
Do not initiate the shutdown, but wait for the server to do it. Do not send
|
||||
a reply.
|
||||
.IP CURLFTPSSL_CCC_ACTIVE
|
||||
Initiate the shutdown and wait for a reply.
|
||||
.RE
|
||||
.IP CURLOPT_FTP_ACCOUNT
|
||||
Pass a pointer to a zero-terminated string (or NULL to disable). When an FTP
|
||||
server asks for "account data" after user name and password has been provided,
|
||||
@@ -1078,6 +1099,10 @@ SIGALRM to enable time-outing system calls.
|
||||
|
||||
In unix-like systems, this might cause signals to be used unless
|
||||
\fICURLOPT_NOSIGNAL\fP is set.
|
||||
.IP CURLOPT_TIMEOUT_MS
|
||||
Like \fICURLOPT_TIMEOUT\fP but takes number of milliseconds instead. If
|
||||
libcurl is built to use the standard system name resolver, that part will
|
||||
still use full-second resolution for timeouts. (Added in 7.16.2)
|
||||
.IP CURLOPT_LOW_SPEED_LIMIT
|
||||
Pass a long as parameter. It contains the transfer speed in bytes per second
|
||||
that the transfer should be below during \fICURLOPT_LOW_SPEED_TIME\fP seconds
|
||||
@@ -1092,10 +1117,10 @@ average during the transfer, the transfer will pause to keep the average rate
|
||||
less than or equal to the parameter value. Defaults to unlimited
|
||||
speed. (Added in 7.15.5)
|
||||
.IP CURLOPT_MAX_RECV_SPEED_LARGE
|
||||
Pass a curl_off_t as parameter. If an upload exceeds this speed on cumulative
|
||||
average during the transfer, the transfer will pause to keep the average rate
|
||||
less than or equal to the parameter value. Defaults to unlimited speed. (Added
|
||||
in 7.15.5)
|
||||
Pass a curl_off_t as parameter. If a download exceeds this speed on
|
||||
cumulative average during the transfer, the transfer will pause to keep the
|
||||
average rate less than or equal to the parameter value. Defaults to unlimited
|
||||
speed. (Added in 7.15.5)
|
||||
.IP CURLOPT_MAXCONNECTS
|
||||
Pass a long. The set number will be the persistent connection cache size. The
|
||||
set amount will be the maximum amount of simultaneously open connections that
|
||||
@@ -1135,6 +1160,10 @@ timeouts). See also the \fICURLOPT_TIMEOUT\fP option.
|
||||
|
||||
In unix-like systems, this might cause signals to be used unless
|
||||
\fICURLOPT_NOSIGNAL\fP is set.
|
||||
.IP CURLOPT_CONNECTTIMEOUT_MS
|
||||
Like \fICURLOPT_CONNECTTIMEOUT\fP but takes number of milliseconds instead. If
|
||||
libcurl is built to use the standard system name resolver, that part will
|
||||
still use full-second resolution for timeouts. (Added in 7.16.2)
|
||||
.IP CURLOPT_IPRESOLVE
|
||||
Allows an application to select what kind of IP addresses to use when
|
||||
resolving host names. This is only interesting when using host names that
|
||||
@@ -1160,6 +1189,9 @@ transfers. (Added in 7.15.2)
|
||||
Pass a pointer to a zero terminated string as parameter. The string should be
|
||||
the file name of your certificate. The default format is "PEM" and can be
|
||||
changed with \fICURLOPT_SSLCERTTYPE\fP.
|
||||
|
||||
With NSS this is the nickname of the certificate you wish to authenticate
|
||||
with.
|
||||
.IP CURLOPT_SSLCERTTYPE
|
||||
Pass a pointer to a zero terminated string as parameter. The string should be
|
||||
the format of your certificate. Supported formats are "PEM" and "DER". (Added
|
||||
@@ -1185,7 +1217,8 @@ engine. You have to set the crypto engine with \fICURLOPT_SSLENGINE\fP.
|
||||
\&"DER" format key file currently does not work because of a bug in OpenSSL.
|
||||
.IP CURLOPT_SSLKEYPASSWD
|
||||
Pass a pointer to a zero terminated string as parameter. It will be used as
|
||||
the password required to use the \fICURLOPT_SSLKEY\fP private key.
|
||||
the password required to use the \fICURLOPT_SSLKEY\fP or
|
||||
\fICURLOPT_SSH_PRIVATE_KEYFILE\fP private key.
|
||||
.IP CURLOPT_SSLENGINE
|
||||
Pass a pointer to a zero terminated string as parameter. It will be used as
|
||||
the identifier for the crypto engine you want to use for your private
|
||||
@@ -1204,8 +1237,8 @@ Pass a long as parameter to control what version of SSL/TLS to attempt to use.
|
||||
The available options are:
|
||||
.RS
|
||||
.IP CURL_SSLVERSION_DEFAULT
|
||||
The default action. When libcurl built with OpenSSL, this will attempt to
|
||||
figure out the remote SSL protocol version. Unfortunately there are a lot of
|
||||
The default action. When libcurl built with OpenSSL or NSS, this will attempt
|
||||
to figure out the remote SSL protocol version. Unfortunately there are a lot of
|
||||
ancient and broken servers in use which cannot handle this technique and will
|
||||
fail to connect. When libcurl is built with GnuTLS, this will mean SSLv3.
|
||||
.IP CURL_SSLVERSION_TLSv1
|
||||
@@ -1248,6 +1281,9 @@ even indicate an accessible file.
|
||||
|
||||
Note that option is by default set to the system path where libcurl's cacert
|
||||
bundle is assumed to be stored, as established at build time.
|
||||
|
||||
When built against NSS this is the directory that the NSS certificate
|
||||
database resides in.
|
||||
.IP CURLOPT_CAPATH
|
||||
Pass a char * to a zero terminated string naming a directory holding multiple
|
||||
CA certificates to verify the peer with. The certificate directory must be
|
||||
@@ -1297,12 +1333,23 @@ Pass a char *, pointing to a zero terminated string holding the list of
|
||||
ciphers to use for the SSL connection. The list must be syntactically correct,
|
||||
it consists of one or more cipher strings separated by colons. Commas or spaces
|
||||
are also acceptable separators but colons are normally used, \!, \- and \+ can
|
||||
be used as operators. Valid examples of cipher lists include 'RC4-SHA',
|
||||
be used as operators.
|
||||
|
||||
For OpenSSL and GnuTLS valid examples of cipher lists include 'RC4-SHA',
|
||||
\'SHA1+DES\', 'TLSv1' and 'DEFAULT'. The default list is normally set when you
|
||||
compile OpenSSL.
|
||||
|
||||
You'll find more details about cipher lists on this URL:
|
||||
\fIhttp://www.openssl.org/docs/apps/ciphers.html\fP
|
||||
|
||||
For NSS valid examples of cipher lists include 'rsa_rc4_128_md5',
|
||||
\'rsa_aes_128_sha\', etc. With NSS you don't add/remove ciphers. If one uses
|
||||
this option then all known ciphers are disabled and only those passed in
|
||||
are enabled.
|
||||
|
||||
You'll find more details about the NSS cipher lists on this URL:
|
||||
\fIhttp://directory.fedora.redhat.com/docs/mod_nss.html#Directives\fP
|
||||
|
||||
.IP CURLOPT_SSL_SESSIONID_CACHE
|
||||
Pass a long set to 0 to disable libcurl's use of SSL session-ID caching. Set
|
||||
this to 1 to enable it. By default all transfers are done using the
|
||||
@@ -1326,6 +1373,7 @@ libcurl defaults to using \fB~/.ssh/id_dsa.pub\fP.
|
||||
.IP CURLOPT_SSH_PRIVATE_KEYFILE
|
||||
Pass a char * pointing to a file name for your private key. If not used,
|
||||
libcurl defaults to using \fB~/.ssh/id_dsa\fP.
|
||||
If the file is password-protected, set the password with \fICURLOPT_SSLKEYPASSWD\fP.
|
||||
.SH OTHER OPTIONS
|
||||
.IP CURLOPT_PRIVATE
|
||||
Pass a char * as parameter, pointing to data that should be associated with
|
||||
|
@@ -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
|
||||
@@ -21,7 +21,7 @@
|
||||
.\" * $Id$
|
||||
.\" **************************************************************************
|
||||
.\"
|
||||
.TH libcurl-multi 3 "13 Oct 2001" "libcurl 7.10.1" "libcurl multi interface"
|
||||
.TH libcurl-multi 3 "3 Feb 2007" "libcurl 7.16.0" "libcurl multi interface"
|
||||
.SH NAME
|
||||
libcurl-multi \- how to use the multi interface
|
||||
.SH DESCRIPTION
|
||||
@@ -112,3 +112,23 @@ to clean them up properly.
|
||||
If you want to re-use an easy handle that was added to the multi handle for
|
||||
transfer, you must first remove it from the multi stack and then re-add it
|
||||
again (possibly after having altered some options at your own choice).
|
||||
.SH "MULTI_SOCKET"
|
||||
Since 7.16.0, the \fIcurl_multi_socket(3)\fP function offers a way for
|
||||
applications to not only avoid being forced to use select(), but it also
|
||||
offers a much more high-performing API that will make a significant difference
|
||||
for applications using large numbers of simultaneous connections.
|
||||
|
||||
\fIcurl_multi_socket(3)\fP (and \fIcurl_multi_socket_all(3)\fP) is then used
|
||||
instead of \fIcurl_multi_perform(3)\fP.
|
||||
.SH "BLOCKING"
|
||||
A few areas in the code are still using blocking code, even when used from the
|
||||
multi interface. While we certainly want and intend for these to get fixed in
|
||||
the future, you should be aware of the following current restrictions:
|
||||
|
||||
- Name resolves on non-windows unless c-ares is used
|
||||
- GnuTLS SSL connections
|
||||
- Active FTP connections
|
||||
- HTTP proxy CONNECT operations
|
||||
- SCP and SFTP connections
|
||||
- SFTP transfers
|
||||
- file:// transfers
|
||||
|
@@ -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
|
||||
@@ -21,7 +21,7 @@
|
||||
.\" * $Id$
|
||||
.\" **************************************************************************
|
||||
.\"
|
||||
.TH libcurl-tutorial 3 "9 May 2005" "libcurl" "libcurl programming"
|
||||
.TH libcurl-tutorial 3 "27 Feb 2007" "libcurl" "libcurl programming"
|
||||
.SH NAME
|
||||
libcurl-tutorial \- libcurl programming tutorial
|
||||
.SH "Objective"
|
||||
@@ -64,10 +64,10 @@ $ curl-config --libs
|
||||
.IP "SSL or Not"
|
||||
libcurl can be built and customized in many ways. One of the things that
|
||||
varies from different libraries and builds is the support for SSL-based
|
||||
transfers, like HTTPS and FTPS. If OpenSSL was detected properly at
|
||||
build-time, libcurl will be built with SSL support. To figure out if an
|
||||
installed libcurl has been built with SSL support enabled, use 'curl-config'
|
||||
like this:
|
||||
transfers, like HTTPS and FTPS. If a supported SSL library was detected
|
||||
properly at build-time, libcurl will be built with SSL support. To figure out
|
||||
if an installed libcurl has been built with SSL support enabled, use
|
||||
\&'curl-config' like this:
|
||||
|
||||
$ curl-config --feature
|
||||
|
||||
@@ -111,11 +111,10 @@ sockets properly. You should only do this once for each application, so if
|
||||
your program already does this or of another library in use does it, you
|
||||
should not tell libcurl to do this as well.
|
||||
.IP CURL_GLOBAL_SSL
|
||||
which only does anything on libcurls compiled and built
|
||||
SSL-enabled. On these systems, this will make libcurl initialize OpenSSL
|
||||
properly for this application. This is only needed to do once for each
|
||||
application so if your program or another library already does this, this
|
||||
bit should not be needed.
|
||||
which only does anything on libcurls compiled and built SSL-enabled. On these
|
||||
systems, this will make libcurl initialize the SSL library properly for this
|
||||
application. This is only needed to do once for each application so if your
|
||||
program or another library already does this, this bit should not be needed.
|
||||
.RE
|
||||
|
||||
libcurl has a default protection mechanism that detects if
|
||||
@@ -256,18 +255,27 @@ handlers. Signals are used timeouting name resolves (during DNS lookup) - when
|
||||
built without c-ares support and not on Windows..
|
||||
|
||||
If you are accessing HTTPS or FTPS URLs in a multi-threaded manner, you are
|
||||
then of course using OpenSSL/GnuTLS multi-threaded and those libs have their
|
||||
own requirements on this issue. Basically, you need to provide one or two
|
||||
functions to allow it to function properly. For all details, see this:
|
||||
then of course using the underlying SSL library multi-threaded and those libs
|
||||
might have their own requirements on this issue. Basically, you need to
|
||||
provide one or two functions to allow it to function properly. For all
|
||||
details, see this:
|
||||
|
||||
OpenSSL
|
||||
|
||||
http://www.openssl.org/docs/crypto/threads.html#DESCRIPTION
|
||||
http://www.openssl.org/docs/crypto/threads.html#DESCRIPTION
|
||||
|
||||
GnuTLS
|
||||
|
||||
http://www.gnu.org/software/gnutls/manual/html_node/Multi_002dthreaded-applications.html
|
||||
|
||||
NSS
|
||||
|
||||
is claimed to be thread-safe already without anything required
|
||||
|
||||
yassl
|
||||
|
||||
Required actions unknown
|
||||
|
||||
When using multiple threads you should set the CURLOPT_NOSIGNAL option to TRUE
|
||||
for all handles. Everything will or might work fine except that timeouts are
|
||||
not honored during the DNS lookup - which you can work around by building
|
||||
@@ -614,22 +622,26 @@ What "proxy" means according to Merriam-Webster: "a person authorized to act
|
||||
for another" but also "the agency, function, or office of a deputy who acts as
|
||||
a substitute for another".
|
||||
|
||||
Proxies are exceedingly common these days. Companies often only offer
|
||||
Internet access to employees through their HTTP proxies. Network clients or
|
||||
user-agents ask the proxy for documents, the proxy does the actual request
|
||||
and then it returns them.
|
||||
Proxies are exceedingly common these days. Companies often only offer Internet
|
||||
access to employees through their proxies. Network clients or user-agents ask
|
||||
the proxy for documents, the proxy does the actual request and then it returns
|
||||
them.
|
||||
|
||||
libcurl has full support for HTTP proxies, so when a given URL is wanted,
|
||||
libcurl will ask the proxy for it instead of trying to connect to the actual
|
||||
host identified in the URL.
|
||||
libcurl supports SOCKS and HTTP proxies. When a given URL is wanted, libcurl
|
||||
will ask the proxy for it instead of trying to connect to the actual host
|
||||
identified in the URL.
|
||||
|
||||
The fact that the proxy is a HTTP proxy puts certain restrictions on what can
|
||||
actually happen. A requested URL that might not be a HTTP URL will be still
|
||||
be passed to the HTTP proxy to deliver back to libcurl. This happens
|
||||
transparently, and an application may not need to know. I say "may", because
|
||||
at times it is very important to understand that all operations over a HTTP
|
||||
proxy is using the HTTP protocol. For example, you can't invoke your own
|
||||
custom FTP commands or even proper FTP directory listings.
|
||||
If you're using a SOCKS proxy, you may find that libcurl doesn't quite support
|
||||
all operations through it.
|
||||
|
||||
For HTTP proxies: the fact that the proxy is a HTTP proxy puts certain
|
||||
restrictions on what can actually happen. A requested URL that might not be a
|
||||
HTTP URL will be still be passed to the HTTP proxy to deliver back to
|
||||
libcurl. This happens transparently, and an application may not need to
|
||||
know. I say "may", because at times it is very important to understand that
|
||||
all operations over a HTTP proxy is using the HTTP protocol. For example, you
|
||||
can't invoke your own custom FTP commands or even proper FTP directory
|
||||
listings.
|
||||
|
||||
.IP "Proxy Options"
|
||||
|
||||
@@ -645,6 +657,11 @@ pass that information similar to this:
|
||||
If you want to, you can specify the host name only in the CURLOPT_PROXY
|
||||
option, and set the port number separately with CURLOPT_PROXYPORT.
|
||||
|
||||
Tell libcurl what kind of proxy it is with CURLOPT_PROXYTYPE (if not, it will
|
||||
default to assume a HTTP proxy):
|
||||
|
||||
curl_easy_setopt(easyhandle, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS4);
|
||||
|
||||
.IP "Environment Variables"
|
||||
|
||||
libcurl automatically checks and uses a set of environment variables to
|
||||
@@ -669,6 +686,8 @@ for any URL in case the protocol specific variable wasn't set, and
|
||||
variable may say so. If 'no_proxy' is a plain asterisk ("*") it matches all
|
||||
hosts.
|
||||
|
||||
To explicitly disable libcurl's checking for and using the proxy environment
|
||||
variables, set the proxy name to "" - an empty string - with CURLOPT_PROXY.
|
||||
.IP "SSL and Proxies"
|
||||
|
||||
SSL is for secure point-to-point connections. This involves strong encryption
|
||||
@@ -768,26 +787,6 @@ with the CURLOPT_MAXCONNECTS option. Default is 5. It is very seldom any
|
||||
point in changing this value, and if you think of changing this it is often
|
||||
just a matter of thinking again.
|
||||
|
||||
When the connection cache gets filled, libcurl must close an existing
|
||||
connection in order to get room for the new one. To know which connection to
|
||||
close, libcurl uses a "close policy" that you can affect with the
|
||||
CURLOPT_CLOSEPOLICY option. There's only two polices implemented as of this
|
||||
writing (libcurl 7.9.4) and they are:
|
||||
|
||||
.RS
|
||||
.IP CURLCLOSEPOLICY_LEAST_RECENTLY_USED
|
||||
simply close the one that hasn't been used for the longest time. This is the
|
||||
default behavior.
|
||||
.IP CURLCLOSEPOLICY_OLDEST
|
||||
closes the oldest connection, the one that was created the longest time ago.
|
||||
.RE
|
||||
|
||||
There are, or at least were, plans to support a close policy that would call
|
||||
a user-specified callback to let the user be able to decide which connection
|
||||
to dump when this is necessary and therefor is the CURLOPT_CLOSEFUNCTION an
|
||||
existing option still today. Nothing ever uses this though and this will not
|
||||
be used within the foreseeable future either.
|
||||
|
||||
To force your upcoming request to not use an already existing connection (it
|
||||
will even close one first if there happens to be one alive to the same host
|
||||
you're about to operate on), you can do that by setting CURLOPT_FRESH_CONNECT
|
||||
@@ -797,7 +796,8 @@ CURLOPT_FORBID_REUSE to TRUE.
|
||||
|
||||
.SH "HTTP Headers Used by libcurl"
|
||||
When you use libcurl to do HTTP requests, it'll pass along a series of headers
|
||||
automatically. It might be good for you to know and understand these ones.
|
||||
automatically. It might be good for you to know and understand these ones. You
|
||||
can replace or remove them by using the CURLOPT_HTTPHEADER option.
|
||||
|
||||
.IP "Host"
|
||||
This header is required by HTTP 1.1 and even many 1.0 servers and should be
|
||||
@@ -811,10 +811,11 @@ fetch a fresh one.
|
||||
.IP "Accept"
|
||||
\&"*/*".
|
||||
|
||||
.IP "Expect:"
|
||||
When doing multi-part formposts, libcurl will set this header to
|
||||
\&"100-continue" to ask the server for an "OK" message before it proceeds with
|
||||
sending the data part of the post.
|
||||
.IP "Expect"
|
||||
When doing POST requests, libcurl sets this header to \&"100-continue" to ask
|
||||
the server for an "OK" message before it proceeds with sending the data part
|
||||
of the post. If the POSTed data amount is deemed "small", libcurl will not use
|
||||
this header.
|
||||
|
||||
.SH "Customizing Operations"
|
||||
There is an ongoing development today where more and more protocols are built
|
||||
@@ -888,12 +889,10 @@ data size is unknown.
|
||||
|
||||
.IP "HTTP Version"
|
||||
|
||||
There's only one aspect left in the HTTP requests that we haven't yet
|
||||
mentioned how to modify: the version field. All HTTP requests includes the
|
||||
version number to tell the server which version we support. libcurl speak HTTP
|
||||
1.1 by default. Some very old servers don't like getting 1.1-requests and when
|
||||
dealing with stubborn old things like that, you can tell libcurl to use 1.0
|
||||
instead by doing something like this:
|
||||
All HTTP requests includes the version number to tell the server which version
|
||||
we support. libcurl speak HTTP 1.1 by default. Some very old servers don't
|
||||
like getting 1.1-requests and when dealing with stubborn old things like that,
|
||||
you can tell libcurl to use 1.0 instead by doing something like this:
|
||||
|
||||
curl_easy_setopt(easyhandle, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);
|
||||
|
||||
@@ -1051,7 +1050,7 @@ The headers are passed to the callback function one by one, and you can
|
||||
depend on that fact. It makes it easier for you to add custom header parsers
|
||||
etc.
|
||||
|
||||
"Headers" for FTP transfers equal all the FTP server responses. They aren't
|
||||
\&"Headers" for FTP transfers equal all the FTP server responses. They aren't
|
||||
actually true headers, but in this case we pretend they are! ;-)
|
||||
|
||||
.SH "Post Transfer Information"
|
||||
|
@@ -71,7 +71,8 @@ AC_DEFUN([LIBCURL_CHECK_CONFIG],
|
||||
if test -d "$_libcurl_with" ; then
|
||||
LIBCURL_CPPFLAGS="-I$withval/include"
|
||||
_libcurl_ldflags="-L$withval/lib"
|
||||
AC_PATH_PROG([_libcurl_config],["$withval/bin/curl-config"])
|
||||
AC_PATH_PROG([_libcurl_config],[curl-config],["$withval/bin"],
|
||||
["$withval/bin"])
|
||||
else
|
||||
AC_PATH_PROG([_libcurl_config],[curl-config])
|
||||
fi
|
||||
|
@@ -465,6 +465,14 @@ typedef enum {
|
||||
CURLFTPSSL_LAST /* not an option, never use */
|
||||
} curl_ftpssl;
|
||||
|
||||
/* parameter for the CURLOPT_FTP_SSL_CCC option */
|
||||
typedef enum {
|
||||
CURLFTPSSL_CCC_NONE, /* do not send CCC */
|
||||
CURLFTPSSL_CCC_PASSIVE, /* Let the server initiate the shutdown */
|
||||
CURLFTPSSL_CCC_ACTIVE, /* Initiate the shutdown */
|
||||
CURLFTPSSL_CCC_LAST /* not an option, never use */
|
||||
} curl_ftpccc;
|
||||
|
||||
/* parameter for the CURLOPT_FTPSSLAUTH option */
|
||||
typedef enum {
|
||||
CURLFTPAUTH_DEFAULT, /* let libcurl decide */
|
||||
@@ -1054,6 +1062,15 @@ typedef enum {
|
||||
/* Send CCC (Clear Command Channel) after authentication */
|
||||
CINIT(FTP_SSL_CCC, LONG, 154),
|
||||
|
||||
/* Same as TIMEOUT and CONNECTTIMEOUT, but with ms resolution */
|
||||
CINIT(TIMEOUT_MS, LONG, 155),
|
||||
CINIT(CONNECTTIMEOUT_MS, LONG, 156),
|
||||
|
||||
/* set to zero to disable the libcurl's decoding and thus pass the raw body
|
||||
data to the appliction even when it is encoded/compressed */
|
||||
CINIT(HTTP_TRANSFER_DECODING, LONG, 157),
|
||||
CINIT(HTTP_CONTENT_DECODING, LONG, 158),
|
||||
|
||||
CURLOPT_LASTENTRY /* the last unused */
|
||||
} CURLoption;
|
||||
|
||||
|
@@ -7,7 +7,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
|
||||
@@ -28,13 +28,13 @@
|
||||
|
||||
/* This is the version number of the libcurl package from which this header
|
||||
file origins: */
|
||||
#define LIBCURL_VERSION "7.16.1-CVS"
|
||||
#define LIBCURL_VERSION "7.16.2-CVS"
|
||||
|
||||
/* The numeric version number is also available "in parts" by using these
|
||||
defines: */
|
||||
#define LIBCURL_VERSION_MAJOR 7
|
||||
#define LIBCURL_VERSION_MINOR 16
|
||||
#define LIBCURL_VERSION_PATCH 1
|
||||
#define LIBCURL_VERSION_PATCH 2
|
||||
|
||||
/* This is the numeric version of the libcurl version number, meant for easier
|
||||
parsing and comparions by programs. The LIBCURL_VERSION_NUM define will
|
||||
@@ -51,6 +51,17 @@
|
||||
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 0x071001
|
||||
#define LIBCURL_VERSION_NUM 0x071002
|
||||
|
||||
/*
|
||||
* This is the date and time when the full source package was created. The
|
||||
* timestamp is not stored in CVS, as the timestamp is properly set in the
|
||||
* tarballs by the maketgz script.
|
||||
*
|
||||
* The format of the date should follow this template:
|
||||
*
|
||||
* "Mon Feb 12 11:35:33 UTC 2007"
|
||||
*/
|
||||
#define LIBCURL_TIMESTAMP "CVS"
|
||||
|
||||
#endif /* __CURL_CURLVER_H */
|
||||
|
@@ -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
|
||||
@@ -39,6 +39,7 @@ EXTRA_DIST = Makefile.b32 Makefile.m32 Makefile.vc6 Makefile.riscos \
|
||||
CLEANFILES = $(DSP) $(VCPROJ)
|
||||
|
||||
lib_LTLIBRARIES = libcurl.la
|
||||
LIBCURL_LIBS = @LIBCURL_LIBS@
|
||||
|
||||
# we use srcdir/include for the static global include files
|
||||
# we use builddir/lib for the generated lib/config.h file to get found
|
||||
@@ -89,7 +90,7 @@ if MIMPURE
|
||||
MIMPURE = -mimpure-text
|
||||
endif
|
||||
|
||||
libcurl_la_LDFLAGS = $(UNDEF) $(VERSION) $(MIMPURE)
|
||||
libcurl_la_LDFLAGS = $(UNDEF) $(VERSION) $(MIMPURE) $(LIBCURL_LIBS)
|
||||
|
||||
# Makefile.inc provides the CSOURCES and HHEADERS defines
|
||||
include Makefile.inc
|
||||
|
@@ -8,7 +8,7 @@ CSOURCES = file.c timeval.c base64.c hostip.c progress.c formdata.c \
|
||||
content_encoding.c share.c http_digest.c md5.c http_negotiate.c \
|
||||
http_ntlm.c inet_pton.c strtoofft.c strerror.c hostares.c hostasyn.c \
|
||||
hostip4.c hostip6.c hostsyn.c hostthre.c inet_ntop.c parsedate.c \
|
||||
select.c gtls.c sslgen.c tftp.c splay.c strdup.c socks.c ssh.c
|
||||
select.c gtls.c sslgen.c tftp.c splay.c strdup.c socks.c ssh.c nss.c
|
||||
|
||||
HHEADERS = arpa_telnet.h netrc.h file.h timeval.h base64.h hostip.h \
|
||||
progress.h formdata.h cookie.h http.h sendf.h ftp.h url.h dict.h \
|
||||
@@ -18,6 +18,5 @@ HHEADERS = arpa_telnet.h netrc.h file.h timeval.h base64.h hostip.h \
|
||||
share.h md5.h http_digest.h http_negotiate.h http_ntlm.h ca-bundle.h \
|
||||
inet_pton.h strtoofft.h strerror.h inet_ntop.h curlx.h memory.h \
|
||||
setup.h transfer.h select.h easyif.h multiif.h parsedate.h sslgen.h \
|
||||
gtls.h tftp.h sockaddr.h splay.h strdup.h setup_once.h socks.h ssh.h
|
||||
|
||||
|
||||
gtls.h tftp.h sockaddr.h splay.h strdup.h setup_once.h socks.h ssh.h \
|
||||
nssg.h
|
||||
|
@@ -50,6 +50,9 @@ endif
|
||||
ifdef SSPI
|
||||
CFLAGS += -DUSE_WINDOWS_SSPI
|
||||
endif
|
||||
ifdef IPV6
|
||||
CFLAGS += -DENABLE_IPV6
|
||||
endif
|
||||
COMPILE = $(CC) $(INCLUDES) $(CFLAGS)
|
||||
|
||||
# Makefile.inc provides the CSOURCES and HHEADERS defines
|
||||
|
@@ -1,4 +1,5 @@
|
||||
#################################################################
|
||||
# $Id$
|
||||
#
|
||||
## Makefile for building libcurl.nlm (NetWare version - gnu make)
|
||||
## Use: make -f Makefile.netware
|
||||
@@ -19,7 +20,7 @@ endif
|
||||
|
||||
# Edit the path below to point to the base of your OpenSSL package.
|
||||
ifndef OPENSSL_PATH
|
||||
OPENSSL_PATH = ../../openssl-0.9.8d
|
||||
OPENSSL_PATH = ../../openssl-0.9.8e
|
||||
endif
|
||||
|
||||
# Edit the path below to point to the base of your LibSSH2 package.
|
||||
@@ -82,9 +83,10 @@ CFLAGS = $(OPT) -D$(DB) -DNETWARE -DHAVE_CONFIG_H -nostdinc
|
||||
|
||||
ifeq ($(CC),mwccnlm)
|
||||
LD = mwldnlm
|
||||
LDFLAGS = -nostdlib $(PRELUDE) $(OBJL) -o $(TARGET).nlm -commandfile
|
||||
LDFLAGS = -nostdlib $(PRELUDE) $(OBJL) -o $@ -commandfile
|
||||
AR = mwldnlm
|
||||
ARFLAGS = -type library -w nocmdline $(OBJS) -o
|
||||
LIBEXT = lib
|
||||
CFLAGS += -msgstyle gcc -gccinc -inline off -opt nointrinsics -proc 586
|
||||
CFLAGS += -relax_pointers
|
||||
#CFLAGS += -w on
|
||||
@@ -101,6 +103,7 @@ LD = nlmconv
|
||||
LDFLAGS = -T
|
||||
AR = ar
|
||||
ARFLAGS = -cq
|
||||
LIBEXT = a
|
||||
CFLAGS += -fno-builtin -fpcc-struct-return -fno-strict-aliasing
|
||||
CFLAGS += -Wall # -pedantic
|
||||
ifeq ($(LIBARCH),LIBC)
|
||||
@@ -115,36 +118,40 @@ NDK_ROOT = $(NDKBASE)/ndk
|
||||
SDK_CLIB = $(NDK_ROOT)/nwsdk
|
||||
SDK_LIBC = $(NDK_ROOT)/libc
|
||||
SDK_LDAP = $(NDK_ROOT)/cldapsdk/netware
|
||||
CURL_INC = ../include
|
||||
CURL_LIB = ../lib
|
||||
ARES_LIB = ../ares
|
||||
|
||||
INCLUDES = -I. -I../include
|
||||
INCLUDES = -I$(CURL_INC) -I$(CURL_LIB)
|
||||
|
||||
ifdef WITH_ARES
|
||||
INCLUDES += -I../ares
|
||||
LDLIBS = ../ares/libcares.lib
|
||||
endif
|
||||
ifdef WITH_SSL
|
||||
INCLUDES += -I$(OPENSSL_PATH)/outinc_nw_libc -I$(OPENSSL_PATH)/outinc_nw_libc/openssl
|
||||
LDLIBS += $(OPENSSL_PATH)/out_nw_libc/crypto.lib $(OPENSSL_PATH)/out_nw_libc/ssl.lib
|
||||
IMPORTS += GetProcessSwitchCount RunningProcess
|
||||
endif
|
||||
ifdef WITH_SSH2
|
||||
INCLUDES += -I$(LIBSSH2_PATH)/include
|
||||
ifdef LINK_STATIC
|
||||
LDLIBS += $(LIBSSH2_PATH)/nw/libssh2.lib
|
||||
else
|
||||
IMPORTS += @$(LIBSSH2_PATH)/nw/libssh2.imp
|
||||
MODULES += libssh2.nlm
|
||||
endif
|
||||
INCLUDES += -I$(ARES_LIB)
|
||||
LDLIBS = $(ARES_LIB)/libcares.$(LIBEXT)
|
||||
endif
|
||||
ifdef WITH_ZLIB
|
||||
INCLUDES += -I$(ZLIB_PATH)
|
||||
ifdef LINK_STATIC
|
||||
LDLIBS += $(ZLIB_PATH)/nw/libz.lib
|
||||
LDLIBS += $(ZLIB_PATH)/nw/libz.$(LIBEXT)
|
||||
else
|
||||
IMPORTS += @$(ZLIB_PATH)/nw/libz.imp
|
||||
MODULES += libz.nlm
|
||||
IMPORTS += @$(ZLIB_PATH)/nw/libz.imp
|
||||
endif
|
||||
endif
|
||||
ifdef WITH_SSH2
|
||||
INCLUDES += -I$(LIBSSH2_PATH)/include
|
||||
ifdef LINK_STATIC
|
||||
LDLIBS += $(LIBSSH2_PATH)/nw/libssh2.$(LIBEXT)
|
||||
else
|
||||
MODULES += libssh2.nlm
|
||||
IMPORTS += @$(LIBSSH2_PATH)/nw/libssh2.imp
|
||||
endif
|
||||
endif
|
||||
ifdef WITH_SSL
|
||||
INCLUDES += -I$(OPENSSL_PATH)/outinc_nw_libc -I$(OPENSSL_PATH)/outinc_nw_libc/openssl
|
||||
LDLIBS += $(OPENSSL_PATH)/out_nw_libc/ssl.$(LIBEXT)
|
||||
LDLIBS += $(OPENSSL_PATH)/out_nw_libc/crypto.$(LIBEXT)
|
||||
IMPORTS += GetProcessSwitchCount RunningProcess
|
||||
endif
|
||||
|
||||
ifeq ($(LIBARCH),LIBC)
|
||||
INCLUDES += -I$(SDK_LIBC)/include -I$(SDK_LIBC)/include/nks
|
||||
@@ -181,15 +188,15 @@ endif
|
||||
# Makefile.inc provides the CSOURCES and HHEADERS defines
|
||||
include Makefile.inc
|
||||
|
||||
OBJS := $(patsubst %.c,$(OBJDIR)/%.o,$(strip $(CSOURCES))) $(LDLIBS)
|
||||
OBJS := $(patsubst %.c,$(OBJDIR)/%.o,$(strip $(CSOURCES)))
|
||||
|
||||
OBJL = $(OBJS) $(OBJDIR)/nwlib.o
|
||||
OBJL = $(OBJS) $(OBJDIR)/nwlib.o $(LDLIBS)
|
||||
|
||||
all: lib nlm
|
||||
|
||||
nlm: prebuild $(TARGET).nlm
|
||||
|
||||
lib: prebuild $(TARGET).lib
|
||||
lib: prebuild $(TARGET).$(LIBEXT)
|
||||
|
||||
prebuild: $(OBJDIR) $(OBJDIR)/version.inc config.h ca-bundle.h
|
||||
|
||||
@@ -207,7 +214,7 @@ dist: all
|
||||
|
||||
install: $(INSTDIR) all
|
||||
@$(CP) $(TARGET).nlm $(INSTDIR)
|
||||
@$(CP) $(TARGET).lib $(INSTDIR)
|
||||
@$(CP) $(TARGET).$(LIBEXT) $(INSTDIR)
|
||||
@$(CP) ../CHANGES $(INSTDIR)
|
||||
@$(CP) ../COPYING $(INSTDIR)
|
||||
@$(CP) ../README $(INSTDIR)
|
||||
@@ -221,7 +228,7 @@ clean:
|
||||
-$(RM) -r $(OBJDIR)
|
||||
|
||||
distclean: clean
|
||||
-$(RM) -r $(TARGET).lib $(TARGET).nlm
|
||||
-$(RM) -r $(TARGET).$(LIBEXT) $(TARGET).nlm
|
||||
|
||||
$(INSTDIR):
|
||||
@mkdir $(INSTDIR)
|
||||
@@ -229,7 +236,7 @@ $(INSTDIR):
|
||||
$(OBJDIR):
|
||||
@mkdir $(OBJDIR)
|
||||
|
||||
$(TARGET).lib: $(OBJS)
|
||||
$(TARGET).$(LIBEXT): $(OBJS)
|
||||
@echo Creating $@
|
||||
@-$(RM) $@
|
||||
@$(AR) $(ARFLAGS) $@ $^
|
||||
@@ -303,11 +310,11 @@ ifdef IMPORTS
|
||||
@echo $(DL)import $(IMPORTS)$(DL) >> $@
|
||||
endif
|
||||
ifeq ($(LD),nlmconv)
|
||||
ifdef LDLIBS
|
||||
@echo $(DL)input $(LDLIBS)$(DL) >> $@
|
||||
endif
|
||||
@echo $(DL)input $(OBJL)$(DL) >> $@
|
||||
@echo $(DL)input $(PRELUDE)$(DL) >> $@
|
||||
#ifdef LDLIBS
|
||||
# @echo $(DL)input $(LDLIBS)$(DL) >> $@
|
||||
#endif
|
||||
@echo $(DL)output $(TARGET).nlm$(DL) >> $@
|
||||
endif
|
||||
|
||||
@@ -317,6 +324,9 @@ config.h: Makefile.netware
|
||||
@echo $(DL)** Do not edit this file - it is created by make!$(DL) >> $@
|
||||
@echo $(DL)** All your changes will be lost!!$(DL) >> $@
|
||||
@echo $(DL)*/$(DL) >> $@
|
||||
@echo $(DL)#ifndef NETWARE$(DL) >> $@
|
||||
@echo $(DL)#error This $(notdir $@) is created for NetWare platform!$(DL) >> $@
|
||||
@echo $(DL)#endif$(DL) >> $@
|
||||
@echo $(DL)#define OS "i586-pc-NetWare"$(DL) >> $@
|
||||
@echo $(DL)#define VERSION "$(LIBCURL_VERSION_STR)"$(DL) >> $@
|
||||
@echo $(DL)#define PACKAGE_BUGREPORT "a suitable curl mailing list => http://curl.haxx.se/mail/"$(DL) >> $@
|
||||
@@ -335,7 +345,6 @@ config.h: Makefile.netware
|
||||
@echo $(DL)#define HAVE_INTTYPES_H 1$(DL) >> $@
|
||||
@echo $(DL)#define HAVE_LIMITS_H 1$(DL) >> $@
|
||||
@echo $(DL)#define HAVE_LONGLONG 1$(DL) >> $@
|
||||
@echo $(DL)#define HAVE_MALLOC_H 1$(DL) >> $@
|
||||
@echo $(DL)#define HAVE_NETINET_IN_H 1$(DL) >> $@
|
||||
@echo $(DL)#define HAVE_RECV 1$(DL) >> $@
|
||||
@echo $(DL)#define HAVE_SELECT 1$(DL) >> $@
|
||||
@@ -360,7 +369,6 @@ config.h: Makefile.netware
|
||||
@echo $(DL)#define HAVE_SYS_TIME_H 1$(DL) >> $@
|
||||
@echo $(DL)#define HAVE_TERMIOS_H 1$(DL) >> $@
|
||||
@echo $(DL)#define HAVE_TIME_H 1$(DL) >> $@
|
||||
@echo $(DL)#define HAVE_UNAME 1$(DL) >> $@
|
||||
@echo $(DL)#define HAVE_UNISTD_H 1$(DL) >> $@
|
||||
@echo $(DL)#define RECV_TYPE_ARG1 int$(DL) >> $@
|
||||
@echo $(DL)#define RECV_TYPE_ARG2 char *$(DL) >> $@
|
||||
@@ -426,6 +434,11 @@ ifdef WITH_SSH2
|
||||
@echo $(DL)#define USE_LIBSSH2 1$(DL) >> $@
|
||||
@echo $(DL)#define HAVE_LIBSSH2_H 1$(DL) >> $@
|
||||
endif
|
||||
@echo $(DL)#ifdef __GNUC__$(DL) >> $@
|
||||
@echo $(DL)#define HAVE_VARIADIC_MACROS_GCC 1$(DL) >> $@
|
||||
@echo $(DL)#else$(DL) >> $@
|
||||
@echo $(DL)#define HAVE_VARIADIC_MACROS_C99 1$(DL) >> $@
|
||||
@echo $(DL)#endif$(DL) >> $@
|
||||
ifdef OLD_NOVELLSDK
|
||||
@echo $(DL)#define socklen_t int$(DL) >> $@
|
||||
endif
|
||||
@@ -477,6 +490,6 @@ else
|
||||
endif
|
||||
|
||||
$(LIBCARES):
|
||||
$(MAKE) -C ../ares -f Makefile.netware lib
|
||||
$(MAKE) -C $(ARES_LIB) -f Makefile.netware lib
|
||||
|
||||
|
||||
|
@@ -41,6 +41,10 @@ OPENSSL_PATH = ../../openssl-0.9.7e
|
||||
ZLIB_PATH = ../../zlib-1.2.1
|
||||
!ENDIF
|
||||
|
||||
!IFNDEF MACHINE
|
||||
MACHINE = X86
|
||||
!ENDIF
|
||||
|
||||
# USE_WINDOWS_SSPI uses windows libraries to allow NTLM authentication
|
||||
# without an openssl installation and offers the ability to authenticate
|
||||
# using the "current logged in user". It does however require that the
|
||||
@@ -74,7 +78,7 @@ CFLAGS = /I. /I../include /nologo /W3 /GX /DWIN32 /YX /FD /c /DBUILDING_LIBC
|
||||
CFLAGSLIB = /DCURL_STATICLIB
|
||||
LNKDLL = link.exe /DLL
|
||||
LNKLIB = link.exe /lib
|
||||
LFLAGS = /nologo
|
||||
LFLAGS = /nologo /machine:$(MACHINE)
|
||||
SSLLIBS = libeay32.lib ssleay32.lib
|
||||
ZLIBLIBSDLL= zdll.lib
|
||||
ZLIBLIBS = zlib.lib
|
||||
|
@@ -5,7 +5,7 @@
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2005, 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
|
||||
@@ -21,6 +21,8 @@
|
||||
* $Id$
|
||||
***************************************************************************/
|
||||
|
||||
#ifdef __AMIGA__ /* Any AmigaOS flavour */
|
||||
|
||||
#include "amigaos.h"
|
||||
#include <amitcp/socketbasetags.h>
|
||||
|
||||
@@ -72,3 +74,5 @@ BOOL amiga_init()
|
||||
#ifdef __libnix__
|
||||
ADD2EXIT(amiga_cleanup,-50);
|
||||
#endif
|
||||
|
||||
#endif /* __AMIGA__ */
|
||||
|
@@ -1,3 +1,5 @@
|
||||
#ifndef LIBCURL_AMIGAOS_H
|
||||
#define LIBCURL_AMIGAOS_H
|
||||
/***************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
@@ -5,7 +7,7 @@
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2005, 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
|
||||
@@ -21,8 +23,7 @@
|
||||
* $Id$
|
||||
***************************************************************************/
|
||||
|
||||
#ifndef LIBCURL_AMIGAOS_H
|
||||
#define LIBCURL_AMIGAOS_H
|
||||
#ifdef __AMIGA__ /* Any AmigaOS flavour */
|
||||
|
||||
#ifndef __ixemul__
|
||||
|
||||
@@ -55,4 +56,6 @@ extern BOOL amiga_init();
|
||||
#warning compiling with ixemul...
|
||||
|
||||
#endif /* __ixemul__ */
|
||||
#endif /* __AMIGA__ */
|
||||
#endif /* LIBCURL_AMIGAOS_H */
|
||||
|
||||
|
@@ -150,7 +150,7 @@ size_t Curl_base64_encode(struct SessionHandle *data,
|
||||
char *output;
|
||||
char *base64data;
|
||||
#ifdef CURL_DOES_CONVERSIONS
|
||||
char *convbuf;
|
||||
char *convbuf = NULL;
|
||||
#endif
|
||||
|
||||
char *indata = (char *)inp;
|
||||
@@ -173,11 +173,13 @@ size_t Curl_base64_encode(struct SessionHandle *data,
|
||||
if(data) {
|
||||
convbuf = (char*)malloc(insize);
|
||||
if(!convbuf) {
|
||||
free(output);
|
||||
return 0;
|
||||
}
|
||||
memcpy(convbuf, indata, insize);
|
||||
if(CURLE_OK != Curl_convert_to_network(data, convbuf, insize)) {
|
||||
free(convbuf);
|
||||
free(output);
|
||||
return 0;
|
||||
}
|
||||
indata = convbuf; /* switch to the converted buffer */
|
||||
|
@@ -1,6 +1,29 @@
|
||||
|
||||
#ifndef LIBCURL_CONFIG_AMIGAOS_H
|
||||
#define LIBCURL_CONFIG_AMIGAOS_H
|
||||
/***************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
* / __| | | | |_) | |
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* 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
|
||||
* are also available at http://curl.haxx.se/docs/copyright.html.
|
||||
*
|
||||
* You may opt to use, copy, modify, merge, publish, distribute and/or sell
|
||||
* copies of the Software, and permit persons to whom the Software is
|
||||
* furnished to do so, under the terms of the COPYING file.
|
||||
*
|
||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||
* KIND, either express or implied.
|
||||
*
|
||||
* $Id$
|
||||
***************************************************************************/
|
||||
|
||||
#ifdef __AMIGA__ /* Any AmigaOS flavour */
|
||||
|
||||
#define HAVE_ARPA_INET_H 1
|
||||
#define HAVE_GETHOSTBYADDR 1
|
||||
@@ -116,4 +139,5 @@
|
||||
#define SEND_TYPE_ARG4 int
|
||||
#define SEND_TYPE_RETV int
|
||||
|
||||
#endif /* __AMIGA__ */
|
||||
#endif /* LIBCURL_CONFIG_AMIGAOS_H */
|
||||
|
@@ -74,9 +74,6 @@
|
||||
/* Define to the type of arg 7 for getnameinfo. */
|
||||
/* #undef GETNAMEINFO_TYPE_ARG7 */
|
||||
|
||||
/* Define to 1 if you have the <alloca.h> header file. */
|
||||
#define HAVE_ALLOCA_H 1
|
||||
|
||||
/* Define to 1 if you have the <arpa/inet.h> header file. */
|
||||
#define HAVE_ARPA_INET_H 1
|
||||
|
||||
@@ -287,9 +284,6 @@
|
||||
/* if your compiler supports long long */
|
||||
#define HAVE_LONGLONG 1
|
||||
|
||||
/* Define to 1 if you have the <malloc.h> header file. */
|
||||
/* #undef HAVE_MALLOC_H */
|
||||
|
||||
/* Define to 1 if you need the malloc.h header file even with stdlib.h */
|
||||
/* #undef NEED_MALLOC_H */
|
||||
|
||||
@@ -539,9 +533,6 @@
|
||||
/* Define to 1 if you have the `tld_strerror' function. */
|
||||
/* #undef HAVE_TLD_STRERROR */
|
||||
|
||||
/* Define to 1 if you have the `uname' function. */
|
||||
/* #undef HAVE_UNAME */
|
||||
|
||||
/* Define to 1 if you have the <unistd.h> header file. */
|
||||
#define HAVE_UNISTD_H 1
|
||||
|
||||
|
@@ -2,16 +2,13 @@
|
||||
#define __LIB_CONFIG_WIN32_H
|
||||
|
||||
/* ================================================================ */
|
||||
/* lib/config-win32.h - Hand crafted config file for windows */
|
||||
/* lib/config-win32.h - Hand crafted config file for Windows */
|
||||
/* ================================================================ */
|
||||
|
||||
/* ---------------------------------------------------------------- */
|
||||
/* HEADER FILES */
|
||||
/* ---------------------------------------------------------------- */
|
||||
|
||||
/* Define if you have the <alloca.h> header file. */
|
||||
/* #define HAVE_ALLOCA_H 1 */
|
||||
|
||||
/* Define if you have the <arpa/inet.h> header file. */
|
||||
/* #define HAVE_ARPA_INET_H 1 */
|
||||
|
||||
@@ -36,11 +33,6 @@
|
||||
/* Define if you have the <io.h> header file. */
|
||||
#define HAVE_IO_H 1
|
||||
|
||||
/* Define if you have the <malloc.h> header file. */
|
||||
#ifndef __SALFORDC__
|
||||
#define HAVE_MALLOC_H 1
|
||||
#endif
|
||||
|
||||
/* Define if you need the malloc.h header file even with stdlib.h */
|
||||
#ifndef __SALFORDC__
|
||||
#define NEED_MALLOC_H 1
|
||||
@@ -218,17 +210,11 @@
|
||||
/* Define if you have the tcsetattr function. */
|
||||
/* #define HAVE_TCSETATTR 1 */
|
||||
|
||||
/* Define if you have the uname function. */
|
||||
/* #define HAVE_UNAME 1 */
|
||||
|
||||
/* Define if you have the utime function */
|
||||
#ifndef __BORLANDC__
|
||||
#define HAVE_UTIME 1
|
||||
#endif
|
||||
|
||||
/* Define if you have the vprintf function. */
|
||||
#define HAVE_VPRINTF 1
|
||||
|
||||
/* Define if you have the getnameinfo function. */
|
||||
#define HAVE_GETNAMEINFO 1
|
||||
|
||||
@@ -352,9 +338,12 @@
|
||||
/* Undef keyword 'const' if it does not work. */
|
||||
/* #undef const */
|
||||
|
||||
#if defined(_MSC_VER) && (_MSC_VER > 1310)
|
||||
/* MSVC 2003 has gmtime_r */
|
||||
#define HAVE_GMTIME_R
|
||||
/* Windows should not have HAVE_GMTIME_R defined */
|
||||
/* #undef HAVE_GMTIME_R */
|
||||
|
||||
/* Define if the compiler supports C99 variadic macro style. */
|
||||
#if defined(_MSC_VER) && (_MSC_VER >= 1400)
|
||||
#define HAVE_VARIADIC_MACROS_C99 1
|
||||
#endif
|
||||
|
||||
/* ---------------------------------------------------------------- */
|
||||
@@ -377,7 +366,15 @@
|
||||
|
||||
/* Define cpu-machine-OS */
|
||||
#undef OS
|
||||
#if defined(_M_IX86) || defined(__i386__) /* x86 (MSVC or gcc) */
|
||||
#define OS "i386-pc-win32"
|
||||
#elif defined(_M_IA64) /* Itanium */
|
||||
#define OS "ia64-pc-win32"
|
||||
#elif defined(_M_X64) /* AMD64/EM64T - Not defined until MSVC 2005 */
|
||||
#define OS "amd64-pc-win32"
|
||||
#else
|
||||
#define OS "unknown-pc-win32"
|
||||
#endif
|
||||
|
||||
/* Name of package */
|
||||
#define PACKAGE "curl"
|
||||
|
@@ -9,9 +9,6 @@
|
||||
/* HEADER FILES */
|
||||
/* ---------------------------------------------------------------- */
|
||||
|
||||
/* Define if you have the <alloca.h> header file. */
|
||||
/* #define HAVE_ALLOCA_H 1 */
|
||||
|
||||
/* Define if you have the <arpa/inet.h> header file. */
|
||||
/* #define HAVE_ARPA_INET_H 1 */
|
||||
|
||||
@@ -36,9 +33,6 @@
|
||||
/* Define if you have the <io.h> header file. */
|
||||
#define HAVE_IO_H 1
|
||||
|
||||
/* Define if you have the <malloc.h> header file. */
|
||||
#define HAVE_MALLOC_H 1
|
||||
|
||||
/* Define if you need the malloc.h header header file even with stdlib.h */
|
||||
#define NEED_MALLOC_H 1
|
||||
|
||||
@@ -204,15 +198,9 @@
|
||||
/* Define if you have the tcsetattr function. */
|
||||
/* #define HAVE_TCSETATTR 1 */
|
||||
|
||||
/* Define if you have the uname function. */
|
||||
/* #define HAVE_UNAME 1 */
|
||||
|
||||
/* Define if you have the utime function */
|
||||
#define HAVE_UTIME 1
|
||||
|
||||
/* Define if you have the vprintf function. */
|
||||
#define HAVE_VPRINTF 1
|
||||
|
||||
/* Define if you have the getnameinfo function. */
|
||||
#define HAVE_GETNAMEINFO 1
|
||||
|
||||
|
@@ -17,48 +17,34 @@
|
||||
|
||||
#define PACKAGE "curl"
|
||||
|
||||
#define HAVE_ASSERT_T 1
|
||||
#define HAVE_ARPA_INET_H 1
|
||||
#define HAVE_CLOSESOCKET 1
|
||||
#define HAVE_FCNTL_H 1
|
||||
#define HAVE_FIONBIO 1
|
||||
#define HAVE_GETHOSTBYADDR 1
|
||||
#define HAVE_GETHOSTNAME 1
|
||||
#define HAVE_GETPASS 1
|
||||
#define HAVE_GETSERVBYNAME 1
|
||||
#define HAVE_GETPROTOBYNAME 1
|
||||
#define HAVE_GETTIMEOFDAY 1
|
||||
#define HAVE_INET_ADDR 1
|
||||
#define HAVE_INET_NTOA 1
|
||||
#define HAVE_IO_H 1
|
||||
#define HAVE_IOCTLSOCKET 1
|
||||
#define HAVE_INET_PTON 1
|
||||
#define HAVE_INET_NTOP 1
|
||||
#define HAVE_LOCALE_H 1
|
||||
#define HAVE_LONGLONG 1
|
||||
#define HAVE_MALLOC_H 1
|
||||
#define HAVE_MEMORY_H 1
|
||||
#define HAVE_NETDB_H 1
|
||||
#define HAVE_NETINET_IN_H 1
|
||||
#define HAVE_NETINET_TCP_H 1
|
||||
#define HAVE_NET_IF_H 1
|
||||
#define HAVE_PROCESS_H 1
|
||||
#define HAVE_PERROR 1
|
||||
#define HAVE_RECV 1
|
||||
#define HAVE_SELECT 1
|
||||
#define HAVE_SEND 1
|
||||
#define HAVE_SETJMP_H 1
|
||||
#define HAVE_SETLOCALE 1
|
||||
#define HAVE_SETVBUF 1
|
||||
#define HAVE_SETMODE 1
|
||||
#define HAVE_SIGNAL 1
|
||||
#define HAVE_SIGNAL_H 1
|
||||
#define HAVE_SIG_ATOMIC_T 1
|
||||
#define HAVE_SOCKET 1
|
||||
#define HAVE_SPNEGO 1
|
||||
#define HAVE_STRDUP 1
|
||||
#define HAVE_STRFTIME 1
|
||||
#define HAVE_STRICMP 1
|
||||
#define HAVE_STRSTR 1
|
||||
#define HAVE_STRTOLL 1
|
||||
#define HAVE_STRUCT_TIMEVAL 1
|
||||
#define HAVE_SYS_IOCTL_H 1
|
||||
@@ -67,9 +53,7 @@
|
||||
#define HAVE_SYS_TYPES_H 1
|
||||
#define HAVE_TERMIOS_H 1
|
||||
#define HAVE_TIME_H 1
|
||||
#define HAVE_UNAME 1
|
||||
#define HAVE_UNISTD_H 1
|
||||
#define HAVE_VPRINTF 1
|
||||
|
||||
#define NEED_MALLOC_H 1
|
||||
|
||||
@@ -105,15 +89,7 @@
|
||||
#endif
|
||||
|
||||
#ifdef USE_SSLEAY /* on cmd-line */
|
||||
#define HAVE_OPENSSL_X509_H 1
|
||||
#define HAVE_OPENSSL_SSL_H 1
|
||||
#define HAVE_OPENSSL_RSA_H 1
|
||||
#define HAVE_OPENSSL_PEM_H 1
|
||||
#define HAVE_OPENSSL_ERR_H 1
|
||||
#define HAVE_OPENSSL_CRYPTO_H 1
|
||||
#define HAVE_OPENSSL_ENGINE_H 1
|
||||
#define HAVE_LIBSSL 1
|
||||
#define HAVE_LIBCRYPTO 1
|
||||
#define OPENSSL_NO_KRB5 1
|
||||
#define USE_OPENSSL 1
|
||||
#endif
|
||||
@@ -139,6 +115,7 @@
|
||||
#define HAVE_SIGACTION 1
|
||||
#define HAVE_SIGSETJMP 1
|
||||
#define HAVE_SYS_TIME_H 1
|
||||
#define HAVE_VARIADIC_MACROS_GCC 1
|
||||
|
||||
#if (DJGPP_MINOR >= 4)
|
||||
#define HAVE_STRLCAT 1
|
||||
|
@@ -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
|
||||
@@ -28,9 +28,6 @@
|
||||
#ifdef HAVE_SYS_TIME_H
|
||||
#include <sys/time.h>
|
||||
#endif
|
||||
#ifdef HAVE_SYS_TYPES_H
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
#ifdef HAVE_SYS_SOCKET_H
|
||||
#include <sys/socket.h>
|
||||
#endif
|
||||
@@ -59,9 +56,9 @@
|
||||
#include <arpa/inet.h>
|
||||
#endif
|
||||
#ifdef HAVE_STDLIB_H
|
||||
#include <stdlib.h> /* required for free() prototype, without it, this crashes
|
||||
on macos 68K */
|
||||
#endif
|
||||
#include <stdlib.h> /* required for free() prototype, without it, this crashes */
|
||||
#endif /* on macos 68K */
|
||||
|
||||
#if (defined(HAVE_FIONBIO) && defined(__NOVELL_LIBC__))
|
||||
#include <sys/filio.h>
|
||||
#endif
|
||||
@@ -74,24 +71,12 @@
|
||||
#include <inet.h>
|
||||
#endif
|
||||
|
||||
#endif
|
||||
#endif /* !WIN32 */
|
||||
|
||||
#include <stdio.h>
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
|
||||
#ifndef TRUE
|
||||
#define TRUE 1
|
||||
#define FALSE 0
|
||||
#endif
|
||||
|
||||
#ifdef USE_WINSOCK
|
||||
#define EINPROGRESS WSAEINPROGRESS
|
||||
#define EWOULDBLOCK WSAEWOULDBLOCK
|
||||
#define EISCONN WSAEISCONN
|
||||
#define ENOTSOCK WSAENOTSOCK
|
||||
#define ECONNREFUSED WSAECONNREFUSED
|
||||
#endif
|
||||
|
||||
#include "urldata.h"
|
||||
#include "sendf.h"
|
||||
#include "if2ip.h"
|
||||
@@ -103,6 +88,7 @@
|
||||
#include "multiif.h"
|
||||
#include "sockaddr.h" /* required for Curl_sockaddr_storage */
|
||||
#include "inet_ntop.h"
|
||||
#include "inet_pton.h"
|
||||
|
||||
/* The last #include file should be: */
|
||||
#include "memdebug.h"
|
||||
@@ -115,19 +101,6 @@ singleipconnect(struct connectdata *conn,
|
||||
long timeout_ms,
|
||||
bool *connected);
|
||||
|
||||
/*
|
||||
* Curl_sockerrno() returns the *socket-related* errno (or equivalent) on this
|
||||
* platform to hide platform specific for the function that calls this.
|
||||
*/
|
||||
int Curl_sockerrno(void)
|
||||
{
|
||||
#ifdef USE_WINSOCK
|
||||
return (int)WSAGetLastError();
|
||||
#else
|
||||
return errno;
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
* Curl_nonblock() set the given socket to either blocking or non-blocking
|
||||
* mode based on the 'nonblock' boolean argument. This function is highly
|
||||
@@ -143,7 +116,7 @@ int Curl_nonblock(curl_socket_t sockfd, /* operate on this */
|
||||
int flags;
|
||||
|
||||
flags = fcntl(sockfd, F_GETFL, 0);
|
||||
if (TRUE == nonblock)
|
||||
if (FALSE != nonblock)
|
||||
return fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);
|
||||
else
|
||||
return fcntl(sockfd, F_SETFL, flags & (~O_NONBLOCK));
|
||||
@@ -224,7 +197,7 @@ int waitconnect(curl_socket_t sockfd, /* socket */
|
||||
#endif
|
||||
|
||||
/* now select() until we get connect or timeout */
|
||||
rc = Curl_select(CURL_SOCKET_BAD, sockfd, (int)timeout_msec);
|
||||
rc = Curl_socket_ready(CURL_SOCKET_BAD, sockfd, (int)timeout_msec);
|
||||
if(-1 == rc)
|
||||
/* error, no connect here, try next */
|
||||
return WAITCONN_SELECT_ERROR;
|
||||
@@ -244,6 +217,9 @@ int waitconnect(curl_socket_t sockfd, /* socket */
|
||||
static CURLcode bindlocal(struct connectdata *conn,
|
||||
curl_socket_t sockfd)
|
||||
{
|
||||
#ifdef ENABLE_IPV6
|
||||
char ipv6_addr[16];
|
||||
#endif
|
||||
struct SessionHandle *data = conn->data;
|
||||
struct sockaddr_in me;
|
||||
struct sockaddr *sock = NULL; /* bind to this address */
|
||||
@@ -262,6 +238,7 @@ static CURLcode bindlocal(struct connectdata *conn,
|
||||
in_addr_t in;
|
||||
int rc;
|
||||
bool was_iface = FALSE;
|
||||
int in6 = -1;
|
||||
|
||||
/* First check if the given name is an IP address */
|
||||
in=inet_addr(data->set.device);
|
||||
@@ -332,7 +309,7 @@ static CURLcode bindlocal(struct connectdata *conn,
|
||||
if (setsockopt(sockfd, SOL_SOCKET, SO_BINDTODEVICE,
|
||||
data->set.device, strlen(data->set.device)+1) != 0) {
|
||||
/* printf("Failed to BINDTODEVICE, socket: %d device: %s error: %s\n",
|
||||
sockfd, data->set.device, Curl_strerror(Curl_sockerrno())); */
|
||||
sockfd, data->set.device, Curl_strerror(SOCKERRNO)); */
|
||||
infof(data, "SO_BINDTODEVICE %s failed\n",
|
||||
data->set.device);
|
||||
/* This is typically "errno 1, error: Operation not permitted" if
|
||||
@@ -342,7 +319,11 @@ static CURLcode bindlocal(struct connectdata *conn,
|
||||
#endif
|
||||
|
||||
in=inet_addr(myhost);
|
||||
if (CURL_INADDR_NONE == in) {
|
||||
|
||||
#ifdef ENABLE_IPV6
|
||||
in6 = Curl_inet_pton (AF_INET6, myhost, (void *)&ipv6_addr);
|
||||
#endif
|
||||
if (CURL_INADDR_NONE == in && -1 == in6) {
|
||||
failf(data,"couldn't find my own IP address (%s)", myhost);
|
||||
return CURLE_HTTP_PORT_FAILED;
|
||||
} /* end of inet_addr */
|
||||
@@ -409,7 +390,7 @@ static CURLcode bindlocal(struct connectdata *conn,
|
||||
break;
|
||||
} while(1);
|
||||
|
||||
data->state.os_errno = Curl_sockerrno();
|
||||
data->state.os_errno = SOCKERRNO;
|
||||
failf(data, "bind failure: %s",
|
||||
Curl_strerror(conn, data->state.os_errno));
|
||||
return CURLE_HTTP_PORT_FAILED;
|
||||
@@ -453,7 +434,7 @@ static bool verifyconnect(curl_socket_t sockfd, int *error)
|
||||
|
||||
if( -1 == getsockopt(sockfd, SOL_SOCKET, SO_ERROR,
|
||||
(void *)&err, &errSize))
|
||||
err = Curl_sockerrno();
|
||||
err = SOCKERRNO;
|
||||
|
||||
#ifdef _WIN32_WCE
|
||||
/* Always returns this error, bug in CE? */
|
||||
@@ -472,7 +453,7 @@ static bool verifyconnect(curl_socket_t sockfd, int *error)
|
||||
#else
|
||||
(void)sockfd;
|
||||
if (error)
|
||||
*error = Curl_sockerrno();
|
||||
*error = SOCKERRNO;
|
||||
#endif
|
||||
return rc;
|
||||
}
|
||||
@@ -548,7 +529,7 @@ CURLcode Curl_is_connected(struct connectdata *conn,
|
||||
long allow_total = 0;
|
||||
long has_passed;
|
||||
|
||||
curlassert(sockindex >= FIRSTSOCKET && sockindex <= SECONDARYSOCKET);
|
||||
DEBUGASSERT(sockindex >= FIRSTSOCKET && sockindex <= SECONDARYSOCKET);
|
||||
|
||||
*connected = FALSE; /* a very negative world view is best */
|
||||
|
||||
@@ -558,15 +539,15 @@ 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)
|
||||
allow_total = allow = data->set.timeout*1000;
|
||||
allow_total = allow = data->set.timeout;
|
||||
else
|
||||
allow = data->set.connecttimeout*1000;
|
||||
allow = data->set.connecttimeout;
|
||||
}
|
||||
else if(data->set.timeout) {
|
||||
allow_total = allow = data->set.timeout*1000;
|
||||
allow_total = allow = data->set.timeout;
|
||||
}
|
||||
else if(data->set.connecttimeout) {
|
||||
allow = data->set.connecttimeout*1000;
|
||||
allow = data->set.connecttimeout;
|
||||
}
|
||||
|
||||
if(has_passed > allow ) {
|
||||
@@ -613,7 +594,7 @@ CURLcode Curl_is_connected(struct connectdata *conn,
|
||||
infof(data, "Connection failed\n");
|
||||
|
||||
if(trynextip(conn, sockindex, connected)) {
|
||||
error = Curl_sockerrno();
|
||||
error = SOCKERRNO;
|
||||
data->state.os_errno = error;
|
||||
failf(data, "Failed connect to %s:%d; %s",
|
||||
conn->host.name, conn->port, Curl_strerror(conn,error));
|
||||
@@ -645,7 +626,7 @@ static void tcpnodelay(struct connectdata *conn,
|
||||
if(setsockopt(sockfd, proto, TCP_NODELAY, (void *)&onoff,
|
||||
sizeof(onoff)) < 0)
|
||||
infof(data, "Could not set TCP_NODELAY: %s\n",
|
||||
Curl_strerror(conn, Curl_sockerrno()));
|
||||
Curl_strerror(conn, SOCKERRNO));
|
||||
else
|
||||
infof(data,"TCP_NODELAY set\n");
|
||||
#else
|
||||
@@ -667,7 +648,7 @@ static void nosigpipe(struct connectdata *conn,
|
||||
if(setsockopt(sockfd, SOL_SOCKET, SO_NOSIGPIPE, (void *)&onoff,
|
||||
sizeof(onoff)) < 0)
|
||||
infof(data, "Could not set SO_NOSIGPIPE: %s\n",
|
||||
Curl_strerror(conn, Curl_sockerrno()));
|
||||
Curl_strerror(conn, SOCKERRNO));
|
||||
}
|
||||
#else
|
||||
#define nosigpipe(x,y)
|
||||
@@ -731,7 +712,7 @@ singleipconnect(struct connectdata *conn,
|
||||
rc = 0;
|
||||
|
||||
if(-1 == rc) {
|
||||
error = Curl_sockerrno();
|
||||
error = SOCKERRNO;
|
||||
|
||||
switch (error) {
|
||||
case EINPROGRESS:
|
||||
@@ -826,14 +807,14 @@ CURLcode Curl_connecthost(struct connectdata *conn, /* context */
|
||||
/* get the most strict timeout of the ones converted to milliseconds */
|
||||
if(data->set.timeout && data->set.connecttimeout) {
|
||||
if (data->set.timeout < data->set.connecttimeout)
|
||||
timeout_ms = data->set.timeout*1000;
|
||||
timeout_ms = data->set.timeout;
|
||||
else
|
||||
timeout_ms = data->set.connecttimeout*1000;
|
||||
timeout_ms = data->set.connecttimeout;
|
||||
}
|
||||
else if(data->set.timeout)
|
||||
timeout_ms = data->set.timeout*1000;
|
||||
timeout_ms = data->set.timeout;
|
||||
else
|
||||
timeout_ms = data->set.connecttimeout*1000;
|
||||
timeout_ms = data->set.connecttimeout;
|
||||
|
||||
/* subtract the passed time */
|
||||
timeout_ms -= has_passed;
|
||||
|
@@ -7,7 +7,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
|
||||
@@ -37,8 +37,6 @@ CURLcode Curl_connecthost(struct connectdata *conn,
|
||||
bool *connected /* truly connected? */
|
||||
);
|
||||
|
||||
int Curl_sockerrno(void);
|
||||
|
||||
CURLcode Curl_store_ip_addr(struct connectdata *conn);
|
||||
|
||||
#define DEFAULT_CONNECT_TIMEOUT 300000 /* milliseconds == five minutes */
|
||||
|
@@ -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
|
||||
@@ -53,14 +53,6 @@
|
||||
#define COMMENT 0x10 /* bit 4 set: file comment present */
|
||||
#define RESERVED 0xE0 /* bits 5..7: reserved */
|
||||
|
||||
enum zlibState {
|
||||
ZLIB_UNINIT, /* uninitialized */
|
||||
ZLIB_INIT, /* initialized */
|
||||
ZLIB_GZIP_HEADER, /* reading gzip header */
|
||||
ZLIB_GZIP_INFLATING, /* inflating gzip stream */
|
||||
ZLIB_INIT_GZIP /* initialized in transparent gzip mode */
|
||||
};
|
||||
|
||||
static CURLcode
|
||||
process_zlib_error(struct connectdata *conn, z_stream *z)
|
||||
{
|
||||
@@ -76,7 +68,7 @@ process_zlib_error(struct connectdata *conn, z_stream *z)
|
||||
}
|
||||
|
||||
static CURLcode
|
||||
exit_zlib(z_stream *z, bool *zlib_init, CURLcode result)
|
||||
exit_zlib(z_stream *z, zlibInitState *zlib_init, CURLcode result)
|
||||
{
|
||||
inflateEnd(z);
|
||||
*zlib_init = ZLIB_UNINIT;
|
||||
|
27
lib/cookie.c
27
lib/cookie.c
@@ -102,7 +102,6 @@ Example set of cookies:
|
||||
#include "memdebug.h"
|
||||
#endif
|
||||
|
||||
#define my_isspace(x) ((x == ' ') || (x == '\t'))
|
||||
|
||||
static void freecookie(struct Cookie *co)
|
||||
{
|
||||
@@ -189,6 +188,10 @@ Curl_cookie_add(struct SessionHandle *data,
|
||||
bool replace_old = FALSE;
|
||||
bool badcookie = FALSE; /* cookies are good by default. mmmmm yummy */
|
||||
|
||||
#ifdef CURL_DISABLE_VERBOSE_STRINGS
|
||||
(void)data;
|
||||
#endif
|
||||
|
||||
/* First, alloc and init a new struct for it */
|
||||
co = (struct Cookie *)calloc(sizeof(struct Cookie), 1);
|
||||
if(!co)
|
||||
@@ -206,7 +209,7 @@ Curl_cookie_add(struct SessionHandle *data,
|
||||
|
||||
semiptr=strchr(lineptr, ';'); /* first, find a semicolon */
|
||||
|
||||
while(*lineptr && my_isspace(*lineptr))
|
||||
while(*lineptr && ISBLANK(*lineptr))
|
||||
lineptr++;
|
||||
|
||||
ptr = lineptr;
|
||||
@@ -229,14 +232,14 @@ Curl_cookie_add(struct SessionHandle *data,
|
||||
|
||||
/* Strip off trailing whitespace from the 'what' */
|
||||
size_t len=strlen(what);
|
||||
while(len && my_isspace(what[len-1])) {
|
||||
while(len && ISBLANK(what[len-1])) {
|
||||
what[len-1]=0;
|
||||
len--;
|
||||
}
|
||||
|
||||
/* Skip leading whitespace from the 'what' */
|
||||
whatptr=what;
|
||||
while(my_isspace(*whatptr)) {
|
||||
while(*whatptr && ISBLANK(*whatptr)) {
|
||||
whatptr++;
|
||||
}
|
||||
|
||||
@@ -378,7 +381,7 @@ Curl_cookie_add(struct SessionHandle *data,
|
||||
}
|
||||
|
||||
ptr=semiptr+1;
|
||||
while(ptr && *ptr && my_isspace(*ptr))
|
||||
while(ptr && *ptr && ISBLANK(*ptr))
|
||||
ptr++;
|
||||
semiptr=strchr(ptr, ';'); /* now, find the next semicolon */
|
||||
|
||||
@@ -702,7 +705,7 @@ struct CookieInfo *Curl_cookie_init(struct SessionHandle *data,
|
||||
lineptr=line;
|
||||
headerline=FALSE;
|
||||
}
|
||||
while(*lineptr && my_isspace(*lineptr))
|
||||
while(*lineptr && ISBLANK(*lineptr))
|
||||
lineptr++;
|
||||
|
||||
Curl_cookie_add(data, c, headerline, lineptr, NULL, NULL);
|
||||
@@ -969,6 +972,7 @@ int Curl_cookie_output(struct CookieInfo *c, char *dumphere)
|
||||
format_ptr = get_netscape_format(co);
|
||||
if (format_ptr == NULL) {
|
||||
fprintf(out, "#\n# Fatal libcurl error\n");
|
||||
fclose(out);
|
||||
return 1;
|
||||
}
|
||||
fprintf(out, "%s\n", format_ptr);
|
||||
@@ -1001,13 +1005,18 @@ struct curl_slist *Curl_cookie_list(struct SessionHandle *data)
|
||||
/* fill the list with _all_ the cookies we know */
|
||||
line = get_netscape_format(c);
|
||||
if (line == NULL) {
|
||||
/* get_netscape_format returns null only if we run out of memory */
|
||||
|
||||
curl_slist_free_all(beg); /* free some memory */
|
||||
curl_slist_free_all(beg);
|
||||
return NULL;
|
||||
}
|
||||
list = curl_slist_append(list, line);
|
||||
free(line);
|
||||
if (list == NULL) {
|
||||
curl_slist_free_all(beg);
|
||||
return NULL;
|
||||
}
|
||||
else if (beg == NULL) {
|
||||
beg = list;
|
||||
}
|
||||
c = c->next;
|
||||
}
|
||||
|
||||
|
14
lib/dict.c
14
lib/dict.c
@@ -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
|
||||
@@ -31,12 +31,6 @@
|
||||
#include <stdarg.h>
|
||||
#include <stdlib.h>
|
||||
#include <ctype.h>
|
||||
#ifdef HAVE_SYS_TYPES_H
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
#ifdef HAVE_SYS_STAT_H
|
||||
#include <sys/stat.h>
|
||||
#endif
|
||||
|
||||
#ifdef WIN32
|
||||
#include <time.h>
|
||||
@@ -165,7 +159,8 @@ CURLcode Curl_dict(struct connectdata *conn, bool *done)
|
||||
}
|
||||
|
||||
if ((word == NULL) || (*word == (char)0)) {
|
||||
failf(data, "lookup word is missing");
|
||||
infof(data, "lookup word is missing");
|
||||
word=(char *)"default";
|
||||
}
|
||||
if ((database == NULL) || (*database == (char)0)) {
|
||||
database = (char *)"!";
|
||||
@@ -219,7 +214,8 @@ CURLcode Curl_dict(struct connectdata *conn, bool *done)
|
||||
}
|
||||
|
||||
if ((word == NULL) || (*word == (char)0)) {
|
||||
failf(data, "lookup word is missing");
|
||||
infof(data, "lookup word is missing");
|
||||
word=(char *)"default";
|
||||
}
|
||||
if ((database == NULL) || (*database == (char)0)) {
|
||||
database = (char *)"!";
|
||||
|
73
lib/easy.c
73
lib/easy.c
@@ -29,13 +29,6 @@
|
||||
#include <stdarg.h>
|
||||
#include <stdlib.h>
|
||||
#include <ctype.h>
|
||||
#ifdef HAVE_SYS_TYPES_H
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
#ifdef HAVE_SYS_STAT_H
|
||||
#include <sys/stat.h>
|
||||
#endif
|
||||
|
||||
#include <errno.h>
|
||||
|
||||
#include "strequal.h"
|
||||
@@ -47,31 +40,33 @@
|
||||
#ifdef HAVE_SYS_SOCKET_H
|
||||
#include <sys/socket.h>
|
||||
#endif
|
||||
#ifdef HAVE_NETINET_IN_H
|
||||
#include <netinet/in.h>
|
||||
#endif
|
||||
#ifdef HAVE_SYS_TIME_H
|
||||
#include <sys/time.h>
|
||||
#endif
|
||||
#ifdef HAVE_UNISTD_H
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
#ifdef HAVE_NETDB_H
|
||||
#include <netdb.h>
|
||||
#endif
|
||||
#ifdef HAVE_ARPA_INET_H
|
||||
#include <arpa/inet.h>
|
||||
#endif
|
||||
#ifdef HAVE_NET_IF_H
|
||||
#include <net/if.h>
|
||||
#endif
|
||||
#ifdef HAVE_SYS_IOCTL_H
|
||||
#include <sys/ioctl.h>
|
||||
#endif
|
||||
#include <signal.h>
|
||||
|
||||
#ifdef HAVE_SYS_PARAM_H
|
||||
#include <sys/param.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_SYS_SELECT_H
|
||||
#include <sys/select.h>
|
||||
#endif
|
||||
|
||||
#endif /* WIN32 ... */
|
||||
|
||||
#include "urldata.h"
|
||||
@@ -86,6 +81,7 @@
|
||||
#include "memory.h"
|
||||
#include "progress.h"
|
||||
#include "easyif.h"
|
||||
#include "select.h"
|
||||
#include "sendf.h" /* for failf function prototype */
|
||||
#include <ca-bundle.h>
|
||||
|
||||
@@ -227,16 +223,22 @@ CURLcode curl_global_init(long flags)
|
||||
Curl_ccalloc = (curl_calloc_callback)calloc;
|
||||
|
||||
if (flags & CURL_GLOBAL_SSL)
|
||||
if (!Curl_ssl_init())
|
||||
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 (win32_init() != CURLE_OK) {
|
||||
DEBUGF(fprintf(stderr, "Error: win32_init failed\n"));
|
||||
return CURLE_FAILED_INIT;
|
||||
}
|
||||
|
||||
#ifdef _AMIGASF
|
||||
if(!amiga_init())
|
||||
#ifdef __AMIGA__
|
||||
if(!amiga_init()) {
|
||||
DEBUGF(fprintf(stderr, "Error: amiga_init failed\n"));
|
||||
return CURLE_FAILED_INIT;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef USE_LIBIDN
|
||||
@@ -299,7 +301,7 @@ void curl_global_cleanup(void)
|
||||
if (init_flags & CURL_GLOBAL_WIN32)
|
||||
win32_cleanup();
|
||||
|
||||
#ifdef _AMIGASF
|
||||
#ifdef __AMIGA__
|
||||
amiga_cleanup();
|
||||
#endif
|
||||
|
||||
@@ -318,15 +320,19 @@ CURL *curl_easy_init(void)
|
||||
/* Make sure we inited the global SSL stuff */
|
||||
if (!initialized) {
|
||||
res = curl_global_init(CURL_GLOBAL_DEFAULT);
|
||||
if(res)
|
||||
if(res) {
|
||||
/* something in the global init failed, return nothing */
|
||||
DEBUGF(fprintf(stderr, "Error: curl_global_init failed\n"));
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/* We use curl_open() with undefined URL so far */
|
||||
res = Curl_open(&data);
|
||||
if(res != CURLE_OK)
|
||||
if(res != CURLE_OK) {
|
||||
DEBUGF(fprintf(stderr, "Error: Curl_open failed\n"));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
@@ -391,7 +397,10 @@ CURLcode curl_easy_perform(CURL *easy)
|
||||
mcode = curl_multi_add_handle(multi, easy);
|
||||
if(mcode) {
|
||||
curl_multi_cleanup(multi);
|
||||
return CURLE_FAILED_INIT;
|
||||
if(mcode == CURLM_OUT_OF_MEMORY)
|
||||
return CURLE_OUT_OF_MEMORY;
|
||||
else
|
||||
return CURLE_FAILED_INIT;
|
||||
}
|
||||
|
||||
/* we start some action by calling perform right away */
|
||||
@@ -414,7 +423,7 @@ CURLcode curl_easy_perform(CURL *easy)
|
||||
/* get file descriptors from the transfers */
|
||||
curl_multi_fdset(multi, &fdread, &fdwrite, &fdexcep, &maxfd);
|
||||
|
||||
rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
|
||||
rc = Curl_select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
|
||||
|
||||
if(rc == -1)
|
||||
/* select error */
|
||||
@@ -627,7 +636,8 @@ CURL *curl_easy_duphandle(CURL *incurl)
|
||||
|
||||
if(fail) {
|
||||
if(outcurl) {
|
||||
if(outcurl->state.connc->type == CONNCACHE_PRIVATE)
|
||||
if((outcurl->state.connc->type == CONNCACHE_PRIVATE) &&
|
||||
outcurl->state.connc)
|
||||
Curl_rm_connc(outcurl->state.connc);
|
||||
if(outcurl->state.headerbuff)
|
||||
free(outcurl->state.headerbuff);
|
||||
@@ -740,17 +750,19 @@ CURLcode Curl_convert_to_network(struct SessionHandle *data,
|
||||
/* do the translation ourselves */
|
||||
char *input_ptr, *output_ptr;
|
||||
size_t in_bytes, out_bytes, rc;
|
||||
int error;
|
||||
|
||||
/* open an iconv conversion descriptor if necessary */
|
||||
if(data->outbound_cd == (iconv_t)-1) {
|
||||
data->outbound_cd = iconv_open(CURL_ICONV_CODESET_OF_NETWORK,
|
||||
CURL_ICONV_CODESET_OF_HOST);
|
||||
if(data->outbound_cd == (iconv_t)-1) {
|
||||
error = ERRNO;
|
||||
failf(data,
|
||||
"The iconv_open(\"%s\", \"%s\") call failed with errno %i: %s",
|
||||
CURL_ICONV_CODESET_OF_NETWORK,
|
||||
CURL_ICONV_CODESET_OF_HOST,
|
||||
errno, strerror(errno));
|
||||
error, strerror(error));
|
||||
return CURLE_CONV_FAILED;
|
||||
}
|
||||
}
|
||||
@@ -760,9 +772,10 @@ CURLcode Curl_convert_to_network(struct SessionHandle *data,
|
||||
rc = iconv(data->outbound_cd, (const char**)&input_ptr, &in_bytes,
|
||||
&output_ptr, &out_bytes);
|
||||
if ((rc == ICONV_ERROR) || (in_bytes != 0)) {
|
||||
error = ERRNO;
|
||||
failf(data,
|
||||
"The Curl_convert_to_network iconv call failed with errno %i: %s",
|
||||
errno, strerror(errno));
|
||||
error, strerror(error));
|
||||
return CURLE_CONV_FAILED;
|
||||
}
|
||||
#else
|
||||
@@ -797,17 +810,19 @@ CURLcode Curl_convert_from_network(struct SessionHandle *data,
|
||||
/* do the translation ourselves */
|
||||
char *input_ptr, *output_ptr;
|
||||
size_t in_bytes, out_bytes, rc;
|
||||
int error;
|
||||
|
||||
/* open an iconv conversion descriptor if necessary */
|
||||
if(data->inbound_cd == (iconv_t)-1) {
|
||||
data->inbound_cd = iconv_open(CURL_ICONV_CODESET_OF_HOST,
|
||||
CURL_ICONV_CODESET_OF_NETWORK);
|
||||
if(data->inbound_cd == (iconv_t)-1) {
|
||||
error = ERRNO;
|
||||
failf(data,
|
||||
"The iconv_open(\"%s\", \"%s\") call failed with errno %i: %s",
|
||||
CURL_ICONV_CODESET_OF_HOST,
|
||||
CURL_ICONV_CODESET_OF_NETWORK,
|
||||
errno, strerror(errno));
|
||||
error, strerror(error));
|
||||
return CURLE_CONV_FAILED;
|
||||
}
|
||||
}
|
||||
@@ -817,9 +832,10 @@ CURLcode Curl_convert_from_network(struct SessionHandle *data,
|
||||
rc = iconv(data->inbound_cd, (const char **)&input_ptr, &in_bytes,
|
||||
&output_ptr, &out_bytes);
|
||||
if ((rc == ICONV_ERROR) || (in_bytes != 0)) {
|
||||
error = ERRNO;
|
||||
failf(data,
|
||||
"The Curl_convert_from_network iconv call failed with errno %i: %s",
|
||||
errno, strerror(errno));
|
||||
error, strerror(error));
|
||||
return CURLE_CONV_FAILED;
|
||||
}
|
||||
#else
|
||||
@@ -854,17 +870,19 @@ CURLcode Curl_convert_from_utf8(struct SessionHandle *data,
|
||||
/* do the translation ourselves */
|
||||
char *input_ptr, *output_ptr;
|
||||
size_t in_bytes, out_bytes, rc;
|
||||
int error;
|
||||
|
||||
/* open an iconv conversion descriptor if necessary */
|
||||
if(data->utf8_cd == (iconv_t)-1) {
|
||||
data->utf8_cd = iconv_open(CURL_ICONV_CODESET_OF_HOST,
|
||||
CURL_ICONV_CODESET_FOR_UTF8);
|
||||
if(data->utf8_cd == (iconv_t)-1) {
|
||||
error = ERRNO;
|
||||
failf(data,
|
||||
"The iconv_open(\"%s\", \"%s\") call failed with errno %i: %s",
|
||||
CURL_ICONV_CODESET_OF_HOST,
|
||||
CURL_ICONV_CODESET_FOR_UTF8,
|
||||
errno, strerror(errno));
|
||||
error, strerror(error));
|
||||
return CURLE_CONV_FAILED;
|
||||
}
|
||||
}
|
||||
@@ -874,9 +892,10 @@ CURLcode Curl_convert_from_utf8(struct SessionHandle *data,
|
||||
rc = iconv(data->utf8_cd, (const char**)&input_ptr, &in_bytes,
|
||||
&output_ptr, &out_bytes);
|
||||
if ((rc == ICONV_ERROR) || (in_bytes != 0)) {
|
||||
error = ERRNO;
|
||||
failf(data,
|
||||
"The Curl_convert_from_utf8 iconv call failed with errno %i: %s",
|
||||
errno, strerror(errno));
|
||||
error, strerror(error));
|
||||
return CURLE_CONV_FAILED;
|
||||
}
|
||||
if (output_ptr < input_ptr) {
|
||||
|
@@ -30,12 +30,6 @@
|
||||
#include <stdarg.h>
|
||||
#include <stdlib.h>
|
||||
#include <ctype.h>
|
||||
#ifdef HAVE_SYS_TYPES_H
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
#ifdef HAVE_SYS_STAT_H
|
||||
#include <sys/stat.h>
|
||||
#endif
|
||||
|
||||
#ifdef WIN32
|
||||
#include <time.h>
|
||||
|
@@ -112,9 +112,6 @@ Content-Disposition: form-data; name="FILECONTENT"
|
||||
#include <string.h>
|
||||
#include <stdarg.h>
|
||||
#include <time.h>
|
||||
#ifdef HAVE_SYS_STAT_H
|
||||
#include <sys/stat.h>
|
||||
#endif
|
||||
#if defined(HAVE_LIBGEN_H) && defined(HAVE_BASENAME)
|
||||
#include <libgen.h>
|
||||
#endif
|
||||
@@ -285,13 +282,15 @@ static const char * ContentTypeForFilename (const char *filename,
|
||||
text/plain so we don't actually need to set this: */
|
||||
contenttype = HTTPPOST_CONTENTTYPE_DEFAULT;
|
||||
|
||||
for(i=0; i<sizeof(ctts)/sizeof(ctts[0]); i++) {
|
||||
if(strlen(filename) >= strlen(ctts[i].extension)) {
|
||||
if(strequal(filename +
|
||||
strlen(filename) - strlen(ctts[i].extension),
|
||||
ctts[i].extension)) {
|
||||
contenttype = ctts[i].type;
|
||||
break;
|
||||
if(filename) { /* in case a NULL was passed in */
|
||||
for(i=0; i<sizeof(ctts)/sizeof(ctts[0]); i++) {
|
||||
if(strlen(filename) >= strlen(ctts[i].extension)) {
|
||||
if(strequal(filename +
|
||||
strlen(filename) - strlen(ctts[i].extension),
|
||||
ctts[i].extension)) {
|
||||
contenttype = ctts[i].type;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -318,10 +317,14 @@ static char *memdup(const char *src, size_t buffer_length)
|
||||
|
||||
if (buffer_length)
|
||||
length = buffer_length;
|
||||
else {
|
||||
else if(src) {
|
||||
length = strlen(src);
|
||||
add = TRUE;
|
||||
}
|
||||
else
|
||||
/* no length and a NULL src pointer! */
|
||||
return strdup((char *)"");
|
||||
|
||||
buffer = (char*)malloc(length+add);
|
||||
if (!buffer)
|
||||
return NULL; /* fail */
|
||||
|
147
lib/ftp.c
147
lib/ftp.c
@@ -34,13 +34,10 @@
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
#ifdef WIN32
|
||||
|
||||
#else /* probably some kind of unix */
|
||||
#ifndef WIN32
|
||||
#ifdef HAVE_SYS_SOCKET_H
|
||||
#include <sys/socket.h>
|
||||
#endif
|
||||
#include <sys/types.h>
|
||||
#ifdef HAVE_NETINET_IN_H
|
||||
#include <netinet/in.h>
|
||||
#endif
|
||||
@@ -57,7 +54,7 @@
|
||||
#include <in.h>
|
||||
#include <inet.h>
|
||||
#endif
|
||||
#endif
|
||||
#endif /* !WIN32 */
|
||||
|
||||
#if (defined(NETWARE) && defined(__NOVELL_LIBC__))
|
||||
#undef in_addr_t
|
||||
@@ -75,6 +72,7 @@
|
||||
#include "transfer.h"
|
||||
#include "escape.h"
|
||||
#include "http.h" /* for HTTP proxy tunnel stuff */
|
||||
#include "socks.h"
|
||||
#include "ftp.h"
|
||||
|
||||
#ifdef HAVE_KRB4
|
||||
@@ -111,16 +109,22 @@
|
||||
#define NIFLAGS NI_NUMERICHOST | NI_NUMERICSERV
|
||||
#endif
|
||||
|
||||
#ifdef CURL_DISABLE_VERBOSE_STRINGS
|
||||
#define ftp_pasv_verbose(a,b,c,d) do { } while (0)
|
||||
#endif
|
||||
|
||||
/* Local API functions */
|
||||
static CURLcode ftp_sendquote(struct connectdata *conn,
|
||||
struct curl_slist *quote);
|
||||
static CURLcode ftp_quit(struct connectdata *conn);
|
||||
static CURLcode ftp_parse_url_path(struct connectdata *conn);
|
||||
static CURLcode ftp_regular_transfer(struct connectdata *conn, bool *done);
|
||||
#ifndef CURL_DISABLE_VERBOSE_STRINGS
|
||||
static void ftp_pasv_verbose(struct connectdata *conn,
|
||||
Curl_addrinfo *ai,
|
||||
char *newhost, /* ascii version */
|
||||
int port);
|
||||
#endif
|
||||
static CURLcode ftp_state_post_rest(struct connectdata *conn);
|
||||
static CURLcode ftp_state_post_cwd(struct connectdata *conn);
|
||||
static CURLcode ftp_state_quote(struct connectdata *conn,
|
||||
@@ -184,7 +188,7 @@ static CURLcode AllowServerConnect(struct connectdata *conn)
|
||||
struct SessionHandle *data = conn->data;
|
||||
curl_socket_t sock = conn->sock[SECONDARYSOCKET];
|
||||
struct timeval now = Curl_tvnow();
|
||||
long timespent = Curl_tvdiff(Curl_tvnow(), now)/1000;
|
||||
long timespent = Curl_tvdiff(Curl_tvnow(), now);
|
||||
long timeout = data->set.connecttimeout?data->set.connecttimeout:
|
||||
(data->set.timeout?data->set.timeout: 0);
|
||||
|
||||
@@ -198,9 +202,9 @@ static CURLcode AllowServerConnect(struct connectdata *conn)
|
||||
|
||||
/* We allow the server 60 seconds to connect to us, or a custom timeout.
|
||||
Note the typecast here. */
|
||||
timeout_ms = (timeout?(int)timeout:60) * 1000;
|
||||
timeout_ms = (timeout?(int)timeout:60000);
|
||||
|
||||
switch (Curl_select(sock, CURL_SOCKET_BAD, timeout_ms)) {
|
||||
switch (Curl_socket_ready(sock, CURL_SOCKET_BAD, timeout_ms)) {
|
||||
case -1: /* error */
|
||||
/* let's die here */
|
||||
failf(data, "Error while waiting for server connect");
|
||||
@@ -270,8 +274,7 @@ static CURLcode ftp_readresp(curl_socket_t sockfd,
|
||||
struct ftp_conn *ftpc = &conn->proto.ftpc;
|
||||
int code = 0;
|
||||
|
||||
if (ftpcode)
|
||||
*ftpcode = 0; /* 0 for errors or not done */
|
||||
*ftpcode = 0; /* 0 for errors or not done */
|
||||
|
||||
ptr=buf + ftpc->nread_resp;
|
||||
|
||||
@@ -328,7 +331,7 @@ static CURLcode ftp_readresp(curl_socket_t sockfd,
|
||||
* line */
|
||||
int i;
|
||||
|
||||
conn->headerbytecount += gotbytes;
|
||||
data->reqdata.keep.headerbytecount += gotbytes;
|
||||
|
||||
ftpc->nread_resp += gotbytes;
|
||||
for(i = 0; i < gotbytes; ptr++, i++) {
|
||||
@@ -413,7 +416,6 @@ static CURLcode ftp_readresp(curl_socket_t sockfd,
|
||||
|
||||
*ftpcode=code; /* return the initial number like this */
|
||||
|
||||
|
||||
/* store the latest code for later retrieval */
|
||||
conn->data->info.httpcode=code;
|
||||
|
||||
@@ -444,8 +446,8 @@ CURLcode Curl_GetFTPResponse(ssize_t *nreadp, /* return number of bytes read */
|
||||
bool keepon=TRUE;
|
||||
ssize_t gotbytes;
|
||||
char *ptr;
|
||||
long timeout; /* timeout in seconds */
|
||||
int interval_ms;
|
||||
long timeout; /* timeout in milliseconds */
|
||||
long interval_ms;
|
||||
struct SessionHandle *data = conn->data;
|
||||
char *line_start;
|
||||
int code=0; /* default ftp "error code" to return */
|
||||
@@ -473,16 +475,16 @@ CURLcode Curl_GetFTPResponse(ssize_t *nreadp, /* return number of bytes read */
|
||||
the response for any given ftp response, not for the time
|
||||
from connect to the given ftp response. */
|
||||
timeout = data->set.ftp_response_timeout - /* timeout time */
|
||||
Curl_tvdiff(Curl_tvnow(), now)/1000; /* spent time */
|
||||
Curl_tvdiff(Curl_tvnow(), now); /* spent time */
|
||||
else if(data->set.timeout)
|
||||
/* if timeout is requested, find out how much remaining time we have */
|
||||
timeout = data->set.timeout - /* timeout time */
|
||||
Curl_tvdiff(Curl_tvnow(), conn->now)/1000; /* spent time */
|
||||
Curl_tvdiff(Curl_tvnow(), conn->now); /* spent time */
|
||||
else
|
||||
/* Even without a requested timeout, we only wait response_time
|
||||
seconds for the full response to arrive before we bail out */
|
||||
timeout = ftpc->response_time -
|
||||
Curl_tvdiff(Curl_tvnow(), now)/1000; /* spent time */
|
||||
Curl_tvdiff(Curl_tvnow(), now); /* spent time */
|
||||
|
||||
if(timeout <=0 ) {
|
||||
failf(data, "FTP response timeout");
|
||||
@@ -491,12 +493,14 @@ CURLcode Curl_GetFTPResponse(ssize_t *nreadp, /* return number of bytes read */
|
||||
|
||||
if(!ftpc->cache) {
|
||||
interval_ms = 1 * 1000; /* use 1 second timeout intervals */
|
||||
if(timeout < interval_ms)
|
||||
interval_ms = timeout;
|
||||
|
||||
switch (Curl_select(sockfd, CURL_SOCKET_BAD, interval_ms)) {
|
||||
switch (Curl_socket_ready(sockfd, CURL_SOCKET_BAD, (int)interval_ms)) {
|
||||
case -1: /* select() error, stop reading */
|
||||
result = CURLE_RECV_ERROR;
|
||||
failf(data, "FTP response aborted due to select() error: %d",
|
||||
Curl_sockerrno());
|
||||
failf(data, "FTP response aborted due to select/poll error: %d",
|
||||
SOCKERRNO);
|
||||
break;
|
||||
case 0: /* timeout */
|
||||
if(Curl_pgrsUpdate(conn))
|
||||
@@ -560,7 +564,7 @@ CURLcode Curl_GetFTPResponse(ssize_t *nreadp, /* return number of bytes read */
|
||||
* line */
|
||||
int i;
|
||||
|
||||
conn->headerbytecount += gotbytes;
|
||||
data->reqdata.keep.headerbytecount += gotbytes;
|
||||
|
||||
*nreadp += gotbytes;
|
||||
for(i = 0; i < gotbytes; ptr++, i++) {
|
||||
@@ -655,7 +659,7 @@ CURLcode Curl_GetFTPResponse(ssize_t *nreadp, /* return number of bytes read */
|
||||
static void state(struct connectdata *conn,
|
||||
ftpstate state)
|
||||
{
|
||||
#ifdef CURLDEBUG
|
||||
#if defined(CURLDEBUG) && !defined(CURL_DISABLE_VERBOSE_STRINGS)
|
||||
/* for debug purposes */
|
||||
const char *names[]={
|
||||
"STOP",
|
||||
@@ -693,7 +697,7 @@ static void state(struct connectdata *conn,
|
||||
};
|
||||
#endif
|
||||
struct ftp_conn *ftpc = &conn->proto.ftpc;
|
||||
#ifdef CURLDEBUG
|
||||
#if defined(CURLDEBUG) && !defined(CURL_DISABLE_VERBOSE_STRINGS)
|
||||
if(ftpc->state != state)
|
||||
infof(conn->data, "FTP %p state change from %s to %s\n",
|
||||
ftpc, names[ftpc->state], names[state]);
|
||||
@@ -839,7 +843,7 @@ static CURLcode ftp_state_use_port(struct connectdata *conn,
|
||||
sslen = sizeof(ss);
|
||||
if (getsockname(conn->sock[FIRSTSOCKET], (struct sockaddr *)&ss, &sslen)) {
|
||||
failf(data, "getsockname() failed: %s",
|
||||
Curl_strerror(conn, Curl_sockerrno()) );
|
||||
Curl_strerror(conn, SOCKERRNO) );
|
||||
return CURLE_FTP_PORT_FAILED;
|
||||
}
|
||||
|
||||
@@ -880,7 +884,7 @@ static CURLcode ftp_state_use_port(struct connectdata *conn,
|
||||
|
||||
portsock = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
|
||||
if (portsock == CURL_SOCKET_BAD) {
|
||||
error = Curl_sockerrno();
|
||||
error = SOCKERRNO;
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
@@ -900,7 +904,7 @@ static CURLcode ftp_state_use_port(struct connectdata *conn,
|
||||
if (getsockname(conn->sock[FIRSTSOCKET],
|
||||
(struct sockaddr *)sa, &sslen)) {
|
||||
failf(data, "getsockname() failed: %s",
|
||||
Curl_strerror(conn, Curl_sockerrno()) );
|
||||
Curl_strerror(conn, SOCKERRNO) );
|
||||
sclose(portsock);
|
||||
return CURLE_FTP_PORT_FAILED;
|
||||
}
|
||||
@@ -915,7 +919,7 @@ static CURLcode ftp_state_use_port(struct connectdata *conn,
|
||||
sslen = sizeof(ss);
|
||||
|
||||
if(bind(portsock, (struct sockaddr *)sa, sslen)) {
|
||||
failf(data, "bind failed: %s", Curl_strerror(conn, Curl_sockerrno()));
|
||||
failf(data, "bind failed: %s", Curl_strerror(conn, SOCKERRNO));
|
||||
sclose(portsock);
|
||||
return CURLE_FTP_PORT_FAILED;
|
||||
}
|
||||
@@ -926,7 +930,7 @@ static CURLcode ftp_state_use_port(struct connectdata *conn,
|
||||
sslen = sizeof(ss);
|
||||
if(getsockname(portsock, (struct sockaddr *)sa, &sslen)) {
|
||||
failf(data, "getsockname() failed: %s",
|
||||
Curl_strerror(conn, Curl_sockerrno()) );
|
||||
Curl_strerror(conn, SOCKERRNO) );
|
||||
sclose(portsock);
|
||||
return CURLE_FTP_PORT_FAILED;
|
||||
}
|
||||
@@ -934,7 +938,7 @@ static CURLcode ftp_state_use_port(struct connectdata *conn,
|
||||
/* step 4, listen on the socket */
|
||||
|
||||
if (listen(portsock, 1)) {
|
||||
failf(data, "socket failure: %s", Curl_strerror(conn, Curl_sockerrno()));
|
||||
failf(data, "socket failure: %s", Curl_strerror(conn, SOCKERRNO));
|
||||
sclose(portsock);
|
||||
return CURLE_FTP_PORT_FAILED;
|
||||
}
|
||||
@@ -1078,7 +1082,7 @@ static CURLcode ftp_state_use_port(struct connectdata *conn,
|
||||
if (getsockname(conn->sock[FIRSTSOCKET],
|
||||
(struct sockaddr *)&sa, &sslen)) {
|
||||
failf(data, "getsockname() failed: %s",
|
||||
Curl_strerror(conn, Curl_sockerrno()) );
|
||||
Curl_strerror(conn, SOCKERRNO) );
|
||||
return CURLE_FTP_PORT_FAILED;
|
||||
}
|
||||
if (sslen > (socklen_t)sizeof(sa))
|
||||
@@ -1114,7 +1118,7 @@ static CURLcode ftp_state_use_port(struct connectdata *conn,
|
||||
if(getsockname(portsock, (struct sockaddr *) &add,
|
||||
&socksize)) {
|
||||
failf(data, "getsockname() failed: %s",
|
||||
Curl_strerror(conn, Curl_sockerrno()) );
|
||||
Curl_strerror(conn, SOCKERRNO) );
|
||||
return CURLE_FTP_PORT_FAILED;
|
||||
}
|
||||
porttouse = ntohs(add.sin_port);
|
||||
@@ -1586,7 +1590,7 @@ static CURLcode ftp_state_pasv_resp(struct connectdata *conn,
|
||||
}
|
||||
}
|
||||
if(ptr) {
|
||||
newport = num;
|
||||
newport = (unsigned short)(num & 0xffff);
|
||||
|
||||
if (conn->bits.tunnel_proxy)
|
||||
/* proxy tunnel -> use other host info because ip_addr_str is the
|
||||
@@ -1650,7 +1654,7 @@ static CURLcode ftp_state_pasv_resp(struct connectdata *conn,
|
||||
else
|
||||
snprintf(newhost, sizeof(newhost),
|
||||
"%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]);
|
||||
newport = (port[0]<<8) + port[1];
|
||||
newport = (unsigned short)(((port[0]<<8) + port[1]) & 0xffff);
|
||||
}
|
||||
else if(ftpc->count1 == 0) {
|
||||
/* EPSV failed, move on to PASV */
|
||||
@@ -1735,6 +1739,23 @@ static CURLcode ftp_state_pasv_resp(struct connectdata *conn,
|
||||
/* this just dumps information about this second connection */
|
||||
ftp_pasv_verbose(conn, conninfo, newhost, connectport);
|
||||
|
||||
switch(data->set.proxytype) {
|
||||
case CURLPROXY_SOCKS5:
|
||||
result = Curl_SOCKS5(conn->proxyuser, conn->proxypasswd, newhost, newport,
|
||||
SECONDARYSOCKET, conn);
|
||||
break;
|
||||
case CURLPROXY_HTTP:
|
||||
/* do nothing here. handled later. */
|
||||
break;
|
||||
case CURLPROXY_SOCKS4:
|
||||
result = Curl_SOCKS4(conn->proxyuser, newhost, newport,
|
||||
SECONDARYSOCKET, conn);
|
||||
break;
|
||||
default:
|
||||
failf(data, "unknown proxytype option given");
|
||||
result = CURLE_COULDNT_CONNECT;
|
||||
break;
|
||||
}
|
||||
#ifndef CURL_DISABLE_HTTP
|
||||
if(conn->bits.tunnel_proxy && conn->bits.httpproxy) {
|
||||
/* FIX: this MUST wait for a proper connect first if 'connected' is
|
||||
@@ -2546,7 +2567,7 @@ static CURLcode ftp_statemach_act(struct connectdata *conn)
|
||||
/* we failed and bails out */
|
||||
return CURLE_FTP_SSL_FAILED;
|
||||
|
||||
if(data->set.ftp_use_ccc) {
|
||||
if(data->set.ftp_ccc) {
|
||||
/* CCC - Clear Command Channel
|
||||
*/
|
||||
NBFTPSENDF(conn, "CCC", NULL);
|
||||
@@ -2751,16 +2772,16 @@ static long ftp_state_timeout(struct connectdata *conn)
|
||||
time. Also, use ftp->response because FTP_RESPONSE_TIMEOUT is supposed
|
||||
to govern the response for any given ftp response, not for the time
|
||||
from connect to the given ftp response. */
|
||||
timeout_ms = data->set.ftp_response_timeout*1000 - /* timeout time */
|
||||
timeout_ms = data->set.ftp_response_timeout - /* timeout time */
|
||||
Curl_tvdiff(Curl_tvnow(), ftpc->response); /* spent time */
|
||||
else if(data->set.timeout)
|
||||
/* if timeout is requested, find out how much remaining time we have */
|
||||
timeout_ms = data->set.timeout*1000 - /* timeout time */
|
||||
timeout_ms = data->set.timeout - /* timeout time */
|
||||
Curl_tvdiff(Curl_tvnow(), conn->now); /* spent time */
|
||||
else
|
||||
/* Without a requested timeout, we only wait 'response_time' seconds for
|
||||
the full response to arrive before we bail out */
|
||||
timeout_ms = ftpc->response_time*1000 -
|
||||
timeout_ms = ftpc->response_time -
|
||||
Curl_tvdiff(Curl_tvnow(), ftpc->response); /* spent time */
|
||||
|
||||
return timeout_ms;
|
||||
@@ -2785,12 +2806,12 @@ CURLcode Curl_ftp_multi_statemach(struct connectdata *conn,
|
||||
return CURLE_OPERATION_TIMEDOUT;
|
||||
}
|
||||
|
||||
rc = Curl_select(ftpc->sendleft?CURL_SOCKET_BAD:sock, /* reading */
|
||||
rc = Curl_socket_ready(ftpc->sendleft?CURL_SOCKET_BAD:sock, /* reading */
|
||||
ftpc->sendleft?sock:CURL_SOCKET_BAD, /* writing */
|
||||
0);
|
||||
|
||||
if(rc == -1) {
|
||||
failf(data, "select error");
|
||||
failf(data, "select/poll error");
|
||||
return CURLE_OUT_OF_MEMORY;
|
||||
}
|
||||
else if(rc != 0) {
|
||||
@@ -2818,12 +2839,12 @@ static CURLcode ftp_easy_statemach(struct connectdata *conn)
|
||||
return CURLE_OPERATION_TIMEDOUT; /* already too little time */
|
||||
}
|
||||
|
||||
rc = Curl_select(ftpc->sendleft?CURL_SOCKET_BAD:sock, /* reading */
|
||||
rc = Curl_socket_ready(ftpc->sendleft?CURL_SOCKET_BAD:sock, /* reading */
|
||||
ftpc->sendleft?sock:CURL_SOCKET_BAD, /* writing */
|
||||
(int)timeout_ms);
|
||||
|
||||
if(rc == -1) {
|
||||
failf(data, "select error");
|
||||
failf(data, "select/poll error");
|
||||
return CURLE_OUT_OF_MEMORY;
|
||||
}
|
||||
else if(rc == 0) {
|
||||
@@ -2904,7 +2925,7 @@ CURLcode Curl_ftp_connect(struct connectdata *conn,
|
||||
/* We always support persistant connections on ftp */
|
||||
conn->bits.close = FALSE;
|
||||
|
||||
ftpc->response_time = 3600; /* set default response time-out */
|
||||
ftpc->response_time = 3600000; /* set default response time-out */
|
||||
|
||||
#ifndef CURL_DISABLE_HTTP
|
||||
if (conn->bits.tunnel_proxy && conn->bits.httpproxy) {
|
||||
@@ -2997,6 +3018,7 @@ CURLcode Curl_ftp_done(struct connectdata *conn, CURLcode status, bool premature
|
||||
case CURLE_FTP_COULDNT_RETR_FILE:
|
||||
case CURLE_FTP_COULDNT_STOR_FILE:
|
||||
case CURLE_FTP_ACCESS_DENIED:
|
||||
case CURLE_FILESIZE_EXCEEDED:
|
||||
/* the connection stays alive fine even though this happened */
|
||||
/* fall-through */
|
||||
case CURLE_OK: /* doesn't affect the control connection's status */
|
||||
@@ -3004,7 +3026,7 @@ CURLcode Curl_ftp_done(struct connectdata *conn, CURLcode status, bool premature
|
||||
ftpc->ctl_valid = was_ctl_valid;
|
||||
break;
|
||||
}
|
||||
/* until we cope better with prematurely ended requests, let them
|
||||
/* until we cope better with prematurely ended requests, let them
|
||||
* fallback as if in complete failure */
|
||||
default: /* by default, an error means the control connection is
|
||||
wedged and should not be used anymore */
|
||||
@@ -3063,7 +3085,7 @@ CURLcode Curl_ftp_done(struct connectdata *conn, CURLcode status, bool premature
|
||||
*/
|
||||
long old_time = ftpc->response_time;
|
||||
|
||||
ftpc->response_time = 60; /* give it only a minute for now */
|
||||
ftpc->response_time = 60000; /* give it only a minute for now */
|
||||
|
||||
result = Curl_GetFTPResponse(&nread, conn, &ftpcode);
|
||||
|
||||
@@ -3208,7 +3230,7 @@ static CURLcode ftp_nb_type(struct connectdata *conn,
|
||||
state(conn, newstate);
|
||||
|
||||
/* keep track of our current transfer type */
|
||||
ftpc->transfertype = want;
|
||||
ftpc->transfertype = (char)want;
|
||||
return CURLE_OK;
|
||||
}
|
||||
|
||||
@@ -3221,6 +3243,7 @@ static CURLcode ftp_nb_type(struct connectdata *conn,
|
||||
* possibly new IP address.
|
||||
*
|
||||
*/
|
||||
#ifndef CURL_DISABLE_VERBOSE_STRINGS
|
||||
static void
|
||||
ftp_pasv_verbose(struct connectdata *conn,
|
||||
Curl_addrinfo *ai,
|
||||
@@ -3231,6 +3254,7 @@ ftp_pasv_verbose(struct connectdata *conn,
|
||||
Curl_printable_address(ai, buf, sizeof(buf));
|
||||
infof(conn->data, "Connecting to %s (%s) port %d\n", newhost, buf, port);
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
Check if this is a range download, and if so, set the internal variables
|
||||
@@ -3283,6 +3307,8 @@ static CURLcode ftp_range(struct connectdata *conn)
|
||||
from, to, data->reqdata.maxdownload));
|
||||
ftpc->dont_check = TRUE; /* dont check for successful transfer */
|
||||
}
|
||||
else
|
||||
data->reqdata.maxdownload = -1;
|
||||
return CURLE_OK;
|
||||
}
|
||||
|
||||
@@ -3621,7 +3647,6 @@ CURLcode Curl_ftp_disconnect(struct connectdata *conn)
|
||||
static
|
||||
CURLcode ftp_parse_url_path(struct connectdata *conn)
|
||||
{
|
||||
CURLcode retcode = CURLE_OK;
|
||||
struct SessionHandle *data = conn->data;
|
||||
/* the ftp struct is already inited in ftp_connect() */
|
||||
struct FTP *ftp = data->reqdata.proto.ftp;
|
||||
@@ -3646,7 +3671,7 @@ CURLcode ftp_parse_url_path(struct connectdata *conn)
|
||||
case FTPFILE_SINGLECWD:
|
||||
/* get the last slash */
|
||||
slash_pos=strrchr(cur_pos, '/');
|
||||
if(slash_pos || !cur_pos || !*cur_pos) {
|
||||
if(slash_pos || !*cur_pos) {
|
||||
ftpc->dirdepth = 1; /* we consider it to be a single dir */
|
||||
ftpc->dirs = (char **)calloc(1, sizeof(ftpc->dirs[0]));
|
||||
if(!ftpc->dirs)
|
||||
@@ -3694,6 +3719,7 @@ CURLcode ftp_parse_url_path(struct connectdata *conn)
|
||||
return CURLE_OUT_OF_MEMORY;
|
||||
}
|
||||
if (isBadFtpString(ftpc->dirs[ftpc->dirdepth])) {
|
||||
free(ftpc->dirs[ftpc->dirdepth]);
|
||||
freedirs(conn);
|
||||
return CURLE_URL_MALFORMAT;
|
||||
}
|
||||
@@ -3703,20 +3729,17 @@ CURLcode ftp_parse_url_path(struct connectdata *conn)
|
||||
continue;
|
||||
}
|
||||
|
||||
if(!retcode) {
|
||||
cur_pos = slash_pos + 1; /* jump to the rest of the string */
|
||||
if(++ftpc->dirdepth >= ftpc->diralloc) {
|
||||
/* enlarge array */
|
||||
char *bigger;
|
||||
ftpc->diralloc *= 2; /* double the size each time */
|
||||
bigger = realloc(ftpc->dirs, ftpc->diralloc * sizeof(ftpc->dirs[0]));
|
||||
if(!bigger) {
|
||||
ftpc->dirdepth--;
|
||||
freedirs(conn);
|
||||
return CURLE_OUT_OF_MEMORY;
|
||||
}
|
||||
ftpc->dirs = (char **)bigger;
|
||||
}
|
||||
cur_pos = slash_pos + 1; /* jump to the rest of the string */
|
||||
if(++ftpc->dirdepth >= ftpc->diralloc) {
|
||||
/* enlarge array */
|
||||
char *bigger;
|
||||
ftpc->diralloc *= 2; /* double the size each time */
|
||||
bigger = realloc(ftpc->dirs, ftpc->diralloc * sizeof(ftpc->dirs[0]));
|
||||
if(!bigger) {
|
||||
freedirs(conn);
|
||||
return CURLE_OUT_OF_MEMORY;
|
||||
}
|
||||
ftpc->dirs = (char **)bigger;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3764,7 +3787,7 @@ CURLcode ftp_parse_url_path(struct connectdata *conn)
|
||||
free(path);
|
||||
}
|
||||
|
||||
return retcode;
|
||||
return CURLE_OK;
|
||||
}
|
||||
|
||||
/* call this when the DO phase has completed */
|
||||
|
@@ -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
|
||||
@@ -75,16 +75,18 @@ CURLcode Curl_getinfo(struct SessionHandle *data, CURLINFO info, ...)
|
||||
double *param_doublep=NULL;
|
||||
char **param_charp=NULL;
|
||||
struct curl_slist **param_slistp=NULL;
|
||||
#ifdef MSG_PEEK
|
||||
char buf;
|
||||
#endif
|
||||
int type;
|
||||
|
||||
if(!data)
|
||||
return CURLE_BAD_FUNCTION_ARGUMENT;
|
||||
|
||||
va_start(arg, info);
|
||||
|
||||
switch(info&CURLINFO_TYPEMASK) {
|
||||
default:
|
||||
return CURLE_BAD_FUNCTION_ARGUMENT;
|
||||
type = CURLINFO_TYPEMASK & (int)info;
|
||||
switch(type) {
|
||||
case CURLINFO_STRING:
|
||||
param_charp = va_arg(arg, char **);
|
||||
if(NULL == param_charp)
|
||||
@@ -105,6 +107,8 @@ CURLcode Curl_getinfo(struct SessionHandle *data, CURLINFO info, ...)
|
||||
if(NULL == param_slistp)
|
||||
return CURLE_BAD_FUNCTION_ARGUMENT;
|
||||
break;
|
||||
default:
|
||||
return CURLE_BAD_FUNCTION_ARGUMENT;
|
||||
}
|
||||
|
||||
switch(info) {
|
||||
|
21
lib/gtls.c
21
lib/gtls.c
@@ -37,9 +37,6 @@
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <ctype.h>
|
||||
#ifdef HAVE_SYS_TYPES_H
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
#ifdef HAVE_SYS_SOCKET_H
|
||||
#include <sys/socket.h>
|
||||
#endif
|
||||
@@ -144,12 +141,12 @@ static CURLcode handshake(struct connectdata *conn,
|
||||
long has_passed;
|
||||
|
||||
if(duringconnect && data->set.connecttimeout)
|
||||
timeout_ms = data->set.connecttimeout*1000;
|
||||
timeout_ms = data->set.connecttimeout;
|
||||
|
||||
if(data->set.timeout) {
|
||||
/* get the strictest timeout of the ones converted to milliseconds */
|
||||
if((data->set.timeout*1000) < timeout_ms)
|
||||
timeout_ms = data->set.timeout*1000;
|
||||
if(data->set.timeout < timeout_ms)
|
||||
timeout_ms = data->set.timeout;
|
||||
}
|
||||
|
||||
/* Evaluate in milliseconds how much time that has passed */
|
||||
@@ -164,7 +161,7 @@ static CURLcode handshake(struct connectdata *conn,
|
||||
return CURLE_OPERATION_TIMEOUTED;
|
||||
}
|
||||
|
||||
rc = Curl_select(conn->sock[sockindex],
|
||||
rc = Curl_socket_ready(conn->sock[sockindex],
|
||||
conn->sock[sockindex], (int)timeout_ms);
|
||||
if(rc > 0)
|
||||
/* reabable or writable, go loop*/
|
||||
@@ -176,7 +173,7 @@ static CURLcode handshake(struct connectdata *conn,
|
||||
}
|
||||
else {
|
||||
/* anything that gets here is fatally bad */
|
||||
failf(data, "select on SSL socket, errno: %d", Curl_sockerrno());
|
||||
failf(data, "select/poll on SSL socket, errno: %d", SOCKERRNO);
|
||||
return CURLE_SSL_CONNECT_ERROR;
|
||||
}
|
||||
}
|
||||
@@ -526,7 +523,6 @@ int Curl_gtls_shutdown(struct connectdata *conn, int sockindex)
|
||||
int retval = 0;
|
||||
struct SessionHandle *data = conn->data;
|
||||
int done = 0;
|
||||
ssize_t nread;
|
||||
char buf[120];
|
||||
|
||||
/* This has only been tested on the proftpd server, and the mod_tls code
|
||||
@@ -534,9 +530,12 @@ int Curl_gtls_shutdown(struct connectdata *conn, int sockindex)
|
||||
response. Thus we wait for a close notify alert from the server, but
|
||||
we do not send one. Let's hope other servers do the same... */
|
||||
|
||||
if(data->set.ftp_ccc == CURLFTPSSL_CCC_ACTIVE)
|
||||
gnutls_bye(conn->ssl[sockindex].session, GNUTLS_SHUT_WR);
|
||||
|
||||
if(conn->ssl[sockindex].session) {
|
||||
while(!done) {
|
||||
int what = Curl_select(conn->sock[sockindex],
|
||||
int what = Curl_socket_ready(conn->sock[sockindex],
|
||||
CURL_SOCKET_BAD, SSL_SHUTDOWN_TIMEOUT);
|
||||
if(what > 0) {
|
||||
/* Something to read, let's do it and hope that it is the close
|
||||
@@ -567,7 +566,7 @@ int Curl_gtls_shutdown(struct connectdata *conn, int sockindex)
|
||||
}
|
||||
else {
|
||||
/* anything that gets here is fatally bad */
|
||||
failf(data, "select on SSL socket, errno: %d", Curl_sockerrno());
|
||||
failf(data, "select/poll on SSL socket, errno: %d", SOCKERRNO);
|
||||
retval = -1;
|
||||
done = 1;
|
||||
}
|
||||
|
@@ -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
|
||||
@@ -28,9 +28,6 @@
|
||||
#ifdef NEED_MALLOC_H
|
||||
#include <malloc.h>
|
||||
#endif
|
||||
#ifdef HAVE_SYS_TYPES_H
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
#ifdef HAVE_SYS_SOCKET_H
|
||||
#include <sys/socket.h>
|
||||
#endif
|
||||
@@ -76,7 +73,8 @@
|
||||
#include "strerror.h"
|
||||
#include "url.h"
|
||||
#include "multiif.h"
|
||||
#include "connect.h" /* for the Curl_sockerrno() proto */
|
||||
#include "connect.h"
|
||||
#include "select.h"
|
||||
|
||||
#define _MPRINTF_REPLACE /* use our functions only */
|
||||
#include <curl/mprintf.h>
|
||||
@@ -147,8 +145,8 @@ CURLcode Curl_is_resolved(struct connectdata *conn,
|
||||
|
||||
nfds = ares_fds(data->state.areschannel, &read_fds, &write_fds);
|
||||
|
||||
(void)select(nfds, &read_fds, &write_fds, NULL,
|
||||
(struct timeval *)&tv);
|
||||
(void)Curl_select(nfds, &read_fds, &write_fds, NULL,
|
||||
(struct timeval *)&tv);
|
||||
|
||||
/* Call ares_process() unconditonally here, even if we simply timed out
|
||||
above, as otherwise the ares name resolve won't timeout! */
|
||||
@@ -183,7 +181,7 @@ CURLcode Curl_wait_for_resolv(struct connectdata *conn,
|
||||
{
|
||||
CURLcode rc=CURLE_OK;
|
||||
struct SessionHandle *data = conn->data;
|
||||
long timeout = CURL_TIMEOUT_RESOLVE; /* default name resolve timeout */
|
||||
long timeout;
|
||||
|
||||
/* now, see if there's a connect timeout or a regular timeout to
|
||||
use instead of the default one */
|
||||
@@ -191,14 +189,8 @@ CURLcode Curl_wait_for_resolv(struct connectdata *conn,
|
||||
timeout = conn->data->set.connecttimeout;
|
||||
else if(conn->data->set.timeout)
|
||||
timeout = conn->data->set.timeout;
|
||||
|
||||
/* We convert the number of seconds into number of milliseconds here: */
|
||||
if(timeout < 2147483)
|
||||
/* maximum amount of seconds that can be multiplied with 1000 and
|
||||
still fit within 31 bits */
|
||||
timeout *= 1000;
|
||||
else
|
||||
timeout = 0x7fffffff; /* ridiculous amount of time anyway */
|
||||
timeout = CURL_TIMEOUT_RESOLVE * 1000; /* default name resolve timeout */
|
||||
|
||||
/* Wait for the name resolve query to complete. */
|
||||
while (1) {
|
||||
@@ -219,8 +211,8 @@ CURLcode Curl_wait_for_resolv(struct connectdata *conn,
|
||||
/* no file descriptors means we're done waiting */
|
||||
break;
|
||||
tvp = ares_timeout(data->state.areschannel, &store, &tv);
|
||||
count = select(nfds, &read_fds, &write_fds, NULL, tvp);
|
||||
if (count < 0 && Curl_sockerrno() != EINVAL)
|
||||
count = Curl_select(nfds, &read_fds, &write_fds, NULL, tvp);
|
||||
if ((count < 0) && (SOCKERRNO != EINVAL))
|
||||
break;
|
||||
|
||||
ares_process(data->state.areschannel, &read_fds, &write_fds);
|
||||
|
@@ -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
|
||||
@@ -28,9 +28,6 @@
|
||||
#ifdef NEED_MALLOC_H
|
||||
#include <malloc.h>
|
||||
#endif
|
||||
#ifdef HAVE_SYS_TYPES_H
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
#ifdef HAVE_SYS_SOCKET_H
|
||||
#include <sys/socket.h>
|
||||
#endif
|
||||
|
@@ -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
|
||||
@@ -28,9 +28,6 @@
|
||||
#ifdef NEED_MALLOC_H
|
||||
#include <malloc.h>
|
||||
#endif
|
||||
#ifdef HAVE_SYS_TYPES_H
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
#ifdef HAVE_SYS_SOCKET_H
|
||||
#include <sys/socket.h>
|
||||
#endif
|
||||
@@ -512,7 +509,7 @@ int Curl_resolv(struct connectdata *conn,
|
||||
*/
|
||||
void Curl_resolv_unlock(struct SessionHandle *data, struct Curl_dns_entry *dns)
|
||||
{
|
||||
curlassert(dns && (dns->inuse>0));
|
||||
DEBUGASSERT(dns && (dns->inuse>0));
|
||||
|
||||
if(data->share)
|
||||
Curl_share_lock(data, CURL_LOCK_DATA_DNS, CURL_LOCK_ACCESS_SINGLE);
|
||||
|
@@ -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
|
||||
@@ -29,9 +29,6 @@
|
||||
#ifdef NEED_MALLOC_H
|
||||
#include <malloc.h>
|
||||
#endif
|
||||
#ifdef HAVE_SYS_TYPES_H
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
#ifdef HAVE_SYS_SOCKET_H
|
||||
#include <sys/socket.h>
|
||||
#endif
|
||||
@@ -124,12 +121,18 @@ Curl_addrinfo *Curl_getaddrinfo(struct connectdata *conn,
|
||||
int port,
|
||||
int *waitp)
|
||||
{
|
||||
#if defined(HAVE_GETHOSTBYNAME_R_3)
|
||||
int res;
|
||||
#endif
|
||||
Curl_addrinfo *ai = NULL;
|
||||
struct hostent *h = NULL;
|
||||
in_addr_t in;
|
||||
struct SessionHandle *data = conn->data;
|
||||
struct hostent *buf = NULL;
|
||||
|
||||
#ifdef CURL_DISABLE_VERBOSE_STRINGS
|
||||
(void)conn;
|
||||
#endif
|
||||
|
||||
(void)port; /* unused in IPv4 code */
|
||||
|
||||
*waitp = 0; /* don't wait, we act synchronously */
|
||||
@@ -146,7 +149,6 @@ Curl_addrinfo *Curl_getaddrinfo(struct connectdata *conn,
|
||||
*/
|
||||
else {
|
||||
int h_errnop;
|
||||
int res=ERANGE;
|
||||
|
||||
buf = (struct hostent *)calloc(CURL_HOSTENT_SIZE, 1);
|
||||
if(!buf)
|
||||
@@ -159,7 +161,6 @@ Curl_addrinfo *Curl_getaddrinfo(struct connectdata *conn,
|
||||
|
||||
#ifdef HAVE_GETHOSTBYNAME_R_5
|
||||
/* Solaris, IRIX and more */
|
||||
(void)res; /* prevent compiler warning */
|
||||
h = gethostbyname_r(hostname,
|
||||
(struct hostent *)buf,
|
||||
(char *)buf + sizeof(struct hostent),
|
||||
@@ -180,7 +181,7 @@ Curl_addrinfo *Curl_getaddrinfo(struct connectdata *conn,
|
||||
#ifdef HAVE_GETHOSTBYNAME_R_6
|
||||
/* Linux */
|
||||
|
||||
res=gethostbyname_r(hostname,
|
||||
(void)gethostbyname_r(hostname,
|
||||
(struct hostent *)buf,
|
||||
(char *)buf + sizeof(struct hostent),
|
||||
CURL_HOSTENT_SIZE - sizeof(struct hostent),
|
||||
@@ -252,7 +253,7 @@ Curl_addrinfo *Curl_getaddrinfo(struct connectdata *conn,
|
||||
(struct hostent *)buf,
|
||||
(struct hostent_data *)((char *)buf +
|
||||
sizeof(struct hostent)));
|
||||
h_errnop= errno; /* we don't deal with this, but set it anyway */
|
||||
h_errnop = SOCKERRNO; /* we don't deal with this, but set it anyway */
|
||||
}
|
||||
else
|
||||
res = -1; /* failure, too smallish buffer size */
|
||||
@@ -273,7 +274,7 @@ Curl_addrinfo *Curl_getaddrinfo(struct connectdata *conn,
|
||||
else
|
||||
#endif /* HAVE_GETHOSTBYNAME_R_3 */
|
||||
{
|
||||
infof(data, "gethostbyname_r(2) failed for %s\n", hostname);
|
||||
infof(conn->data, "gethostbyname_r(2) failed for %s\n", hostname);
|
||||
h = NULL; /* set return code to NULL */
|
||||
free(buf);
|
||||
}
|
||||
@@ -285,7 +286,7 @@ Curl_addrinfo *Curl_getaddrinfo(struct connectdata *conn,
|
||||
else {
|
||||
h = gethostbyname(hostname);
|
||||
if (!h)
|
||||
infof(data, "gethostbyname(2) failed for %s\n", hostname);
|
||||
infof(conn->data, "gethostbyname(2) failed for %s\n", hostname);
|
||||
#endif /*HAVE_GETHOSTBYNAME_R */
|
||||
}
|
||||
|
||||
@@ -379,7 +380,7 @@ Curl_addrinfo *Curl_he2ai(const struct hostent *he, int port)
|
||||
addr = (struct sockaddr_in *)ai->ai_addr; /* storage area for this info */
|
||||
|
||||
memcpy((char *)&(addr->sin_addr), curr, sizeof(struct in_addr));
|
||||
addr->sin_family = he->h_addrtype;
|
||||
addr->sin_family = (unsigned short)(he->h_addrtype);
|
||||
addr->sin_port = htons((unsigned short)port);
|
||||
|
||||
prevai = ai;
|
||||
|
@@ -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
|
||||
@@ -28,9 +28,6 @@
|
||||
#ifdef NEED_MALLOC_H
|
||||
#include <malloc.h>
|
||||
#endif
|
||||
#ifdef HAVE_SYS_TYPES_H
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
#ifdef HAVE_SYS_SOCKET_H
|
||||
#include <sys/socket.h>
|
||||
#endif
|
||||
@@ -210,7 +207,7 @@ static void dump_addrinfo(struct connectdata *conn, const struct addrinfo *ai)
|
||||
if (Curl_printable_address(ai, buf, sizeof(buf)))
|
||||
printf("%s\n", buf);
|
||||
else
|
||||
printf("failed; %s\n", Curl_strerror(conn, Curl_sockerrno()));
|
||||
printf("failed; %s\n", Curl_strerror(conn, SOCKERRNO));
|
||||
}
|
||||
}
|
||||
#else
|
||||
|
@@ -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
|
||||
@@ -28,9 +28,6 @@
|
||||
#ifdef NEED_MALLOC_H
|
||||
#include <malloc.h>
|
||||
#endif
|
||||
#ifdef HAVE_SYS_TYPES_H
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
#ifdef HAVE_SYS_SOCKET_H
|
||||
#include <sys/socket.h>
|
||||
#endif
|
||||
|
@@ -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
|
||||
@@ -29,9 +29,6 @@
|
||||
#ifdef NEED_MALLOC_H
|
||||
#include <malloc.h>
|
||||
#endif
|
||||
#ifdef HAVE_SYS_TYPES_H
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
#ifdef HAVE_SYS_SOCKET_H
|
||||
#include <sys/socket.h>
|
||||
#endif
|
||||
@@ -147,7 +144,7 @@ static void dump_addrinfo (struct connectdata *conn, const struct addrinfo *ai)
|
||||
if (Curl_printable_address(ai, buf, sizeof(buf)))
|
||||
trace_it("%s\n", buf);
|
||||
else
|
||||
trace_it("failed; %s\n", Curl_strerror(conn,WSAGetLastError()));
|
||||
trace_it("failed; %s\n", Curl_strerror(conn, SOCKERRNO));
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@@ -301,7 +298,8 @@ static unsigned __stdcall gethostbyname_thread (void *arg)
|
||||
return (unsigned)-1;
|
||||
}
|
||||
|
||||
WSASetLastError (conn->async.status = NO_DATA); /* pending status */
|
||||
conn->async.status = NO_DATA; /* pending status */
|
||||
SET_SOCKERRNO(conn->async.status);
|
||||
|
||||
/* Signaling that we have initialized all copies of data and handles we
|
||||
need */
|
||||
@@ -318,7 +316,7 @@ static unsigned __stdcall gethostbyname_thread (void *arg)
|
||||
rc = Curl_addrinfo4_callback(conn, CURL_ASYNC_SUCCESS, he);
|
||||
}
|
||||
else {
|
||||
rc = Curl_addrinfo4_callback(conn, (int)WSAGetLastError(), NULL);
|
||||
rc = Curl_addrinfo4_callback(conn, SOCKERRNO, NULL);
|
||||
}
|
||||
TRACE(("Winsock-error %d, addr %s\n", conn->async.status,
|
||||
he ? inet_ntoa(*(struct in_addr*)he->h_addr) : "unknown"));
|
||||
@@ -362,7 +360,8 @@ static unsigned __stdcall getaddrinfo_thread (void *arg)
|
||||
|
||||
itoa(conn->async.port, service, 10);
|
||||
|
||||
WSASetLastError(conn->async.status = NO_DATA); /* pending status */
|
||||
conn->async.status = NO_DATA; /* pending status */
|
||||
SET_SOCKERRNO(conn->async.status);
|
||||
|
||||
/* Signaling that we have initialized all copies of data and handles we
|
||||
need */
|
||||
@@ -383,7 +382,7 @@ static unsigned __stdcall getaddrinfo_thread (void *arg)
|
||||
rc = Curl_addrinfo6_callback(conn, CURL_ASYNC_SUCCESS, res);
|
||||
}
|
||||
else {
|
||||
rc = Curl_addrinfo6_callback(conn, (int)WSAGetLastError(), NULL);
|
||||
rc = Curl_addrinfo6_callback(conn, SOCKERRNO, NULL);
|
||||
TRACE(("Winsock-error %d, no address\n", conn->async.status));
|
||||
}
|
||||
release_thread_sync(&tsd);
|
||||
@@ -461,7 +460,7 @@ static bool init_resolve_thread (struct connectdata *conn,
|
||||
HANDLE thread_and_event[2] = {0};
|
||||
|
||||
if (!td) {
|
||||
SetLastError(ENOMEM);
|
||||
SET_ERRNO(ENOMEM);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
@@ -469,7 +468,7 @@ static bool init_resolve_thread (struct connectdata *conn,
|
||||
conn->async.hostname = strdup(hostname);
|
||||
if (!conn->async.hostname) {
|
||||
free(td);
|
||||
SetLastError(ENOMEM);
|
||||
SET_ERRNO(ENOMEM);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
@@ -486,7 +485,7 @@ static bool init_resolve_thread (struct connectdata *conn,
|
||||
td->mutex_waiting = CreateMutex(NULL, TRUE, NULL);
|
||||
if (td->mutex_waiting == NULL) {
|
||||
Curl_destroy_thread_data(&conn->async);
|
||||
SetLastError(EAGAIN);
|
||||
SET_ERRNO(EAGAIN);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
@@ -496,7 +495,7 @@ static bool init_resolve_thread (struct connectdata *conn,
|
||||
td->event_resolved = CreateEvent(NULL, TRUE, FALSE, NULL);
|
||||
if (td->event_resolved == NULL) {
|
||||
Curl_destroy_thread_data(&conn->async);
|
||||
SetLastError(EAGAIN);
|
||||
SET_ERRNO(EAGAIN);
|
||||
return FALSE;
|
||||
}
|
||||
/* Create the mutex used to serialize access to event_terminated
|
||||
@@ -505,7 +504,7 @@ static bool init_resolve_thread (struct connectdata *conn,
|
||||
td->mutex_terminate = CreateMutex(NULL, FALSE, NULL);
|
||||
if (td->mutex_terminate == NULL) {
|
||||
Curl_destroy_thread_data(&conn->async);
|
||||
SetLastError(EAGAIN);
|
||||
SET_ERRNO(EAGAIN);
|
||||
return FALSE;
|
||||
}
|
||||
/* Create the event used to signal thread that it should terminate.
|
||||
@@ -513,7 +512,7 @@ static bool init_resolve_thread (struct connectdata *conn,
|
||||
td->event_terminate = CreateEvent(NULL, TRUE, FALSE, NULL);
|
||||
if (td->event_terminate == NULL) {
|
||||
Curl_destroy_thread_data(&conn->async);
|
||||
SetLastError(EAGAIN);
|
||||
SET_ERRNO(EAGAIN);
|
||||
return FALSE;
|
||||
}
|
||||
/* Create the event used by thread to inform it has initialized its own data.
|
||||
@@ -521,7 +520,7 @@ static bool init_resolve_thread (struct connectdata *conn,
|
||||
td->event_thread_started = CreateEvent(NULL, TRUE, FALSE, NULL);
|
||||
if (td->event_thread_started == NULL) {
|
||||
Curl_destroy_thread_data(&conn->async);
|
||||
SetLastError(EAGAIN);
|
||||
SET_ERRNO(EAGAIN);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
@@ -535,7 +534,7 @@ static bool init_resolve_thread (struct connectdata *conn,
|
||||
#endif
|
||||
|
||||
#ifdef CURLRES_IPV6
|
||||
curlassert(hints);
|
||||
DEBUGASSERT(hints);
|
||||
td->hints = *hints;
|
||||
#else
|
||||
(void) hints;
|
||||
@@ -543,10 +542,10 @@ static bool init_resolve_thread (struct connectdata *conn,
|
||||
|
||||
if (!td->thread_hnd) {
|
||||
#ifdef _WIN32_WCE
|
||||
TRACE(("CreateThread() failed; %s\n", Curl_strerror(conn,GetLastError())));
|
||||
TRACE(("CreateThread() failed; %s\n", Curl_strerror(conn, ERRNO)));
|
||||
#else
|
||||
SetLastError(errno);
|
||||
TRACE(("_beginthreadex() failed; %s\n", Curl_strerror(conn,errno)));
|
||||
SET_ERRNO(errno);
|
||||
TRACE(("_beginthreadex() failed; %s\n", Curl_strerror(conn, ERRNO)));
|
||||
#endif
|
||||
Curl_destroy_thread_data(&conn->async);
|
||||
return FALSE;
|
||||
@@ -589,7 +588,7 @@ CURLcode Curl_wait_for_resolv(struct connectdata *conn,
|
||||
DWORD status, ticks;
|
||||
CURLcode rc;
|
||||
|
||||
curlassert (conn && td);
|
||||
DEBUGASSERT(conn && td);
|
||||
|
||||
/* now, see if there's a connect timeout or a regular timeout to
|
||||
use instead of the default one */
|
||||
@@ -600,7 +599,7 @@ CURLcode Curl_wait_for_resolv(struct connectdata *conn,
|
||||
ticks = GetTickCount();
|
||||
|
||||
/* wait for the thread to resolve the name */
|
||||
status = WaitForSingleObject(td->event_resolved, 1000UL*timeout);
|
||||
status = WaitForSingleObject(td->event_resolved, timeout);
|
||||
|
||||
/* mark that we are now done waiting */
|
||||
ReleaseMutex(td->mutex_waiting);
|
||||
@@ -627,7 +626,7 @@ CURLcode Curl_wait_for_resolv(struct connectdata *conn,
|
||||
* thread. 'conn->async.done = TRUE' is set in
|
||||
* Curl_addrinfo4/6_callback().
|
||||
*/
|
||||
WSASetLastError(conn->async.status);
|
||||
SET_SOCKERRNO(conn->async.status);
|
||||
GetExitCodeThread(td->thread_hnd, &td->thread_status);
|
||||
TRACE(("%s() status %lu, thread retval %lu, ",
|
||||
THREAD_NAME, status, td->thread_status));
|
||||
@@ -749,12 +748,12 @@ Curl_addrinfo *Curl_getaddrinfo(struct connectdata *conn,
|
||||
|
||||
/* fall-back to blocking version */
|
||||
infof(data, "init_resolve_thread() failed for %s; %s\n",
|
||||
hostname, Curl_strerror(conn,GetLastError()));
|
||||
hostname, Curl_strerror(conn, ERRNO));
|
||||
|
||||
h = gethostbyname(hostname);
|
||||
if (!h) {
|
||||
infof(data, "gethostbyname(2) failed for %s:%d; %s\n",
|
||||
hostname, port, Curl_strerror(conn,WSAGetLastError()));
|
||||
hostname, port, Curl_strerror(conn, SOCKERRNO));
|
||||
return NULL;
|
||||
}
|
||||
return Curl_he2ai(h, port);
|
||||
@@ -826,12 +825,12 @@ Curl_addrinfo *Curl_getaddrinfo(struct connectdata *conn,
|
||||
|
||||
/* fall-back to blocking version */
|
||||
infof(data, "init_resolve_thread() failed for %s; %s\n",
|
||||
hostname, Curl_strerror(conn,GetLastError()));
|
||||
hostname, Curl_strerror(conn, ERRNO));
|
||||
|
||||
error = getaddrinfo(hostname, sbuf, &hints, &res);
|
||||
if (error) {
|
||||
infof(data, "getaddrinfo() failed for %s:%d; %s\n",
|
||||
hostname, port, Curl_strerror(conn,WSAGetLastError()));
|
||||
hostname, port, Curl_strerror(conn, SOCKERRNO));
|
||||
return NULL;
|
||||
}
|
||||
return res;
|
||||
|
585
lib/http.c
585
lib/http.c
@@ -30,12 +30,6 @@
|
||||
#include <stdarg.h>
|
||||
#include <stdlib.h>
|
||||
#include <ctype.h>
|
||||
#ifdef HAVE_SYS_TYPES_H
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
#ifdef HAVE_SYS_STAT_H
|
||||
#include <sys/stat.h>
|
||||
#endif
|
||||
|
||||
#ifdef WIN32
|
||||
#include <time.h>
|
||||
@@ -60,14 +54,18 @@
|
||||
#ifdef HAVE_UNISTD_H
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
#ifdef HAVE_NETDB_H
|
||||
#include <netdb.h>
|
||||
#endif
|
||||
#ifdef HAVE_ARPA_INET_H
|
||||
#include <arpa/inet.h>
|
||||
#endif
|
||||
#ifdef HAVE_NET_IF_H
|
||||
#include <net/if.h>
|
||||
#endif
|
||||
#ifdef HAVE_SYS_IOCTL_H
|
||||
#include <sys/ioctl.h>
|
||||
#endif
|
||||
#include <signal.h>
|
||||
|
||||
#ifdef HAVE_SYS_PARAM_H
|
||||
@@ -159,6 +157,8 @@ static CURLcode Curl_output_basic(struct connectdata *conn, bool proxy)
|
||||
proxy?"Proxy-":"",
|
||||
authorization);
|
||||
free(authorization);
|
||||
if(!*userp)
|
||||
return CURLE_OUT_OF_MEMORY;
|
||||
}
|
||||
else
|
||||
return CURLE_OUT_OF_MEMORY;
|
||||
@@ -332,6 +332,8 @@ CURLcode Curl_http_auth_act(struct connectdata *conn)
|
||||
|
||||
if(pickhost || pickproxy) {
|
||||
data->reqdata.newurl = strdup(data->change.url); /* clone URL */
|
||||
if (!data->reqdata.newurl)
|
||||
return CURLE_OUT_OF_MEMORY;
|
||||
|
||||
if((data->set.httpreq != HTTPREQ_GET) &&
|
||||
(data->set.httpreq != HTTPREQ_HEAD) &&
|
||||
@@ -352,6 +354,8 @@ CURLcode Curl_http_auth_act(struct connectdata *conn)
|
||||
if((data->set.httpreq != HTTPREQ_GET) &&
|
||||
(data->set.httpreq != HTTPREQ_HEAD)) {
|
||||
data->reqdata.newurl = strdup(data->change.url); /* clone URL */
|
||||
if (!data->reqdata.newurl)
|
||||
return CURLE_OUT_OF_MEMORY;
|
||||
data->state.authhost.done = TRUE;
|
||||
}
|
||||
}
|
||||
@@ -391,7 +395,7 @@ Curl_http_output_auth(struct connectdata *conn,
|
||||
struct auth *authhost;
|
||||
struct auth *authproxy;
|
||||
|
||||
curlassert(data);
|
||||
DEBUGASSERT(data);
|
||||
|
||||
authhost = &data->state.authhost;
|
||||
authproxy = &data->state.authproxy;
|
||||
@@ -676,9 +680,9 @@ int Curl_http_should_fail(struct connectdata *conn)
|
||||
struct SessionHandle *data;
|
||||
struct Curl_transfer_keeper *k;
|
||||
|
||||
curlassert(conn);
|
||||
DEBUGASSERT(conn);
|
||||
data = conn->data;
|
||||
curlassert(data);
|
||||
DEBUGASSERT(data);
|
||||
|
||||
/*
|
||||
** For readability
|
||||
@@ -717,7 +721,7 @@ int Curl_http_should_fail(struct connectdata *conn)
|
||||
/*
|
||||
** All we have left to deal with is 401 and 407
|
||||
*/
|
||||
curlassert((k->httpcode == 401) || (k->httpcode == 407));
|
||||
DEBUGASSERT((k->httpcode == 401) || (k->httpcode == 407));
|
||||
|
||||
/*
|
||||
** Examine the current authentication state to see if this
|
||||
@@ -864,7 +868,7 @@ CURLcode add_buffer_send(send_buffer *in,
|
||||
size_t sendsize;
|
||||
curl_socket_t sockfd;
|
||||
|
||||
curlassert(socketindex <= SECONDARYSOCKET);
|
||||
DEBUGASSERT(socketindex <= SECONDARYSOCKET);
|
||||
|
||||
sockfd = conn->sock[socketindex];
|
||||
|
||||
@@ -992,8 +996,7 @@ CURLcode add_bufferf(send_buffer *in, const char *fmt, ...)
|
||||
if(s) {
|
||||
CURLcode result = add_buffer(in, s, strlen(s));
|
||||
free(s);
|
||||
if(CURLE_OK == result)
|
||||
return CURLE_OK;
|
||||
return result;
|
||||
}
|
||||
/* If we failed, we cleanup the whole buffer and return error */
|
||||
if(in->buffer)
|
||||
@@ -1021,8 +1024,12 @@ CURLcode add_buffer(send_buffer *in, const void *inptr, size_t size)
|
||||
/* create a new buffer */
|
||||
new_rb = (char *)malloc(new_size);
|
||||
|
||||
if(!new_rb)
|
||||
if(!new_rb) {
|
||||
/* If we failed, we cleanup the whole buffer and return error */
|
||||
Curl_safefree(in->buffer);
|
||||
free(in);
|
||||
return CURLE_OUT_OF_MEMORY;
|
||||
}
|
||||
|
||||
in->buffer = new_rb;
|
||||
in->size_max = new_size;
|
||||
@@ -1115,258 +1122,315 @@ CURLcode Curl_proxyCONNECT(struct connectdata *conn,
|
||||
struct Curl_transfer_keeper *k = &data->reqdata.keep;
|
||||
CURLcode result;
|
||||
int res;
|
||||
size_t nread; /* total size read */
|
||||
int perline; /* count bytes per line */
|
||||
int keepon=TRUE;
|
||||
ssize_t gotbytes;
|
||||
char *ptr;
|
||||
long timeout =
|
||||
data->set.timeout?data->set.timeout:3600; /* in seconds */
|
||||
char *line_start;
|
||||
char *host_port;
|
||||
data->set.timeout?data->set.timeout:3600000; /* in milliseconds */
|
||||
curl_socket_t tunnelsocket = conn->sock[sockindex];
|
||||
send_buffer *req_buffer;
|
||||
curl_off_t cl=0;
|
||||
bool closeConnection = FALSE;
|
||||
long check;
|
||||
|
||||
#define SELECT_OK 0
|
||||
#define SELECT_ERROR 1
|
||||
#define SELECT_TIMEOUT 2
|
||||
int error = SELECT_OK;
|
||||
|
||||
infof(data, "Establish HTTP proxy tunnel to %s:%d\n", hostname, remote_port);
|
||||
conn->bits.proxy_connect_closed = FALSE;
|
||||
|
||||
do {
|
||||
if(data->reqdata.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;
|
||||
}
|
||||
if (!conn->bits.tunnel_connecting) { /* BEGIN CONNECT PHASE */
|
||||
char *host_port;
|
||||
send_buffer *req_buffer;
|
||||
|
||||
/* initialize a dynamic send-buffer */
|
||||
req_buffer = add_buffer_init();
|
||||
infof(data, "Establish HTTP proxy tunnel to %s:%d\n",
|
||||
hostname, remote_port);
|
||||
|
||||
if(!req_buffer)
|
||||
return CURLE_OUT_OF_MEMORY;
|
||||
|
||||
host_port = aprintf("%s:%d", hostname, remote_port);
|
||||
if(!host_port)
|
||||
return CURLE_OUT_OF_MEMORY;
|
||||
|
||||
/* Setup the proxy-authorization header, if any */
|
||||
result = Curl_http_output_auth(conn, (char *)"CONNECT", host_port, TRUE);
|
||||
|
||||
if(CURLE_OK == result) {
|
||||
char *host=(char *)"";
|
||||
const char *proxyconn="";
|
||||
const char *useragent="";
|
||||
|
||||
if(!checkheaders(data, "Host:")) {
|
||||
host = aprintf("Host: %s\r\n", host_port);
|
||||
if(!host)
|
||||
result = CURLE_OUT_OF_MEMORY;
|
||||
if(data->reqdata.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;
|
||||
}
|
||||
if(!checkheaders(data, "Proxy-Connection:"))
|
||||
proxyconn = "Proxy-Connection: Keep-Alive\r\n";
|
||||
|
||||
if(!checkheaders(data, "User-Agent:") && data->set.useragent)
|
||||
useragent = conn->allocptr.uagent;
|
||||
/* initialize a dynamic send-buffer */
|
||||
req_buffer = add_buffer_init();
|
||||
|
||||
if(!req_buffer)
|
||||
return CURLE_OUT_OF_MEMORY;
|
||||
|
||||
host_port = aprintf("%s:%d", hostname, remote_port);
|
||||
if(!host_port) {
|
||||
free(req_buffer);
|
||||
return CURLE_OUT_OF_MEMORY;
|
||||
}
|
||||
|
||||
/* Setup the proxy-authorization header, if any */
|
||||
result = Curl_http_output_auth(conn, (char *)"CONNECT", host_port, TRUE);
|
||||
|
||||
if(CURLE_OK == result) {
|
||||
/* Send the connect request to the proxy */
|
||||
/* BLOCKING */
|
||||
result =
|
||||
add_bufferf(req_buffer,
|
||||
"CONNECT %s:%d HTTP/1.0\r\n"
|
||||
"%s" /* Host: */
|
||||
"%s" /* Proxy-Authorization */
|
||||
"%s" /* User-Agent */
|
||||
"%s", /* Proxy-Connection */
|
||||
hostname, remote_port,
|
||||
host,
|
||||
conn->allocptr.proxyuserpwd?
|
||||
conn->allocptr.proxyuserpwd:"",
|
||||
useragent,
|
||||
proxyconn);
|
||||
char *host=(char *)"";
|
||||
const char *proxyconn="";
|
||||
const char *useragent="";
|
||||
|
||||
if(CURLE_OK == result)
|
||||
result = add_custom_headers(conn, req_buffer);
|
||||
if(!checkheaders(data, "Host:")) {
|
||||
host = aprintf("Host: %s\r\n", host_port);
|
||||
if(!host) {
|
||||
free(req_buffer);
|
||||
free(host_port);
|
||||
return CURLE_OUT_OF_MEMORY;
|
||||
}
|
||||
}
|
||||
if(!checkheaders(data, "Proxy-Connection:"))
|
||||
proxyconn = "Proxy-Connection: Keep-Alive\r\n";
|
||||
|
||||
if(host && *host)
|
||||
free(host);
|
||||
if(!checkheaders(data, "User-Agent:") && data->set.useragent)
|
||||
useragent = conn->allocptr.uagent;
|
||||
|
||||
if(CURLE_OK == result)
|
||||
/* CRLF terminate the request */
|
||||
result = add_bufferf(req_buffer, "\r\n");
|
||||
/* Send the connect request to the proxy */
|
||||
/* BLOCKING */
|
||||
result =
|
||||
add_bufferf(req_buffer,
|
||||
"CONNECT %s:%d HTTP/1.0\r\n"
|
||||
"%s" /* Host: */
|
||||
"%s" /* Proxy-Authorization */
|
||||
"%s" /* User-Agent */
|
||||
"%s", /* Proxy-Connection */
|
||||
hostname, remote_port,
|
||||
host,
|
||||
conn->allocptr.proxyuserpwd?
|
||||
conn->allocptr.proxyuserpwd:"",
|
||||
useragent,
|
||||
proxyconn);
|
||||
|
||||
if(CURLE_OK == result)
|
||||
/* Now send off the request */
|
||||
result = add_buffer_send(req_buffer, conn,
|
||||
&data->info.request_size, 0, sockindex);
|
||||
if(host && *host)
|
||||
free(host);
|
||||
|
||||
if(CURLE_OK == result)
|
||||
result = add_custom_headers(conn, req_buffer);
|
||||
|
||||
if(CURLE_OK == result)
|
||||
/* CRLF terminate the request */
|
||||
result = add_bufferf(req_buffer, "\r\n");
|
||||
|
||||
if(CURLE_OK == result) {
|
||||
/* Now send off the request */
|
||||
result = add_buffer_send(req_buffer, conn,
|
||||
&data->info.request_size, 0, sockindex);
|
||||
}
|
||||
req_buffer = NULL;
|
||||
if(result)
|
||||
failf(data, "Failed sending CONNECT to proxy");
|
||||
}
|
||||
free(host_port);
|
||||
Curl_safefree(req_buffer);
|
||||
if(result)
|
||||
failf(data, "Failed sending CONNECT to proxy");
|
||||
}
|
||||
free(host_port);
|
||||
if(result)
|
||||
return result;
|
||||
return result;
|
||||
|
||||
ptr=data->state.buffer;
|
||||
line_start = ptr;
|
||||
conn->bits.tunnel_connecting = TRUE;
|
||||
} /* END CONNECT PHASE */
|
||||
|
||||
nread=0;
|
||||
perline=0;
|
||||
keepon=TRUE;
|
||||
/* now we've issued the CONNECT and we're waiting to hear back -
|
||||
we try not to block here in multi-mode because that might be a LONG
|
||||
wait if the proxy cannot connect-through to the remote host. */
|
||||
|
||||
while((nread<BUFSIZE) && (keepon && !error)) {
|
||||
|
||||
/* if timeout is requested, find out how much remaining time we have */
|
||||
long check = timeout - /* timeout time */
|
||||
Curl_tvdiff(Curl_tvnow(), conn->now)/1000; /* spent time */
|
||||
if(check <=0 ) {
|
||||
failf(data, "Proxy CONNECT aborted due to timeout");
|
||||
error = SELECT_TIMEOUT; /* already too little time */
|
||||
break;
|
||||
}
|
||||
|
||||
/* timeout each second and check the timeout */
|
||||
switch (Curl_select(tunnelsocket, CURL_SOCKET_BAD, 1000)) {
|
||||
case -1: /* select() error, stop reading */
|
||||
error = SELECT_ERROR;
|
||||
failf(data, "Proxy CONNECT aborted due to select() error");
|
||||
break;
|
||||
case 0: /* timeout */
|
||||
break;
|
||||
default:
|
||||
res = Curl_read(conn, tunnelsocket, ptr, BUFSIZE-nread, &gotbytes);
|
||||
if(res< 0)
|
||||
/* EWOULDBLOCK */
|
||||
continue; /* go loop yourself */
|
||||
else if(res)
|
||||
keepon = FALSE;
|
||||
else if(gotbytes <= 0) {
|
||||
keepon = FALSE;
|
||||
error = SELECT_ERROR;
|
||||
failf(data, "Proxy CONNECT aborted");
|
||||
}
|
||||
else {
|
||||
/*
|
||||
* We got a whole chunk of data, which can be anything from one byte
|
||||
* to a set of lines and possibly just a piece of the last line.
|
||||
*/
|
||||
int i;
|
||||
|
||||
nread += gotbytes;
|
||||
|
||||
if(keepon > TRUE) {
|
||||
/* This means we are currently ignoring a response-body, so we
|
||||
simply count down our counter and make sure to break out of the
|
||||
loop when we're done! */
|
||||
cl -= gotbytes;
|
||||
if(cl<=0) {
|
||||
keepon = FALSE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
for(i = 0; i < gotbytes; ptr++, i++) {
|
||||
perline++; /* amount of bytes in this line so far */
|
||||
if(*ptr=='\n') {
|
||||
char letter;
|
||||
int writetype;
|
||||
|
||||
/* output debug if that is requested */
|
||||
if(data->set.verbose)
|
||||
Curl_debug(data, CURLINFO_HEADER_IN,
|
||||
line_start, (size_t)perline, conn);
|
||||
|
||||
/* send the header to the callback */
|
||||
writetype = CLIENTWRITE_HEADER;
|
||||
if(data->set.include_header)
|
||||
writetype |= CLIENTWRITE_BODY;
|
||||
|
||||
result = Curl_client_write(conn, writetype, line_start, perline);
|
||||
if(result)
|
||||
return result;
|
||||
|
||||
/* Newlines are CRLF, so the CR is ignored as the line isn't
|
||||
really terminated until the LF comes. Treat a following CR
|
||||
as end-of-headers as well.*/
|
||||
|
||||
if(('\r' == line_start[0]) ||
|
||||
('\n' == line_start[0])) {
|
||||
/* end of response-headers from the proxy */
|
||||
if(cl && (407 == k->httpcode) && !data->state.authproblem) {
|
||||
/* If we get a 407 response code with content length when we
|
||||
* have no auth problem, we must ignore the whole
|
||||
* response-body */
|
||||
keepon = 2;
|
||||
infof(data, "Ignore %" FORMAT_OFF_T
|
||||
" bytes of response-body\n", cl);
|
||||
cl -= (gotbytes - i);/* remove the remaining chunk of what
|
||||
we already read */
|
||||
if(cl<=0)
|
||||
/* if the whole thing was already read, we are done! */
|
||||
keepon=FALSE;
|
||||
}
|
||||
else
|
||||
keepon = FALSE;
|
||||
break; /* breaks out of for-loop, not switch() */
|
||||
}
|
||||
|
||||
/* keep a backup of the position we are about to blank */
|
||||
letter = line_start[perline];
|
||||
line_start[perline]=0; /* zero terminate the buffer */
|
||||
if((checkprefix("WWW-Authenticate:", line_start) &&
|
||||
(401 == k->httpcode)) ||
|
||||
(checkprefix("Proxy-authenticate:", line_start) &&
|
||||
(407 == k->httpcode))) {
|
||||
result = Curl_http_input_auth(conn, k->httpcode, line_start);
|
||||
if(result)
|
||||
return result;
|
||||
}
|
||||
else if(checkprefix("Content-Length:", line_start)) {
|
||||
cl = curlx_strtoofft(line_start + strlen("Content-Length:"),
|
||||
NULL, 10);
|
||||
}
|
||||
else if(Curl_compareheader(line_start,
|
||||
"Connection:", "close"))
|
||||
closeConnection = TRUE;
|
||||
else if(2 == sscanf(line_start, "HTTP/1.%d %d",
|
||||
&subversion,
|
||||
&k->httpcode)) {
|
||||
/* store the HTTP code from the proxy */
|
||||
data->info.httpproxycode = k->httpcode;
|
||||
}
|
||||
/* put back the letter we blanked out before */
|
||||
line_start[perline]= letter;
|
||||
|
||||
perline=0; /* line starts over here */
|
||||
line_start = ptr+1; /* this skips the zero byte we wrote */
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
} /* switch */
|
||||
} /* while there's buffer left and loop is requested */
|
||||
|
||||
if(error)
|
||||
return CURLE_RECV_ERROR;
|
||||
|
||||
if(data->info.httpproxycode != 200)
|
||||
/* Deal with the possibly already received authenticate
|
||||
headers. 'newurl' is set to a new URL if we must loop. */
|
||||
Curl_http_auth_act(conn);
|
||||
|
||||
if (closeConnection && data->reqdata.newurl) {
|
||||
/* Connection closed by server. Don't use it anymore */
|
||||
sclose(conn->sock[sockindex]);
|
||||
conn->sock[sockindex] = CURL_SOCKET_BAD;
|
||||
/* if timeout is requested, find out how much remaining time we have */
|
||||
check = timeout - /* timeout time */
|
||||
Curl_tvdiff(Curl_tvnow(), conn->now); /* spent time */
|
||||
if(check <=0 ) {
|
||||
failf(data, "Proxy CONNECT aborted due to timeout");
|
||||
error = SELECT_TIMEOUT; /* already too little time */
|
||||
break;
|
||||
}
|
||||
|
||||
/* 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))
|
||||
/* return so we'll be called again polling-style */
|
||||
return CURLE_OK;
|
||||
else {
|
||||
DEBUGF(infof(data,
|
||||
"Multi mode finished polling for response from "
|
||||
"proxy CONNECT."));
|
||||
}
|
||||
}
|
||||
else {
|
||||
DEBUGF(infof(data, "Easy mode waiting for response from proxy CONNECT."));
|
||||
}
|
||||
|
||||
/* at this point, either:
|
||||
1) we're in easy-mode and so it's okay to block waiting for a CONNECT
|
||||
response
|
||||
2) we're in multi-mode and we didn't block - it's either an error or we
|
||||
now have some data waiting.
|
||||
In any case, the tunnel_connecting phase is over. */
|
||||
conn->bits.tunnel_connecting = FALSE;
|
||||
|
||||
{ /* BEGIN NEGOTIATION PHASE */
|
||||
size_t nread; /* total size read */
|
||||
int perline; /* count bytes per line */
|
||||
int keepon=TRUE;
|
||||
ssize_t gotbytes;
|
||||
char *ptr;
|
||||
char *line_start;
|
||||
|
||||
ptr=data->state.buffer;
|
||||
line_start = ptr;
|
||||
|
||||
nread=0;
|
||||
perline=0;
|
||||
keepon=TRUE;
|
||||
|
||||
while((nread<BUFSIZE) && (keepon && !error)) {
|
||||
|
||||
/* if timeout is requested, find out how much remaining time we have */
|
||||
check = timeout - /* timeout time */
|
||||
Curl_tvdiff(Curl_tvnow(), conn->now); /* spent time */
|
||||
if(check <= 0) {
|
||||
failf(data, "Proxy CONNECT aborted due to timeout");
|
||||
error = SELECT_TIMEOUT; /* already too little time */
|
||||
break;
|
||||
}
|
||||
|
||||
/* loop every second at least, less if the timeout is near */
|
||||
switch (Curl_socket_ready(tunnelsocket, CURL_SOCKET_BAD,
|
||||
check<1000L?(int)check:1000)) {
|
||||
case -1: /* select() error, stop reading */
|
||||
error = SELECT_ERROR;
|
||||
failf(data, "Proxy CONNECT aborted due to select/poll error");
|
||||
break;
|
||||
case 0: /* timeout */
|
||||
break;
|
||||
default:
|
||||
res = Curl_read(conn, tunnelsocket, ptr, BUFSIZE-nread, &gotbytes);
|
||||
if(res< 0)
|
||||
/* EWOULDBLOCK */
|
||||
continue; /* go loop yourself */
|
||||
else if(res)
|
||||
keepon = FALSE;
|
||||
else if(gotbytes <= 0) {
|
||||
keepon = FALSE;
|
||||
error = SELECT_ERROR;
|
||||
failf(data, "Proxy CONNECT aborted");
|
||||
}
|
||||
else {
|
||||
/*
|
||||
* We got a whole chunk of data, which can be anything from one
|
||||
* byte to a set of lines and possibly just a piece of the last
|
||||
* line.
|
||||
*/
|
||||
int i;
|
||||
|
||||
nread += gotbytes;
|
||||
|
||||
if(keepon > TRUE) {
|
||||
/* This means we are currently ignoring a response-body, so we
|
||||
simply count down our counter and make sure to break out of
|
||||
the loop when we're done! */
|
||||
cl -= gotbytes;
|
||||
if(cl<=0) {
|
||||
keepon = FALSE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
for(i = 0; i < gotbytes; ptr++, i++) {
|
||||
perline++; /* amount of bytes in this line so far */
|
||||
if(*ptr=='\n') {
|
||||
char letter;
|
||||
int writetype;
|
||||
|
||||
/* output debug if that is requested */
|
||||
if(data->set.verbose)
|
||||
Curl_debug(data, CURLINFO_HEADER_IN,
|
||||
line_start, (size_t)perline, conn);
|
||||
|
||||
/* send the header to the callback */
|
||||
writetype = CLIENTWRITE_HEADER;
|
||||
if(data->set.include_header)
|
||||
writetype |= CLIENTWRITE_BODY;
|
||||
|
||||
result = Curl_client_write(conn, writetype, line_start, perline);
|
||||
if(result)
|
||||
return result;
|
||||
|
||||
/* Newlines are CRLF, so the CR is ignored as the line isn't
|
||||
really terminated until the LF comes. Treat a following CR
|
||||
as end-of-headers as well.*/
|
||||
|
||||
if(('\r' == line_start[0]) ||
|
||||
('\n' == line_start[0])) {
|
||||
/* end of response-headers from the proxy */
|
||||
if(cl && (407 == k->httpcode) &&
|
||||
!data->state.authproblem) {
|
||||
/* If we get a 407 response code with content length
|
||||
* when we have no auth problem, we must ignore the
|
||||
* whole response-body */
|
||||
keepon = 2;
|
||||
infof(data, "Ignore %" FORMAT_OFF_T
|
||||
" bytes of response-body\n", cl);
|
||||
cl -= (gotbytes - i);/* remove the remaining chunk of
|
||||
what we already read */
|
||||
if(cl<=0)
|
||||
/* if the whole thing was already read, we are done! */
|
||||
keepon=FALSE;
|
||||
}
|
||||
else
|
||||
keepon = FALSE;
|
||||
break; /* breaks out of for-loop, not switch() */
|
||||
}
|
||||
|
||||
/* keep a backup of the position we are about to blank */
|
||||
letter = line_start[perline];
|
||||
line_start[perline]=0; /* zero terminate the buffer */
|
||||
if((checkprefix("WWW-Authenticate:", line_start) &&
|
||||
(401 == k->httpcode)) ||
|
||||
(checkprefix("Proxy-authenticate:", line_start) &&
|
||||
(407 == k->httpcode))) {
|
||||
result = Curl_http_input_auth(conn, k->httpcode,
|
||||
line_start);
|
||||
if(result)
|
||||
return result;
|
||||
}
|
||||
else if(checkprefix("Content-Length:", line_start)) {
|
||||
cl = curlx_strtoofft(line_start + strlen("Content-Length:"),
|
||||
NULL, 10);
|
||||
}
|
||||
else if(Curl_compareheader(line_start,
|
||||
"Connection:", "close"))
|
||||
closeConnection = TRUE;
|
||||
else if(2 == sscanf(line_start, "HTTP/1.%d %d",
|
||||
&subversion,
|
||||
&k->httpcode)) {
|
||||
/* store the HTTP code from the proxy */
|
||||
data->info.httpproxycode = k->httpcode;
|
||||
}
|
||||
/* put back the letter we blanked out before */
|
||||
line_start[perline]= letter;
|
||||
|
||||
perline=0; /* line starts over here */
|
||||
line_start = ptr+1; /* this skips the zero byte we wrote */
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
} /* switch */
|
||||
} /* while there's buffer left and loop is requested */
|
||||
|
||||
if(error)
|
||||
return CURLE_RECV_ERROR;
|
||||
|
||||
if(data->info.httpproxycode != 200)
|
||||
/* Deal with the possibly already received authenticate
|
||||
headers. 'newurl' is set to a new URL if we must loop. */
|
||||
Curl_http_auth_act(conn);
|
||||
|
||||
if (closeConnection && data->reqdata.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);
|
||||
|
||||
if(200 != k->httpcode) {
|
||||
@@ -1402,6 +1466,10 @@ CURLcode Curl_http_connect(struct connectdata *conn, bool *done)
|
||||
|
||||
data=conn->data;
|
||||
|
||||
/* We default to persistent connections. We set this already in this connect
|
||||
function to make the re-use checks properly be able to check this bit. */
|
||||
conn->bits.close = FALSE;
|
||||
|
||||
/* If we are not using a proxy and we want a secure connection, perform SSL
|
||||
* initialization & connection now. If using a proxy with https, then we
|
||||
* must tell the proxy to CONNECT to the host we want to talk to. Only
|
||||
@@ -1418,6 +1486,11 @@ CURLcode Curl_http_connect(struct connectdata *conn, bool *done)
|
||||
return result;
|
||||
}
|
||||
|
||||
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)
|
||||
@@ -1454,7 +1527,7 @@ CURLcode Curl_http_connect(struct connectdata *conn, bool *done)
|
||||
CURLcode Curl_https_connecting(struct connectdata *conn, bool *done)
|
||||
{
|
||||
CURLcode result;
|
||||
curlassert(conn->protocol & PROT_HTTPS);
|
||||
DEBUGASSERT((conn) && (conn->protocol & PROT_HTTPS));
|
||||
|
||||
/* perform SSL initialization for this socket */
|
||||
result = Curl_ssl_connect_nonblocking(conn, FIRSTSOCKET, done);
|
||||
@@ -1501,6 +1574,18 @@ int Curl_https_getsock(struct connectdata *conn,
|
||||
(void)numsocks;
|
||||
return GETSOCK_BLANK;
|
||||
}
|
||||
#else
|
||||
#ifdef USE_NSS
|
||||
int Curl_https_getsock(struct connectdata *conn,
|
||||
curl_socket_t *socks,
|
||||
int numsocks)
|
||||
{
|
||||
(void)conn;
|
||||
(void)socks;
|
||||
(void)numsocks;
|
||||
return GETSOCK_BLANK;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@@ -1550,8 +1635,8 @@ CURLcode Curl_http_done(struct connectdata *conn,
|
||||
|
||||
if(!conn->bits.retry &&
|
||||
((http->readbytecount +
|
||||
conn->headerbytecount -
|
||||
conn->deductheadercount)) <= 0) {
|
||||
data->reqdata.keep.headerbytecount -
|
||||
data->reqdata.keep.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 */
|
||||
@@ -1586,7 +1671,6 @@ static CURLcode expect100(struct SessionHandle *data,
|
||||
static CURLcode add_custom_headers(struct connectdata *conn,
|
||||
send_buffer *req_buffer)
|
||||
{
|
||||
CURLcode result = CURLE_OK;
|
||||
char *ptr;
|
||||
struct curl_slist *headers=conn->data->set.headers;
|
||||
|
||||
@@ -1613,7 +1697,7 @@ static CURLcode add_custom_headers(struct connectdata *conn,
|
||||
strlen("Content-Type:")))
|
||||
;
|
||||
else {
|
||||
result = add_bufferf(req_buffer, "%s\r\n", headers->data);
|
||||
CURLcode result = add_bufferf(req_buffer, "%s\r\n", headers->data);
|
||||
if(result)
|
||||
return result;
|
||||
}
|
||||
@@ -1621,7 +1705,7 @@ static CURLcode add_custom_headers(struct connectdata *conn,
|
||||
}
|
||||
headers = headers->next;
|
||||
}
|
||||
return result;
|
||||
return CURLE_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1661,9 +1745,6 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
|
||||
else
|
||||
http = data->reqdata.proto.http;
|
||||
|
||||
/* We default to persistent connections */
|
||||
conn->bits.close = FALSE;
|
||||
|
||||
if ( (conn->protocol&(PROT_HTTP|PROT_FTP)) &&
|
||||
data->set.upload) {
|
||||
httpreq = HTTPREQ_PUT;
|
||||
@@ -1676,7 +1757,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
|
||||
if(conn->bits.no_body)
|
||||
request = (char *)"HEAD";
|
||||
else {
|
||||
curlassert((httpreq > HTTPREQ_NONE) && (httpreq < HTTPREQ_LAST));
|
||||
DEBUGASSERT((httpreq > HTTPREQ_NONE) && (httpreq < HTTPREQ_LAST));
|
||||
switch(httpreq) {
|
||||
case HTTPREQ_POST:
|
||||
case HTTPREQ_POST_FORM:
|
||||
@@ -2368,11 +2449,15 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
|
||||
/* set the upload size to the progress meter */
|
||||
Curl_pgrsSetUploadSize(data, http->postsize);
|
||||
|
||||
add_buffer(req_buffer, "\r\n", 2); /* end of headers! */
|
||||
result = add_buffer(req_buffer, "\r\n", 2); /* end of headers! */
|
||||
if(result)
|
||||
return result;
|
||||
}
|
||||
}
|
||||
else {
|
||||
add_buffer(req_buffer, "\r\n", 2); /* end of headers! */
|
||||
result = add_buffer(req_buffer, "\r\n", 2); /* end of headers! */
|
||||
if(result)
|
||||
return result;
|
||||
|
||||
if(data->set.postfieldsize) {
|
||||
/* set the upload size to the progress meter */
|
||||
@@ -2398,7 +2483,9 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
|
||||
break;
|
||||
|
||||
default:
|
||||
add_buffer(req_buffer, "\r\n", 2);
|
||||
result = add_buffer(req_buffer, "\r\n", 2);
|
||||
if(result)
|
||||
return result;
|
||||
|
||||
/* issue the request */
|
||||
result = add_buffer_send(req_buffer, conn,
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user