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
|
config.log
|
||||||
Makefile
|
Makefile
|
||||||
libtool
|
libtool
|
||||||
|
309
CHANGES
309
CHANGES
@@ -6,6 +6,315 @@
|
|||||||
|
|
||||||
Changelog
|
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)
|
Version 7.16.1 (29 January 2007)
|
||||||
|
|
||||||
Daniel (29 January 2007)
|
Daniel (29 January 2007)
|
||||||
|
@@ -21,6 +21,8 @@
|
|||||||
# $Id$
|
# $Id$
|
||||||
###########################################################################
|
###########################################################################
|
||||||
|
|
||||||
|
VC=vc6
|
||||||
|
|
||||||
all:
|
all:
|
||||||
./configure
|
./configure
|
||||||
make
|
make
|
||||||
@@ -87,106 +89,106 @@ mingw32-clean:
|
|||||||
|
|
||||||
vc-clean:
|
vc-clean:
|
||||||
cd lib
|
cd lib
|
||||||
nmake -f Makefile.vc6 clean
|
nmake -f Makefile.$(VC) clean
|
||||||
cd ..\src
|
cd ..\src
|
||||||
nmake -f Makefile.vc6 clean
|
nmake -f Makefile.$(VC) clean
|
||||||
|
|
||||||
vc-all:
|
vc-all:
|
||||||
cd lib
|
cd lib
|
||||||
nmake -f Makefile.vc6 cfg=release
|
nmake -f Makefile.$(VC) cfg=release
|
||||||
nmake -f Makefile.vc6 cfg=release-ssl
|
nmake -f Makefile.$(VC) cfg=release-ssl
|
||||||
nmake -f Makefile.vc6 cfg=release-zlib
|
nmake -f Makefile.$(VC) cfg=release-zlib
|
||||||
nmake -f Makefile.vc6 cfg=release-ssl-zlib
|
nmake -f Makefile.$(VC) cfg=release-ssl-zlib
|
||||||
nmake -f Makefile.vc6 cfg=release-ssl-dll
|
nmake -f Makefile.$(VC) cfg=release-ssl-dll
|
||||||
nmake -f Makefile.vc6 cfg=release-zlib-dll
|
nmake -f Makefile.$(VC) cfg=release-zlib-dll
|
||||||
nmake -f Makefile.vc6 cfg=release-ssl-dll-zlib-dll
|
nmake -f Makefile.$(VC) cfg=release-ssl-dll-zlib-dll
|
||||||
nmake -f Makefile.vc6 cfg=release-dll
|
nmake -f Makefile.$(VC) cfg=release-dll
|
||||||
nmake -f Makefile.vc6 cfg=release-dll-ssl-dll
|
nmake -f Makefile.$(VC) cfg=release-dll-ssl-dll
|
||||||
nmake -f Makefile.vc6 cfg=release-dll-zlib-dll
|
nmake -f Makefile.$(VC) cfg=release-dll-zlib-dll
|
||||||
nmake -f Makefile.vc6 cfg=release-dll-ssl-dll-zlib-dll
|
nmake -f Makefile.$(VC) cfg=release-dll-ssl-dll-zlib-dll
|
||||||
nmake -f Makefile.vc6 cfg=debug
|
nmake -f Makefile.$(VC) cfg=debug
|
||||||
nmake -f Makefile.vc6 cfg=debug-ssl
|
nmake -f Makefile.$(VC) cfg=debug-ssl
|
||||||
nmake -f Makefile.vc6 cfg=debug-zlib
|
nmake -f Makefile.$(VC) cfg=debug-zlib
|
||||||
nmake -f Makefile.vc6 cfg=debug-ssl-zlib
|
nmake -f Makefile.$(VC) cfg=debug-ssl-zlib
|
||||||
nmake -f Makefile.vc6 cfg=debug-ssl-dll
|
nmake -f Makefile.$(VC) cfg=debug-ssl-dll
|
||||||
nmake -f Makefile.vc6 cfg=debug-zlib-dll
|
nmake -f Makefile.$(VC) cfg=debug-zlib-dll
|
||||||
nmake -f Makefile.vc6 cfg=debug-ssl-dll-zlib-dll
|
nmake -f Makefile.$(VC) cfg=debug-ssl-dll-zlib-dll
|
||||||
nmake -f Makefile.vc6 cfg=debug-dll
|
nmake -f Makefile.$(VC) cfg=debug-dll
|
||||||
nmake -f Makefile.vc6 cfg=debug-dll-ssl-dll
|
nmake -f Makefile.$(VC) cfg=debug-dll-ssl-dll
|
||||||
nmake -f Makefile.vc6 cfg=debug-dll-zlib-dll
|
nmake -f Makefile.$(VC) cfg=debug-dll-zlib-dll
|
||||||
nmake -f Makefile.vc6 cfg=debug-dll-ssl-dll-zlib-dll
|
nmake -f Makefile.$(VC) cfg=debug-dll-ssl-dll-zlib-dll
|
||||||
|
|
||||||
vc:
|
vc:
|
||||||
cd lib
|
cd lib
|
||||||
nmake /f Makefile.vc6 cfg=release
|
nmake /f Makefile.$(VC) cfg=release
|
||||||
cd ..\src
|
cd ..\src
|
||||||
nmake /f Makefile.vc6
|
nmake /f Makefile.$(VC)
|
||||||
|
|
||||||
vc-zlib:
|
vc-zlib:
|
||||||
cd lib
|
cd lib
|
||||||
nmake /f Makefile.vc6 cfg=release-zlib
|
nmake /f Makefile.$(VC) cfg=release-zlib
|
||||||
cd ..\src
|
cd ..\src
|
||||||
nmake /f Makefile.vc6 cfg=release-zlib
|
nmake /f Makefile.$(VC) cfg=release-zlib
|
||||||
|
|
||||||
vc-ssl:
|
vc-ssl:
|
||||||
cd lib
|
cd lib
|
||||||
nmake /f Makefile.vc6 cfg=release-ssl
|
nmake /f Makefile.$(VC) cfg=release-ssl
|
||||||
cd ..\src
|
cd ..\src
|
||||||
nmake /f Makefile.vc6 cfg=release-ssl
|
nmake /f Makefile.$(VC) cfg=release-ssl
|
||||||
|
|
||||||
vc-ssl-zlib:
|
vc-ssl-zlib:
|
||||||
cd lib
|
cd lib
|
||||||
nmake /f Makefile.vc6 cfg=release-ssl-zlib
|
nmake /f Makefile.$(VC) cfg=release-ssl-zlib
|
||||||
cd ..\src
|
cd ..\src
|
||||||
nmake /f Makefile.vc6 cfg=release-ssl-zlib
|
nmake /f Makefile.$(VC) cfg=release-ssl-zlib
|
||||||
|
|
||||||
vc-ssl-dll:
|
vc-ssl-dll:
|
||||||
cd lib
|
cd lib
|
||||||
nmake /f Makefile.vc6 cfg=release-ssl-dll
|
nmake /f Makefile.$(VC) cfg=release-ssl-dll
|
||||||
cd ..\src
|
cd ..\src
|
||||||
nmake /f Makefile.vc6 cfg=release-ssl-dll
|
nmake /f Makefile.$(VC) cfg=release-ssl-dll
|
||||||
|
|
||||||
vc-dll-ssl-dll:
|
vc-dll-ssl-dll:
|
||||||
cd lib
|
cd lib
|
||||||
nmake /f Makefile.vc6 cfg=release-dll-ssl-dll
|
nmake /f Makefile.$(VC) cfg=release-dll-ssl-dll
|
||||||
cd ..\src
|
cd ..\src
|
||||||
nmake /f Makefile.vc6 cfg=release-dll-ssl-dll
|
nmake /f Makefile.$(VC) cfg=release-dll-ssl-dll
|
||||||
|
|
||||||
vc-dll:
|
vc-dll:
|
||||||
cd lib
|
cd lib
|
||||||
nmake /f Makefile.vc6 cfg=release-dll
|
nmake /f Makefile.$(VC) cfg=release-dll
|
||||||
cd ..\src
|
cd ..\src
|
||||||
nmake /f Makefile.vc6 cfg=release-dll
|
nmake /f Makefile.$(VC) cfg=release-dll
|
||||||
|
|
||||||
vc-dll-zlib-dll:
|
vc-dll-zlib-dll:
|
||||||
cd lib
|
cd lib
|
||||||
nmake /f Makefile.vc6 cfg=release-dll-zlib-dll
|
nmake /f Makefile.$(VC) cfg=release-dll-zlib-dll
|
||||||
cd ..\src
|
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:
|
vc-dll-ssl-dll-zlib-dll:
|
||||||
cd lib
|
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
|
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:
|
vc-ssl-dll-zlib-dll:
|
||||||
cd lib
|
cd lib
|
||||||
nmake /f Makefile.vc6 cfg=release-ssl-dll-zlib-dll
|
nmake /f Makefile.$(VC) cfg=release-ssl-dll-zlib-dll
|
||||||
cd ..\src
|
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:
|
vc-zlib-dll:
|
||||||
cd lib
|
cd lib
|
||||||
nmake /f Makefile.vc6 cfg=release-zlib-dll
|
nmake /f Makefile.$(VC) cfg=release-zlib-dll
|
||||||
cd ..\src
|
cd ..\src
|
||||||
nmake /f Makefile.vc6 cfg=release-zlib-dll
|
nmake /f Makefile.$(VC) cfg=release-zlib-dll
|
||||||
|
|
||||||
vc-sspi:
|
vc-sspi:
|
||||||
cd lib
|
cd lib
|
||||||
nmake /f Makefile.vc6 cfg=release WINDOWS_SSPI=1
|
nmake /f Makefile.$(VC) cfg=release WINDOWS_SSPI=1
|
||||||
cd ..\src
|
cd ..\src
|
||||||
nmake /f Makefile.vc6 cfg=release WINDOWS_SSPI=1
|
nmake /f Makefile.$(VC) cfg=release WINDOWS_SSPI=1
|
||||||
|
|
||||||
djgpp:
|
djgpp:
|
||||||
$(MAKE) -C lib -f Makefile.dj
|
$(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
|
Public curl release number: 98
|
||||||
Releases counted from the very beginning: 124
|
Releases counted from the very beginning: 125
|
||||||
Available command line options: 115
|
Available command line options: 118
|
||||||
Available curl_easy_setopt() options: 137
|
Available curl_easy_setopt() options: 141
|
||||||
Number of public functions in libcurl: 54
|
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 known libcurl bindings: 35
|
||||||
Number of contributors: 539
|
Number of contributors: 539
|
||||||
|
|
||||||
This release includes the following changes:
|
This release includes the following changes:
|
||||||
|
|
||||||
o Support for SCP and SFTP were added (powered by libssh2)
|
o added CURLOPT_TIMEOUT_MS and CURLOPT_CONNECTTIMEOUT_MS
|
||||||
o CURLOPT_CLOSEPOLICY is now deprecated
|
o added CURLOPT_HTTP_CONTENT_DECODING, CURLOPT_HTTP_TRANSFER_DECODING and
|
||||||
o --ftp-ssl-ccc and CURLOPT_FTP_SSL_CCC were added
|
--raw
|
||||||
o HTTP support for non-ASCII platforms
|
o added support for using the NSS library for TLS/SSL
|
||||||
o --libcurl was added
|
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:
|
This release includes the following bugfixes:
|
||||||
|
|
||||||
o proxy close during CONNECT authentication is now dealt with nicely
|
o in testsuite, update test cookies expiration from 2007-Feb-1 to year 2035
|
||||||
o the CURLOPT_DEBUGFUNCTION was sometimes called even when CURLOPT_VERBOSE
|
o socks5 works
|
||||||
was not enabled
|
o builds fine with VC2005
|
||||||
o multiple TFTP transfers on the same (easy or multi) handle could cause a
|
o CURLOPT_RANGE set to NULL resets the range for FTP
|
||||||
crash
|
o curl_multi_remove_handle() rare crash
|
||||||
o SIGSEGV when disconnecting on a transfer on a re-used handle when the
|
o passive FTP transfers work with SOCKS
|
||||||
host name didn't resolve
|
o multi interface HTTPS connection re-use memory leak
|
||||||
o stack overwrite on 64bit Windows in the chunked decoding department
|
o libcurl.m4's --with-libcurl is improved
|
||||||
o HTTP responses on persistent connections without Content-Length nor chunked
|
o curl-config --libs and libcurl.pc no longer list unnecessary dependencies
|
||||||
encoding are now considered to be without response body
|
o fixed an issue with CCC not working on some servers
|
||||||
o Content-Range: header parsing improved
|
o several HTTP pipelining problems
|
||||||
o CPU 100% load when HTTP upload connection broke
|
o HTTP CONNECT thru a proxy is now less blocking when the multi interface is
|
||||||
o active FTP didn't work with multi interface
|
used
|
||||||
o curl_getdate() could be off one hour for TZ time zones with DST, on windows
|
o HTTP Digest header parsing fix for unquoted last word ending with CRLF
|
||||||
o CURLOPT_FORBID_REUSE works again
|
o CURLOPT_PORT, HTTP proxy, re-using connections and non-HTTP protocols
|
||||||
o CURLOPT_MAXCONNECTS set to zero caused libcurl to SIGSEGV
|
o CURLOPT_INTERFACE for ipv6
|
||||||
o rate limiting works better
|
o use-after-free issue with HTTP transfers with the multi interface
|
||||||
o getting FTP response code errors when using the multi-interface caused
|
o the progress callback can get called more frequently
|
||||||
libcurl to leak memory
|
o timeout would restart when signal caught while awaiting socket events
|
||||||
o no more SIGPIPE when GnuTLS is used
|
o curl -f with user+password embedded in the URL
|
||||||
o FTP downloading 2 zero byte files in a row
|
o 26 flaws identified by coverity.com
|
||||||
o using proxy and URLs without protocol prefixes
|
o builds on QNX 6 again
|
||||||
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
|
|
||||||
|
|
||||||
This release includes the following known bugs:
|
This release includes the following known bugs:
|
||||||
|
|
||||||
@@ -63,24 +58,21 @@ This release includes the following known bugs:
|
|||||||
|
|
||||||
Other curl-related news:
|
Other curl-related news:
|
||||||
|
|
||||||
o TclCurl 7.16.0 was released:
|
o pycurl 7.16.1 was released: http://pycurl.sf.net/
|
||||||
http://personal1.iddeo.es/andresgarci/tclcurl/english/
|
|
||||||
o Curb - Libcurl bindings for Ruby: http://curb.rubyforge.org/
|
|
||||||
|
|
||||||
New curl mirrors:
|
New curl mirrors:
|
||||||
|
|
||||||
o curl.miroir-francais.fr is a new French web mirror
|
o http://curl.basemirror.de is a new mirror in Germany
|
||||||
o curl.dsmirror.nl is a new Dutch web mirror
|
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
|
This release would not have looked like this without help, code, reports and
|
||||||
advice from friends like these:
|
advice from friends like these:
|
||||||
|
|
||||||
James Housley, Olaf Stueben, Yang Tse, Gisle Vanem, Bradford Bruce,
|
Yang Tse, Manfred Schwarb, Michael Wallner, Jeff Pohlmeyer, Shmulik Regev,
|
||||||
Ciprian Badescu, Dmitriy Sergeyev, Nir Soffer, Venkat Akella, Toon Verwaest,
|
Rob Crittenden, Robert A. Monat, Dan Fandrich, Duncan Mac-Vicar Prett,
|
||||||
Matt Witherspoon, Alexey Simak, Martin Skinner, Sh Diao, Jared Lundell,
|
Michal Marek, Robson Braga Araujo, Ian Turner, Linus Nielsen Feltzing,
|
||||||
Stefan Krause, Sebastien Willemijns, Alexey Simak, Brendan Jurd,
|
Ravi Pratap, Adam D. Moss, Jose Kahan, Hang Kin Lau, Justin Fletcher,
|
||||||
Robson Braga Araujo, David McCreedy, Robert Foreman, Nathanael Nerode,
|
Robert Iakobashvili, Bryan Henderson, Eygene Ryabinkin, Daniel Johnson,
|
||||||
Victor Snezhko, Linus Nielsen Feltzing, Toby Peterson, Dan Fandrich,
|
Matt Kraai, Nick Zitzmann, Rob Jones
|
||||||
Armel Asselin, Michael Wallner, Guenter Knauf
|
|
||||||
|
|
||||||
Thanks! (and sorry if I forgot to mention someone)
|
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
|
# This software is licensed as described in the file COPYING, which
|
||||||
# you should have received as part of this distribution. The terms
|
# you should have received as part of this distribution. The terms
|
||||||
@@ -685,7 +685,7 @@ AC_DEFUN([CURL_CHECK_FUNC_RECV], [
|
|||||||
])
|
])
|
||||||
#
|
#
|
||||||
if test "$curl_cv_recv" = "yes"; then
|
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], [
|
||||||
curl_cv_func_recv_args="unknown"
|
curl_cv_func_recv_args="unknown"
|
||||||
for recv_retv in 'int' 'ssize_t'; do
|
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
|
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], [
|
||||||
curl_cv_func_send_args="unknown"
|
curl_cv_func_send_args="unknown"
|
||||||
for send_retv in 'int' 'ssize_t'; do
|
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])
|
AC_MSG_CHECKING([name of dynamic library $2])
|
||||||
dnl The shared library extension variable name changes from version to
|
dnl The shared library extension variable name changes from version to
|
||||||
dnl version of libtool. Try a few names then just set one statically.
|
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="$shrext"
|
||||||
test -z "$shared_ext" && shared_ext=".so"
|
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/^.* //'`
|
LIBNAME_LINK_SPEC=`echo "$library_names_spec" | $SED 's/^.* //'`
|
||||||
DLGUESSLIB=`name=$2 eval echo "$libname_spec"`
|
DLGUESSLIB=`name=$2 eval echo "$libname_spec"`
|
||||||
DLGUESSFILE=`libname="$DLGUESSLIB" release="" major="" versuffix="" eval echo "$LIBNAME_LINK_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
|
dnl Synthesize a likely dynamic library name in case we can't find an actual one
|
||||||
SO_NAME_SPEC="$soname_spec"
|
SO_NAME_SPEC="$soname_spec"
|
||||||
dnl soname_spec undefined when identical to the 1st entry in library_names_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/ .*$//'`
|
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"`
|
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
|
if test "$cross_compiling" = yes; then
|
||||||
dnl Can't look at filesystem when cross-compiling
|
dnl Can't look at filesystem when cross-compiling
|
||||||
@@ -1949,3 +1954,103 @@ main()
|
|||||||
dnl if this test fails, configure has already stopped
|
dnl if this test fails, configure has already stopped
|
||||||
fi
|
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
|
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
|
* November 22
|
||||||
|
|
||||||
- Install ares_dns.h too
|
- Install ares_dns.h too
|
||||||
|
147
ares/Makefile.dj
147
ares/Makefile.dj
@@ -4,6 +4,8 @@
|
|||||||
#
|
#
|
||||||
# $Id$
|
# $Id$
|
||||||
|
|
||||||
|
TOPDIR = ..
|
||||||
|
|
||||||
include ../packages/DOS/common.dj
|
include ../packages/DOS/common.dj
|
||||||
|
|
||||||
include Makefile.inc
|
include Makefile.inc
|
||||||
@@ -11,19 +13,23 @@ include Makefile.inc
|
|||||||
CFLAGS += -DWATT32 -DHAVE_AF_INET6 -DHAVE_PF_INET6 -DHAVE_FIONBIO \
|
CFLAGS += -DWATT32 -DHAVE_AF_INET6 -DHAVE_PF_INET6 -DHAVE_FIONBIO \
|
||||||
-DHAVE_STRUCT_IN6_ADDR -DHAVE_SOCKADDR_IN6_SIN6_SCOPE_ID \
|
-DHAVE_STRUCT_IN6_ADDR -DHAVE_SOCKADDR_IN6_SIN6_SCOPE_ID \
|
||||||
-DHAVE_SYS_TIME_H -DHAVE_STRUCT_SOCKADDR_IN6 -DHAVE_STRUCT_ADDRINFO \
|
-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 \
|
-DHAVE_ARPA_NAMESER_H -DNS_INADDRSZ=4 -DHAVE_RECV -DHAVE_SEND \
|
||||||
-DSEND_TYPE_ARG1='int' -DSEND_QUAL_ARG2='const' \
|
-DSEND_TYPE_ARG1='int' -DSEND_QUAL_ARG2='const' \
|
||||||
-DSEND_TYPE_ARG2='void*' -DSEND_TYPE_ARG3='int' \
|
-DSEND_TYPE_ARG2='void*' -DSEND_TYPE_ARG3='int' \
|
||||||
-DSEND_TYPE_ARG4='int' -DSEND_TYPE_RETV='int' \
|
-DSEND_TYPE_ARG4='int' -DSEND_TYPE_RETV='int' \
|
||||||
-DRECV_TYPE_ARG1='int' -DRECV_TYPE_ARG2='void*' \
|
-DRECV_TYPE_ARG1='int' -DRECV_TYPE_ARG2='void*' \
|
||||||
-DRECV_TYPE_ARG3='int' -DRECV_TYPE_ARG4='int' \
|
-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
|
LDFLAGS = -s
|
||||||
|
|
||||||
ifeq ($(USE_DEBUG),1)
|
ifeq ($(USE_DEBUG),1)
|
||||||
EX_LIBS = ../lib/libcurl.a
|
EX_LIBS = ../lib/libcurl.a
|
||||||
|
OBJ_HACK = $(OBJECTS)
|
||||||
|
else
|
||||||
|
OBJ_HACK = libcares.a
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(USE_SSL),1)
|
ifeq ($(USE_SSL),1)
|
||||||
@@ -49,10 +55,10 @@ all: $(OBJ_DIR) libcares.a ahost.exe adig.exe
|
|||||||
libcares.a: $(OBJECTS)
|
libcares.a: $(OBJECTS)
|
||||||
ar rs $@ $?
|
ar rs $@ $?
|
||||||
|
|
||||||
ahost.exe: ahost.c libcares.a
|
ahost.exe: ahost.c $(OBJ_HACK)
|
||||||
$(CC) $(LDFLAGS) $(CFLAGS) -o $@ $^ $(EX_LIBS)
|
$(CC) $(LDFLAGS) $(CFLAGS) -o $@ $^ $(EX_LIBS)
|
||||||
|
|
||||||
adig.exe: adig.c libcares.a
|
adig.exe: adig.c $(OBJ_HACK)
|
||||||
$(CC) $(LDFLAGS) $(CFLAGS) -o $@ $^ $(EX_LIBS)
|
$(CC) $(LDFLAGS) $(CFLAGS) -o $@ $^ $(EX_LIBS)
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
@@ -62,132 +68,5 @@ vclean realclean: clean
|
|||||||
rm -f ahost.exe adig.exe depend.dj
|
rm -f ahost.exe adig.exe depend.dj
|
||||||
- rmdir $(OBJ_DIR)
|
- rmdir $(OBJ_DIR)
|
||||||
|
|
||||||
# DO NOT DELETE THIS LINE
|
-include depend.dj
|
||||||
$(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
|
|
||||||
|
@@ -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_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_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_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 \
|
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 \
|
nameser.h inet_net_pton.h inet_ntop.h ares_ipv6.h bitncmp.h \
|
||||||
setup_once.h
|
setup_once.h
|
||||||
|
|
||||||
MANPAGES= ares_destroy.3 ares_expand_name.3 ares_expand_string.3 ares_fds.3 \
|
MANPAGES= ares_destroy.3 ares_expand_name.3 ares_expand_string.3 ares_fds.3 \
|
||||||
ares_free_hostent.3 ares_free_string.3 ares_gethostbyaddr.3 \
|
ares_free_hostent.3 ares_free_string.3 ares_gethostbyaddr.3 \
|
||||||
ares_gethostbyname.3 ares_init.3 ares_init_options.3 ares_mkquery.3 \
|
ares_gethostbyname.3 ares_init.3 ares_init_options.3 ares_mkquery.3 \
|
||||||
ares_parse_a_reply.3 ares_parse_ptr_reply.3 ares_process.3 \
|
ares_parse_a_reply.3 ares_parse_ptr_reply.3 ares_process.3 \
|
||||||
ares_query.3 ares_search.3 ares_send.3 ares_strerror.3 ares_timeout.3 \
|
ares_query.3 ares_search.3 ares_send.3 ares_strerror.3 ares_timeout.3 \
|
||||||
ares_version.3 ares_cancel.3 ares_parse_aaaa_reply.3 ares_getnameinfo.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
|
## 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.
|
# Edit the vars below to change NLM target settings.
|
||||||
TARGETS = adig.nlm ahost.nlm
|
TARGETS = adig.nlm ahost.nlm
|
||||||
LTARGET = libcares.lib
|
LTARGET = libcares.$(LIBEXT)
|
||||||
VERSION = $(LIBCARES_VERSION)
|
VERSION = $(LIBCARES_VERSION)
|
||||||
COPYR = Copyright (C) 1996 - 2007, Daniel Stenberg, <daniel@haxx.se>
|
COPYR = Copyright (C) 1996 - 2007, Daniel Stenberg, <daniel@haxx.se>
|
||||||
DESCR = cURL $(subst .def,,$(notdir $@)) $(LIBCARES_VERSION_STR) - http://curl.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
|
LDFLAGS = -nostdlib $(PRELUDE) $(OBJS) $(<:.def=.o) -o $@ -commandfile
|
||||||
AR = mwldnlm
|
AR = mwldnlm
|
||||||
ARFLAGS = -type library -w nocmdline $(OBJDIR)/*.o -o
|
ARFLAGS = -type library -w nocmdline $(OBJDIR)/*.o -o
|
||||||
|
LIBEXT = lib
|
||||||
CFLAGS += -msgstyle gcc -gccinc -inline off -opt nointrinsics -proc 586
|
CFLAGS += -msgstyle gcc -gccinc -inline off -opt nointrinsics -proc 586
|
||||||
CFLAGS += -relax_pointers
|
CFLAGS += -relax_pointers
|
||||||
#CFLAGS += -w on
|
#CFLAGS += -w on
|
||||||
@@ -88,6 +90,7 @@ LD = nlmconv
|
|||||||
LDFLAGS = -T
|
LDFLAGS = -T
|
||||||
AR = ar
|
AR = ar
|
||||||
ARFLAGS = -cq
|
ARFLAGS = -cq
|
||||||
|
LIBEXT = a
|
||||||
CFLAGS += -fno-builtin -fpcc-struct-return -fno-strict-aliasing
|
CFLAGS += -fno-builtin -fpcc-struct-return -fno-strict-aliasing
|
||||||
CFLAGS += -Wall -Wno-format -Wno-uninitialized # -pedantic
|
CFLAGS += -Wall -Wno-format -Wno-uninitialized # -pedantic
|
||||||
ifeq ($(LIBARCH),LIBC)
|
ifeq ($(LIBARCH),LIBC)
|
||||||
@@ -155,7 +158,7 @@ clean:
|
|||||||
-$(RM) -r $(OBJDIR)
|
-$(RM) -r $(OBJDIR)
|
||||||
-$(RM) -r arpa
|
-$(RM) -r arpa
|
||||||
|
|
||||||
%.lib: $(OBJS)
|
%.$(LIBEXT): $(OBJS)
|
||||||
@echo Creating $@
|
@echo Creating $@
|
||||||
@-$(RM) $@
|
@-$(RM) $@
|
||||||
@$(AR) $(ARFLAGS) $@ $^
|
@$(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)** Do not edit this file - it is created by make!$(DL) >> $@
|
||||||
@echo $(DL)** All your changes will be lost!!$(DL) >> $@
|
@echo $(DL)** All your changes will be lost!!$(DL) >> $@
|
||||||
@echo $(DL)*/$(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 OS "i586-pc-NetWare"$(DL) >> $@
|
||||||
@echo $(DL)#define VERSION "$(LIBCARES_VERSION_STR)"$(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) >> $@
|
@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_SYS_SOCKIO_H 1$(DL) >> $@
|
||||||
@echo $(DL)#define HAVE_NETDB_H 1$(DL) >> $@
|
@echo $(DL)#define HAVE_NETDB_H 1$(DL) >> $@
|
||||||
endif
|
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
|
ifdef OLD_NOVELLSDK
|
||||||
@echo $(DL)#define socklen_t int$(DL) >> $@
|
@echo $(DL)#define socklen_t int$(DL) >> $@
|
||||||
endif
|
endif
|
||||||
|
@@ -67,6 +67,7 @@ OBJECTS = $(OBJ_DIR)\ares_fds.obj \
|
|||||||
$(OBJ_DIR)\ares_expand_name.obj \
|
$(OBJ_DIR)\ares_expand_name.obj \
|
||||||
$(OBJ_DIR)\ares_parse_a_reply.obj \
|
$(OBJ_DIR)\ares_parse_a_reply.obj \
|
||||||
$(OBJ_DIR)\ares_parse_aaaa_reply.obj \
|
$(OBJ_DIR)\ares_parse_aaaa_reply.obj \
|
||||||
|
$(OBJ_DIR)\ares_parse_ns_reply.obj \
|
||||||
$(OBJ_DIR)\windows_port.obj \
|
$(OBJ_DIR)\windows_port.obj \
|
||||||
$(OBJ_DIR)\ares_expand_string.obj \
|
$(OBJ_DIR)\ares_expand_string.obj \
|
||||||
$(OBJ_DIR)\ares_parse_ptr_reply.obj \
|
$(OBJ_DIR)\ares_parse_ptr_reply.obj \
|
||||||
@@ -75,6 +76,7 @@ OBJECTS = $(OBJ_DIR)\ares_fds.obj \
|
|||||||
$(OBJ_DIR)\inet_ntop.obj
|
$(OBJ_DIR)\inet_ntop.obj
|
||||||
|
|
||||||
all: $(OBJ_DIR) cares.lib cares.dll cares_imp.lib ahost.exe adig.exe
|
all: $(OBJ_DIR) cares.lib cares.dll cares_imp.lib ahost.exe adig.exe
|
||||||
|
@echo Welcome to c-ares library and examples
|
||||||
|
|
||||||
$(OBJ_DIR):
|
$(OBJ_DIR):
|
||||||
mkdir $(OBJ_DIR)
|
mkdir $(OBJ_DIR)
|
||||||
@@ -105,6 +107,7 @@ $(DEF_FILE): $(OBJECTS) Makefile.VC6
|
|||||||
@echo ares_mkquery >> $@
|
@echo ares_mkquery >> $@
|
||||||
@echo ares_parse_a_reply >> $@
|
@echo ares_parse_a_reply >> $@
|
||||||
@echo ares_parse_ptr_reply >> $@
|
@echo ares_parse_ptr_reply >> $@
|
||||||
|
@echo ares_parse_ns_reply >> $@
|
||||||
@echo ares_process >> $@
|
@echo ares_process >> $@
|
||||||
@echo ares_query >> $@
|
@echo ares_query >> $@
|
||||||
@echo ares_search >> $@
|
@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 \
|
$(OBJ_DIR)\ares_fds.obj: ares_fds.c setup.h setup_once.h ares.h ares_private.h \
|
||||||
ares_ipv6.h
|
ares_ipv6.h
|
||||||
|
|
||||||
$(OBJ_DIR)\ares_process.obj: ares_process.c setup.h setup_once.h nameser.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
|
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 \
|
$(OBJ_DIR)\ares_free_hostent.obj: ares_free_hostent.c setup.h setup_once.h \
|
||||||
ares.h ares_private.h ares_ipv6.h
|
ares.h ares_private.h ares_ipv6.h
|
||||||
|
|
||||||
$(OBJ_DIR)\ares_query.obj: ares_query.c setup.h setup_once.h nameser.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
|
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 \
|
$(OBJ_DIR)\ares__close_sockets.obj: ares__close_sockets.c setup.h setup_once.h \
|
||||||
ares.h ares_private.h ares_ipv6.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_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 \
|
$(OBJ_DIR)\ares_search.obj: ares_search.c setup.h setup_once.h nameser.h \
|
||||||
ares.h ares_private.h ares_ipv6.h
|
ares.h ares_private.h ares_ipv6.h
|
||||||
|
|
||||||
$(OBJ_DIR)\ares__get_hostent.obj: ares__get_hostent.c setup.h setup_once.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
|
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 \
|
$(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
|
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 \
|
$(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
|
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 \
|
$(OBJ_DIR)\ares__read_line.obj: ares__read_line.c setup.h setup_once.h ares.h \
|
||||||
ares_private.h ares_ipv6.h
|
ares_private.h ares_ipv6.h
|
||||||
|
|
||||||
$(OBJ_DIR)\ares_gethostbyname.obj: ares_gethostbyname.c setup.h setup_once.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
|
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_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 \
|
$(OBJ_DIR)\ares_cancel.obj: ares_cancel.c setup.h setup_once.h ares.h \
|
||||||
ares_private.h ares_ipv6.h
|
ares_private.h ares_ipv6.h
|
||||||
|
|
||||||
$(OBJ_DIR)\ares_init.obj: ares_init.c setup.h setup_once.h nameser.h ares.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
|
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 \
|
$(OBJ_DIR)\ares_timeout.obj: ares_timeout.c setup.h setup_once.h ares.h \
|
||||||
ares_private.h ares_ipv6.h
|
ares_private.h ares_ipv6.h
|
||||||
|
|
||||||
$(OBJ_DIR)\ares_destroy.obj: ares_destroy.c setup.h setup_once.h ares.h \
|
$(OBJ_DIR)\ares_destroy.obj: ares_destroy.c setup.h setup_once.h ares.h \
|
||||||
ares_private.h ares_ipv6.h
|
ares_private.h ares_ipv6.h
|
||||||
|
|
||||||
$(OBJ_DIR)\ares_mkquery.obj: ares_mkquery.c setup.h setup_once.h nameser.h \
|
$(OBJ_DIR)\ares_mkquery.obj: ares_mkquery.c setup.h setup_once.h nameser.h \
|
||||||
ares.h ares_dns.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_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 \
|
$(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
|
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 \
|
$(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
|
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 \
|
$(OBJ_DIR)\windows_port.obj: windows_port.c setup.h setup_once.h nameser.h \
|
||||||
ares.h ares_private.h ares_ipv6.h
|
ares.h ares_private.h ares_ipv6.h
|
||||||
|
|
||||||
$(OBJ_DIR)\ares_expand_string.obj: ares_expand_string.c setup.h setup_once.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
|
nameser.h ares.h ares_private.h ares_ipv6.h
|
||||||
|
|
||||||
$(OBJ_DIR)\ares_parse_ptr_reply.obj: ares_parse_ptr_reply.c setup.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
|
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 \
|
$(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 \
|
setup_once.h nameser.h ares.h ares_dns.h inet_net_pton.h ares_private.h \
|
||||||
ares_ipv6.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 \
|
$(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
|
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 \
|
$(OBJ_DIR)\inet_net_pton.obj: inet_net_pton.c setup.h setup_once.h nameser.h \
|
||||||
ares_ipv6.h inet_net_pton.h
|
ares_ipv6.h inet_net_pton.h
|
||||||
|
|
||||||
$(OBJ_DIR)\bitncmp.obj: bitncmp.c bitncmp.h
|
$(OBJ_DIR)\bitncmp.obj: bitncmp.c bitncmp.h
|
||||||
|
|
||||||
$(OBJ_DIR)\inet_ntop.obj: inet_ntop.c setup.h setup_once.h nameser.h \
|
$(OBJ_DIR)\inet_ntop.obj: inet_ntop.c setup.h setup_once.h nameser.h \
|
||||||
ares_ipv6.h inet_ntop.h
|
ares_ipv6.h inet_ntop.h
|
||||||
|
@@ -663,7 +663,7 @@ AC_DEFUN([CURL_CHECK_FUNC_RECV], [
|
|||||||
])
|
])
|
||||||
#
|
#
|
||||||
if test "$curl_cv_recv" = "yes"; then
|
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], [
|
||||||
curl_cv_func_recv_args="unknown"
|
curl_cv_func_recv_args="unknown"
|
||||||
for recv_retv in 'int' 'ssize_t'; do
|
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
|
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], [
|
||||||
curl_cv_func_send_args="unknown"
|
curl_cv_func_send_args="unknown"
|
||||||
for send_retv in 'int' 'ssize_t'; do
|
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 TYPE_IN_ADDR_T
|
||||||
dnl -------------------------------------------------
|
dnl -------------------------------------------------
|
||||||
dnl Check for in_addr_t: it is used to receive the return code of inet_addr()
|
dnl Check for in_addr_t: it is used to receive the return code of inet_addr()
|
||||||
@@ -1316,12 +1279,39 @@ AC_DEFUN([TYPE_IN_ADDR_T],
|
|||||||
#ifdef HAVE_ARPA_INET_H
|
#ifdef HAVE_ARPA_INET_H
|
||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
]) dnl AC_CHECK_TYPE
|
]) dnl AC_CHECK_TYPE
|
||||||
]) dnl AC_DEFUN
|
]) 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 We create a function for detecting which compiler we use and then set as
|
||||||
dnl pendantic compiler options as possible for that particular compiler. The
|
dnl pendantic compiler options as possible for that particular compiler. The
|
||||||
dnl options are only used for debug-builds.
|
dnl options are only used for debug-builds.
|
||||||
@@ -1332,6 +1322,10 @@ dnl is changed.
|
|||||||
|
|
||||||
AC_DEFUN([CURL_CC_DEBUG_OPTS],
|
AC_DEFUN([CURL_CC_DEBUG_OPTS],
|
||||||
[
|
[
|
||||||
|
if test "z$ICC" = "z"; then
|
||||||
|
CURL_DETECT_ICC
|
||||||
|
fi
|
||||||
|
|
||||||
if test "$GCC" = "yes"; then
|
if test "$GCC" = "yes"; then
|
||||||
|
|
||||||
dnl figure out gcc version!
|
dnl figure out gcc version!
|
||||||
@@ -1342,58 +1336,73 @@ AC_DEFUN([CURL_CC_DEBUG_OPTS],
|
|||||||
gccnum=`(expr $num1 "*" 100 + $num2) 2>/dev/null`
|
gccnum=`(expr $num1 "*" 100 + $num2) 2>/dev/null`
|
||||||
AC_MSG_RESULT($gccver)
|
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
|
if test "$ICC" = "yes"; then
|
||||||
dnl this is icc, not gcc.
|
dnl this is icc, not gcc.
|
||||||
|
|
||||||
dnl ICC warnings we ignore:
|
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 * 269 warns on our "%Od" printf formatters for curl_off_t output:
|
||||||
dnl "invalid format string conversion"
|
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
|
if test "$gccnum" -gt "600"; then
|
||||||
dnl icc 6.0 and older doesn't have the -Wall flag
|
dnl icc 6.0 and older doesn't have the -Wall flag
|
||||||
WARN="-Wall $WARN"
|
WARN="-Wall $WARN"
|
||||||
fi
|
fi
|
||||||
else dnl $ICC = yes
|
else dnl $ICC = yes
|
||||||
dnl
|
dnl this is a set of options we believe *ALL* gcc versions support:
|
||||||
WARN="-W -Wall -Wwrite-strings -pedantic -Wno-long-long -Wundef -Wpointer-arith -Wnested-externs -Winline -Wmissing-declarations -Wmissing-prototypes -Wsign-compare"
|
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
|
if test "$gccnum" -ge "296"; then
|
||||||
dnl gcc 2.96 or later
|
dnl gcc 2.96 or later
|
||||||
WARN="$WARN -Wfloat-equal"
|
WARN="$WARN -Wfloat-equal"
|
||||||
|
fi
|
||||||
|
|
||||||
if test "$gccnum" -gt "296"; then
|
if test "$gccnum" -gt "296"; then
|
||||||
dnl this option does not exist in 2.96
|
dnl this option does not exist in 2.96
|
||||||
WARN="$WARN -Wno-format-nonliteral"
|
WARN="$WARN -Wno-format-nonliteral"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
dnl -Wunreachable-code seems totally unreliable on my gcc 3.3.2 on
|
dnl -Wunreachable-code seems totally unreliable on my gcc 3.3.2 on
|
||||||
dnl on i686-Linux as it gives us heaps with false positives
|
dnl on i686-Linux as it gives us heaps with false positives.
|
||||||
if test "$gccnum" -ge "303"; then
|
dnl Also, on gcc 4.0.X it is totally unbearable and complains all
|
||||||
dnl gcc 3.3 and later
|
dnl over making it unusable for generic purposes. Let's not use it.
|
||||||
WARN="$WARN -Wendif-labels -Wstrict-prototypes"
|
|
||||||
fi
|
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
|
fi
|
||||||
|
|
||||||
for flag in $CPPFLAGS; do
|
for flag in $CPPFLAGS; do
|
||||||
case "$flag" in
|
case "$flag" in
|
||||||
-I*)
|
-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'`
|
add=`echo $flag | sed 's/^-I/-isystem /g'`
|
||||||
WARN="$WARN $add"
|
WARN="$WARN $add"
|
||||||
;;
|
;;
|
||||||
@@ -1404,6 +1413,12 @@ AC_DEFUN([CURL_CC_DEBUG_OPTS],
|
|||||||
|
|
||||||
CFLAGS="$CFLAGS $WARN"
|
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
|
fi dnl $GCC = yes
|
||||||
|
|
||||||
dnl strip off optimizer flags
|
dnl strip off optimizer flags
|
||||||
@@ -1516,39 +1531,3 @@ else
|
|||||||
fi
|
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 "setup.h"
|
||||||
#include <sys/types.h>
|
|
||||||
|
|
||||||
#if defined(WIN32) && !defined(WATT32)
|
#if defined(WIN32) && !defined(WATT32)
|
||||||
#include "nameser.h"
|
#include "nameser.h"
|
||||||
#else
|
#else
|
||||||
|
#ifdef HAVE_SYS_TIME_H
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
|
#endif
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
#include <arpa/nameser.h>
|
#include <arpa/nameser.h>
|
||||||
|
#ifdef HAVE_UNISTD_H
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
#endif
|
||||||
#include <netdb.h>
|
#include <netdb.h>
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_GETOPT_H
|
#ifdef HAVE_GETOPT_H
|
||||||
@@ -47,10 +50,6 @@
|
|||||||
#undef WIN32 /* Redefined in MingW headers */
|
#undef WIN32 /* Redefined in MingW headers */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef INADDR_NONE
|
|
||||||
#define INADDR_NONE 0xffffffff
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Mac OS X portability check */
|
/* Mac OS X portability check */
|
||||||
#ifndef T_SRV
|
#ifndef T_SRV
|
||||||
#define T_SRV 33 /* server selection */
|
#define T_SRV 33 /* server selection */
|
||||||
@@ -285,7 +284,7 @@ int main(int argc, char **argv)
|
|||||||
break;
|
break;
|
||||||
tvp = ares_timeout(channel, NULL, &tv);
|
tvp = ares_timeout(channel, NULL, &tv);
|
||||||
count = select(nfds, &read_fds, &write_fds, NULL, tvp);
|
count = select(nfds, &read_fds, &write_fds, NULL, tvp);
|
||||||
if (count < 0 && errno != EINVAL)
|
if (count < 0 && SOCKERRNO != EINVAL)
|
||||||
{
|
{
|
||||||
perror("select");
|
perror("select");
|
||||||
return 1;
|
return 1;
|
||||||
@@ -294,6 +293,11 @@ int main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
ares_destroy(channel);
|
ares_destroy(channel);
|
||||||
|
|
||||||
|
#ifdef USE_WINSOCK
|
||||||
|
WSACleanup();
|
||||||
|
#endif
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -551,8 +555,9 @@ static const unsigned char *display_rr(const unsigned char *aptr,
|
|||||||
if (p + 20 > aptr + dlen)
|
if (p + 20 > aptr + dlen)
|
||||||
return NULL;
|
return NULL;
|
||||||
printf("\t\t\t\t\t\t( %lu %lu %lu %lu %lu )",
|
printf("\t\t\t\t\t\t( %lu %lu %lu %lu %lu )",
|
||||||
DNS__32BIT(p), DNS__32BIT(p+4), DNS__32BIT(p+8),
|
(unsigned long)DNS__32BIT(p), (unsigned long)DNS__32BIT(p+4),
|
||||||
DNS__32BIT(p+12), DNS__32BIT(p+16));
|
(unsigned long)DNS__32BIT(p+8), (unsigned long)DNS__32BIT(p+12),
|
||||||
|
(unsigned long)DNS__32BIT(p+16));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case T_TXT:
|
case T_TXT:
|
||||||
|
22
ares/ahost.c
22
ares/ahost.c
@@ -16,16 +16,19 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "setup.h"
|
#include "setup.h"
|
||||||
#include <sys/types.h>
|
|
||||||
|
|
||||||
#if !defined(WIN32) || defined(WATT32)
|
#if !defined(WIN32) || defined(WATT32)
|
||||||
|
#ifdef HAVE_SYS_TIME_H
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
|
#endif
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
#include <netdb.h>
|
#include <netdb.h>
|
||||||
|
#ifdef HAVE_UNISTD_H
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@@ -40,8 +43,9 @@
|
|||||||
#include "inet_ntop.h"
|
#include "inet_ntop.h"
|
||||||
#include "inet_net_pton.h"
|
#include "inet_net_pton.h"
|
||||||
|
|
||||||
#ifndef INADDR_NONE
|
#ifndef optind
|
||||||
#define INADDR_NONE 0xffffffff
|
extern int optind;
|
||||||
|
extern char *optarg;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef HAVE_STRUCT_IN6_ADDR
|
#ifndef HAVE_STRUCT_IN6_ADDR
|
||||||
@@ -69,10 +73,15 @@ int main(int argc, char **argv)
|
|||||||
WSAStartup(wVersionRequested, &wsaData);
|
WSAStartup(wVersionRequested, &wsaData);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
while ((c = getopt(argc,argv,"t:h")) != -1)
|
while ((c = getopt(argc,argv,"dt:h")) != -1)
|
||||||
{
|
{
|
||||||
switch (c)
|
switch (c)
|
||||||
{
|
{
|
||||||
|
case 'd':
|
||||||
|
#ifdef WATT32
|
||||||
|
dbug_init();
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
case 't':
|
case 't':
|
||||||
if (!strcasecmp(optarg,"a"))
|
if (!strcasecmp(optarg,"a"))
|
||||||
addr_family = AF_INET;
|
addr_family = AF_INET;
|
||||||
@@ -133,6 +142,11 @@ int main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
ares_destroy(channel);
|
ares_destroy(channel);
|
||||||
|
|
||||||
|
#ifdef USE_WINSOCK
|
||||||
|
WSACleanup();
|
||||||
|
#endif
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -213,6 +213,8 @@ int ares_parse_aaaa_reply(const unsigned char *abuf, int alen,
|
|||||||
struct hostent **host);
|
struct hostent **host);
|
||||||
int ares_parse_ptr_reply(const unsigned char *abuf, int alen, const void *addr,
|
int ares_parse_ptr_reply(const unsigned char *abuf, int alen, const void *addr,
|
||||||
int addrlen, int family, struct hostent **host);
|
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_string(void *str);
|
||||||
void ares_free_hostent(struct hostent *host);
|
void ares_free_hostent(struct hostent *host);
|
||||||
const char *ares_strerror(int code);
|
const char *ares_strerror(int code);
|
||||||
|
@@ -16,7 +16,6 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "setup.h"
|
#include "setup.h"
|
||||||
#include <sys/types.h>
|
|
||||||
|
|
||||||
#if !defined(WIN32) || defined(WATT32)
|
#if !defined(WIN32) || defined(WATT32)
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
|
@@ -21,12 +21,13 @@
|
|||||||
#define DNS__16BIT(p) (((p)[0] << 8) | (p)[1])
|
#define DNS__16BIT(p) (((p)[0] << 8) | (p)[1])
|
||||||
#define DNS__32BIT(p) (((p)[0] << 24) | ((p)[1] << 16) | \
|
#define DNS__32BIT(p) (((p)[0] << 24) | ((p)[1] << 16) | \
|
||||||
((p)[2] << 8) | (p)[3])
|
((p)[2] << 8) | (p)[3])
|
||||||
#define DNS__SET16BIT(p, v) (((p)[0] = ((v) >> 8) & 0xff), \
|
|
||||||
((p)[1] = (v) & 0xff))
|
#define DNS__SET16BIT(p, v) (((p)[0] = (unsigned char)(((v) >> 8) & 0xff)), \
|
||||||
#define DNS__SET32BIT(p, v) (((p)[0] = ((v) >> 24) & 0xff), \
|
((p)[1] = (unsigned char)((v) & 0xff)))
|
||||||
((p)[1] = ((v) >> 16) & 0xff), \
|
#define DNS__SET32BIT(p, v) (((p)[0] = (unsigned char)(((v) >> 24) & 0xff)), \
|
||||||
((p)[2] = ((v) >> 8) & 0xff), \
|
((p)[1] = (unsigned char)(((v) >> 16) & 0xff)), \
|
||||||
((p)[3] = (v) & 0xff))
|
((p)[2] = (unsigned char)(((v) >> 8) & 0xff)), \
|
||||||
|
((p)[3] = (unsigned char)((v) & 0xff)))
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
/* we cannot use this approach on systems where we can't access 16/32 bit
|
/* 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)
|
#define DNS_HEADER_ARCOUNT(h) DNS__16BIT((h) + 10)
|
||||||
|
|
||||||
/* Macros for constructing a DNS header */
|
/* Macros for constructing a DNS header */
|
||||||
#define DNS_HEADER_SET_QID(h, v) DNS__SET16BIT(h, v)
|
#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_QR(h, v) ((h)[2] |= (unsigned char)(((v) & 0x1) << 7))
|
||||||
#define DNS_HEADER_SET_OPCODE(h, v) ((h)[2] |= (((v) & 0xf) << 3))
|
#define DNS_HEADER_SET_OPCODE(h, v) ((h)[2] |= (unsigned char)(((v) & 0xf) << 3))
|
||||||
#define DNS_HEADER_SET_AA(h, v) ((h)[2] |= (((v) & 0x1) << 2))
|
#define DNS_HEADER_SET_AA(h, v) ((h)[2] |= (unsigned char)(((v) & 0x1) << 2))
|
||||||
#define DNS_HEADER_SET_TC(h, v) ((h)[2] |= (((v) & 0x1) << 1))
|
#define DNS_HEADER_SET_TC(h, v) ((h)[2] |= (unsigned char)(((v) & 0x1) << 1))
|
||||||
#define DNS_HEADER_SET_RD(h, v) ((h)[2] |= (((v) & 0x1)))
|
#define DNS_HEADER_SET_RD(h, v) ((h)[2] |= (unsigned char)((v) & 0x1))
|
||||||
#define DNS_HEADER_SET_RA(h, v) ((h)[3] |= (((v) & 0x1) << 7))
|
#define DNS_HEADER_SET_RA(h, v) ((h)[3] |= (unsigned char)(((v) & 0x1) << 7))
|
||||||
#define DNS_HEADER_SET_Z(h, v) ((h)[3] |= (((v) & 0x7) << 4))
|
#define DNS_HEADER_SET_Z(h, v) ((h)[3] |= (unsigned char)(((v) & 0x7) << 4))
|
||||||
#define DNS_HEADER_SET_RCODE(h, v) ((h)[3] |= (((v) & 0xf)))
|
#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_QDCOUNT(h, v) DNS__SET16BIT((h) + 4, v)
|
||||||
#define DNS_HEADER_SET_ANCOUNT(h, v) DNS__SET16BIT((h) + 6, 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_NSCOUNT(h, v) DNS__SET16BIT((h) + 8, v)
|
||||||
#define DNS_HEADER_SET_ARCOUNT(h, v) DNS__SET16BIT((h) + 10, v)
|
#define DNS_HEADER_SET_ARCOUNT(h, v) DNS__SET16BIT((h) + 10, v)
|
||||||
|
|
||||||
/* Macros for parsing the fixed part of a DNS question */
|
/* Macros for parsing the fixed part of a DNS question */
|
||||||
#define DNS_QUESTION_TYPE(q) DNS__16BIT(q)
|
#define DNS_QUESTION_TYPE(q) DNS__16BIT(q)
|
||||||
|
@@ -16,7 +16,6 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "setup.h"
|
#include "setup.h"
|
||||||
#include <sys/types.h>
|
|
||||||
|
|
||||||
#if defined(WIN32) && !defined(WATT32)
|
#if defined(WIN32) && !defined(WATT32)
|
||||||
#include "nameser.h"
|
#include "nameser.h"
|
||||||
|
@@ -16,7 +16,6 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "setup.h"
|
#include "setup.h"
|
||||||
#include <sys/types.h>
|
|
||||||
|
|
||||||
#if defined(WIN32) && !defined(WATT32)
|
#if defined(WIN32) && !defined(WATT32)
|
||||||
#include "nameser.h"
|
#include "nameser.h"
|
||||||
|
@@ -16,7 +16,6 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "setup.h"
|
#include "setup.h"
|
||||||
#include <sys/types.h>
|
|
||||||
|
|
||||||
#ifdef HAVE_SYS_TIME_H
|
#ifdef HAVE_SYS_TIME_H
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
|
@@ -29,7 +29,7 @@ void ares_free_hostent(struct hostent *host)
|
|||||||
{
|
{
|
||||||
char **p;
|
char **p;
|
||||||
|
|
||||||
free(host->h_name);
|
free((char *)(host->h_name));
|
||||||
for (p = host->h_aliases; *p; p++)
|
for (p = host->h_aliases; *p; p++)
|
||||||
free(*p);
|
free(*p);
|
||||||
free(host->h_aliases);
|
free(host->h_aliases);
|
||||||
|
@@ -15,7 +15,6 @@
|
|||||||
* without express or implied warranty.
|
* without express or implied warranty.
|
||||||
*/
|
*/
|
||||||
#include "setup.h"
|
#include "setup.h"
|
||||||
#include <sys/types.h>
|
|
||||||
|
|
||||||
#if defined(WIN32) && !defined(WATT32)
|
#if defined(WIN32) && !defined(WATT32)
|
||||||
#include "nameser.h"
|
#include "nameser.h"
|
||||||
@@ -186,6 +185,7 @@ static int file_lookup(union ares_addr *addr, int family, struct hostent **host)
|
|||||||
{
|
{
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
int status;
|
int status;
|
||||||
|
int error;
|
||||||
|
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
char PATH_HOSTS[MAX_PATH];
|
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");
|
fp = fopen(PATH_HOSTS, "r");
|
||||||
if (!fp)
|
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)
|
while ((status = ares__get_hostent(fp, family, host)) == ARES_SUCCESS)
|
||||||
{
|
{
|
||||||
if (family != (*host)->h_addrtype)
|
if (family != (*host)->h_addrtype)
|
||||||
|
@@ -16,7 +16,6 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "setup.h"
|
#include "setup.h"
|
||||||
#include <sys/types.h>
|
|
||||||
|
|
||||||
#if defined(WIN32) && !defined(WATT32)
|
#if defined(WIN32) && !defined(WATT32)
|
||||||
#include "nameser.h"
|
#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;
|
hostent.h_addr_list = addrs;
|
||||||
callback(arg, ARES_SUCCESS, &hostent);
|
callback(arg, ARES_SUCCESS, &hostent);
|
||||||
|
|
||||||
free(hostent.h_name);
|
free((char *)(hostent.h_name));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -248,6 +247,7 @@ static int file_lookup(const char *name, int family, struct hostent **host)
|
|||||||
FILE *fp;
|
FILE *fp;
|
||||||
char **alias;
|
char **alias;
|
||||||
int status;
|
int status;
|
||||||
|
int error;
|
||||||
|
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
char PATH_HOSTS[MAX_PATH];
|
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");
|
fp = fopen(PATH_HOSTS, "r");
|
||||||
if (!fp)
|
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)
|
while ((status = ares__get_hostent(fp, family, host)) == ARES_SUCCESS)
|
||||||
{
|
{
|
||||||
if (strcasecmp((*host)->h_name, name) == 0)
|
if (strcasecmp((*host)->h_name, name) == 0)
|
||||||
|
@@ -15,8 +15,6 @@
|
|||||||
* without express or implied warranty.
|
* without express or implied warranty.
|
||||||
*/
|
*/
|
||||||
#include "setup.h"
|
#include "setup.h"
|
||||||
#include <sys/types.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
|
|
||||||
#if defined(WIN32) && !defined(WATT32)
|
#if defined(WIN32) && !defined(WATT32)
|
||||||
#include "nameser.h"
|
#include "nameser.h"
|
||||||
@@ -110,7 +108,8 @@ void ares_getnameinfo(ares_channel channel, const struct sockaddr *sa, socklen_t
|
|||||||
port = addr->sin_port;
|
port = addr->sin_port;
|
||||||
else
|
else
|
||||||
port = addr6->sin6_port;
|
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);
|
callback(arg, ARES_SUCCESS, NULL, service);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -151,7 +150,8 @@ void ares_getnameinfo(ares_channel channel, const struct sockaddr *sa, socklen_t
|
|||||||
}
|
}
|
||||||
/* They also want a service */
|
/* They also want a service */
|
||||||
if (flags & ARES_NI_LOOKUPSERVICE)
|
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);
|
callback(arg, ARES_SUCCESS, ipbuf, service);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -220,7 +220,8 @@ static void nameinfo_callback(void *arg, int status, struct hostent *host)
|
|||||||
*end = 0;
|
*end = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
niquery->callback(niquery->arg, ARES_SUCCESS, host->h_name, service);
|
niquery->callback(niquery->arg, ARES_SUCCESS, (char *)(host->h_name),
|
||||||
|
service);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
/* We couldn't find the host, but it's OK, we can use the IP */
|
/* 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);
|
strcpy(tmpbuf, sep->s_name);
|
||||||
else
|
else
|
||||||
/* get port as a string */
|
/* get port as a string */
|
||||||
sprintf(tmpbuf, "%u", ntohs(port));
|
sprintf(tmpbuf, "%u", (unsigned int)ntohs(port));
|
||||||
if (strlen(tmpbuf) < buflen)
|
if (strlen(tmpbuf) < buflen)
|
||||||
/* return it if buffer big enough */
|
/* return it if buffer big enough */
|
||||||
strcpy(buf, tmpbuf);
|
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,
|
static void append_scopeid(struct sockaddr_in6 *addr6, unsigned int flags,
|
||||||
char *buf, size_t buflen)
|
char *buf, size_t buflen)
|
||||||
{
|
{
|
||||||
|
#ifdef HAVE_IF_INDEXTONAME
|
||||||
|
int is_ll, is_mcll;
|
||||||
|
#endif
|
||||||
char fmt_u[] = "%u";
|
char fmt_u[] = "%u";
|
||||||
char fmt_lu[] = "%lu";
|
char fmt_lu[] = "%lu";
|
||||||
char tmpbuf[IF_NAMESIZE + 2];
|
char tmpbuf[IF_NAMESIZE + 2];
|
||||||
@@ -328,9 +332,10 @@ static void append_scopeid(struct sockaddr_in6 *addr6, unsigned int flags,
|
|||||||
tmpbuf[0] = '%';
|
tmpbuf[0] = '%';
|
||||||
|
|
||||||
#ifdef HAVE_IF_INDEXTONAME
|
#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) ||
|
if ((flags & ARES_NI_NUMERICSCOPE) ||
|
||||||
(!IN6_IS_ADDR_LINKLOCAL(&addr6->sin6_addr)
|
(!is_ll && !is_mcll))
|
||||||
&& !IN6_IS_ADDR_MC_LINKLOCAL(&addr6->sin6_addr)))
|
|
||||||
{
|
{
|
||||||
sprintf(&tmpbuf[1], fmt, addr6->sin6_scope_id);
|
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)
|
static char *ares_striendstr(const char *s1, const char *s2)
|
||||||
{
|
{
|
||||||
const char *c1, *c2, *c1_begin;
|
const char *c1, *c2, *c1_begin;
|
||||||
|
int lo1, lo2;
|
||||||
size_t s1_len = strlen(s1), s2_len = strlen(s2);
|
size_t s1_len = strlen(s1), s2_len = strlen(s2);
|
||||||
|
|
||||||
/* If the substr is longer than the full str, it can't match */
|
/* 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;
|
c2 = s2;
|
||||||
while (c2 < s2+s2_len)
|
while (c2 < s2+s2_len)
|
||||||
{
|
{
|
||||||
if (tolower(*c1) != tolower(*c2))
|
lo1 = tolower(*c1);
|
||||||
|
lo2 = tolower(*c2);
|
||||||
|
if (lo1 != lo2)
|
||||||
return NULL;
|
return NULL;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
/* $Id$ */
|
/* $Id$ */
|
||||||
|
|
||||||
/* Copyright (C) 2005 - 2006, Daniel Stenberg
|
/* Copyright (C) 2005 - 2007, Daniel Stenberg
|
||||||
*
|
*
|
||||||
* Permission to use, copy, modify, and distribute this software and its
|
* Permission to use, copy, modify, and distribute this software and its
|
||||||
* documentation for any purpose and without fee is hereby granted, provided
|
* documentation for any purpose and without fee is hereby granted, provided
|
||||||
@@ -14,7 +14,6 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "setup.h"
|
#include "setup.h"
|
||||||
#include <sys/types.h>
|
|
||||||
|
|
||||||
#ifdef HAVE_SYS_TIME_H
|
#ifdef HAVE_SYS_TIME_H
|
||||||
#include <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 "setup.h"
|
||||||
#include <sys/types.h>
|
|
||||||
|
|
||||||
#if defined(WIN32) && !defined(WATT32)
|
#if defined(WIN32) && !defined(WATT32)
|
||||||
#include "nameser.h"
|
#include "nameser.h"
|
||||||
@@ -43,6 +42,9 @@
|
|||||||
#ifdef HAVE_UNISTD_H
|
#ifdef HAVE_UNISTD_H
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef HAVE_PROCESS_H
|
||||||
|
#include <process.h> /* Some have getpid() here */
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@@ -91,7 +93,8 @@ int ares_init_options(ares_channel *channelptr, struct ares_options *options,
|
|||||||
int optmask)
|
int optmask)
|
||||||
{
|
{
|
||||||
ares_channel channel;
|
ares_channel channel;
|
||||||
int i, status;
|
int i;
|
||||||
|
int status = ARES_SUCCESS;
|
||||||
struct server_state *server;
|
struct server_state *server;
|
||||||
struct timeval tv;
|
struct timeval tv;
|
||||||
|
|
||||||
@@ -106,8 +109,10 @@ int ares_init_options(ares_channel *channelptr, struct ares_options *options,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
channel = malloc(sizeof(struct ares_channeldata));
|
channel = malloc(sizeof(struct ares_channeldata));
|
||||||
if (!channel)
|
if (!channel) {
|
||||||
|
*channelptr = NULL;
|
||||||
return ARES_ENOMEM;
|
return ARES_ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
/* Set everything to distinguished values so we know they haven't
|
/* Set everything to distinguished values so we know they haven't
|
||||||
* been set yet.
|
* 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
|
/* Initialize configuration by each of the four sources, from highest
|
||||||
* precedence to lowest.
|
* precedence to lowest.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
if (status == ARES_SUCCESS) {
|
||||||
status = init_by_options(channel, options, optmask);
|
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);
|
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);
|
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);
|
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)
|
if (status != ARES_SUCCESS)
|
||||||
{
|
{
|
||||||
/* Something failed; clean up memory we may have allocated. */
|
/* 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);
|
gettimeofday(&tv, NULL);
|
||||||
channel->next_id = (unsigned short)
|
channel->next_id = (unsigned short)
|
||||||
(tv.tv_sec ^ tv.tv_usec ^ getpid()) & 0xffff;
|
((tv.tv_sec ^ tv.tv_usec ^ getpid()) & 0xffff);
|
||||||
|
|
||||||
channel->queries = NULL;
|
channel->queries = NULL;
|
||||||
|
|
||||||
@@ -550,7 +573,7 @@ DhcpNameServer
|
|||||||
do {
|
do {
|
||||||
space = strchr(pos, ' ');
|
space = strchr(pos, ' ');
|
||||||
if (space)
|
if (space)
|
||||||
*space = 0;
|
*space = '\0';
|
||||||
status = config_nameserver(&servers, &nservers, pos);
|
status = config_nameserver(&servers, &nservers, pos);
|
||||||
if (status != ARES_SUCCESS)
|
if (status != ARES_SUCCESS)
|
||||||
break;
|
break;
|
||||||
@@ -586,32 +609,47 @@ DhcpNameServer
|
|||||||
char *p;
|
char *p;
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
int linesize;
|
int linesize;
|
||||||
|
int error;
|
||||||
|
|
||||||
fp = fopen(PATH_RESOLV_CONF, "r");
|
fp = fopen(PATH_RESOLV_CONF, "r");
|
||||||
if (!fp)
|
if (fp) {
|
||||||
return (errno == ENOENT) ? ARES_SUCCESS : ARES_EFILE;
|
while ((status = ares__read_line(fp, &line, &linesize)) == ARES_SUCCESS)
|
||||||
while ((status = ares__read_line(fp, &line, &linesize)) == ARES_SUCCESS)
|
{
|
||||||
{
|
if ((p = try_config(line, "domain")) && channel->ndomains == -1)
|
||||||
if ((p = try_config(line, "domain")) && channel->ndomains == -1)
|
status = config_domain(channel, p);
|
||||||
status = config_domain(channel, p);
|
else if ((p = try_config(line, "lookup")) && !channel->lookups)
|
||||||
else if ((p = try_config(line, "lookup")) && !channel->lookups)
|
status = config_lookup(channel, p, "bind", "file");
|
||||||
status = config_lookup(channel, p, "bind", "file");
|
else if ((p = try_config(line, "search")) && channel->ndomains == -1)
|
||||||
else if ((p = try_config(line, "search")) && channel->ndomains == -1)
|
status = set_search(channel, p);
|
||||||
status = set_search(channel, p);
|
else if ((p = try_config(line, "nameserver")) && channel->nservers == -1)
|
||||||
else if ((p = try_config(line, "nameserver")) && channel->nservers == -1)
|
status = config_nameserver(&servers, &nservers, p);
|
||||||
status = config_nameserver(&servers, &nservers, p);
|
else if ((p = try_config(line, "sortlist")) && channel->nsort == -1)
|
||||||
else if ((p = try_config(line, "sortlist")) && channel->nsort == -1)
|
status = config_sortlist(&sortlist, &nsort, p);
|
||||||
status = config_sortlist(&sortlist, &nsort, p);
|
else if ((p = try_config(line, "options")))
|
||||||
else if ((p = try_config(line, "options")))
|
status = set_options(channel, p);
|
||||||
status = set_options(channel, p);
|
else
|
||||||
else
|
status = ARES_SUCCESS;
|
||||||
status = ARES_SUCCESS;
|
if (status != ARES_SUCCESS)
|
||||||
if (status != ARES_SUCCESS)
|
break;
|
||||||
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 */
|
/* Many systems (Solaris, Linux, BSD's) use nsswitch.conf */
|
||||||
fp = fopen("/etc/nsswitch.conf", "r");
|
fp = fopen("/etc/nsswitch.conf", "r");
|
||||||
if (fp) {
|
if (fp) {
|
||||||
@@ -622,9 +660,23 @@ DhcpNameServer
|
|||||||
}
|
}
|
||||||
fclose(fp);
|
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 */
|
/* Linux / GNU libc 2.x and possibly others have host.conf */
|
||||||
fp = fopen("/etc/host.conf", "r");
|
fp = fopen("/etc/host.conf", "r");
|
||||||
if (fp) {
|
if (fp) {
|
||||||
@@ -635,9 +687,23 @@ DhcpNameServer
|
|||||||
}
|
}
|
||||||
fclose(fp);
|
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 */
|
/* Tru64 uses /etc/svc.conf */
|
||||||
fp = fopen("/etc/svc.conf", "r");
|
fp = fopen("/etc/svc.conf", "r");
|
||||||
if (fp) {
|
if (fp) {
|
||||||
@@ -648,6 +714,20 @@ DhcpNameServer
|
|||||||
}
|
}
|
||||||
fclose(fp);
|
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)
|
if(line)
|
||||||
@@ -761,7 +841,7 @@ static int config_domain(ares_channel channel, char *str)
|
|||||||
q = str;
|
q = str;
|
||||||
while (*q && !ISSPACE(*q))
|
while (*q && !ISSPACE(*q))
|
||||||
q++;
|
q++;
|
||||||
*q = 0;
|
*q = '\0';
|
||||||
return set_search(channel, str);
|
return set_search(channel, str);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -788,7 +868,7 @@ static int config_lookup(ares_channel channel, const char *str,
|
|||||||
while (*p && (ISSPACE(*p) || (*p == ',')))
|
while (*p && (ISSPACE(*p) || (*p == ',')))
|
||||||
p++;
|
p++;
|
||||||
}
|
}
|
||||||
*l = 0;
|
*l = '\0';
|
||||||
channel->lookups = strdup(lookups);
|
channel->lookups = strdup(lookups);
|
||||||
return (channel->lookups) ? ARES_SUCCESS : ARES_ENOMEM;
|
return (channel->lookups) ? ARES_SUCCESS : ARES_ENOMEM;
|
||||||
}
|
}
|
||||||
@@ -815,7 +895,7 @@ static int config_nameserver(struct server_state **servers, int *nservers,
|
|||||||
|
|
||||||
if (*p)
|
if (*p)
|
||||||
{
|
{
|
||||||
*p = 0;
|
*p = '\0';
|
||||||
more = 1;
|
more = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -873,7 +953,7 @@ static int config_sortlist(struct apattern **sortlist, int *nsort,
|
|||||||
while (*q && *q != '/' && *q != ';' && !ISSPACE(*q))
|
while (*q && *q != '/' && *q != ';' && !ISSPACE(*q))
|
||||||
q++;
|
q++;
|
||||||
memcpy(ipbuf, str, (int)(q-str));
|
memcpy(ipbuf, str, (int)(q-str));
|
||||||
ipbuf[(int)(q-str)] = 0;
|
ipbuf[(int)(q-str)] = '\0';
|
||||||
/* Find the prefix */
|
/* Find the prefix */
|
||||||
if (*q == '/')
|
if (*q == '/')
|
||||||
{
|
{
|
||||||
@@ -881,11 +961,11 @@ static int config_sortlist(struct apattern **sortlist, int *nsort,
|
|||||||
while (*q && *q != ';' && !ISSPACE(*q))
|
while (*q && *q != ';' && !ISSPACE(*q))
|
||||||
q++;
|
q++;
|
||||||
memcpy(ipbufpfx, str, (int)(q-str));
|
memcpy(ipbufpfx, str, (int)(q-str));
|
||||||
ipbufpfx[(int)(q-str)] = 0;
|
ipbufpfx[(int)(q-str)] = '\0';
|
||||||
str = str2;
|
str = str2;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
ipbufpfx[0] = 0;
|
ipbufpfx[0] = '\0';
|
||||||
/* Lets see if it is CIDR */
|
/* Lets see if it is CIDR */
|
||||||
/* First we'll try IPv6 */
|
/* First we'll try IPv6 */
|
||||||
if ((bits = ares_inet_net_pton(AF_INET6, ipbufpfx ? ipbufpfx : ipbuf,
|
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)
|
sizeof(pat.addr.addr6))) > 0)
|
||||||
{
|
{
|
||||||
pat.type = PATTERN_CIDR;
|
pat.type = PATTERN_CIDR;
|
||||||
pat.mask.bits = bits;
|
pat.mask.bits = (unsigned short)bits;
|
||||||
pat.family = AF_INET6;
|
pat.family = AF_INET6;
|
||||||
if (!sortlist_alloc(sortlist, nsort, &pat))
|
if (!sortlist_alloc(sortlist, nsort, &pat))
|
||||||
return ARES_ENOMEM;
|
return ARES_ENOMEM;
|
||||||
@@ -903,7 +983,7 @@ static int config_sortlist(struct apattern **sortlist, int *nsort,
|
|||||||
sizeof(pat.addr.addr4))) > 0)
|
sizeof(pat.addr.addr4))) > 0)
|
||||||
{
|
{
|
||||||
pat.type = PATTERN_CIDR;
|
pat.type = PATTERN_CIDR;
|
||||||
pat.mask.bits = bits;
|
pat.mask.bits = (unsigned short)bits;
|
||||||
pat.family = AF_INET;
|
pat.family = AF_INET;
|
||||||
if (!sortlist_alloc(sortlist, nsort, &pat))
|
if (!sortlist_alloc(sortlist, nsort, &pat))
|
||||||
return ARES_ENOMEM;
|
return ARES_ENOMEM;
|
||||||
@@ -914,7 +994,7 @@ static int config_sortlist(struct apattern **sortlist, int *nsort,
|
|||||||
if (ipbufpfx)
|
if (ipbufpfx)
|
||||||
{
|
{
|
||||||
memcpy(ipbuf, str, (int)(q-str));
|
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)
|
if (ip_addr(ipbuf, (int)(q - str), &pat.mask.addr.addr4) != 0)
|
||||||
natural_mask(&pat);
|
natural_mask(&pat);
|
||||||
}
|
}
|
||||||
|
@@ -16,7 +16,6 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "setup.h"
|
#include "setup.h"
|
||||||
#include <sys/types.h>
|
|
||||||
|
|
||||||
#if defined(WIN32) && !defined(WATT32)
|
#if defined(WIN32) && !defined(WATT32)
|
||||||
#include "nameser.h"
|
#include "nameser.h"
|
||||||
@@ -115,7 +114,12 @@ int ares_mkquery(const char *name, int dnsclass, int type, unsigned short id,
|
|||||||
memset(q, 0, HFIXEDSZ);
|
memset(q, 0, HFIXEDSZ);
|
||||||
DNS_HEADER_SET_QID(q, id);
|
DNS_HEADER_SET_QID(q, id);
|
||||||
DNS_HEADER_SET_OPCODE(q, QUERY);
|
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);
|
DNS_HEADER_SET_QDCOUNT(q, 1);
|
||||||
|
|
||||||
/* A name of "." is a screw case for the loop below, so adjust it. */
|
/* 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;
|
return ARES_EBADNAME;
|
||||||
|
|
||||||
/* Encode the length and copy the data. */
|
/* Encode the length and copy the data. */
|
||||||
*q++ = len;
|
*q++ = (unsigned char)len;
|
||||||
for (p = name; *p && *p != '.'; p++)
|
for (p = name; *p && *p != '.'; p++)
|
||||||
{
|
{
|
||||||
if (*p == '\\' && *(p + 1) != 0)
|
if (*p == '\\' && *(p + 1) != 0)
|
||||||
|
@@ -16,7 +16,6 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "setup.h"
|
#include "setup.h"
|
||||||
#include <sys/types.h>
|
|
||||||
|
|
||||||
#if defined(WIN32) && !defined(WATT32)
|
#if defined(WIN32) && !defined(WATT32)
|
||||||
#include "nameser.h"
|
#include "nameser.h"
|
||||||
|
@@ -16,7 +16,6 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "setup.h"
|
#include "setup.h"
|
||||||
#include <sys/types.h>
|
|
||||||
|
|
||||||
#if defined(WIN32) && !defined(WATT32)
|
#if defined(WIN32) && !defined(WATT32)
|
||||||
#include "nameser.h"
|
#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 "setup.h"
|
||||||
#include <sys/types.h>
|
|
||||||
|
|
||||||
#if defined(WIN32) && !defined(WATT32)
|
#if defined(WIN32) && !defined(WATT32)
|
||||||
#include "nameser.h"
|
#include "nameser.h"
|
||||||
|
@@ -16,7 +16,6 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "setup.h"
|
#include "setup.h"
|
||||||
#include <sys/types.h>
|
|
||||||
|
|
||||||
#if defined(WIN32) && !defined(WATT32)
|
#if defined(WIN32) && !defined(WATT32)
|
||||||
#include "nameser.h"
|
#include "nameser.h"
|
||||||
@@ -54,16 +53,6 @@
|
|||||||
#include "ares_dns.h"
|
#include "ares_dns.h"
|
||||||
#include "ares_private.h"
|
#include "ares_private.h"
|
||||||
|
|
||||||
#ifndef TRUE
|
|
||||||
/* at least Solaris 7 does not have TRUE at this point */
|
|
||||||
#define TRUE 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef USE_WINSOCK
|
|
||||||
#define GET_ERRNO() WSAGetLastError()
|
|
||||||
#else
|
|
||||||
#define GET_ERRNO() errno
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static int try_again(int errnum);
|
static int try_again(int errnum);
|
||||||
static void write_tcp_data(ares_channel channel, fd_set *write_fds,
|
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);
|
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
|
* otherwise. This is mostly for HP-UX, which could return EAGAIN or
|
||||||
* EWOULDBLOCK. See this man page
|
* 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);
|
free(vec);
|
||||||
if (wcount < 0)
|
if (wcount < 0)
|
||||||
{
|
{
|
||||||
if (!try_again(GET_ERRNO()))
|
if (!try_again(SOCKERRNO))
|
||||||
handle_error(channel, i, now);
|
handle_error(channel, i, now);
|
||||||
continue;
|
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);
|
scount = swrite(server->tcp_socket, sendreq->data, sendreq->len);
|
||||||
if (scount < 0)
|
if (scount < 0)
|
||||||
{
|
{
|
||||||
if (!try_again(GET_ERRNO()))
|
if (!try_again(SOCKERRNO))
|
||||||
handle_error(channel, i, now);
|
handle_error(channel, i, now);
|
||||||
continue;
|
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);
|
2 - server->tcp_lenbuf_pos);
|
||||||
if (count <= 0)
|
if (count <= 0)
|
||||||
{
|
{
|
||||||
if (!(count == -1 && try_again(GET_ERRNO())))
|
if (!(count == -1 && try_again(SOCKERRNO)))
|
||||||
handle_error(channel, i, now);
|
handle_error(channel, i, now);
|
||||||
continue;
|
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);
|
server->tcp_length - server->tcp_buffer_pos);
|
||||||
if (count <= 0)
|
if (count <= 0)
|
||||||
{
|
{
|
||||||
if (!(count == -1 && try_again(GET_ERRNO())))
|
if (!(count == -1 && try_again(SOCKERRNO)))
|
||||||
handle_error(channel, i, now);
|
handle_error(channel, i, now);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -322,7 +311,7 @@ static void read_udp_packets(ares_channel channel, fd_set *read_fds,
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
count = sread(server->udp_socket, buf, sizeof(buf));
|
count = sread(server->udp_socket, buf, sizeof(buf));
|
||||||
if (count == -1 && try_again(GET_ERRNO()))
|
if (count == -1 && try_again(SOCKERRNO))
|
||||||
continue;
|
continue;
|
||||||
else if (count <= 0)
|
else if (count <= 0)
|
||||||
handle_error(channel, i, now);
|
handle_error(channel, i, now);
|
||||||
@@ -538,7 +527,7 @@ static int nonblock(ares_socket_t sockfd, /* operate on this */
|
|||||||
int flags;
|
int flags;
|
||||||
|
|
||||||
flags = fcntl(sockfd, F_GETFL, 0);
|
flags = fcntl(sockfd, F_GETFL, 0);
|
||||||
if (TRUE == nonblock)
|
if (FALSE != nonblock)
|
||||||
return fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);
|
return fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);
|
||||||
else
|
else
|
||||||
return fcntl(sockfd, F_SETFL, flags & (~O_NONBLOCK));
|
return fcntl(sockfd, F_SETFL, flags & (~O_NONBLOCK));
|
||||||
@@ -557,8 +546,12 @@ static int nonblock(ares_socket_t sockfd, /* operate on this */
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(HAVE_IOCTLSOCKET) && (SETBLOCK == 0)
|
#if defined(HAVE_IOCTLSOCKET) && (SETBLOCK == 0)
|
||||||
|
#ifdef WATT32
|
||||||
|
char flags;
|
||||||
|
#else
|
||||||
/* Windows? */
|
/* Windows? */
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
#endif
|
||||||
flags = nonblock;
|
flags = nonblock;
|
||||||
|
|
||||||
return ioctlsocket(sockfd, FIONBIO, &flags);
|
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));
|
memset(&sockin, 0, sizeof(sockin));
|
||||||
sockin.sin_family = AF_INET;
|
sockin.sin_family = AF_INET;
|
||||||
sockin.sin_addr = server->addr;
|
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) {
|
if (connect(s, (struct sockaddr *) &sockin, sizeof(sockin)) == -1) {
|
||||||
int err = GET_ERRNO();
|
int err = SOCKERRNO;
|
||||||
|
|
||||||
if (err != EINPROGRESS && err != EWOULDBLOCK) {
|
if (err != EINPROGRESS && err != EWOULDBLOCK) {
|
||||||
closesocket(s);
|
closesocket(s);
|
||||||
@@ -642,7 +635,7 @@ static int open_udp_socket(ares_channel channel, struct server_state *server)
|
|||||||
memset(&sockin, 0, sizeof(sockin));
|
memset(&sockin, 0, sizeof(sockin));
|
||||||
sockin.sin_family = AF_INET;
|
sockin.sin_family = AF_INET;
|
||||||
sockin.sin_addr = server->addr;
|
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)
|
if (connect(s, (struct sockaddr *) &sockin, sizeof(sockin)) == -1)
|
||||||
{
|
{
|
||||||
closesocket(s);
|
closesocket(s);
|
||||||
|
@@ -16,7 +16,6 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "setup.h"
|
#include "setup.h"
|
||||||
#include <sys/types.h>
|
|
||||||
|
|
||||||
#if defined(WIN32) && !defined(WATT32)
|
#if defined(WIN32) && !defined(WATT32)
|
||||||
#include "nameser.h"
|
#include "nameser.h"
|
||||||
|
@@ -20,6 +20,7 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
#if defined(WIN32) && !defined(WATT32)
|
#if defined(WIN32) && !defined(WATT32)
|
||||||
#include "nameser.h"
|
#include "nameser.h"
|
||||||
@@ -216,6 +217,7 @@ static int single_domain(ares_channel channel, const char *name, char **s)
|
|||||||
char *line = NULL;
|
char *line = NULL;
|
||||||
int linesize, status;
|
int linesize, status;
|
||||||
const char *p, *q;
|
const char *p, *q;
|
||||||
|
int error;
|
||||||
|
|
||||||
/* If the name contains a trailing dot, then the single query is the name
|
/* If the name contains a trailing dot, then the single query is the name
|
||||||
* sans the trailing dot.
|
* sans the trailing dot.
|
||||||
@@ -265,6 +267,23 @@ static int single_domain(ares_channel channel, const char *name, char **s)
|
|||||||
if (status != ARES_SUCCESS)
|
if (status != ARES_SUCCESS)
|
||||||
return status;
|
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 "setup.h"
|
||||||
#include <sys/types.h>
|
|
||||||
|
|
||||||
#if defined(WIN32) && !defined(WATT32)
|
#if defined(WIN32) && !defined(WATT32)
|
||||||
#include "nameser.h"
|
#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. */
|
/* 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;
|
query->timeout = 0;
|
||||||
|
|
||||||
/* Form the TCP query buffer by prepending qlen (as two
|
/* Form the TCP query buffer by prepending qlen (as two
|
||||||
* network-order bytes) to qbuf.
|
* network-order bytes) to qbuf.
|
||||||
*/
|
*/
|
||||||
query->tcpbuf[0] = (qlen >> 8) & 0xff;
|
query->tcpbuf[0] = (unsigned char)((qlen >> 8) & 0xff);
|
||||||
query->tcpbuf[1] = qlen & 0xff;
|
query->tcpbuf[1] = (unsigned char)(qlen & 0xff);
|
||||||
memcpy(query->tcpbuf + 2, qbuf, qlen);
|
memcpy(query->tcpbuf + 2, qbuf, qlen);
|
||||||
query->tcplen = qlen + 2;
|
query->tcplen = qlen + 2;
|
||||||
|
|
||||||
|
@@ -41,9 +41,11 @@ const char *ares_strerror(int code)
|
|||||||
"Out of memory",
|
"Out of memory",
|
||||||
"Channel is being destroyed",
|
"Channel is being destroyed",
|
||||||
"Misformatted string",
|
"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];
|
return errtext[code];
|
||||||
}
|
}
|
||||||
|
@@ -16,7 +16,6 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "setup.h"
|
#include "setup.h"
|
||||||
#include <sys/types.h>
|
|
||||||
|
|
||||||
#ifdef HAVE_SYS_TIME_H
|
#ifdef HAVE_SYS_TIME_H
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
|
@@ -19,9 +19,7 @@
|
|||||||
|
|
||||||
#ifndef HAVE_BITNCMP
|
#ifndef HAVE_BITNCMP
|
||||||
|
|
||||||
#include <sys/types.h>
|
#include "setup.h"
|
||||||
#include <string.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include "bitncmp.h"
|
#include "bitncmp.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@@ -38,6 +38,9 @@
|
|||||||
/* Define if you have the <time.h> header file. */
|
/* Define if you have the <time.h> header file. */
|
||||||
#define HAVE_TIME_H 1
|
#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. */
|
/* Define if you have the <unistd.h> header file. */
|
||||||
#if defined(__MINGW32__) || defined(__WATCOMC__) || defined(__LCC__) || \
|
#if defined(__MINGW32__) || defined(__WATCOMC__) || defined(__LCC__) || \
|
||||||
defined(__POCC__)
|
defined(__POCC__)
|
||||||
|
@@ -7,6 +7,15 @@ AM_CONFIG_HEADER(config.h)
|
|||||||
AM_MAINTAINER_MODE
|
AM_MAINTAINER_MODE
|
||||||
AM_INIT_AUTOMAKE(c-ares, CVS)
|
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_CC
|
||||||
AC_PROG_INSTALL
|
AC_PROG_INSTALL
|
||||||
|
|
||||||
@@ -16,6 +25,7 @@ solaris*)
|
|||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
|
dnl support building of Windows DLLs
|
||||||
AC_LIBTOOL_WIN32_DLL
|
AC_LIBTOOL_WIN32_DLL
|
||||||
|
|
||||||
dnl ************************************************************
|
dnl ************************************************************
|
||||||
@@ -61,8 +71,31 @@ AC_HELP_STRING([--disable-debug],[Disable debug options]),
|
|||||||
AC_MSG_RESULT(no)
|
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
|
dnl libtool setup
|
||||||
CARES_CLEAR_LIBTOOL_TAGS
|
|
||||||
AC_PROG_LIBTOOL
|
AC_PROG_LIBTOOL
|
||||||
|
|
||||||
AC_MSG_CHECKING([if we need -no-undefined])
|
AC_MSG_CHECKING([if we need -no-undefined])
|
||||||
@@ -77,6 +110,13 @@ esac
|
|||||||
AC_MSG_RESULT($need_no_undefined)
|
AC_MSG_RESULT($need_no_undefined)
|
||||||
AM_CONDITIONAL(NO_UNDEFINED, test x$need_no_undefined = xyes)
|
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 **********************************************************************
|
||||||
dnl Checks for libraries.
|
dnl Checks for libraries.
|
||||||
dnl **********************************************************************
|
dnl **********************************************************************
|
||||||
@@ -198,6 +238,77 @@ AC_HELP_STRING([--enable-libgcc],[use libgcc when linking]),
|
|||||||
AC_MSG_RESULT(no)
|
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 **********************************************************************
|
||||||
dnl Back to "normal" configuring
|
dnl Back to "normal" configuring
|
||||||
dnl **********************************************************************
|
dnl **********************************************************************
|
||||||
@@ -229,6 +340,8 @@ AC_CHECK_HEADERS(
|
|||||||
netdb.h \
|
netdb.h \
|
||||||
netinet/in.h \
|
netinet/in.h \
|
||||||
net/if.h \
|
net/if.h \
|
||||||
|
errno.h \
|
||||||
|
stdbool.h \
|
||||||
arpa/nameser.h \
|
arpa/nameser.h \
|
||||||
arpa/nameser_compat.h \
|
arpa/nameser_compat.h \
|
||||||
arpa/inet.h,
|
arpa/inet.h,
|
||||||
@@ -290,6 +403,19 @@ fi
|
|||||||
AC_CHECK_TYPE(ssize_t, ,
|
AC_CHECK_TYPE(ssize_t, ,
|
||||||
AC_DEFINE(ssize_t, int, [the signed version of size_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
|
# Check for socklen_t or equivalent
|
||||||
CURL_CHECK_TYPE_SOCKLEN_T
|
CURL_CHECK_TYPE_SOCKLEN_T
|
||||||
|
|
||||||
|
@@ -19,9 +19,6 @@
|
|||||||
|
|
||||||
#include "setup.h"
|
#include "setup.h"
|
||||||
|
|
||||||
|
|
||||||
#include <sys/types.h>
|
|
||||||
|
|
||||||
#if defined(WIN32) && !defined(WATT32)
|
#if defined(WIN32) && !defined(WATT32)
|
||||||
#include "nameser.h"
|
#include "nameser.h"
|
||||||
#else
|
#else
|
||||||
@@ -66,6 +63,11 @@
|
|||||||
* note:
|
* note:
|
||||||
* network byte order assumed. this means 192.5.5.240/28 has
|
* network byte order assumed. this means 192.5.5.240/28 has
|
||||||
* 0b11110000 in its fourth octet.
|
* 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:
|
* author:
|
||||||
* Paul Vixie (ISC), June 1996
|
* Paul Vixie (ISC), June 1996
|
||||||
*/
|
*/
|
||||||
@@ -86,7 +88,7 @@ inet_net_pton_ipv4(const char *src, unsigned char *dst, size_t size)
|
|||||||
dirty = 0;
|
dirty = 0;
|
||||||
src++; /* skip x or X. */
|
src++; /* skip x or X. */
|
||||||
while ((ch = *src++) != '\0' && ISXDIGIT(ch)) {
|
while ((ch = *src++) != '\0' && ISXDIGIT(ch)) {
|
||||||
if (isupper(ch))
|
if (ISUPPER(ch))
|
||||||
ch = tolower(ch);
|
ch = tolower(ch);
|
||||||
n = (int)(strchr(xdigits, ch) - xdigits);
|
n = (int)(strchr(xdigits, ch) - xdigits);
|
||||||
if (dirty == 0)
|
if (dirty == 0)
|
||||||
@@ -186,11 +188,11 @@ inet_net_pton_ipv4(const char *src, unsigned char *dst, size_t size)
|
|||||||
return (bits);
|
return (bits);
|
||||||
|
|
||||||
enoent:
|
enoent:
|
||||||
errno = ENOENT;
|
SET_ERRNO(ENOENT);
|
||||||
return (-1);
|
return (-1);
|
||||||
|
|
||||||
emsgsize:
|
emsgsize:
|
||||||
errno = EMSGSIZE;
|
SET_ERRNO(EMSGSIZE);
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -252,7 +254,7 @@ getv4(const char *src, unsigned char *dst, int *bitsp)
|
|||||||
if (ch == '.' || ch == '/') {
|
if (ch == '.' || ch == '/') {
|
||||||
if (dst - odst > 3) /* too many octets? */
|
if (dst - odst > 3) /* too many octets? */
|
||||||
return (0);
|
return (0);
|
||||||
*dst++ = val;
|
*dst++ = (unsigned char)val;
|
||||||
if (ch == '/')
|
if (ch == '/')
|
||||||
return (getbits(src, bitsp));
|
return (getbits(src, bitsp));
|
||||||
val = 0;
|
val = 0;
|
||||||
@@ -265,7 +267,7 @@ getv4(const char *src, unsigned char *dst, int *bitsp)
|
|||||||
return (0);
|
return (0);
|
||||||
if (dst - odst > 3) /* too many octets? */
|
if (dst - odst > 3) /* too many octets? */
|
||||||
return (0);
|
return (0);
|
||||||
*dst++ = val;
|
*dst++ = (unsigned char)val;
|
||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -321,8 +323,8 @@ inet_net_pton_ipv6(const char *src, unsigned char *dst, size_t size)
|
|||||||
goto enoent;
|
goto enoent;
|
||||||
if (tp + NS_INT16SZ > endp)
|
if (tp + NS_INT16SZ > endp)
|
||||||
return (0);
|
return (0);
|
||||||
*tp++ = (unsigned char) (val >> 8) & 0xff;
|
*tp++ = (unsigned char)((val >> 8) & 0xff);
|
||||||
*tp++ = (unsigned char) val & 0xff;
|
*tp++ = (unsigned char)(val & 0xff);
|
||||||
saw_xdigit = 0;
|
saw_xdigit = 0;
|
||||||
digits = 0;
|
digits = 0;
|
||||||
val = 0;
|
val = 0;
|
||||||
@@ -342,8 +344,8 @@ inet_net_pton_ipv6(const char *src, unsigned char *dst, size_t size)
|
|||||||
if (saw_xdigit) {
|
if (saw_xdigit) {
|
||||||
if (tp + NS_INT16SZ > endp)
|
if (tp + NS_INT16SZ > endp)
|
||||||
goto enoent;
|
goto enoent;
|
||||||
*tp++ = (unsigned char) (val >> 8) & 0xff;
|
*tp++ = (unsigned char)((val >> 8) & 0xff);
|
||||||
*tp++ = (unsigned char) val & 0xff;
|
*tp++ = (unsigned char)(val & 0xff);
|
||||||
}
|
}
|
||||||
if (bits == -1)
|
if (bits == -1)
|
||||||
bits = 128;
|
bits = 128;
|
||||||
@@ -381,11 +383,11 @@ inet_net_pton_ipv6(const char *src, unsigned char *dst, size_t size)
|
|||||||
return (bits);
|
return (bits);
|
||||||
|
|
||||||
enoent:
|
enoent:
|
||||||
errno = ENOENT;
|
SET_ERRNO(ENOENT);
|
||||||
return (-1);
|
return (-1);
|
||||||
|
|
||||||
emsgsize:
|
emsgsize:
|
||||||
errno = EMSGSIZE;
|
SET_ERRNO(EMSGSIZE);
|
||||||
return (-1);
|
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,
|
* number of bits, either imputed classfully or specified with /CIDR,
|
||||||
* or -1 if some failure occurred (check errno). ENOENT means it was
|
* or -1 if some failure occurred (check errno). ENOENT means it was
|
||||||
* not a valid network specification.
|
* 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:
|
* author:
|
||||||
* Paul Vixie (ISC), June 1996
|
* 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:
|
case AF_INET6:
|
||||||
return (inet_net_pton_ipv6(src, dst, size));
|
return (inet_net_pton_ipv6(src, dst, size));
|
||||||
default:
|
default:
|
||||||
errno = EAFNOSUPPORT;
|
SET_ERRNO(EAFNOSUPPORT);
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -429,11 +436,11 @@ int ares_inet_pton(int af, const char *src, void *dst)
|
|||||||
size = sizeof(struct in6_addr);
|
size = sizeof(struct in6_addr);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
errno = EAFNOSUPPORT;
|
SET_ERRNO(EAFNOSUPPORT);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
result = ares_inet_net_pton(af, src, dst, size);
|
result = ares_inet_net_pton(af, src, dst, size);
|
||||||
if (result == -1 && errno == ENOENT)
|
if (result == -1 && ERRNO == ENOENT)
|
||||||
return 0;
|
return 0;
|
||||||
return (result > -1 ? 1 : -1);
|
return (result > -1 ? 1 : -1);
|
||||||
}
|
}
|
||||||
|
@@ -18,8 +18,6 @@
|
|||||||
|
|
||||||
#include "setup.h"
|
#include "setup.h"
|
||||||
|
|
||||||
#include <sys/types.h>
|
|
||||||
|
|
||||||
#if defined(WIN32) && !defined(WATT32)
|
#if defined(WIN32) && !defined(WATT32)
|
||||||
#include "nameser.h"
|
#include "nameser.h"
|
||||||
#else
|
#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.
|
* convert a network format address to presentation format.
|
||||||
* return:
|
* return:
|
||||||
* pointer to presentation format address (`dst'), or NULL (see errno).
|
* 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:
|
* author:
|
||||||
* Paul Vixie, 1996.
|
* Paul Vixie, 1996.
|
||||||
*/
|
*/
|
||||||
@@ -81,7 +84,7 @@ ares_inet_ntop(int af, const void *src, char *dst, size_t size)
|
|||||||
case AF_INET6:
|
case AF_INET6:
|
||||||
return (inet_ntop6(src, dst, size));
|
return (inet_ntop6(src, dst, size));
|
||||||
default:
|
default:
|
||||||
errno = EAFNOSUPPORT;
|
SET_ERRNO(EAFNOSUPPORT);
|
||||||
return (NULL);
|
return (NULL);
|
||||||
}
|
}
|
||||||
/* NOTREACHED */
|
/* 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)
|
if (SPRINTF((tmp, fmt, src[0], src[1], src[2], src[3])) > size)
|
||||||
{
|
{
|
||||||
errno = ENOSPC;
|
SET_ERRNO(ENOSPC);
|
||||||
return (NULL);
|
return (NULL);
|
||||||
}
|
}
|
||||||
strcpy(dst, tmp);
|
strcpy(dst, tmp);
|
||||||
@@ -218,7 +221,7 @@ inet_ntop6(const unsigned char *src, char *dst, size_t size)
|
|||||||
*/
|
*/
|
||||||
if ((size_t)(tp - tmp) > size)
|
if ((size_t)(tp - tmp) > size)
|
||||||
{
|
{
|
||||||
errno = ENOSPC;
|
SET_ERRNO(ENOSPC);
|
||||||
return (NULL);
|
return (NULL);
|
||||||
}
|
}
|
||||||
strcpy(dst, tmp);
|
strcpy(dst, tmp);
|
||||||
|
@@ -18,11 +18,6 @@
|
|||||||
|
|
||||||
#define MAXHOSTNAMELEN 256
|
#define MAXHOSTNAMELEN 256
|
||||||
|
|
||||||
#define EINPROGRESS WSAEINPROGRESS
|
|
||||||
#define EWOULDBLOCK WSAEWOULDBLOCK
|
|
||||||
#define EMSGSIZE WSAEMSGSIZE
|
|
||||||
#define EAFNOSUPPORT WSAEAFNOSUPPORT
|
|
||||||
|
|
||||||
/* Structure for scatter/gather I/O. */
|
/* Structure for scatter/gather I/O. */
|
||||||
struct iovec
|
struct iovec
|
||||||
{
|
{
|
||||||
@@ -30,7 +25,9 @@ struct iovec
|
|||||||
size_t iov_len; /* Length of data. */
|
size_t iov_len; /* Length of data. */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifndef __WATCOMC__
|
||||||
#define getpid() _getpid()
|
#define getpid() _getpid()
|
||||||
|
#endif
|
||||||
|
|
||||||
int ares_writev (SOCKET s, const struct iovec *vector, size_t count);
|
int ares_writev (SOCKET s, const struct iovec *vector, size_t count);
|
||||||
#define writev(s,vect,count) ares_writev(s,vect,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
|
* 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
|
#define HAVE_SYS_TIME_H
|
||||||
#endif
|
#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
|
* If we have the MSG_NOSIGNAL define, make sure we use
|
||||||
* it as the fourth argument of function send()
|
* it as the fourth argument of function send()
|
||||||
@@ -121,6 +173,33 @@
|
|||||||
#define ISGRAPH(x) (isgraph((int) ((unsigned char)x)))
|
#define ISGRAPH(x) (isgraph((int) ((unsigned char)x)))
|
||||||
#define ISALPHA(x) (isalpha((int) ((unsigned char)x)))
|
#define ISALPHA(x) (isalpha((int) ((unsigned char)x)))
|
||||||
#define ISPRINT(x) (isprint((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
|
#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.
|
* Default return type for signal handlers.
|
||||||
*/
|
*/
|
||||||
@@ -142,5 +232,110 @@ typedef int sig_atomic_t;
|
|||||||
#endif
|
#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 */
|
#endif /* __SETUP_ONCE_H */
|
||||||
|
|
||||||
|
@@ -20,6 +20,20 @@
|
|||||||
#include "ares.h"
|
#include "ares.h"
|
||||||
#include "ares_private.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__
|
#ifndef __MINGW32__
|
||||||
int
|
int
|
||||||
ares_strncasecmp(const char *a, const char *b, int n)
|
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;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < n; i++) {
|
for (i = 0; i < n; i++) {
|
||||||
int c1 = isupper(a[i]) ? tolower(a[i]) : a[i];
|
int c1 = ISUPPER(a[i]) ? tolower(a[i]) : a[i];
|
||||||
int c2 = isupper(b[i]) ? tolower(b[i]) : b[i];
|
int c2 = ISUPPER(b[i]) ? tolower(b[i]) : b[i];
|
||||||
if (c1 != c2) return c1-c2;
|
if (c1 != c2) return c1-c2;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@@ -91,7 +105,7 @@ ares_writev (ares_socket_t s, const struct iovec *vector, size_t count)
|
|||||||
buffer = bp = (char*) alloca (bytes);
|
buffer = bp = (char*) alloca (bytes);
|
||||||
if (!buffer)
|
if (!buffer)
|
||||||
{
|
{
|
||||||
errno = ENOMEM;
|
SET_ERRNO(ENOMEM);
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
412
configure.ac
412
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
|
# This software is licensed as described in the file COPYING, which
|
||||||
# you should have received as part of this distribution. The terms
|
# you should have received as part of this distribution. The terms
|
||||||
@@ -90,6 +90,11 @@ dnl initialize all the info variables
|
|||||||
curl_verbose_msg="enabled (--disable-verbose)"
|
curl_verbose_msg="enabled (--disable-verbose)"
|
||||||
curl_sspi_msg="no (--enable-sspi)"
|
curl_sspi_msg="no (--enable-sspi)"
|
||||||
|
|
||||||
|
dnl
|
||||||
|
dnl Save anything in $LIBS for later
|
||||||
|
dnl
|
||||||
|
ALL_LIBS=$LIBS
|
||||||
|
|
||||||
dnl
|
dnl
|
||||||
dnl Detect the canonical host and target build environment
|
dnl Detect the canonical host and target build environment
|
||||||
dnl
|
dnl
|
||||||
@@ -107,9 +112,33 @@ AC_PROG_CC
|
|||||||
dnl check for how to do large files
|
dnl check for how to do large files
|
||||||
AC_SYS_LARGEFILE
|
AC_SYS_LARGEFILE
|
||||||
|
|
||||||
dnl check for cygwin stuff
|
dnl support building of Windows DLLs
|
||||||
AC_LIBTOOL_WIN32_DLL
|
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
|
dnl libtool setup
|
||||||
AC_PROG_LIBTOOL
|
AC_PROG_LIBTOOL
|
||||||
|
|
||||||
@@ -158,6 +187,15 @@ case $host in
|
|||||||
;;
|
;;
|
||||||
esac
|
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 The install stuff has already been taken care of by the automake stuff
|
||||||
dnl AC_PROG_INSTALL
|
dnl AC_PROG_INSTALL
|
||||||
AC_PROG_MAKE_SET
|
AC_PROG_MAKE_SET
|
||||||
@@ -418,15 +456,20 @@ fi
|
|||||||
dnl socket lib?
|
dnl socket lib?
|
||||||
AC_CHECK_FUNC(connect, , [ AC_CHECK_LIB(socket, connect) ])
|
AC_CHECK_FUNC(connect, , [ AC_CHECK_LIB(socket, connect) ])
|
||||||
|
|
||||||
dnl dl lib?
|
dnl **********************************************************************
|
||||||
AC_CHECK_FUNC(dlclose, , [ AC_CHECK_LIB(dl, dlopen) ])
|
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_MSG_CHECKING([whether to use libgcc])
|
||||||
AC_ARG_ENABLE(libgcc,
|
AC_ARG_ENABLE(libgcc,
|
||||||
AC_HELP_STRING([--enable-libgcc],[use libgcc when linking]),
|
AC_HELP_STRING([--enable-libgcc],[use libgcc when linking]),
|
||||||
[ case "$enableval" in
|
[ case "$enableval" in
|
||||||
yes)
|
yes)
|
||||||
LIBS="$LIBS -lgcc"
|
ALL_LIBS="$ALL_LIBS -lgcc"
|
||||||
AC_MSG_RESULT(yes)
|
AC_MSG_RESULT(yes)
|
||||||
;;
|
;;
|
||||||
*) AC_MSG_RESULT(no)
|
*) AC_MSG_RESULT(no)
|
||||||
@@ -435,6 +478,9 @@ AC_HELP_STRING([--enable-libgcc],[use libgcc when linking]),
|
|||||||
AC_MSG_RESULT(no)
|
AC_MSG_RESULT(no)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
dnl dl lib?
|
||||||
|
AC_CHECK_FUNC(dlclose, , [ AC_CHECK_LIB(dl, dlopen) ])
|
||||||
|
|
||||||
dnl **********************************************************************
|
dnl **********************************************************************
|
||||||
dnl Check for the name of dynamic OpenLDAP libraries
|
dnl Check for the name of dynamic OpenLDAP libraries
|
||||||
dnl **********************************************************************
|
dnl **********************************************************************
|
||||||
@@ -1022,12 +1068,35 @@ if test X"$OPT_SSL" != Xno; then
|
|||||||
])
|
])
|
||||||
|
|
||||||
dnl these can only exist if openssl exists
|
dnl these can only exist if openssl exists
|
||||||
|
dnl yassl doesn't have SSL_get_shutdown
|
||||||
|
|
||||||
AC_CHECK_FUNCS( RAND_status \
|
AC_CHECK_FUNCS( RAND_status \
|
||||||
RAND_screen \
|
RAND_screen \
|
||||||
RAND_egd \
|
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
|
fi
|
||||||
|
|
||||||
if test "$OPENSSL_ENABLED" = "1"; then
|
if test "$OPENSSL_ENABLED" = "1"; then
|
||||||
@@ -1044,6 +1113,91 @@ if test X"$OPT_SSL" != Xno; then
|
|||||||
|
|
||||||
fi
|
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 **********************************************************************
|
||||||
dnl Check for the presence of LIBSSH2 libraries and headers
|
dnl Check for the presence of LIBSSH2 libraries and headers
|
||||||
dnl **********************************************************************
|
dnl **********************************************************************
|
||||||
@@ -1080,23 +1234,16 @@ if test X"$OPT_LIBSSH2" != Xno; then
|
|||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
if test X"$HAVECRYPTO" = X"yes"; then
|
AC_CHECK_LIB(ssh2, libssh2_channel_open_ex)
|
||||||
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_HEADERS(libssh2.h,
|
if test X"$OPT_LIBSSH2" != Xoff &&
|
||||||
curl_ssh_msg="enabled (libSSH2)"
|
test "$LIBSSH2_ENABLED" != "1"; then
|
||||||
LIBSSH2_ENABLED=1
|
AC_MSG_ERROR([libSSH2 libs and/or directories were not found where specified!])
|
||||||
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])
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if test "$LIBSSH2_ENABLED" = "1"; then
|
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_DEFINE(USE_GNUTLS, 1, [if GnuTLS is enabled])
|
||||||
AC_SUBST(USE_GNUTLS, [1])
|
AC_SUBST(USE_GNUTLS, [1])
|
||||||
|
GNUTLS_ENABLED = 1
|
||||||
USE_GNUTLS="yes"
|
USE_GNUTLS="yes"
|
||||||
curl_ssl_msg="enabled (GnuTLS)"
|
curl_ssl_msg="enabled (GnuTLS)"
|
||||||
],
|
],
|
||||||
@@ -1215,13 +1363,85 @@ if test "$OPENSSL_ENABLED" != "1"; then
|
|||||||
|
|
||||||
fi dnl GNUTLS not disabled
|
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
|
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 **********************************************************************
|
||||||
dnl Check for the CA bundle
|
dnl Check for the CA bundle
|
||||||
dnl **********************************************************************
|
dnl **********************************************************************
|
||||||
@@ -1251,93 +1471,10 @@ fi dnl only done if some kind of SSL was enabled
|
|||||||
|
|
||||||
AM_CONDITIONAL(CABUNDLE, test x$ca != xno)
|
AM_CONDITIONAL(CABUNDLE, test x$ca != xno)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
dnl **********************************************************************
|
dnl **********************************************************************
|
||||||
dnl Check for the presence of ZLIB libraries and headers
|
dnl Check for the presence of IDN libraries and headers
|
||||||
dnl **********************************************************************
|
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_MSG_CHECKING([whether to build with libidn])
|
||||||
AC_ARG_WITH(libidn,
|
AC_ARG_WITH(libidn,
|
||||||
AC_HELP_STRING([--with-libidn=PATH],[Enable libidn usage])
|
AC_HELP_STRING([--with-libidn=PATH],[Enable libidn usage])
|
||||||
@@ -1466,6 +1603,10 @@ if test "x$RECENTAIX" = "xyes"; then
|
|||||||
XLC="yes"
|
XLC="yes"
|
||||||
AC_MSG_RESULT([yes])
|
AC_MSG_RESULT([yes])
|
||||||
CFLAGS="$CFLAGS -qthreaded"
|
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
|
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 10.20 is known to have a buggy one. If it doesn't work, disable use of
|
||||||
dnl it.
|
dnl it.
|
||||||
|
|
||||||
@@ -1565,6 +1706,7 @@ AC_CHECK_HEADERS(
|
|||||||
libgen.h \
|
libgen.h \
|
||||||
locale.h \
|
locale.h \
|
||||||
errno.h \
|
errno.h \
|
||||||
|
stdbool.h \
|
||||||
arpa/tftp.h \
|
arpa/tftp.h \
|
||||||
sys/filio.h \
|
sys/filio.h \
|
||||||
setjmp.h,
|
setjmp.h,
|
||||||
@@ -1594,6 +1736,7 @@ dnl default includes
|
|||||||
|
|
||||||
dnl Checks for typedefs, structures, and compiler characteristics.
|
dnl Checks for typedefs, structures, and compiler characteristics.
|
||||||
AC_C_CONST
|
AC_C_CONST
|
||||||
|
CURL_CHECK_VARIADIC_MACROS
|
||||||
AC_TYPE_SIZE_T
|
AC_TYPE_SIZE_T
|
||||||
AC_HEADER_TIME
|
AC_HEADER_TIME
|
||||||
CURL_CHECK_STRUCT_TIMEVAL
|
CURL_CHECK_STRUCT_TIMEVAL
|
||||||
@@ -1626,6 +1769,19 @@ fi
|
|||||||
AC_CHECK_TYPE(ssize_t, ,
|
AC_CHECK_TYPE(ssize_t, ,
|
||||||
AC_DEFINE(ssize_t, int, [the signed version of size_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
|
# Check for socklen_t or equivalent
|
||||||
CURL_CHECK_TYPE_SOCKLEN_T
|
CURL_CHECK_TYPE_SOCKLEN_T
|
||||||
|
|
||||||
@@ -1691,7 +1847,8 @@ AC_CHECK_FUNCS( strtoll \
|
|||||||
getprotobyname \
|
getprotobyname \
|
||||||
getrlimit \
|
getrlimit \
|
||||||
setrlimit \
|
setrlimit \
|
||||||
fork,
|
fork \
|
||||||
|
setmode,
|
||||||
dnl if found
|
dnl if found
|
||||||
[],
|
[],
|
||||||
dnl if not found, $ac_func is the name we check for
|
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)
|
AC_MSG_RESULT(yes)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
CURL_CHECK_NATIVE_WINDOWS
|
||||||
|
|
||||||
dnl ************************************************************
|
dnl ************************************************************
|
||||||
dnl enable SSPI support
|
dnl enable SSPI support
|
||||||
dnl
|
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_ARG_ENABLE(sspi,
|
||||||
AC_HELP_STRING([--enable-sspi],[Enable SSPI])
|
AC_HELP_STRING([--enable-sspi],[Enable SSPI])
|
||||||
AC_HELP_STRING([--disable-sspi],[Disable SSPI]),
|
AC_HELP_STRING([--disable-sspi],[Disable SSPI]),
|
||||||
[ case "$enableval" in
|
[ case "$enableval" in
|
||||||
yes)
|
yes)
|
||||||
AC_MSG_RESULT(yes)
|
if test "$ac_cv_native_windows" = "yes"; then
|
||||||
AC_DEFINE(USE_WINDOWS_SSPI, 1, [to enable SSPI support])
|
AC_MSG_RESULT(yes)
|
||||||
AC_SUBST(USE_WINDOWS_SSPI)
|
AC_DEFINE(USE_WINDOWS_SSPI, 1, [to enable SSPI support])
|
||||||
curl_sspi_msg="yes"
|
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)
|
AC_MSG_RESULT(no)
|
||||||
@@ -2105,9 +2269,23 @@ if test "x$ws2" = "xyes"; then
|
|||||||
dnl end.
|
dnl end.
|
||||||
|
|
||||||
LIBS="$LIBS -lws2_32"
|
LIBS="$LIBS -lws2_32"
|
||||||
|
TEST_SERVER_LIBS="$TEST_SERVER_LIBS -lws2_32"
|
||||||
|
|
||||||
fi
|
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)
|
AM_CONDITIONAL(CROSSCOMPILING, test x$cross_compiling = xyes)
|
||||||
|
|
||||||
AC_CONFIG_FILES([Makefile \
|
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
|
# This software is licensed as described in the file COPYING, which
|
||||||
# you should have received as part of this distribution. The terms
|
# you should have received as part of this distribution. The terms
|
||||||
@@ -181,8 +181,17 @@ while test $# -gt 0; do
|
|||||||
;;
|
;;
|
||||||
|
|
||||||
--libs)
|
--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"
|
echo "unknown option: $1"
|
||||||
|
@@ -182,7 +182,7 @@ Q
|
|||||||
wxWidgets
|
wxWidgets
|
||||||
|
|
||||||
Written by Casey O'Donnell
|
Written by Casey O'Donnell
|
||||||
http://homepage.mac.com/codonnell/wxcurldav/
|
http://wxcode.sourceforge.net/components/wxcurl/
|
||||||
|
|
||||||
XBLite
|
XBLite
|
||||||
|
|
||||||
|
@@ -17,7 +17,9 @@ Join the Community
|
|||||||
you start sending patches! We prefer patches and discussions being held on
|
you start sending patches! We prefer patches and discussions being held on
|
||||||
the mailing list(s), not sent to individuals.
|
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
|
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
|
the same license curl and libcurl is already using unless stated and agreed
|
||||||
@@ -43,9 +45,10 @@ The License Issue
|
|||||||
|
|
||||||
What To Read
|
What To Read
|
||||||
|
|
||||||
Source code, the man pages, the INTERNALS document, the TODO, the most recent
|
Source code, the man pages, the INTERNALS document, TODO, KNOWN_BUGS, the
|
||||||
CHANGES. Just lurking on the libcurl mailing list is gonna give you a lot of
|
most recent CHANGES. Just lurking on the libcurl mailing list is gonna give
|
||||||
insights on what's going on right now. Asking there is a good idea too.
|
you a lot of insights on what's going on right now. Asking there is a good
|
||||||
|
idea too.
|
||||||
|
|
||||||
Naming
|
Naming
|
||||||
|
|
||||||
@@ -170,3 +173,21 @@ How To Make a Patch
|
|||||||
|
|
||||||
http://gnuwin32.sourceforge.net/packages/patch.htm
|
http://gnuwin32.sourceforge.net/packages/patch.htm
|
||||||
http://gnuwin32.sourceforge.net/packages/diffutils.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>
|
Author: Daniel Stenberg <daniel@haxx.se>
|
||||||
URL: http://curl.haxx.se/legal/distro-dilemma.html
|
URL: http://curl.haxx.se/legal/distro-dilemma.html
|
||||||
|
|
||||||
Condition
|
Condition
|
||||||
|
|
||||||
This document is written to describe the situation as it is right
|
This document is written to describe the situation as it is right now.
|
||||||
now. libcurl 7.15.3 is currently the latest version available. Things may of
|
libcurl 7.16.1 is currently the latest version available. Things may of
|
||||||
course change in the future.
|
course change in the future.
|
||||||
|
|
||||||
This document reflects my view and understanding of these things. Please tell
|
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
|
Debian does however not take this stance and has officially(?) claimed that
|
||||||
OpenSSL is not a required part of the Debian operating system
|
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
|
GnuTLS
|
||||||
|
|
||||||
With the release of libcurl 7.14.0 (May 2005), libcurl can now get built to
|
Since May 2005 libcurl can get built to use GnuTLS instead of OpenSSL. GnuTLS
|
||||||
use GnuTLS instead of OpenSSL. GnuTLS is an LGPL[7] licensed library that
|
is an LGPL[7] licensed library that offers a matching set of features as
|
||||||
offers a matching set of features as OpenSSL does. Now, you can build and
|
OpenSSL does. Now, you can build and distribute an TLS/SSL capable libcurl
|
||||||
distribute an TLS/SSL capable libcurl without including any Original BSD
|
without including any Original BSD licensed code.
|
||||||
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
|
libcurl can get also get built to use yassl for the TLS/SSL layer. yassl is a
|
||||||
libraries have features the other one lacks. libcurl does not (yet) offer a
|
GPL[3] licensed library.
|
||||||
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
|
GnuTLS vs OpenSSL vs yassl
|
||||||
equivalent code has been used and thus matured for more than seven (7) years.
|
|
||||||
|
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
|
GnuTLS
|
||||||
- LGPL licensened
|
- LGPL licensened
|
||||||
@@ -82,7 +92,12 @@ GnuTLS vs OpenSSL
|
|||||||
- provides crypto functions libcurl uses for NTLM
|
- provides crypto functions libcurl uses for NTLM
|
||||||
- libcurl can do non-blocking connects with it in 7.15.4 and later
|
- 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
|
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
|
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
|
Instead, I think we should accept the fact that the SSL/TLS libraries and
|
||||||
their different licenses will fit different applications and their authors
|
their different licenses will fit different applications and their authors
|
||||||
differently depending on the applications' licenses and their general usage
|
differently depending on the applications' licenses and their general usage
|
||||||
pattern (considering how LGPL libraries for example can be burdensome for
|
pattern (considering how GPL and LGPL libraries for example can be burdensome
|
||||||
embedded systems usage).
|
for embedded systems usage).
|
||||||
|
|
||||||
In Debian land, there seems to be a common opinion that LGPL is "maximally
|
In Debian land, there seems to be a common opinion that LGPL is "maximally
|
||||||
compatible" with apps while Original BSD is not. Like this:
|
compatible" with apps while Original BSD is not. Like this:
|
||||||
@@ -101,8 +116,8 @@ The Better License, Original BSD or LGPL?
|
|||||||
|
|
||||||
More SSL Libraries
|
More SSL Libraries
|
||||||
|
|
||||||
In libcurl, there's no stopping us here. There are at least a few more Open
|
In libcurl, there's no stopping us here. There are more Open Source/Free
|
||||||
Source/Free SSL/TLS libraries and we would very much like to support them as
|
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.
|
well, to offer application authors an even wider scope of choice.
|
||||||
|
|
||||||
Application Angle of this Problem
|
Application Angle of this Problem
|
||||||
@@ -137,7 +152,7 @@ Project cURL Angle of this Problem
|
|||||||
Distro Angle of this Problem
|
Distro Angle of this Problem
|
||||||
|
|
||||||
To my knowledge there is only one distro that ships libcurl built with either
|
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
|
Debian Linux is now (since mid September 2005) providing two different
|
||||||
libcurl packages, one for libcurl built with OpenSSL and one built with
|
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
|
single system simultaneously. This has been said to be a transitional system
|
||||||
not desired to keep in the long run.
|
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
|
Footnotes
|
||||||
|
|
||||||
[1] = http://www.xfree86.org/3.3.6/COPYRIGHT2.html#6
|
[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
|
libcurl
|
||||||
|
|
||||||
A free and easy-to-use client-side URL transfer library, supporting FTP,
|
A free and easy-to-use client-side URL transfer library, supporting FTP,
|
||||||
FTPS, HTTP, HTTPS, TELNET, DICT, FILE and LDAP. libcurl supports
|
FTPS, HTTP, HTTPS, SCP, SFTP, TFTP, TELNET, DICT, FILE and LDAP. libcurl
|
||||||
HTTPS certificates, HTTP POST, HTTP PUT, FTP uploading, kerberos, HTTP
|
supports HTTPS certificates, HTTP POST, HTTP PUT, FTP uploading, kerberos,
|
||||||
form based upload, proxies, cookies, user+password authentication, file
|
HTTP form based upload, proxies, cookies, user+password authentication,
|
||||||
transfer resume, http proxy tunneling and more!
|
file transfer resume, http proxy tunneling and more!
|
||||||
|
|
||||||
libcurl is highly portable, it builds and works identically on numerous
|
libcurl is highly portable, it builds and works identically on numerous
|
||||||
platforms, including Solaris, NetBSD, FreeBSD, OpenBSD, Darwin, HPUX,
|
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.
|
A command line tool for getting or sending files using URL syntax.
|
||||||
|
|
||||||
Since curl uses libcurl, it supports a range of common Internet protocols,
|
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].
|
We pronounce curl and cURL with an initial k sound: [kurl].
|
||||||
|
|
||||||
@@ -156,7 +157,7 @@ FAQ
|
|||||||
|
|
||||||
1.3 What is curl not?
|
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
|
curl's development, have we intended curl to replace wget or compete on its
|
||||||
market. Curl is targeted at single-shot file transfers.
|
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
|
Curl is not a PHP tool, even though it works perfectly well when used from
|
||||||
or with PHP (when using the PHP/CURL module).
|
or with PHP (when using the PHP/CURL module).
|
||||||
|
|
||||||
Curl is not a single-OS program. Curl exists, compiles, builds and runs
|
Curl is not a program for a single operating system. Curl exists, compiles,
|
||||||
under a wide range of operating systems, including all modern Unixes (and a
|
builds and runs under a wide range of operating systems, including all
|
||||||
bunch of older ones too), Windows, Amiga, BeOS, OS/2, OS X, QNX etc.
|
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 ?
|
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
|
improvements and have them inserted in the main sources (of course on the
|
||||||
condition that developers agree on that the fixes are good).
|
condition that developers agree on that the fixes are good).
|
||||||
|
|
||||||
The 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.
|
file.
|
||||||
|
|
||||||
curl is developed by a community, with Daniel at the wheel.
|
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:
|
Some facts to use as input to the math:
|
||||||
|
|
||||||
curl packages have been downloaded from the curl.haxx.se site well over a
|
curl packages are downloaded from the curl.haxx.se and mirrors almost one
|
||||||
million times. curl is installed by default with most Linux
|
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
|
distributions. curl is installed by default with Mac OS X. curl and libcurl
|
||||||
as used by numerous applications that include libcurl binaries in their
|
as used by numerous applications that include libcurl binaries in their
|
||||||
distribution packages (like Adobe Acrobat Reader and Google Earth).
|
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
|
products. More than 100 known named open source projects depend on
|
||||||
(lib)curl.
|
(lib)curl.
|
||||||
|
|
||||||
@@ -305,6 +307,9 @@ FAQ
|
|||||||
based web servers. A guess is that a fair amount of these Linux
|
based web servers. A guess is that a fair amount of these Linux
|
||||||
installations have curl installed.
|
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/companies.html
|
||||||
http://curl.haxx.se/docs/programs.html
|
http://curl.haxx.se/docs/programs.html
|
||||||
http://curl.haxx.se/libcurl/using/apps.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
|
./configure places the -L/usr/local/ssl/lib early enough in the command
|
||||||
line to make things work
|
line to make things work
|
||||||
|
|
||||||
Solution submitted by: Bob Allison <allisonb@users.sourceforge.net>
|
|
||||||
|
|
||||||
2.1.2 only the libssl lib is missing
|
2.1.2 only the libssl lib is missing
|
||||||
|
|
||||||
If all include files and the libcrypto lib is present, with only the
|
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?
|
2.2 Does curl work/build with other SSL libraries?
|
||||||
|
|
||||||
Curl has been written to use OpenSSL or GnuTLS, although there should not be
|
Curl has been written to use OpenSSL, GnuTLS, yassl or NSS, although there
|
||||||
many problems using a different library. If anyone does "port" curl to use a
|
should not be many problems using a different library. If anyone does "port"
|
||||||
different SSL library, we are of course very interested in getting the
|
curl to use a different SSL library, we are of course very interested in
|
||||||
patch!
|
getting the patch!
|
||||||
|
|
||||||
2.3 Where can I find a copy of LIBEAY32.DLL?
|
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:
|
install and use them, in the libcurl section of the curl web site:
|
||||||
http://curl.haxx.se/libcurl/
|
http://curl.haxx.se/libcurl/
|
||||||
|
|
||||||
In February 2003, there are interfaces available for the following
|
In February 2007, there are interfaces available for the following
|
||||||
languages: Basic, C, C++, Cocoa, Dylan, Euphoria, Java, Lua, Object-Pascal,
|
languages: Ada95, Basic, C, C++, Ch, Cocoa, D, Dylan, Euphoria, Ferite,
|
||||||
Pascal, Perl, PHP, PostgreSQL, Python, Rexx, Ruby, Scheme and Tcl. By the
|
Gambas, glib/GTK+, Java, Lisp, Lua, Mono, .NET, Object-Pascal, O'Caml,
|
||||||
time you read this, additional ones may have appeared!
|
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?
|
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
|
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?
|
5.2 How can I receive all data into a large memory chunk?
|
||||||
|
|
||||||
[ See also the examples/getinmemory.c source ]
|
[ See also the examples/getinmemory.c source ]
|
||||||
@@ -896,8 +903,6 @@ FAQ
|
|||||||
Similarly, if you use CURLOPT_READDATA you must also specify
|
Similarly, if you use CURLOPT_READDATA you must also specify
|
||||||
CURLOPT_READFUNCTION.
|
CURLOPT_READFUNCTION.
|
||||||
|
|
||||||
(Provided by Joel DeYoung and Bob Schader)
|
|
||||||
|
|
||||||
5.6 What about Keep-Alive or persistent connections?
|
5.6 What about Keep-Alive or persistent connections?
|
||||||
|
|
||||||
curl and libcurl have excellent support for persistent connections when
|
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
|
options to the command line compiler. /MD (linking against MSVCRT dll) seems
|
||||||
to be the most commonly used option.
|
to be the most commonly used option.
|
||||||
|
|
||||||
(Provided by Andrew Francis)
|
|
||||||
|
|
||||||
When building an application that uses the static libcurl library, you must
|
When building an application that uses the static libcurl library, you must
|
||||||
add -DCURL_STATICLIB to your CFLAGS. Otherwise the linker will look for
|
add -DCURL_STATICLIB to your CFLAGS. Otherwise the linker will look for
|
||||||
dynamic import symbols. If you get linker error like "unknown symbol
|
dynamic import symbols. If you get linker error like "unknown symbol
|
||||||
|
@@ -116,10 +116,10 @@ FILE
|
|||||||
FOOTNOTES
|
FOOTNOTES
|
||||||
=========
|
=========
|
||||||
|
|
||||||
*1 = requires OpenSSL or GnuTLS
|
*1 = requires OpenSSL, GnuTLS or NSS
|
||||||
*2 = requires OpenLDAP
|
*2 = requires OpenLDAP
|
||||||
*3 = requires a GSSAPI-compliant library, such as Heimdal or similar.
|
*3 = requires a GSSAPI-compliant library, such as Heimdal or similar.
|
||||||
*4 = requires FBopenssl
|
*4 = requires FBopenssl
|
||||||
*5 = requires a krb4 library, such as the MIT one or similar.
|
*5 = requires a krb4 library, such as the MIT one or similar.
|
||||||
*6 = requires c-ares
|
*6 = requires c-ares
|
||||||
*7 = requires OpenSSL specificly, as GnuTLS only supports SSLv3 and TLSv1
|
*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
|
yassl with its OpenSSL emulation enabled and point to that directory root
|
||||||
with configure --with-ssl.
|
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
|
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
|
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
|
changelog of the current development status, as one or more of these problems
|
||||||
may have been fixed since this was written!
|
may have been fixed since this was written!
|
||||||
|
|
||||||
41. Jeff Pohlmeyer's curl_multi_socket crashing case. Recipe and instructions
|
41. When doing an operation over FTP that requires the ACCT command (but not
|
||||||
here: http://curl.haxx.se/mail/lib-2007-01/0022.html
|
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
|
40. Mac OS X test failures (Daniel Johnson)
|
||||||
http://curl.haxx.se/bug/view.cgi?id=1631566
|
http://curl.haxx.se/mail/lib-2007-03/0095.html
|
||||||
|
|
||||||
39. Steffen Rumler's Race Condition in Curl_proxyCONNECT:
|
39. Steffen Rumler's Race Condition in Curl_proxyCONNECT:
|
||||||
http://curl.haxx.se/mail/lib-2007-01/0045.html
|
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
|
"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
|
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.
|
23. SOCKS-related problems:
|
||||||
We don't have any test cases for SOCKS proxy. We probably have even more
|
A) libcurl doesn't support SOCKS for IPv6.
|
||||||
bugs and lack of features when a SOCKS proxy is used. And there seem to be a
|
B) libcurl doesn't support FTPS over a SOCKS proxy.
|
||||||
problem with SOCKS when doing FTP: See
|
C) We don't have any test cases for SOCKS proxy.
|
||||||
http://curl.haxx.se/bug/view.cgi?id=1371540
|
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
|
22. Sending files to a FTP server using curl on VMS, might lead to curl
|
||||||
complaining on "unaligned file size" on completion. The problem is related
|
complaining on "unaligned file size" on completion. The problem is related
|
||||||
@@ -109,9 +114,6 @@ may have been fixed since this was written!
|
|||||||
acknowledged after the actual TCP connect (during the SOCKS "negotiate"
|
acknowledged after the actual TCP connect (during the SOCKS "negotiate"
|
||||||
phase).
|
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
|
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
|
(fake) user name (this concerns both curl and the lib) because the code
|
||||||
wrongly only considers authentication if there's a user name provided.
|
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
|
distributing them as binaries would be to violate the GPL license - unless you
|
||||||
accompany your license with an exception[2]. This particular problem was
|
accompany your license with an exception[2]. This particular problem was
|
||||||
addressed when the Modified BSD license was created, which does not have the
|
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
|
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
|
OpenSSL http://www.openssl.org/source/license.html
|
||||||
|
|
||||||
(May be used for SSL/TLS support) Uses an Original BSD-style license
|
(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
|
are not allowed to ship binaries that link with OpenSSL that includes
|
||||||
GPL code (unless that specific GPL code includes an exception for
|
GPL code (unless that specific GPL code includes an exception for
|
||||||
OpenSSL - a habit that is growing more and more common). If OpenSSL's
|
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
|
(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.
|
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
|
c-ares http://daniel.haxx.se/projects/c-ares/license.html
|
||||||
|
|
||||||
(Used for asynchronous name resolves) Uses an MIT license that is very
|
(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
|
that it uses the OpenSSL license and thus shares the same issues as
|
||||||
described for OpenSSL above.
|
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
|
(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
|
"copyleft". This license requires more requirements to be met when
|
||||||
distributing binaries, see the license for details. Also note that if
|
distributing binaries, see the license for details. Also note that if
|
||||||
you distribute a binary that includes this library, you must also
|
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
|
libcurl uses OpenLDAP as a shared library only, I have not heard of
|
||||||
anyone that ships OpenLDAP linked with libcurl in an app.
|
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
|
[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
|
[2] = http://www.fsf.org/licenses/gpl-faq.html#GPLIncompatibleLibs details on
|
||||||
how to write such an exception to the GPL
|
how to write such an exception to the GPL
|
||||||
[3] = LGPL - GNU Lesser General Public License:
|
[3] = LGPL - GNU Lesser General Public License:
|
||||||
http://www.gnu.org/licenses/lgpl.html
|
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
|
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/
|
curl http://www.netscape.com/
|
||||||
|
|
||||||
@@ -39,6 +39,15 @@ SIMPLE USAGE
|
|||||||
|
|
||||||
curl --ftp-ssl ftp://files.are.secure.com/secrets.txt
|
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
|
DOWNLOAD TO A FILE
|
||||||
|
|
||||||
@@ -79,9 +88,8 @@ USING PASSWORDS
|
|||||||
|
|
||||||
HTTP
|
HTTP
|
||||||
|
|
||||||
The HTTP URL doesn't support user and password in the URL string. Curl
|
Curl also supports user and password in HTTP URLs, thus you can pick a file
|
||||||
does support that anyway to provide a ftp-style interface and thus you can
|
like:
|
||||||
pick a file like:
|
|
||||||
|
|
||||||
curl http://name:passwd@machine.domain/full/path/to/file
|
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
|
curl -z -local.html http://remote.server.com/remote.html
|
||||||
|
|
||||||
You can specify a "free text" date as condition. Tell curl to only download
|
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
|
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 '-'.
|
check the other way around by prepending it with a dash '-'.
|
||||||
|
10
docs/TODO
10
docs/TODO
@@ -157,18 +157,14 @@ TODO
|
|||||||
Clark)
|
Clark)
|
||||||
|
|
||||||
* Make curl's SSL layer capable of using other free SSL libraries. Such as
|
* Make curl's SSL layer capable of using other free SSL libraries. Such as
|
||||||
Mozilla Security Services
|
MatrixSSL (http://www.matrixssl.org/).
|
||||||
(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.
|
|
||||||
|
|
||||||
* Peter Sylvester's patch for SRP on the TLS layer.
|
* Peter Sylvester's patch for SRP on the TLS layer.
|
||||||
Awaits OpenSSL support for this, no need to support this in libcurl before
|
Awaits OpenSSL support for this, no need to support this in libcurl before
|
||||||
there's an OpenSSL release that does it.
|
there's an OpenSSL release that does it.
|
||||||
|
|
||||||
* make the configure --with-ssl option first check for OpenSSL and then for
|
* make the configure --with-ssl option first check for OpenSSL, then GnuTLS,
|
||||||
GnuTLS if OpenSSL wasn't detected.
|
then NSS...
|
||||||
|
|
||||||
GnuTLS
|
GnuTLS
|
||||||
|
|
||||||
|
71
docs/curl.1
71
docs/curl.1
@@ -21,7 +21,7 @@
|
|||||||
.\" * $Id$
|
.\" * $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
|
.SH NAME
|
||||||
curl \- transfer a URL
|
curl \- transfer a URL
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
@@ -167,6 +167,10 @@ difference.
|
|||||||
must be using valid ciphers. Read up on SSL cipher list details on this URL:
|
must be using valid ciphers. Read up on SSL cipher list details on this URL:
|
||||||
\fIhttp://www.openssl.org/docs/apps/ciphers.html\fP
|
\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.
|
If this option is used several times, the last one will override the others.
|
||||||
.IP "--compressed"
|
.IP "--compressed"
|
||||||
(HTTP) Request a compressed response using one of the algorithms libcurl
|
(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
|
private certificate concatenated! See \fI--cert\fP and \fI--key\fP to specify
|
||||||
them independently.
|
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.
|
If this option is used several times, the last one will be used.
|
||||||
.IP "--cert-type <type>"
|
.IP "--cert-type <type>"
|
||||||
(SSL) Tells curl what certificate type the provided certificate is in. PEM,
|
(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
|
\'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.
|
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.
|
If this option is used several times, the last one will be used.
|
||||||
.IP "--capath <CA certificate directory>"
|
.IP "--capath <CA certificate directory>"
|
||||||
(SSL) Tells curl to use the specified certificate directory to verify the
|
(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)
|
(FTP) Use CCC (Clear Command Channel)
|
||||||
Shuts down the SSL/TLS layer after authenticating. The rest of the
|
Shuts down the SSL/TLS layer after authenticating. The rest of the
|
||||||
control channel communication will be unencrypted. This allows
|
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)
|
(Added in 7.16.1)
|
||||||
|
|
||||||
If this option is used twice, the second will again disable this.
|
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>"
|
.IP "-F/--form <name=content>"
|
||||||
(HTTP) This lets curl emulate a filled in form in which a user has pressed the
|
(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
|
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.
|
If this option is used twice, the second time will again disable it.
|
||||||
.IP "--key <key>"
|
.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.
|
separate file.
|
||||||
|
|
||||||
If this option is used several times, the last one will be used.
|
If this option is used several times, the last one will be used.
|
||||||
@@ -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
|
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
|
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
|
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
|
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
|
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/"
|
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
|
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
|
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
|
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
|
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.
|
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>"
|
.IP "--libcurl <file>"
|
||||||
Append this option to any ordinary curl command line, and you will get a
|
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
|
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.
|
You may use this option as many times as you have number of URLs.
|
||||||
.IP "--pass <phrase>"
|
.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.
|
If this option is used several times, the last one will be used.
|
||||||
.IP "--proxy-anyauth"
|
.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.
|
remote port number curl wants to tunnel through to.
|
||||||
|
|
||||||
If this option is used twice, the second will again disable proxy tunnel.
|
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>"
|
.IP "-P/--ftp-port <address>"
|
||||||
(FTP) Reverses the initiator/listener roles when connecting with ftp. This
|
(FTP) Reverses the initiator/listener roles when connecting with ftp. This
|
||||||
switch makes Curl use the PORT command instead of PASV. In practice, PORT
|
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.
|
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.
|
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"
|
.IP "-R/--remote-time"
|
||||||
When used, this will make libcurl attempt to figure out the timestamp of the
|
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
|
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
|
descriptive information, to the given output file. Use "-" as filename to have
|
||||||
the output sent to stdout.
|
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.
|
If this option is used several times, the last one will be used.
|
||||||
.IP "--trace-ascii <file>"
|
.IP "--trace-ascii <file>"
|
||||||
Enables a full trace dump of all incoming and outgoing data, including
|
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
|
shows the ASCII part of the dump. It makes smaller output that might be easier
|
||||||
to read for untrained humans.
|
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.
|
If this option is used several times, the last one will be used.
|
||||||
.IP "--trace-time"
|
.IP "--trace-time"
|
||||||
Prepends a time stamp to each trace or verbose line that curl displays.
|
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
|
If you think this option still doesn't give you enough details, consider using
|
||||||
\fI--trace\fP or \fI--trace-ascii\fP instead.
|
\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"
|
.IP "-V/--version"
|
||||||
Displays information about curl and the libcurl version it uses.
|
Displays information about curl and the libcurl version it uses.
|
||||||
|
|
||||||
|
@@ -1,13 +1,16 @@
|
|||||||
|
# $Id$
|
||||||
#
|
#
|
||||||
# Adapted for djgpp / Watt-32 / DOS by
|
# Adapted for djgpp / Watt-32 / DOS by
|
||||||
# Gisle Vanem <giva@bgnett.no>
|
# 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)
|
ifeq ($(USE_SSL),1)
|
||||||
LIBS += $(OPENSSL_ROOT)/lib/libssl.a $(OPENSSL_ROOT)/lib/libcrypt.a
|
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
|
LIBS += $(WATT32_ROOT)/lib/libwatt.a $(ZLIB_ROOT)/libz.a
|
||||||
|
|
||||||
CSOURCES = fopen.c ftpget.c ftpgetresp.c ftpupload.c getinmemory.c \
|
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 \
|
http-post.c httpput.c https.c multi-app.c multi-double.c \
|
||||||
multi-single.c persistant.c post-callback.c postit2.c \
|
multi-post.c multi-single.c persistant.c post-callback.c \
|
||||||
sepheaders.c simple.c simplessl.c https.c ftp3rdparty.c \
|
postit2.c sepheaders.c simple.c simplepost.c simplessl.c \
|
||||||
getinfo.c anyauthput.c cookie_interface.c 10-at-a-time.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)
|
PROGRAMS = $(CSOURCES:.c=.exe)
|
||||||
|
|
||||||
all: $(PROGRAMS)
|
all: $(PROGRAMS)
|
||||||
|
@echo Welcome to libcurl example program
|
||||||
|
|
||||||
%.exe: %.c
|
%.exe: %.c
|
||||||
$(CC) $(CFLAGS) -o $@ $^ $(LIBS)
|
$(CC) $(CFLAGS) -o $@ $^ $(LIBS)
|
||||||
@echo
|
@echo
|
||||||
|
|
||||||
clean:
|
clean vclean realclean:
|
||||||
rm -f $(PROGRAMS)
|
- 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
|
.\" * This software is licensed as described in the file COPYING, which
|
||||||
.\" * you should have received as part of this distribution. The terms
|
.\" * you should have received as part of this distribution. The terms
|
||||||
@@ -98,13 +98,13 @@ downloaded. The amount is only for the latest transfer and will be reset again
|
|||||||
for each new transfer.
|
for each new transfer.
|
||||||
.IP CURLINFO_SPEED_DOWNLOAD
|
.IP CURLINFO_SPEED_DOWNLOAD
|
||||||
Pass a pointer to a double to receive the average download speed that curl
|
Pass a pointer to a double to receive the average download speed that curl
|
||||||
measured for the complete download.
|
measured for the complete download. Measured in bytes/second.
|
||||||
.IP CURLINFO_SPEED_UPLOAD
|
.IP CURLINFO_SPEED_UPLOAD
|
||||||
Pass a pointer to a double to receive the average upload speed that curl
|
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
|
.IP CURLINFO_HEADER_SIZE
|
||||||
Pass a pointer to a long to receive the total size of all the headers
|
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
|
.IP CURLINFO_REQUEST_SIZE
|
||||||
Pass a pointer to a long to receive the total size of the issued
|
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
|
requests. This is so far only for HTTP requests. Note that this may be more
|
||||||
|
@@ -21,7 +21,7 @@
|
|||||||
.\" * $Id$
|
.\" * $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
|
.SH NAME
|
||||||
curl_easy_setopt \- set options for a curl easy handle
|
curl_easy_setopt \- set options for a curl easy handle
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
@@ -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
|
\fBall_proxy\fP etc, if any of those is set. The \fICURLOPT_PROXY\fP option
|
||||||
does however override any possibly set environment variables.
|
does however override any possibly set environment variables.
|
||||||
|
|
||||||
Starting with 7.14.1, the proxy host string given in environment variables can
|
Setting the proxy string to "" (an empty string) will explicitly disable the
|
||||||
be specified the exact same way as the proxy can be set with
|
use of a proxy, even if there is an environment variable set for it.
|
||||||
\fICURLOPT_PROXY\fP, include protocol prefix (http://) and embedded user +
|
|
||||||
password.
|
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
|
.IP CURLOPT_PROXYPORT
|
||||||
Pass a long with this option to set the proxy port to connect to unless it is
|
Pass a long with this option to set the proxy port to connect to unless it is
|
||||||
specified in the proxy string \fICURLOPT_PROXY\fP.
|
specified in the proxy string \fICURLOPT_PROXY\fP.
|
||||||
@@ -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
|
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
|
progress, and will simply stop the download when the server ends the
|
||||||
connection. (added in 7.14.1)
|
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
|
.RE
|
||||||
.SH FTP OPTIONS
|
.SH FTP OPTIONS
|
||||||
.IP CURLOPT_FTPPORT
|
.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"
|
Try "AUTH TLS" first, and only if that fails try "AUTH SSL"
|
||||||
.RE
|
.RE
|
||||||
.IP CURLOPT_FTP_SSL_CCC
|
.IP CURLOPT_FTP_SSL_CCC
|
||||||
Pass a long that is set to 0 to disable and 1 to enable. If enabled, this
|
If enabled, this option makes libcurl use CCC (Clear Command Channel). It
|
||||||
option makes libcurl use CCC (Clear Command Channel). It shuts down the
|
shuts down the SSL/TLS layer after authenticating. The rest of the
|
||||||
SSL/TLS layer after authenticating. The rest of the control channel
|
control channel communication will be unencrypted. This allows NAT routers
|
||||||
communication will be unencrypted. This allows NAT routers to follow the FTP
|
to follow the FTP transaction. Pass a long using one of the values below.
|
||||||
transaction. (Added in 7.16.1)
|
(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
|
.IP CURLOPT_FTP_ACCOUNT
|
||||||
Pass a pointer to a zero-terminated string (or NULL to disable). When an FTP
|
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,
|
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
|
In unix-like systems, this might cause signals to be used unless
|
||||||
\fICURLOPT_NOSIGNAL\fP is set.
|
\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
|
.IP CURLOPT_LOW_SPEED_LIMIT
|
||||||
Pass a long as parameter. It contains the transfer speed in bytes per second
|
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
|
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
|
less than or equal to the parameter value. Defaults to unlimited
|
||||||
speed. (Added in 7.15.5)
|
speed. (Added in 7.15.5)
|
||||||
.IP CURLOPT_MAX_RECV_SPEED_LARGE
|
.IP CURLOPT_MAX_RECV_SPEED_LARGE
|
||||||
Pass a curl_off_t as parameter. If an upload exceeds this speed on cumulative
|
Pass a curl_off_t as parameter. If a download exceeds this speed on
|
||||||
average during the transfer, the transfer will pause to keep the average rate
|
cumulative average during the transfer, the transfer will pause to keep the
|
||||||
less than or equal to the parameter value. Defaults to unlimited speed. (Added
|
average rate less than or equal to the parameter value. Defaults to unlimited
|
||||||
in 7.15.5)
|
speed. (Added in 7.15.5)
|
||||||
.IP CURLOPT_MAXCONNECTS
|
.IP CURLOPT_MAXCONNECTS
|
||||||
Pass a long. The set number will be the persistent connection cache size. The
|
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
|
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
|
In unix-like systems, this might cause signals to be used unless
|
||||||
\fICURLOPT_NOSIGNAL\fP is set.
|
\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
|
.IP CURLOPT_IPRESOLVE
|
||||||
Allows an application to select what kind of IP addresses to use when
|
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
|
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
|
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
|
the file name of your certificate. The default format is "PEM" and can be
|
||||||
changed with \fICURLOPT_SSLCERTTYPE\fP.
|
changed with \fICURLOPT_SSLCERTTYPE\fP.
|
||||||
|
|
||||||
|
With NSS this is the nickname of the certificate you wish to authenticate
|
||||||
|
with.
|
||||||
.IP CURLOPT_SSLCERTTYPE
|
.IP CURLOPT_SSLCERTTYPE
|
||||||
Pass a pointer to a zero terminated string as parameter. The string should be
|
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
|
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.
|
\&"DER" format key file currently does not work because of a bug in OpenSSL.
|
||||||
.IP CURLOPT_SSLKEYPASSWD
|
.IP CURLOPT_SSLKEYPASSWD
|
||||||
Pass a pointer to a zero terminated string as parameter. It will be used as
|
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
|
.IP CURLOPT_SSLENGINE
|
||||||
Pass a pointer to a zero terminated string as parameter. It will be used as
|
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
|
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:
|
The available options are:
|
||||||
.RS
|
.RS
|
||||||
.IP CURL_SSLVERSION_DEFAULT
|
.IP CURL_SSLVERSION_DEFAULT
|
||||||
The default action. When libcurl built with OpenSSL, this will attempt to
|
The default action. When libcurl built with OpenSSL or NSS, this will attempt
|
||||||
figure out the remote SSL protocol version. Unfortunately there are a lot of
|
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
|
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.
|
fail to connect. When libcurl is built with GnuTLS, this will mean SSLv3.
|
||||||
.IP CURL_SSLVERSION_TLSv1
|
.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
|
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.
|
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
|
.IP CURLOPT_CAPATH
|
||||||
Pass a char * to a zero terminated string naming a directory holding multiple
|
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
|
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,
|
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
|
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
|
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
|
\'SHA1+DES\', 'TLSv1' and 'DEFAULT'. The default list is normally set when you
|
||||||
compile OpenSSL.
|
compile OpenSSL.
|
||||||
|
|
||||||
You'll find more details about cipher lists on this URL:
|
You'll find more details about cipher lists on this URL:
|
||||||
\fIhttp://www.openssl.org/docs/apps/ciphers.html\fP
|
\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
|
.IP CURLOPT_SSL_SESSIONID_CACHE
|
||||||
Pass a long set to 0 to disable libcurl's use of SSL session-ID caching. Set
|
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
|
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
|
.IP CURLOPT_SSH_PRIVATE_KEYFILE
|
||||||
Pass a char * pointing to a file name for your private key. If not used,
|
Pass a char * pointing to a file name for your private key. If not used,
|
||||||
libcurl defaults to using \fB~/.ssh/id_dsa\fP.
|
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
|
.SH OTHER OPTIONS
|
||||||
.IP CURLOPT_PRIVATE
|
.IP CURLOPT_PRIVATE
|
||||||
Pass a char * as parameter, pointing to data that should be associated with
|
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
|
.\" * This software is licensed as described in the file COPYING, which
|
||||||
.\" * you should have received as part of this distribution. The terms
|
.\" * you should have received as part of this distribution. The terms
|
||||||
@@ -21,7 +21,7 @@
|
|||||||
.\" * $Id$
|
.\" * $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
|
.SH NAME
|
||||||
libcurl-multi \- how to use the multi interface
|
libcurl-multi \- how to use the multi interface
|
||||||
.SH DESCRIPTION
|
.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
|
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
|
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).
|
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
|
.\" * This software is licensed as described in the file COPYING, which
|
||||||
.\" * you should have received as part of this distribution. The terms
|
.\" * you should have received as part of this distribution. The terms
|
||||||
@@ -21,7 +21,7 @@
|
|||||||
.\" * $Id$
|
.\" * $Id$
|
||||||
.\" **************************************************************************
|
.\" **************************************************************************
|
||||||
.\"
|
.\"
|
||||||
.TH libcurl-tutorial 3 "9 May 2005" "libcurl" "libcurl programming"
|
.TH libcurl-tutorial 3 "27 Feb 2007" "libcurl" "libcurl programming"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
libcurl-tutorial \- libcurl programming tutorial
|
libcurl-tutorial \- libcurl programming tutorial
|
||||||
.SH "Objective"
|
.SH "Objective"
|
||||||
@@ -64,10 +64,10 @@ $ curl-config --libs
|
|||||||
.IP "SSL or Not"
|
.IP "SSL or Not"
|
||||||
libcurl can be built and customized in many ways. One of the things that
|
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
|
varies from different libraries and builds is the support for SSL-based
|
||||||
transfers, like HTTPS and FTPS. If OpenSSL was detected properly at
|
transfers, like HTTPS and FTPS. If a supported SSL library was detected
|
||||||
build-time, libcurl will be built with SSL support. To figure out if an
|
properly at build-time, libcurl will be built with SSL support. To figure out
|
||||||
installed libcurl has been built with SSL support enabled, use 'curl-config'
|
if an installed libcurl has been built with SSL support enabled, use
|
||||||
like this:
|
\&'curl-config' like this:
|
||||||
|
|
||||||
$ curl-config --feature
|
$ 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
|
your program already does this or of another library in use does it, you
|
||||||
should not tell libcurl to do this as well.
|
should not tell libcurl to do this as well.
|
||||||
.IP CURL_GLOBAL_SSL
|
.IP CURL_GLOBAL_SSL
|
||||||
which only does anything on libcurls compiled and built
|
which only does anything on libcurls compiled and built SSL-enabled. On these
|
||||||
SSL-enabled. On these systems, this will make libcurl initialize OpenSSL
|
systems, this will make libcurl initialize the SSL library properly for this
|
||||||
properly for this application. This is only needed to do once for each
|
application. This is only needed to do once for each application so if your
|
||||||
application so if your program or another library already does this, this
|
program or another library already does this, this bit should not be needed.
|
||||||
bit should not be needed.
|
|
||||||
.RE
|
.RE
|
||||||
|
|
||||||
libcurl has a default protection mechanism that detects if
|
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..
|
built without c-ares support and not on Windows..
|
||||||
|
|
||||||
If you are accessing HTTPS or FTPS URLs in a multi-threaded manner, you are
|
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
|
then of course using the underlying SSL library multi-threaded and those libs
|
||||||
own requirements on this issue. Basically, you need to provide one or two
|
might have their own requirements on this issue. Basically, you need to
|
||||||
functions to allow it to function properly. For all details, see this:
|
provide one or two functions to allow it to function properly. For all
|
||||||
|
details, see this:
|
||||||
|
|
||||||
OpenSSL
|
OpenSSL
|
||||||
|
|
||||||
http://www.openssl.org/docs/crypto/threads.html#DESCRIPTION
|
http://www.openssl.org/docs/crypto/threads.html#DESCRIPTION
|
||||||
|
|
||||||
GnuTLS
|
GnuTLS
|
||||||
|
|
||||||
http://www.gnu.org/software/gnutls/manual/html_node/Multi_002dthreaded-applications.html
|
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
|
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
|
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
|
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
|
for another" but also "the agency, function, or office of a deputy who acts as
|
||||||
a substitute for another".
|
a substitute for another".
|
||||||
|
|
||||||
Proxies are exceedingly common these days. Companies often only offer
|
Proxies are exceedingly common these days. Companies often only offer Internet
|
||||||
Internet access to employees through their HTTP proxies. Network clients or
|
access to employees through their proxies. Network clients or user-agents ask
|
||||||
user-agents ask the proxy for documents, the proxy does the actual request
|
the proxy for documents, the proxy does the actual request and then it returns
|
||||||
and then it returns them.
|
them.
|
||||||
|
|
||||||
libcurl has full support for HTTP proxies, so when a given URL is wanted,
|
libcurl supports SOCKS and HTTP proxies. When a given URL is wanted, libcurl
|
||||||
libcurl will ask the proxy for it instead of trying to connect to the actual
|
will ask the proxy for it instead of trying to connect to the actual host
|
||||||
host identified in the URL.
|
identified in the URL.
|
||||||
|
|
||||||
The fact that the proxy is a HTTP proxy puts certain restrictions on what can
|
If you're using a SOCKS proxy, you may find that libcurl doesn't quite support
|
||||||
actually happen. A requested URL that might not be a HTTP URL will be still
|
all operations through it.
|
||||||
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
|
For HTTP proxies: the fact that the proxy is a HTTP proxy puts certain
|
||||||
at times it is very important to understand that all operations over a HTTP
|
restrictions on what can actually happen. A requested URL that might not be a
|
||||||
proxy is using the HTTP protocol. For example, you can't invoke your own
|
HTTP URL will be still be passed to the HTTP proxy to deliver back to
|
||||||
custom FTP commands or even proper FTP directory listings.
|
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"
|
.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
|
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.
|
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"
|
.IP "Environment Variables"
|
||||||
|
|
||||||
libcurl automatically checks and uses a set of environment variables to
|
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
|
variable may say so. If 'no_proxy' is a plain asterisk ("*") it matches all
|
||||||
hosts.
|
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"
|
.IP "SSL and Proxies"
|
||||||
|
|
||||||
SSL is for secure point-to-point connections. This involves strong encryption
|
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
|
point in changing this value, and if you think of changing this it is often
|
||||||
just a matter of thinking again.
|
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
|
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
|
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
|
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"
|
.SH "HTTP Headers Used by libcurl"
|
||||||
When you use libcurl to do HTTP requests, it'll pass along a series of headers
|
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"
|
.IP "Host"
|
||||||
This header is required by HTTP 1.1 and even many 1.0 servers and should be
|
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 "Accept"
|
||||||
\&"*/*".
|
\&"*/*".
|
||||||
|
|
||||||
.IP "Expect:"
|
.IP "Expect"
|
||||||
When doing multi-part formposts, libcurl will set this header to
|
When doing POST requests, libcurl sets this header to \&"100-continue" to ask
|
||||||
\&"100-continue" to ask the server for an "OK" message before it proceeds with
|
the server for an "OK" message before it proceeds with sending the data part
|
||||||
sending the data part of the post.
|
of the post. If the POSTed data amount is deemed "small", libcurl will not use
|
||||||
|
this header.
|
||||||
|
|
||||||
.SH "Customizing Operations"
|
.SH "Customizing Operations"
|
||||||
There is an ongoing development today where more and more protocols are built
|
There is an ongoing development today where more and more protocols are built
|
||||||
@@ -888,12 +889,10 @@ data size is unknown.
|
|||||||
|
|
||||||
.IP "HTTP Version"
|
.IP "HTTP Version"
|
||||||
|
|
||||||
There's only one aspect left in the HTTP requests that we haven't yet
|
All HTTP requests includes the version number to tell the server which version
|
||||||
mentioned how to modify: the version field. All HTTP requests includes the
|
we support. libcurl speak HTTP 1.1 by default. Some very old servers don't
|
||||||
version number to tell the server which version we support. libcurl speak HTTP
|
like getting 1.1-requests and when dealing with stubborn old things like that,
|
||||||
1.1 by default. Some very old servers don't like getting 1.1-requests and when
|
you can tell libcurl to use 1.0 instead by doing something like this:
|
||||||
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);
|
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
|
depend on that fact. It makes it easier for you to add custom header parsers
|
||||||
etc.
|
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! ;-)
|
actually true headers, but in this case we pretend they are! ;-)
|
||||||
|
|
||||||
.SH "Post Transfer Information"
|
.SH "Post Transfer Information"
|
||||||
|
@@ -71,7 +71,8 @@ AC_DEFUN([LIBCURL_CHECK_CONFIG],
|
|||||||
if test -d "$_libcurl_with" ; then
|
if test -d "$_libcurl_with" ; then
|
||||||
LIBCURL_CPPFLAGS="-I$withval/include"
|
LIBCURL_CPPFLAGS="-I$withval/include"
|
||||||
_libcurl_ldflags="-L$withval/lib"
|
_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
|
else
|
||||||
AC_PATH_PROG([_libcurl_config],[curl-config])
|
AC_PATH_PROG([_libcurl_config],[curl-config])
|
||||||
fi
|
fi
|
||||||
|
@@ -465,6 +465,14 @@ typedef enum {
|
|||||||
CURLFTPSSL_LAST /* not an option, never use */
|
CURLFTPSSL_LAST /* not an option, never use */
|
||||||
} curl_ftpssl;
|
} 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 */
|
/* parameter for the CURLOPT_FTPSSLAUTH option */
|
||||||
typedef enum {
|
typedef enum {
|
||||||
CURLFTPAUTH_DEFAULT, /* let libcurl decide */
|
CURLFTPAUTH_DEFAULT, /* let libcurl decide */
|
||||||
@@ -1054,6 +1062,15 @@ typedef enum {
|
|||||||
/* Send CCC (Clear Command Channel) after authentication */
|
/* Send CCC (Clear Command Channel) after authentication */
|
||||||
CINIT(FTP_SSL_CCC, LONG, 154),
|
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 */
|
CURLOPT_LASTENTRY /* the last unused */
|
||||||
} CURLoption;
|
} 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
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -28,13 +28,13 @@
|
|||||||
|
|
||||||
/* This is the version number of the libcurl package from which this header
|
/* This is the version number of the libcurl package from which this header
|
||||||
file origins: */
|
file origins: */
|
||||||
#define LIBCURL_VERSION "7.16.1-CVS"
|
#define LIBCURL_VERSION "7.16.2-CVS"
|
||||||
|
|
||||||
/* The numeric version number is also available "in parts" by using these
|
/* The numeric version number is also available "in parts" by using these
|
||||||
defines: */
|
defines: */
|
||||||
#define LIBCURL_VERSION_MAJOR 7
|
#define LIBCURL_VERSION_MAJOR 7
|
||||||
#define LIBCURL_VERSION_MINOR 16
|
#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
|
/* This is the numeric version of the libcurl version number, meant for easier
|
||||||
parsing and comparions by programs. The LIBCURL_VERSION_NUM define will
|
parsing and comparions by programs. The LIBCURL_VERSION_NUM define will
|
||||||
@@ -51,6 +51,17 @@
|
|||||||
and it is always a greater number in a more recent release. It makes
|
and it is always a greater number in a more recent release. It makes
|
||||||
comparisons with greater than and less than work.
|
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 */
|
#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
|
# This software is licensed as described in the file COPYING, which
|
||||||
# you should have received as part of this distribution. The terms
|
# you should have received as part of this distribution. The terms
|
||||||
@@ -39,6 +39,7 @@ EXTRA_DIST = Makefile.b32 Makefile.m32 Makefile.vc6 Makefile.riscos \
|
|||||||
CLEANFILES = $(DSP) $(VCPROJ)
|
CLEANFILES = $(DSP) $(VCPROJ)
|
||||||
|
|
||||||
lib_LTLIBRARIES = libcurl.la
|
lib_LTLIBRARIES = libcurl.la
|
||||||
|
LIBCURL_LIBS = @LIBCURL_LIBS@
|
||||||
|
|
||||||
# we use srcdir/include for the static global include files
|
# we use srcdir/include for the static global include files
|
||||||
# we use builddir/lib for the generated lib/config.h file to get found
|
# we use builddir/lib for the generated lib/config.h file to get found
|
||||||
@@ -89,7 +90,7 @@ if MIMPURE
|
|||||||
MIMPURE = -mimpure-text
|
MIMPURE = -mimpure-text
|
||||||
endif
|
endif
|
||||||
|
|
||||||
libcurl_la_LDFLAGS = $(UNDEF) $(VERSION) $(MIMPURE)
|
libcurl_la_LDFLAGS = $(UNDEF) $(VERSION) $(MIMPURE) $(LIBCURL_LIBS)
|
||||||
|
|
||||||
# Makefile.inc provides the CSOURCES and HHEADERS defines
|
# Makefile.inc provides the CSOURCES and HHEADERS defines
|
||||||
include Makefile.inc
|
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 \
|
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 \
|
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 \
|
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 \
|
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 \
|
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 \
|
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 \
|
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 \
|
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
|
ifdef SSPI
|
||||||
CFLAGS += -DUSE_WINDOWS_SSPI
|
CFLAGS += -DUSE_WINDOWS_SSPI
|
||||||
endif
|
endif
|
||||||
|
ifdef IPV6
|
||||||
|
CFLAGS += -DENABLE_IPV6
|
||||||
|
endif
|
||||||
COMPILE = $(CC) $(INCLUDES) $(CFLAGS)
|
COMPILE = $(CC) $(INCLUDES) $(CFLAGS)
|
||||||
|
|
||||||
# Makefile.inc provides the CSOURCES and HHEADERS defines
|
# Makefile.inc provides the CSOURCES and HHEADERS defines
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
#################################################################
|
#################################################################
|
||||||
|
# $Id$
|
||||||
#
|
#
|
||||||
## Makefile for building libcurl.nlm (NetWare version - gnu make)
|
## Makefile for building libcurl.nlm (NetWare version - gnu make)
|
||||||
## Use: make -f Makefile.netware
|
## Use: make -f Makefile.netware
|
||||||
@@ -19,7 +20,7 @@ endif
|
|||||||
|
|
||||||
# Edit the path below to point to the base of your OpenSSL package.
|
# Edit the path below to point to the base of your OpenSSL package.
|
||||||
ifndef OPENSSL_PATH
|
ifndef OPENSSL_PATH
|
||||||
OPENSSL_PATH = ../../openssl-0.9.8d
|
OPENSSL_PATH = ../../openssl-0.9.8e
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# Edit the path below to point to the base of your LibSSH2 package.
|
# 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)
|
ifeq ($(CC),mwccnlm)
|
||||||
LD = mwldnlm
|
LD = mwldnlm
|
||||||
LDFLAGS = -nostdlib $(PRELUDE) $(OBJL) -o $(TARGET).nlm -commandfile
|
LDFLAGS = -nostdlib $(PRELUDE) $(OBJL) -o $@ -commandfile
|
||||||
AR = mwldnlm
|
AR = mwldnlm
|
||||||
ARFLAGS = -type library -w nocmdline $(OBJS) -o
|
ARFLAGS = -type library -w nocmdline $(OBJS) -o
|
||||||
|
LIBEXT = lib
|
||||||
CFLAGS += -msgstyle gcc -gccinc -inline off -opt nointrinsics -proc 586
|
CFLAGS += -msgstyle gcc -gccinc -inline off -opt nointrinsics -proc 586
|
||||||
CFLAGS += -relax_pointers
|
CFLAGS += -relax_pointers
|
||||||
#CFLAGS += -w on
|
#CFLAGS += -w on
|
||||||
@@ -101,6 +103,7 @@ LD = nlmconv
|
|||||||
LDFLAGS = -T
|
LDFLAGS = -T
|
||||||
AR = ar
|
AR = ar
|
||||||
ARFLAGS = -cq
|
ARFLAGS = -cq
|
||||||
|
LIBEXT = a
|
||||||
CFLAGS += -fno-builtin -fpcc-struct-return -fno-strict-aliasing
|
CFLAGS += -fno-builtin -fpcc-struct-return -fno-strict-aliasing
|
||||||
CFLAGS += -Wall # -pedantic
|
CFLAGS += -Wall # -pedantic
|
||||||
ifeq ($(LIBARCH),LIBC)
|
ifeq ($(LIBARCH),LIBC)
|
||||||
@@ -115,36 +118,40 @@ NDK_ROOT = $(NDKBASE)/ndk
|
|||||||
SDK_CLIB = $(NDK_ROOT)/nwsdk
|
SDK_CLIB = $(NDK_ROOT)/nwsdk
|
||||||
SDK_LIBC = $(NDK_ROOT)/libc
|
SDK_LIBC = $(NDK_ROOT)/libc
|
||||||
SDK_LDAP = $(NDK_ROOT)/cldapsdk/netware
|
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
|
ifdef WITH_ARES
|
||||||
INCLUDES += -I../ares
|
INCLUDES += -I$(ARES_LIB)
|
||||||
LDLIBS = ../ares/libcares.lib
|
LDLIBS = $(ARES_LIB)/libcares.$(LIBEXT)
|
||||||
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
|
|
||||||
endif
|
endif
|
||||||
ifdef WITH_ZLIB
|
ifdef WITH_ZLIB
|
||||||
INCLUDES += -I$(ZLIB_PATH)
|
INCLUDES += -I$(ZLIB_PATH)
|
||||||
ifdef LINK_STATIC
|
ifdef LINK_STATIC
|
||||||
LDLIBS += $(ZLIB_PATH)/nw/libz.lib
|
LDLIBS += $(ZLIB_PATH)/nw/libz.$(LIBEXT)
|
||||||
else
|
else
|
||||||
IMPORTS += @$(ZLIB_PATH)/nw/libz.imp
|
|
||||||
MODULES += libz.nlm
|
MODULES += libz.nlm
|
||||||
|
IMPORTS += @$(ZLIB_PATH)/nw/libz.imp
|
||||||
endif
|
endif
|
||||||
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)
|
ifeq ($(LIBARCH),LIBC)
|
||||||
INCLUDES += -I$(SDK_LIBC)/include -I$(SDK_LIBC)/include/nks
|
INCLUDES += -I$(SDK_LIBC)/include -I$(SDK_LIBC)/include/nks
|
||||||
@@ -181,15 +188,15 @@ endif
|
|||||||
# Makefile.inc provides the CSOURCES and HHEADERS defines
|
# Makefile.inc provides the CSOURCES and HHEADERS defines
|
||||||
include Makefile.inc
|
include Makefile.inc
|
||||||
|
|
||||||
OBJS := $(patsubst %.c,$(OBJDIR)/%.o,$(strip $(CSOURCES))) $(LDLIBS)
|
OBJS := $(patsubst %.c,$(OBJDIR)/%.o,$(strip $(CSOURCES)))
|
||||||
|
|
||||||
OBJL = $(OBJS) $(OBJDIR)/nwlib.o
|
OBJL = $(OBJS) $(OBJDIR)/nwlib.o $(LDLIBS)
|
||||||
|
|
||||||
all: lib nlm
|
all: lib nlm
|
||||||
|
|
||||||
nlm: prebuild $(TARGET).nlm
|
nlm: prebuild $(TARGET).nlm
|
||||||
|
|
||||||
lib: prebuild $(TARGET).lib
|
lib: prebuild $(TARGET).$(LIBEXT)
|
||||||
|
|
||||||
prebuild: $(OBJDIR) $(OBJDIR)/version.inc config.h ca-bundle.h
|
prebuild: $(OBJDIR) $(OBJDIR)/version.inc config.h ca-bundle.h
|
||||||
|
|
||||||
@@ -207,7 +214,7 @@ dist: all
|
|||||||
|
|
||||||
install: $(INSTDIR) all
|
install: $(INSTDIR) all
|
||||||
@$(CP) $(TARGET).nlm $(INSTDIR)
|
@$(CP) $(TARGET).nlm $(INSTDIR)
|
||||||
@$(CP) $(TARGET).lib $(INSTDIR)
|
@$(CP) $(TARGET).$(LIBEXT) $(INSTDIR)
|
||||||
@$(CP) ../CHANGES $(INSTDIR)
|
@$(CP) ../CHANGES $(INSTDIR)
|
||||||
@$(CP) ../COPYING $(INSTDIR)
|
@$(CP) ../COPYING $(INSTDIR)
|
||||||
@$(CP) ../README $(INSTDIR)
|
@$(CP) ../README $(INSTDIR)
|
||||||
@@ -221,7 +228,7 @@ clean:
|
|||||||
-$(RM) -r $(OBJDIR)
|
-$(RM) -r $(OBJDIR)
|
||||||
|
|
||||||
distclean: clean
|
distclean: clean
|
||||||
-$(RM) -r $(TARGET).lib $(TARGET).nlm
|
-$(RM) -r $(TARGET).$(LIBEXT) $(TARGET).nlm
|
||||||
|
|
||||||
$(INSTDIR):
|
$(INSTDIR):
|
||||||
@mkdir $(INSTDIR)
|
@mkdir $(INSTDIR)
|
||||||
@@ -229,7 +236,7 @@ $(INSTDIR):
|
|||||||
$(OBJDIR):
|
$(OBJDIR):
|
||||||
@mkdir $(OBJDIR)
|
@mkdir $(OBJDIR)
|
||||||
|
|
||||||
$(TARGET).lib: $(OBJS)
|
$(TARGET).$(LIBEXT): $(OBJS)
|
||||||
@echo Creating $@
|
@echo Creating $@
|
||||||
@-$(RM) $@
|
@-$(RM) $@
|
||||||
@$(AR) $(ARFLAGS) $@ $^
|
@$(AR) $(ARFLAGS) $@ $^
|
||||||
@@ -303,11 +310,11 @@ ifdef IMPORTS
|
|||||||
@echo $(DL)import $(IMPORTS)$(DL) >> $@
|
@echo $(DL)import $(IMPORTS)$(DL) >> $@
|
||||||
endif
|
endif
|
||||||
ifeq ($(LD),nlmconv)
|
ifeq ($(LD),nlmconv)
|
||||||
ifdef LDLIBS
|
|
||||||
@echo $(DL)input $(LDLIBS)$(DL) >> $@
|
|
||||||
endif
|
|
||||||
@echo $(DL)input $(OBJL)$(DL) >> $@
|
@echo $(DL)input $(OBJL)$(DL) >> $@
|
||||||
@echo $(DL)input $(PRELUDE)$(DL) >> $@
|
@echo $(DL)input $(PRELUDE)$(DL) >> $@
|
||||||
|
#ifdef LDLIBS
|
||||||
|
# @echo $(DL)input $(LDLIBS)$(DL) >> $@
|
||||||
|
#endif
|
||||||
@echo $(DL)output $(TARGET).nlm$(DL) >> $@
|
@echo $(DL)output $(TARGET).nlm$(DL) >> $@
|
||||||
endif
|
endif
|
||||||
|
|
||||||
@@ -317,6 +324,9 @@ config.h: Makefile.netware
|
|||||||
@echo $(DL)** Do not edit this file - it is created by make!$(DL) >> $@
|
@echo $(DL)** Do not edit this file - it is created by make!$(DL) >> $@
|
||||||
@echo $(DL)** All your changes will be lost!!$(DL) >> $@
|
@echo $(DL)** All your changes will be lost!!$(DL) >> $@
|
||||||
@echo $(DL)*/$(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 OS "i586-pc-NetWare"$(DL) >> $@
|
||||||
@echo $(DL)#define VERSION "$(LIBCURL_VERSION_STR)"$(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) >> $@
|
@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_INTTYPES_H 1$(DL) >> $@
|
||||||
@echo $(DL)#define HAVE_LIMITS_H 1$(DL) >> $@
|
@echo $(DL)#define HAVE_LIMITS_H 1$(DL) >> $@
|
||||||
@echo $(DL)#define HAVE_LONGLONG 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_NETINET_IN_H 1$(DL) >> $@
|
||||||
@echo $(DL)#define HAVE_RECV 1$(DL) >> $@
|
@echo $(DL)#define HAVE_RECV 1$(DL) >> $@
|
||||||
@echo $(DL)#define HAVE_SELECT 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_SYS_TIME_H 1$(DL) >> $@
|
||||||
@echo $(DL)#define HAVE_TERMIOS_H 1$(DL) >> $@
|
@echo $(DL)#define HAVE_TERMIOS_H 1$(DL) >> $@
|
||||||
@echo $(DL)#define HAVE_TIME_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 HAVE_UNISTD_H 1$(DL) >> $@
|
||||||
@echo $(DL)#define RECV_TYPE_ARG1 int$(DL) >> $@
|
@echo $(DL)#define RECV_TYPE_ARG1 int$(DL) >> $@
|
||||||
@echo $(DL)#define RECV_TYPE_ARG2 char *$(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 USE_LIBSSH2 1$(DL) >> $@
|
||||||
@echo $(DL)#define HAVE_LIBSSH2_H 1$(DL) >> $@
|
@echo $(DL)#define HAVE_LIBSSH2_H 1$(DL) >> $@
|
||||||
endif
|
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
|
ifdef OLD_NOVELLSDK
|
||||||
@echo $(DL)#define socklen_t int$(DL) >> $@
|
@echo $(DL)#define socklen_t int$(DL) >> $@
|
||||||
endif
|
endif
|
||||||
@@ -477,6 +490,6 @@ else
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
$(LIBCARES):
|
$(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
|
ZLIB_PATH = ../../zlib-1.2.1
|
||||||
!ENDIF
|
!ENDIF
|
||||||
|
|
||||||
|
!IFNDEF MACHINE
|
||||||
|
MACHINE = X86
|
||||||
|
!ENDIF
|
||||||
|
|
||||||
# USE_WINDOWS_SSPI uses windows libraries to allow NTLM authentication
|
# USE_WINDOWS_SSPI uses windows libraries to allow NTLM authentication
|
||||||
# without an openssl installation and offers the ability to authenticate
|
# without an openssl installation and offers the ability to authenticate
|
||||||
# using the "current logged in user". It does however require that the
|
# 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
|
CFLAGSLIB = /DCURL_STATICLIB
|
||||||
LNKDLL = link.exe /DLL
|
LNKDLL = link.exe /DLL
|
||||||
LNKLIB = link.exe /lib
|
LNKLIB = link.exe /lib
|
||||||
LFLAGS = /nologo
|
LFLAGS = /nologo /machine:$(MACHINE)
|
||||||
SSLLIBS = libeay32.lib ssleay32.lib
|
SSLLIBS = libeay32.lib ssleay32.lib
|
||||||
ZLIBLIBSDLL= zdll.lib
|
ZLIBLIBSDLL= zdll.lib
|
||||||
ZLIBLIBS = zlib.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
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -21,6 +21,8 @@
|
|||||||
* $Id$
|
* $Id$
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
|
||||||
|
#ifdef __AMIGA__ /* Any AmigaOS flavour */
|
||||||
|
|
||||||
#include "amigaos.h"
|
#include "amigaos.h"
|
||||||
#include <amitcp/socketbasetags.h>
|
#include <amitcp/socketbasetags.h>
|
||||||
|
|
||||||
@@ -72,3 +74,5 @@ BOOL amiga_init()
|
|||||||
#ifdef __libnix__
|
#ifdef __libnix__
|
||||||
ADD2EXIT(amiga_cleanup,-50);
|
ADD2EXIT(amiga_cleanup,-50);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#endif /* __AMIGA__ */
|
||||||
|
@@ -1,3 +1,5 @@
|
|||||||
|
#ifndef LIBCURL_AMIGAOS_H
|
||||||
|
#define LIBCURL_AMIGAOS_H
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
* _ _ ____ _
|
* _ _ ____ _
|
||||||
* Project ___| | | | _ \| |
|
* 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
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -21,8 +23,7 @@
|
|||||||
* $Id$
|
* $Id$
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
|
||||||
#ifndef LIBCURL_AMIGAOS_H
|
#ifdef __AMIGA__ /* Any AmigaOS flavour */
|
||||||
#define LIBCURL_AMIGAOS_H
|
|
||||||
|
|
||||||
#ifndef __ixemul__
|
#ifndef __ixemul__
|
||||||
|
|
||||||
@@ -55,4 +56,6 @@ extern BOOL amiga_init();
|
|||||||
#warning compiling with ixemul...
|
#warning compiling with ixemul...
|
||||||
|
|
||||||
#endif /* __ixemul__ */
|
#endif /* __ixemul__ */
|
||||||
|
#endif /* __AMIGA__ */
|
||||||
#endif /* LIBCURL_AMIGAOS_H */
|
#endif /* LIBCURL_AMIGAOS_H */
|
||||||
|
|
||||||
|
@@ -150,7 +150,7 @@ size_t Curl_base64_encode(struct SessionHandle *data,
|
|||||||
char *output;
|
char *output;
|
||||||
char *base64data;
|
char *base64data;
|
||||||
#ifdef CURL_DOES_CONVERSIONS
|
#ifdef CURL_DOES_CONVERSIONS
|
||||||
char *convbuf;
|
char *convbuf = NULL;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
char *indata = (char *)inp;
|
char *indata = (char *)inp;
|
||||||
@@ -173,11 +173,13 @@ size_t Curl_base64_encode(struct SessionHandle *data,
|
|||||||
if(data) {
|
if(data) {
|
||||||
convbuf = (char*)malloc(insize);
|
convbuf = (char*)malloc(insize);
|
||||||
if(!convbuf) {
|
if(!convbuf) {
|
||||||
|
free(output);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
memcpy(convbuf, indata, insize);
|
memcpy(convbuf, indata, insize);
|
||||||
if(CURLE_OK != Curl_convert_to_network(data, convbuf, insize)) {
|
if(CURLE_OK != Curl_convert_to_network(data, convbuf, insize)) {
|
||||||
free(convbuf);
|
free(convbuf);
|
||||||
|
free(output);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
indata = convbuf; /* switch to the converted buffer */
|
indata = convbuf; /* switch to the converted buffer */
|
||||||
|
@@ -1,6 +1,29 @@
|
|||||||
|
|
||||||
#ifndef LIBCURL_CONFIG_AMIGAOS_H
|
#ifndef LIBCURL_CONFIG_AMIGAOS_H
|
||||||
#define 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_ARPA_INET_H 1
|
||||||
#define HAVE_GETHOSTBYADDR 1
|
#define HAVE_GETHOSTBYADDR 1
|
||||||
@@ -116,4 +139,5 @@
|
|||||||
#define SEND_TYPE_ARG4 int
|
#define SEND_TYPE_ARG4 int
|
||||||
#define SEND_TYPE_RETV int
|
#define SEND_TYPE_RETV int
|
||||||
|
|
||||||
|
#endif /* __AMIGA__ */
|
||||||
#endif /* LIBCURL_CONFIG_AMIGAOS_H */
|
#endif /* LIBCURL_CONFIG_AMIGAOS_H */
|
||||||
|
@@ -74,9 +74,6 @@
|
|||||||
/* Define to the type of arg 7 for getnameinfo. */
|
/* Define to the type of arg 7 for getnameinfo. */
|
||||||
/* #undef GETNAMEINFO_TYPE_ARG7 */
|
/* #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 to 1 if you have the <arpa/inet.h> header file. */
|
||||||
#define HAVE_ARPA_INET_H 1
|
#define HAVE_ARPA_INET_H 1
|
||||||
|
|
||||||
@@ -287,9 +284,6 @@
|
|||||||
/* if your compiler supports long long */
|
/* if your compiler supports long long */
|
||||||
#define HAVE_LONGLONG 1
|
#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 */
|
/* Define to 1 if you need the malloc.h header file even with stdlib.h */
|
||||||
/* #undef NEED_MALLOC_H */
|
/* #undef NEED_MALLOC_H */
|
||||||
|
|
||||||
@@ -539,9 +533,6 @@
|
|||||||
/* Define to 1 if you have the `tld_strerror' function. */
|
/* Define to 1 if you have the `tld_strerror' function. */
|
||||||
/* #undef HAVE_TLD_STRERROR */
|
/* #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 to 1 if you have the <unistd.h> header file. */
|
||||||
#define HAVE_UNISTD_H 1
|
#define HAVE_UNISTD_H 1
|
||||||
|
|
||||||
|
@@ -2,16 +2,13 @@
|
|||||||
#define __LIB_CONFIG_WIN32_H
|
#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 */
|
/* 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 if you have the <arpa/inet.h> header file. */
|
||||||
/* #define HAVE_ARPA_INET_H 1 */
|
/* #define HAVE_ARPA_INET_H 1 */
|
||||||
|
|
||||||
@@ -36,11 +33,6 @@
|
|||||||
/* Define if you have the <io.h> header file. */
|
/* Define if you have the <io.h> header file. */
|
||||||
#define HAVE_IO_H 1
|
#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 */
|
/* Define if you need the malloc.h header file even with stdlib.h */
|
||||||
#ifndef __SALFORDC__
|
#ifndef __SALFORDC__
|
||||||
#define NEED_MALLOC_H 1
|
#define NEED_MALLOC_H 1
|
||||||
@@ -218,17 +210,11 @@
|
|||||||
/* Define if you have the tcsetattr function. */
|
/* Define if you have the tcsetattr function. */
|
||||||
/* #define HAVE_TCSETATTR 1 */
|
/* #define HAVE_TCSETATTR 1 */
|
||||||
|
|
||||||
/* Define if you have the uname function. */
|
|
||||||
/* #define HAVE_UNAME 1 */
|
|
||||||
|
|
||||||
/* Define if you have the utime function */
|
/* Define if you have the utime function */
|
||||||
#ifndef __BORLANDC__
|
#ifndef __BORLANDC__
|
||||||
#define HAVE_UTIME 1
|
#define HAVE_UTIME 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Define if you have the vprintf function. */
|
|
||||||
#define HAVE_VPRINTF 1
|
|
||||||
|
|
||||||
/* Define if you have the getnameinfo function. */
|
/* Define if you have the getnameinfo function. */
|
||||||
#define HAVE_GETNAMEINFO 1
|
#define HAVE_GETNAMEINFO 1
|
||||||
|
|
||||||
@@ -352,9 +338,12 @@
|
|||||||
/* Undef keyword 'const' if it does not work. */
|
/* Undef keyword 'const' if it does not work. */
|
||||||
/* #undef const */
|
/* #undef const */
|
||||||
|
|
||||||
#if defined(_MSC_VER) && (_MSC_VER > 1310)
|
/* Windows should not have HAVE_GMTIME_R defined */
|
||||||
/* MSVC 2003 has gmtime_r */
|
/* #undef HAVE_GMTIME_R */
|
||||||
#define 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
|
#endif
|
||||||
|
|
||||||
/* ---------------------------------------------------------------- */
|
/* ---------------------------------------------------------------- */
|
||||||
@@ -377,7 +366,15 @@
|
|||||||
|
|
||||||
/* Define cpu-machine-OS */
|
/* Define cpu-machine-OS */
|
||||||
#undef OS
|
#undef OS
|
||||||
|
#if defined(_M_IX86) || defined(__i386__) /* x86 (MSVC or gcc) */
|
||||||
#define OS "i386-pc-win32"
|
#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 */
|
/* Name of package */
|
||||||
#define PACKAGE "curl"
|
#define PACKAGE "curl"
|
||||||
|
@@ -9,9 +9,6 @@
|
|||||||
/* HEADER FILES */
|
/* 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 if you have the <arpa/inet.h> header file. */
|
||||||
/* #define HAVE_ARPA_INET_H 1 */
|
/* #define HAVE_ARPA_INET_H 1 */
|
||||||
|
|
||||||
@@ -36,9 +33,6 @@
|
|||||||
/* Define if you have the <io.h> header file. */
|
/* Define if you have the <io.h> header file. */
|
||||||
#define HAVE_IO_H 1
|
#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 if you need the malloc.h header header file even with stdlib.h */
|
||||||
#define NEED_MALLOC_H 1
|
#define NEED_MALLOC_H 1
|
||||||
|
|
||||||
@@ -204,15 +198,9 @@
|
|||||||
/* Define if you have the tcsetattr function. */
|
/* Define if you have the tcsetattr function. */
|
||||||
/* #define HAVE_TCSETATTR 1 */
|
/* #define HAVE_TCSETATTR 1 */
|
||||||
|
|
||||||
/* Define if you have the uname function. */
|
|
||||||
/* #define HAVE_UNAME 1 */
|
|
||||||
|
|
||||||
/* Define if you have the utime function */
|
/* Define if you have the utime function */
|
||||||
#define HAVE_UTIME 1
|
#define HAVE_UTIME 1
|
||||||
|
|
||||||
/* Define if you have the vprintf function. */
|
|
||||||
#define HAVE_VPRINTF 1
|
|
||||||
|
|
||||||
/* Define if you have the getnameinfo function. */
|
/* Define if you have the getnameinfo function. */
|
||||||
#define HAVE_GETNAMEINFO 1
|
#define HAVE_GETNAMEINFO 1
|
||||||
|
|
||||||
|
@@ -17,48 +17,34 @@
|
|||||||
|
|
||||||
#define PACKAGE "curl"
|
#define PACKAGE "curl"
|
||||||
|
|
||||||
#define HAVE_ASSERT_T 1
|
|
||||||
#define HAVE_ARPA_INET_H 1
|
#define HAVE_ARPA_INET_H 1
|
||||||
#define HAVE_CLOSESOCKET 1
|
|
||||||
#define HAVE_FCNTL_H 1
|
#define HAVE_FCNTL_H 1
|
||||||
#define HAVE_FIONBIO 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_GETPROTOBYNAME 1
|
||||||
#define HAVE_GETTIMEOFDAY 1
|
#define HAVE_GETTIMEOFDAY 1
|
||||||
#define HAVE_INET_ADDR 1
|
|
||||||
#define HAVE_INET_NTOA 1
|
|
||||||
#define HAVE_IO_H 1
|
#define HAVE_IO_H 1
|
||||||
#define HAVE_IOCTLSOCKET 1
|
#define HAVE_IOCTLSOCKET 1
|
||||||
#define HAVE_INET_PTON 1
|
#define HAVE_INET_PTON 1
|
||||||
#define HAVE_INET_NTOP 1
|
#define HAVE_INET_NTOP 1
|
||||||
#define HAVE_LOCALE_H 1
|
#define HAVE_LOCALE_H 1
|
||||||
#define HAVE_LONGLONG 1
|
#define HAVE_LONGLONG 1
|
||||||
#define HAVE_MALLOC_H 1
|
|
||||||
#define HAVE_MEMORY_H 1
|
#define HAVE_MEMORY_H 1
|
||||||
#define HAVE_NETDB_H 1
|
#define HAVE_NETDB_H 1
|
||||||
#define HAVE_NETINET_IN_H 1
|
#define HAVE_NETINET_IN_H 1
|
||||||
#define HAVE_NETINET_TCP_H 1
|
#define HAVE_NETINET_TCP_H 1
|
||||||
#define HAVE_NET_IF_H 1
|
#define HAVE_NET_IF_H 1
|
||||||
#define HAVE_PROCESS_H 1
|
#define HAVE_PROCESS_H 1
|
||||||
#define HAVE_PERROR 1
|
|
||||||
#define HAVE_RECV 1
|
#define HAVE_RECV 1
|
||||||
#define HAVE_SELECT 1
|
#define HAVE_SELECT 1
|
||||||
#define HAVE_SEND 1
|
#define HAVE_SEND 1
|
||||||
#define HAVE_SETJMP_H 1
|
#define HAVE_SETJMP_H 1
|
||||||
#define HAVE_SETLOCALE 1
|
#define HAVE_SETLOCALE 1
|
||||||
#define HAVE_SETVBUF 1
|
#define HAVE_SETMODE 1
|
||||||
#define HAVE_SIGNAL 1
|
#define HAVE_SIGNAL 1
|
||||||
#define HAVE_SIGNAL_H 1
|
|
||||||
#define HAVE_SIG_ATOMIC_T 1
|
|
||||||
#define HAVE_SOCKET 1
|
#define HAVE_SOCKET 1
|
||||||
#define HAVE_SPNEGO 1
|
#define HAVE_SPNEGO 1
|
||||||
#define HAVE_STRDUP 1
|
#define HAVE_STRDUP 1
|
||||||
#define HAVE_STRFTIME 1
|
|
||||||
#define HAVE_STRICMP 1
|
#define HAVE_STRICMP 1
|
||||||
#define HAVE_STRSTR 1
|
|
||||||
#define HAVE_STRTOLL 1
|
#define HAVE_STRTOLL 1
|
||||||
#define HAVE_STRUCT_TIMEVAL 1
|
#define HAVE_STRUCT_TIMEVAL 1
|
||||||
#define HAVE_SYS_IOCTL_H 1
|
#define HAVE_SYS_IOCTL_H 1
|
||||||
@@ -67,9 +53,7 @@
|
|||||||
#define HAVE_SYS_TYPES_H 1
|
#define HAVE_SYS_TYPES_H 1
|
||||||
#define HAVE_TERMIOS_H 1
|
#define HAVE_TERMIOS_H 1
|
||||||
#define HAVE_TIME_H 1
|
#define HAVE_TIME_H 1
|
||||||
#define HAVE_UNAME 1
|
|
||||||
#define HAVE_UNISTD_H 1
|
#define HAVE_UNISTD_H 1
|
||||||
#define HAVE_VPRINTF 1
|
|
||||||
|
|
||||||
#define NEED_MALLOC_H 1
|
#define NEED_MALLOC_H 1
|
||||||
|
|
||||||
@@ -105,15 +89,7 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef USE_SSLEAY /* on cmd-line */
|
#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_OPENSSL_ENGINE_H 1
|
||||||
#define HAVE_LIBSSL 1
|
|
||||||
#define HAVE_LIBCRYPTO 1
|
|
||||||
#define OPENSSL_NO_KRB5 1
|
#define OPENSSL_NO_KRB5 1
|
||||||
#define USE_OPENSSL 1
|
#define USE_OPENSSL 1
|
||||||
#endif
|
#endif
|
||||||
@@ -139,6 +115,7 @@
|
|||||||
#define HAVE_SIGACTION 1
|
#define HAVE_SIGACTION 1
|
||||||
#define HAVE_SIGSETJMP 1
|
#define HAVE_SIGSETJMP 1
|
||||||
#define HAVE_SYS_TIME_H 1
|
#define HAVE_SYS_TIME_H 1
|
||||||
|
#define HAVE_VARIADIC_MACROS_GCC 1
|
||||||
|
|
||||||
#if (DJGPP_MINOR >= 4)
|
#if (DJGPP_MINOR >= 4)
|
||||||
#define HAVE_STRLCAT 1
|
#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
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -28,9 +28,6 @@
|
|||||||
#ifdef HAVE_SYS_TIME_H
|
#ifdef HAVE_SYS_TIME_H
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_SYS_TYPES_H
|
|
||||||
#include <sys/types.h>
|
|
||||||
#endif
|
|
||||||
#ifdef HAVE_SYS_SOCKET_H
|
#ifdef HAVE_SYS_SOCKET_H
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#endif
|
#endif
|
||||||
@@ -59,9 +56,9 @@
|
|||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_STDLIB_H
|
#ifdef HAVE_STDLIB_H
|
||||||
#include <stdlib.h> /* required for free() prototype, without it, this crashes
|
#include <stdlib.h> /* required for free() prototype, without it, this crashes */
|
||||||
on macos 68K */
|
#endif /* on macos 68K */
|
||||||
#endif
|
|
||||||
#if (defined(HAVE_FIONBIO) && defined(__NOVELL_LIBC__))
|
#if (defined(HAVE_FIONBIO) && defined(__NOVELL_LIBC__))
|
||||||
#include <sys/filio.h>
|
#include <sys/filio.h>
|
||||||
#endif
|
#endif
|
||||||
@@ -74,24 +71,12 @@
|
|||||||
#include <inet.h>
|
#include <inet.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif /* !WIN32 */
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <string.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 "urldata.h"
|
||||||
#include "sendf.h"
|
#include "sendf.h"
|
||||||
#include "if2ip.h"
|
#include "if2ip.h"
|
||||||
@@ -103,6 +88,7 @@
|
|||||||
#include "multiif.h"
|
#include "multiif.h"
|
||||||
#include "sockaddr.h" /* required for Curl_sockaddr_storage */
|
#include "sockaddr.h" /* required for Curl_sockaddr_storage */
|
||||||
#include "inet_ntop.h"
|
#include "inet_ntop.h"
|
||||||
|
#include "inet_pton.h"
|
||||||
|
|
||||||
/* The last #include file should be: */
|
/* The last #include file should be: */
|
||||||
#include "memdebug.h"
|
#include "memdebug.h"
|
||||||
@@ -115,19 +101,6 @@ singleipconnect(struct connectdata *conn,
|
|||||||
long timeout_ms,
|
long timeout_ms,
|
||||||
bool *connected);
|
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
|
* Curl_nonblock() set the given socket to either blocking or non-blocking
|
||||||
* mode based on the 'nonblock' boolean argument. This function is highly
|
* 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;
|
int flags;
|
||||||
|
|
||||||
flags = fcntl(sockfd, F_GETFL, 0);
|
flags = fcntl(sockfd, F_GETFL, 0);
|
||||||
if (TRUE == nonblock)
|
if (FALSE != nonblock)
|
||||||
return fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);
|
return fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);
|
||||||
else
|
else
|
||||||
return fcntl(sockfd, F_SETFL, flags & (~O_NONBLOCK));
|
return fcntl(sockfd, F_SETFL, flags & (~O_NONBLOCK));
|
||||||
@@ -224,7 +197,7 @@ int waitconnect(curl_socket_t sockfd, /* socket */
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* now select() until we get connect or timeout */
|
/* 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)
|
if(-1 == rc)
|
||||||
/* error, no connect here, try next */
|
/* error, no connect here, try next */
|
||||||
return WAITCONN_SELECT_ERROR;
|
return WAITCONN_SELECT_ERROR;
|
||||||
@@ -244,6 +217,9 @@ int waitconnect(curl_socket_t sockfd, /* socket */
|
|||||||
static CURLcode bindlocal(struct connectdata *conn,
|
static CURLcode bindlocal(struct connectdata *conn,
|
||||||
curl_socket_t sockfd)
|
curl_socket_t sockfd)
|
||||||
{
|
{
|
||||||
|
#ifdef ENABLE_IPV6
|
||||||
|
char ipv6_addr[16];
|
||||||
|
#endif
|
||||||
struct SessionHandle *data = conn->data;
|
struct SessionHandle *data = conn->data;
|
||||||
struct sockaddr_in me;
|
struct sockaddr_in me;
|
||||||
struct sockaddr *sock = NULL; /* bind to this address */
|
struct sockaddr *sock = NULL; /* bind to this address */
|
||||||
@@ -262,6 +238,7 @@ static CURLcode bindlocal(struct connectdata *conn,
|
|||||||
in_addr_t in;
|
in_addr_t in;
|
||||||
int rc;
|
int rc;
|
||||||
bool was_iface = FALSE;
|
bool was_iface = FALSE;
|
||||||
|
int in6 = -1;
|
||||||
|
|
||||||
/* First check if the given name is an IP address */
|
/* First check if the given name is an IP address */
|
||||||
in=inet_addr(data->set.device);
|
in=inet_addr(data->set.device);
|
||||||
@@ -332,7 +309,7 @@ static CURLcode bindlocal(struct connectdata *conn,
|
|||||||
if (setsockopt(sockfd, SOL_SOCKET, SO_BINDTODEVICE,
|
if (setsockopt(sockfd, SOL_SOCKET, SO_BINDTODEVICE,
|
||||||
data->set.device, strlen(data->set.device)+1) != 0) {
|
data->set.device, strlen(data->set.device)+1) != 0) {
|
||||||
/* printf("Failed to BINDTODEVICE, socket: %d device: %s error: %s\n",
|
/* 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",
|
infof(data, "SO_BINDTODEVICE %s failed\n",
|
||||||
data->set.device);
|
data->set.device);
|
||||||
/* This is typically "errno 1, error: Operation not permitted" if
|
/* This is typically "errno 1, error: Operation not permitted" if
|
||||||
@@ -342,7 +319,11 @@ static CURLcode bindlocal(struct connectdata *conn,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
in=inet_addr(myhost);
|
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);
|
failf(data,"couldn't find my own IP address (%s)", myhost);
|
||||||
return CURLE_HTTP_PORT_FAILED;
|
return CURLE_HTTP_PORT_FAILED;
|
||||||
} /* end of inet_addr */
|
} /* end of inet_addr */
|
||||||
@@ -409,7 +390,7 @@ static CURLcode bindlocal(struct connectdata *conn,
|
|||||||
break;
|
break;
|
||||||
} while(1);
|
} while(1);
|
||||||
|
|
||||||
data->state.os_errno = Curl_sockerrno();
|
data->state.os_errno = SOCKERRNO;
|
||||||
failf(data, "bind failure: %s",
|
failf(data, "bind failure: %s",
|
||||||
Curl_strerror(conn, data->state.os_errno));
|
Curl_strerror(conn, data->state.os_errno));
|
||||||
return CURLE_HTTP_PORT_FAILED;
|
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,
|
if( -1 == getsockopt(sockfd, SOL_SOCKET, SO_ERROR,
|
||||||
(void *)&err, &errSize))
|
(void *)&err, &errSize))
|
||||||
err = Curl_sockerrno();
|
err = SOCKERRNO;
|
||||||
|
|
||||||
#ifdef _WIN32_WCE
|
#ifdef _WIN32_WCE
|
||||||
/* Always returns this error, bug in CE? */
|
/* Always returns this error, bug in CE? */
|
||||||
@@ -472,7 +453,7 @@ static bool verifyconnect(curl_socket_t sockfd, int *error)
|
|||||||
#else
|
#else
|
||||||
(void)sockfd;
|
(void)sockfd;
|
||||||
if (error)
|
if (error)
|
||||||
*error = Curl_sockerrno();
|
*error = SOCKERRNO;
|
||||||
#endif
|
#endif
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
@@ -548,7 +529,7 @@ CURLcode Curl_is_connected(struct connectdata *conn,
|
|||||||
long allow_total = 0;
|
long allow_total = 0;
|
||||||
long has_passed;
|
long has_passed;
|
||||||
|
|
||||||
curlassert(sockindex >= FIRSTSOCKET && sockindex <= SECONDARYSOCKET);
|
DEBUGASSERT(sockindex >= FIRSTSOCKET && sockindex <= SECONDARYSOCKET);
|
||||||
|
|
||||||
*connected = FALSE; /* a very negative world view is best */
|
*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 */
|
/* subtract the most strict timeout of the ones */
|
||||||
if(data->set.timeout && data->set.connecttimeout) {
|
if(data->set.timeout && data->set.connecttimeout) {
|
||||||
if (data->set.timeout < data->set.connecttimeout)
|
if (data->set.timeout < data->set.connecttimeout)
|
||||||
allow_total = allow = data->set.timeout*1000;
|
allow_total = allow = data->set.timeout;
|
||||||
else
|
else
|
||||||
allow = data->set.connecttimeout*1000;
|
allow = data->set.connecttimeout;
|
||||||
}
|
}
|
||||||
else if(data->set.timeout) {
|
else if(data->set.timeout) {
|
||||||
allow_total = allow = data->set.timeout*1000;
|
allow_total = allow = data->set.timeout;
|
||||||
}
|
}
|
||||||
else if(data->set.connecttimeout) {
|
else if(data->set.connecttimeout) {
|
||||||
allow = data->set.connecttimeout*1000;
|
allow = data->set.connecttimeout;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(has_passed > allow ) {
|
if(has_passed > allow ) {
|
||||||
@@ -613,7 +594,7 @@ CURLcode Curl_is_connected(struct connectdata *conn,
|
|||||||
infof(data, "Connection failed\n");
|
infof(data, "Connection failed\n");
|
||||||
|
|
||||||
if(trynextip(conn, sockindex, connected)) {
|
if(trynextip(conn, sockindex, connected)) {
|
||||||
error = Curl_sockerrno();
|
error = SOCKERRNO;
|
||||||
data->state.os_errno = error;
|
data->state.os_errno = error;
|
||||||
failf(data, "Failed connect to %s:%d; %s",
|
failf(data, "Failed connect to %s:%d; %s",
|
||||||
conn->host.name, conn->port, Curl_strerror(conn,error));
|
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,
|
if(setsockopt(sockfd, proto, TCP_NODELAY, (void *)&onoff,
|
||||||
sizeof(onoff)) < 0)
|
sizeof(onoff)) < 0)
|
||||||
infof(data, "Could not set TCP_NODELAY: %s\n",
|
infof(data, "Could not set TCP_NODELAY: %s\n",
|
||||||
Curl_strerror(conn, Curl_sockerrno()));
|
Curl_strerror(conn, SOCKERRNO));
|
||||||
else
|
else
|
||||||
infof(data,"TCP_NODELAY set\n");
|
infof(data,"TCP_NODELAY set\n");
|
||||||
#else
|
#else
|
||||||
@@ -667,7 +648,7 @@ static void nosigpipe(struct connectdata *conn,
|
|||||||
if(setsockopt(sockfd, SOL_SOCKET, SO_NOSIGPIPE, (void *)&onoff,
|
if(setsockopt(sockfd, SOL_SOCKET, SO_NOSIGPIPE, (void *)&onoff,
|
||||||
sizeof(onoff)) < 0)
|
sizeof(onoff)) < 0)
|
||||||
infof(data, "Could not set SO_NOSIGPIPE: %s\n",
|
infof(data, "Could not set SO_NOSIGPIPE: %s\n",
|
||||||
Curl_strerror(conn, Curl_sockerrno()));
|
Curl_strerror(conn, SOCKERRNO));
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
#define nosigpipe(x,y)
|
#define nosigpipe(x,y)
|
||||||
@@ -731,7 +712,7 @@ singleipconnect(struct connectdata *conn,
|
|||||||
rc = 0;
|
rc = 0;
|
||||||
|
|
||||||
if(-1 == rc) {
|
if(-1 == rc) {
|
||||||
error = Curl_sockerrno();
|
error = SOCKERRNO;
|
||||||
|
|
||||||
switch (error) {
|
switch (error) {
|
||||||
case EINPROGRESS:
|
case EINPROGRESS:
|
||||||
@@ -826,14 +807,14 @@ CURLcode Curl_connecthost(struct connectdata *conn, /* context */
|
|||||||
/* get the most strict timeout of the ones converted to milliseconds */
|
/* 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) {
|
||||||
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
|
else
|
||||||
timeout_ms = data->set.connecttimeout*1000;
|
timeout_ms = data->set.connecttimeout;
|
||||||
}
|
}
|
||||||
else if(data->set.timeout)
|
else if(data->set.timeout)
|
||||||
timeout_ms = data->set.timeout*1000;
|
timeout_ms = data->set.timeout;
|
||||||
else
|
else
|
||||||
timeout_ms = data->set.connecttimeout*1000;
|
timeout_ms = data->set.connecttimeout;
|
||||||
|
|
||||||
/* subtract the passed time */
|
/* subtract the passed time */
|
||||||
timeout_ms -= has_passed;
|
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
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -37,8 +37,6 @@ CURLcode Curl_connecthost(struct connectdata *conn,
|
|||||||
bool *connected /* truly connected? */
|
bool *connected /* truly connected? */
|
||||||
);
|
);
|
||||||
|
|
||||||
int Curl_sockerrno(void);
|
|
||||||
|
|
||||||
CURLcode Curl_store_ip_addr(struct connectdata *conn);
|
CURLcode Curl_store_ip_addr(struct connectdata *conn);
|
||||||
|
|
||||||
#define DEFAULT_CONNECT_TIMEOUT 300000 /* milliseconds == five minutes */
|
#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
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -53,14 +53,6 @@
|
|||||||
#define COMMENT 0x10 /* bit 4 set: file comment present */
|
#define COMMENT 0x10 /* bit 4 set: file comment present */
|
||||||
#define RESERVED 0xE0 /* bits 5..7: reserved */
|
#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
|
static CURLcode
|
||||||
process_zlib_error(struct connectdata *conn, z_stream *z)
|
process_zlib_error(struct connectdata *conn, z_stream *z)
|
||||||
{
|
{
|
||||||
@@ -76,7 +68,7 @@ process_zlib_error(struct connectdata *conn, z_stream *z)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static CURLcode
|
static CURLcode
|
||||||
exit_zlib(z_stream *z, bool *zlib_init, CURLcode result)
|
exit_zlib(z_stream *z, zlibInitState *zlib_init, CURLcode result)
|
||||||
{
|
{
|
||||||
inflateEnd(z);
|
inflateEnd(z);
|
||||||
*zlib_init = ZLIB_UNINIT;
|
*zlib_init = ZLIB_UNINIT;
|
||||||
|
27
lib/cookie.c
27
lib/cookie.c
@@ -102,7 +102,6 @@ Example set of cookies:
|
|||||||
#include "memdebug.h"
|
#include "memdebug.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define my_isspace(x) ((x == ' ') || (x == '\t'))
|
|
||||||
|
|
||||||
static void freecookie(struct Cookie *co)
|
static void freecookie(struct Cookie *co)
|
||||||
{
|
{
|
||||||
@@ -189,6 +188,10 @@ Curl_cookie_add(struct SessionHandle *data,
|
|||||||
bool replace_old = FALSE;
|
bool replace_old = FALSE;
|
||||||
bool badcookie = FALSE; /* cookies are good by default. mmmmm yummy */
|
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 */
|
/* First, alloc and init a new struct for it */
|
||||||
co = (struct Cookie *)calloc(sizeof(struct Cookie), 1);
|
co = (struct Cookie *)calloc(sizeof(struct Cookie), 1);
|
||||||
if(!co)
|
if(!co)
|
||||||
@@ -206,7 +209,7 @@ Curl_cookie_add(struct SessionHandle *data,
|
|||||||
|
|
||||||
semiptr=strchr(lineptr, ';'); /* first, find a semicolon */
|
semiptr=strchr(lineptr, ';'); /* first, find a semicolon */
|
||||||
|
|
||||||
while(*lineptr && my_isspace(*lineptr))
|
while(*lineptr && ISBLANK(*lineptr))
|
||||||
lineptr++;
|
lineptr++;
|
||||||
|
|
||||||
ptr = lineptr;
|
ptr = lineptr;
|
||||||
@@ -229,14 +232,14 @@ Curl_cookie_add(struct SessionHandle *data,
|
|||||||
|
|
||||||
/* Strip off trailing whitespace from the 'what' */
|
/* Strip off trailing whitespace from the 'what' */
|
||||||
size_t len=strlen(what);
|
size_t len=strlen(what);
|
||||||
while(len && my_isspace(what[len-1])) {
|
while(len && ISBLANK(what[len-1])) {
|
||||||
what[len-1]=0;
|
what[len-1]=0;
|
||||||
len--;
|
len--;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Skip leading whitespace from the 'what' */
|
/* Skip leading whitespace from the 'what' */
|
||||||
whatptr=what;
|
whatptr=what;
|
||||||
while(my_isspace(*whatptr)) {
|
while(*whatptr && ISBLANK(*whatptr)) {
|
||||||
whatptr++;
|
whatptr++;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -378,7 +381,7 @@ Curl_cookie_add(struct SessionHandle *data,
|
|||||||
}
|
}
|
||||||
|
|
||||||
ptr=semiptr+1;
|
ptr=semiptr+1;
|
||||||
while(ptr && *ptr && my_isspace(*ptr))
|
while(ptr && *ptr && ISBLANK(*ptr))
|
||||||
ptr++;
|
ptr++;
|
||||||
semiptr=strchr(ptr, ';'); /* now, find the next semicolon */
|
semiptr=strchr(ptr, ';'); /* now, find the next semicolon */
|
||||||
|
|
||||||
@@ -702,7 +705,7 @@ struct CookieInfo *Curl_cookie_init(struct SessionHandle *data,
|
|||||||
lineptr=line;
|
lineptr=line;
|
||||||
headerline=FALSE;
|
headerline=FALSE;
|
||||||
}
|
}
|
||||||
while(*lineptr && my_isspace(*lineptr))
|
while(*lineptr && ISBLANK(*lineptr))
|
||||||
lineptr++;
|
lineptr++;
|
||||||
|
|
||||||
Curl_cookie_add(data, c, headerline, lineptr, NULL, NULL);
|
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);
|
format_ptr = get_netscape_format(co);
|
||||||
if (format_ptr == NULL) {
|
if (format_ptr == NULL) {
|
||||||
fprintf(out, "#\n# Fatal libcurl error\n");
|
fprintf(out, "#\n# Fatal libcurl error\n");
|
||||||
|
fclose(out);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
fprintf(out, "%s\n", format_ptr);
|
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 */
|
/* fill the list with _all_ the cookies we know */
|
||||||
line = get_netscape_format(c);
|
line = get_netscape_format(c);
|
||||||
if (line == NULL) {
|
if (line == NULL) {
|
||||||
/* get_netscape_format returns null only if we run out of memory */
|
curl_slist_free_all(beg);
|
||||||
|
|
||||||
curl_slist_free_all(beg); /* free some memory */
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
list = curl_slist_append(list, line);
|
list = curl_slist_append(list, line);
|
||||||
free(line);
|
free(line);
|
||||||
|
if (list == NULL) {
|
||||||
|
curl_slist_free_all(beg);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
else if (beg == NULL) {
|
||||||
|
beg = list;
|
||||||
|
}
|
||||||
c = c->next;
|
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
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -31,12 +31,6 @@
|
|||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <ctype.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
|
#ifdef WIN32
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
@@ -165,7 +159,8 @@ CURLcode Curl_dict(struct connectdata *conn, bool *done)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ((word == NULL) || (*word == (char)0)) {
|
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)) {
|
if ((database == NULL) || (*database == (char)0)) {
|
||||||
database = (char *)"!";
|
database = (char *)"!";
|
||||||
@@ -219,7 +214,8 @@ CURLcode Curl_dict(struct connectdata *conn, bool *done)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ((word == NULL) || (*word == (char)0)) {
|
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)) {
|
if ((database == NULL) || (*database == (char)0)) {
|
||||||
database = (char *)"!";
|
database = (char *)"!";
|
||||||
|
73
lib/easy.c
73
lib/easy.c
@@ -29,13 +29,6 @@
|
|||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <ctype.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 <errno.h>
|
||||||
|
|
||||||
#include "strequal.h"
|
#include "strequal.h"
|
||||||
@@ -47,31 +40,33 @@
|
|||||||
#ifdef HAVE_SYS_SOCKET_H
|
#ifdef HAVE_SYS_SOCKET_H
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef HAVE_NETINET_IN_H
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
|
#endif
|
||||||
#ifdef HAVE_SYS_TIME_H
|
#ifdef HAVE_SYS_TIME_H
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_UNISTD_H
|
#ifdef HAVE_UNISTD_H
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef HAVE_NETDB_H
|
||||||
#include <netdb.h>
|
#include <netdb.h>
|
||||||
|
#endif
|
||||||
#ifdef HAVE_ARPA_INET_H
|
#ifdef HAVE_ARPA_INET_H
|
||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_NET_IF_H
|
#ifdef HAVE_NET_IF_H
|
||||||
#include <net/if.h>
|
#include <net/if.h>
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef HAVE_SYS_IOCTL_H
|
||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
|
#endif
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
|
|
||||||
#ifdef HAVE_SYS_PARAM_H
|
#ifdef HAVE_SYS_PARAM_H
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef HAVE_SYS_SELECT_H
|
|
||||||
#include <sys/select.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* WIN32 ... */
|
#endif /* WIN32 ... */
|
||||||
|
|
||||||
#include "urldata.h"
|
#include "urldata.h"
|
||||||
@@ -86,6 +81,7 @@
|
|||||||
#include "memory.h"
|
#include "memory.h"
|
||||||
#include "progress.h"
|
#include "progress.h"
|
||||||
#include "easyif.h"
|
#include "easyif.h"
|
||||||
|
#include "select.h"
|
||||||
#include "sendf.h" /* for failf function prototype */
|
#include "sendf.h" /* for failf function prototype */
|
||||||
#include <ca-bundle.h>
|
#include <ca-bundle.h>
|
||||||
|
|
||||||
@@ -227,16 +223,22 @@ CURLcode curl_global_init(long flags)
|
|||||||
Curl_ccalloc = (curl_calloc_callback)calloc;
|
Curl_ccalloc = (curl_calloc_callback)calloc;
|
||||||
|
|
||||||
if (flags & CURL_GLOBAL_SSL)
|
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;
|
return CURLE_FAILED_INIT;
|
||||||
|
}
|
||||||
|
|
||||||
if (flags & CURL_GLOBAL_WIN32)
|
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;
|
return CURLE_FAILED_INIT;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef _AMIGASF
|
#ifdef __AMIGA__
|
||||||
if(!amiga_init())
|
if(!amiga_init()) {
|
||||||
|
DEBUGF(fprintf(stderr, "Error: amiga_init failed\n"));
|
||||||
return CURLE_FAILED_INIT;
|
return CURLE_FAILED_INIT;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef USE_LIBIDN
|
#ifdef USE_LIBIDN
|
||||||
@@ -299,7 +301,7 @@ void curl_global_cleanup(void)
|
|||||||
if (init_flags & CURL_GLOBAL_WIN32)
|
if (init_flags & CURL_GLOBAL_WIN32)
|
||||||
win32_cleanup();
|
win32_cleanup();
|
||||||
|
|
||||||
#ifdef _AMIGASF
|
#ifdef __AMIGA__
|
||||||
amiga_cleanup();
|
amiga_cleanup();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -318,15 +320,19 @@ CURL *curl_easy_init(void)
|
|||||||
/* Make sure we inited the global SSL stuff */
|
/* Make sure we inited the global SSL stuff */
|
||||||
if (!initialized) {
|
if (!initialized) {
|
||||||
res = curl_global_init(CURL_GLOBAL_DEFAULT);
|
res = curl_global_init(CURL_GLOBAL_DEFAULT);
|
||||||
if(res)
|
if(res) {
|
||||||
/* something in the global init failed, return nothing */
|
/* something in the global init failed, return nothing */
|
||||||
|
DEBUGF(fprintf(stderr, "Error: curl_global_init failed\n"));
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* We use curl_open() with undefined URL so far */
|
/* We use curl_open() with undefined URL so far */
|
||||||
res = Curl_open(&data);
|
res = Curl_open(&data);
|
||||||
if(res != CURLE_OK)
|
if(res != CURLE_OK) {
|
||||||
|
DEBUGF(fprintf(stderr, "Error: Curl_open failed\n"));
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
@@ -391,7 +397,10 @@ CURLcode curl_easy_perform(CURL *easy)
|
|||||||
mcode = curl_multi_add_handle(multi, easy);
|
mcode = curl_multi_add_handle(multi, easy);
|
||||||
if(mcode) {
|
if(mcode) {
|
||||||
curl_multi_cleanup(multi);
|
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 */
|
/* 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 */
|
/* get file descriptors from the transfers */
|
||||||
curl_multi_fdset(multi, &fdread, &fdwrite, &fdexcep, &maxfd);
|
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)
|
if(rc == -1)
|
||||||
/* select error */
|
/* select error */
|
||||||
@@ -627,7 +636,8 @@ CURL *curl_easy_duphandle(CURL *incurl)
|
|||||||
|
|
||||||
if(fail) {
|
if(fail) {
|
||||||
if(outcurl) {
|
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);
|
Curl_rm_connc(outcurl->state.connc);
|
||||||
if(outcurl->state.headerbuff)
|
if(outcurl->state.headerbuff)
|
||||||
free(outcurl->state.headerbuff);
|
free(outcurl->state.headerbuff);
|
||||||
@@ -740,17 +750,19 @@ CURLcode Curl_convert_to_network(struct SessionHandle *data,
|
|||||||
/* do the translation ourselves */
|
/* do the translation ourselves */
|
||||||
char *input_ptr, *output_ptr;
|
char *input_ptr, *output_ptr;
|
||||||
size_t in_bytes, out_bytes, rc;
|
size_t in_bytes, out_bytes, rc;
|
||||||
|
int error;
|
||||||
|
|
||||||
/* open an iconv conversion descriptor if necessary */
|
/* open an iconv conversion descriptor if necessary */
|
||||||
if(data->outbound_cd == (iconv_t)-1) {
|
if(data->outbound_cd == (iconv_t)-1) {
|
||||||
data->outbound_cd = iconv_open(CURL_ICONV_CODESET_OF_NETWORK,
|
data->outbound_cd = iconv_open(CURL_ICONV_CODESET_OF_NETWORK,
|
||||||
CURL_ICONV_CODESET_OF_HOST);
|
CURL_ICONV_CODESET_OF_HOST);
|
||||||
if(data->outbound_cd == (iconv_t)-1) {
|
if(data->outbound_cd == (iconv_t)-1) {
|
||||||
|
error = ERRNO;
|
||||||
failf(data,
|
failf(data,
|
||||||
"The iconv_open(\"%s\", \"%s\") call failed with errno %i: %s",
|
"The iconv_open(\"%s\", \"%s\") call failed with errno %i: %s",
|
||||||
CURL_ICONV_CODESET_OF_NETWORK,
|
CURL_ICONV_CODESET_OF_NETWORK,
|
||||||
CURL_ICONV_CODESET_OF_HOST,
|
CURL_ICONV_CODESET_OF_HOST,
|
||||||
errno, strerror(errno));
|
error, strerror(error));
|
||||||
return CURLE_CONV_FAILED;
|
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,
|
rc = iconv(data->outbound_cd, (const char**)&input_ptr, &in_bytes,
|
||||||
&output_ptr, &out_bytes);
|
&output_ptr, &out_bytes);
|
||||||
if ((rc == ICONV_ERROR) || (in_bytes != 0)) {
|
if ((rc == ICONV_ERROR) || (in_bytes != 0)) {
|
||||||
|
error = ERRNO;
|
||||||
failf(data,
|
failf(data,
|
||||||
"The Curl_convert_to_network iconv call failed with errno %i: %s",
|
"The Curl_convert_to_network iconv call failed with errno %i: %s",
|
||||||
errno, strerror(errno));
|
error, strerror(error));
|
||||||
return CURLE_CONV_FAILED;
|
return CURLE_CONV_FAILED;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
@@ -797,17 +810,19 @@ CURLcode Curl_convert_from_network(struct SessionHandle *data,
|
|||||||
/* do the translation ourselves */
|
/* do the translation ourselves */
|
||||||
char *input_ptr, *output_ptr;
|
char *input_ptr, *output_ptr;
|
||||||
size_t in_bytes, out_bytes, rc;
|
size_t in_bytes, out_bytes, rc;
|
||||||
|
int error;
|
||||||
|
|
||||||
/* open an iconv conversion descriptor if necessary */
|
/* open an iconv conversion descriptor if necessary */
|
||||||
if(data->inbound_cd == (iconv_t)-1) {
|
if(data->inbound_cd == (iconv_t)-1) {
|
||||||
data->inbound_cd = iconv_open(CURL_ICONV_CODESET_OF_HOST,
|
data->inbound_cd = iconv_open(CURL_ICONV_CODESET_OF_HOST,
|
||||||
CURL_ICONV_CODESET_OF_NETWORK);
|
CURL_ICONV_CODESET_OF_NETWORK);
|
||||||
if(data->inbound_cd == (iconv_t)-1) {
|
if(data->inbound_cd == (iconv_t)-1) {
|
||||||
|
error = ERRNO;
|
||||||
failf(data,
|
failf(data,
|
||||||
"The iconv_open(\"%s\", \"%s\") call failed with errno %i: %s",
|
"The iconv_open(\"%s\", \"%s\") call failed with errno %i: %s",
|
||||||
CURL_ICONV_CODESET_OF_HOST,
|
CURL_ICONV_CODESET_OF_HOST,
|
||||||
CURL_ICONV_CODESET_OF_NETWORK,
|
CURL_ICONV_CODESET_OF_NETWORK,
|
||||||
errno, strerror(errno));
|
error, strerror(error));
|
||||||
return CURLE_CONV_FAILED;
|
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,
|
rc = iconv(data->inbound_cd, (const char **)&input_ptr, &in_bytes,
|
||||||
&output_ptr, &out_bytes);
|
&output_ptr, &out_bytes);
|
||||||
if ((rc == ICONV_ERROR) || (in_bytes != 0)) {
|
if ((rc == ICONV_ERROR) || (in_bytes != 0)) {
|
||||||
|
error = ERRNO;
|
||||||
failf(data,
|
failf(data,
|
||||||
"The Curl_convert_from_network iconv call failed with errno %i: %s",
|
"The Curl_convert_from_network iconv call failed with errno %i: %s",
|
||||||
errno, strerror(errno));
|
error, strerror(error));
|
||||||
return CURLE_CONV_FAILED;
|
return CURLE_CONV_FAILED;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
@@ -854,17 +870,19 @@ CURLcode Curl_convert_from_utf8(struct SessionHandle *data,
|
|||||||
/* do the translation ourselves */
|
/* do the translation ourselves */
|
||||||
char *input_ptr, *output_ptr;
|
char *input_ptr, *output_ptr;
|
||||||
size_t in_bytes, out_bytes, rc;
|
size_t in_bytes, out_bytes, rc;
|
||||||
|
int error;
|
||||||
|
|
||||||
/* open an iconv conversion descriptor if necessary */
|
/* open an iconv conversion descriptor if necessary */
|
||||||
if(data->utf8_cd == (iconv_t)-1) {
|
if(data->utf8_cd == (iconv_t)-1) {
|
||||||
data->utf8_cd = iconv_open(CURL_ICONV_CODESET_OF_HOST,
|
data->utf8_cd = iconv_open(CURL_ICONV_CODESET_OF_HOST,
|
||||||
CURL_ICONV_CODESET_FOR_UTF8);
|
CURL_ICONV_CODESET_FOR_UTF8);
|
||||||
if(data->utf8_cd == (iconv_t)-1) {
|
if(data->utf8_cd == (iconv_t)-1) {
|
||||||
|
error = ERRNO;
|
||||||
failf(data,
|
failf(data,
|
||||||
"The iconv_open(\"%s\", \"%s\") call failed with errno %i: %s",
|
"The iconv_open(\"%s\", \"%s\") call failed with errno %i: %s",
|
||||||
CURL_ICONV_CODESET_OF_HOST,
|
CURL_ICONV_CODESET_OF_HOST,
|
||||||
CURL_ICONV_CODESET_FOR_UTF8,
|
CURL_ICONV_CODESET_FOR_UTF8,
|
||||||
errno, strerror(errno));
|
error, strerror(error));
|
||||||
return CURLE_CONV_FAILED;
|
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,
|
rc = iconv(data->utf8_cd, (const char**)&input_ptr, &in_bytes,
|
||||||
&output_ptr, &out_bytes);
|
&output_ptr, &out_bytes);
|
||||||
if ((rc == ICONV_ERROR) || (in_bytes != 0)) {
|
if ((rc == ICONV_ERROR) || (in_bytes != 0)) {
|
||||||
|
error = ERRNO;
|
||||||
failf(data,
|
failf(data,
|
||||||
"The Curl_convert_from_utf8 iconv call failed with errno %i: %s",
|
"The Curl_convert_from_utf8 iconv call failed with errno %i: %s",
|
||||||
errno, strerror(errno));
|
error, strerror(error));
|
||||||
return CURLE_CONV_FAILED;
|
return CURLE_CONV_FAILED;
|
||||||
}
|
}
|
||||||
if (output_ptr < input_ptr) {
|
if (output_ptr < input_ptr) {
|
||||||
|
@@ -30,12 +30,6 @@
|
|||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <ctype.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
|
#ifdef WIN32
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
@@ -112,9 +112,6 @@ Content-Disposition: form-data; name="FILECONTENT"
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#ifdef HAVE_SYS_STAT_H
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#endif
|
|
||||||
#if defined(HAVE_LIBGEN_H) && defined(HAVE_BASENAME)
|
#if defined(HAVE_LIBGEN_H) && defined(HAVE_BASENAME)
|
||||||
#include <libgen.h>
|
#include <libgen.h>
|
||||||
#endif
|
#endif
|
||||||
@@ -285,13 +282,15 @@ static const char * ContentTypeForFilename (const char *filename,
|
|||||||
text/plain so we don't actually need to set this: */
|
text/plain so we don't actually need to set this: */
|
||||||
contenttype = HTTPPOST_CONTENTTYPE_DEFAULT;
|
contenttype = HTTPPOST_CONTENTTYPE_DEFAULT;
|
||||||
|
|
||||||
for(i=0; i<sizeof(ctts)/sizeof(ctts[0]); i++) {
|
if(filename) { /* in case a NULL was passed in */
|
||||||
if(strlen(filename) >= strlen(ctts[i].extension)) {
|
for(i=0; i<sizeof(ctts)/sizeof(ctts[0]); i++) {
|
||||||
if(strequal(filename +
|
if(strlen(filename) >= strlen(ctts[i].extension)) {
|
||||||
strlen(filename) - strlen(ctts[i].extension),
|
if(strequal(filename +
|
||||||
ctts[i].extension)) {
|
strlen(filename) - strlen(ctts[i].extension),
|
||||||
contenttype = ctts[i].type;
|
ctts[i].extension)) {
|
||||||
break;
|
contenttype = ctts[i].type;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -318,10 +317,14 @@ static char *memdup(const char *src, size_t buffer_length)
|
|||||||
|
|
||||||
if (buffer_length)
|
if (buffer_length)
|
||||||
length = buffer_length;
|
length = buffer_length;
|
||||||
else {
|
else if(src) {
|
||||||
length = strlen(src);
|
length = strlen(src);
|
||||||
add = TRUE;
|
add = TRUE;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
/* no length and a NULL src pointer! */
|
||||||
|
return strdup((char *)"");
|
||||||
|
|
||||||
buffer = (char*)malloc(length+add);
|
buffer = (char*)malloc(length+add);
|
||||||
if (!buffer)
|
if (!buffer)
|
||||||
return NULL; /* fail */
|
return NULL; /* fail */
|
||||||
|
145
lib/ftp.c
145
lib/ftp.c
@@ -34,13 +34,10 @@
|
|||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef WIN32
|
#ifndef WIN32
|
||||||
|
|
||||||
#else /* probably some kind of unix */
|
|
||||||
#ifdef HAVE_SYS_SOCKET_H
|
#ifdef HAVE_SYS_SOCKET_H
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#endif
|
#endif
|
||||||
#include <sys/types.h>
|
|
||||||
#ifdef HAVE_NETINET_IN_H
|
#ifdef HAVE_NETINET_IN_H
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
#endif
|
#endif
|
||||||
@@ -57,7 +54,7 @@
|
|||||||
#include <in.h>
|
#include <in.h>
|
||||||
#include <inet.h>
|
#include <inet.h>
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif /* !WIN32 */
|
||||||
|
|
||||||
#if (defined(NETWARE) && defined(__NOVELL_LIBC__))
|
#if (defined(NETWARE) && defined(__NOVELL_LIBC__))
|
||||||
#undef in_addr_t
|
#undef in_addr_t
|
||||||
@@ -75,6 +72,7 @@
|
|||||||
#include "transfer.h"
|
#include "transfer.h"
|
||||||
#include "escape.h"
|
#include "escape.h"
|
||||||
#include "http.h" /* for HTTP proxy tunnel stuff */
|
#include "http.h" /* for HTTP proxy tunnel stuff */
|
||||||
|
#include "socks.h"
|
||||||
#include "ftp.h"
|
#include "ftp.h"
|
||||||
|
|
||||||
#ifdef HAVE_KRB4
|
#ifdef HAVE_KRB4
|
||||||
@@ -111,16 +109,22 @@
|
|||||||
#define NIFLAGS NI_NUMERICHOST | NI_NUMERICSERV
|
#define NIFLAGS NI_NUMERICHOST | NI_NUMERICSERV
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef CURL_DISABLE_VERBOSE_STRINGS
|
||||||
|
#define ftp_pasv_verbose(a,b,c,d) do { } while (0)
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Local API functions */
|
/* Local API functions */
|
||||||
static CURLcode ftp_sendquote(struct connectdata *conn,
|
static CURLcode ftp_sendquote(struct connectdata *conn,
|
||||||
struct curl_slist *quote);
|
struct curl_slist *quote);
|
||||||
static CURLcode ftp_quit(struct connectdata *conn);
|
static CURLcode ftp_quit(struct connectdata *conn);
|
||||||
static CURLcode ftp_parse_url_path(struct connectdata *conn);
|
static CURLcode ftp_parse_url_path(struct connectdata *conn);
|
||||||
static CURLcode ftp_regular_transfer(struct connectdata *conn, bool *done);
|
static CURLcode ftp_regular_transfer(struct connectdata *conn, bool *done);
|
||||||
|
#ifndef CURL_DISABLE_VERBOSE_STRINGS
|
||||||
static void ftp_pasv_verbose(struct connectdata *conn,
|
static void ftp_pasv_verbose(struct connectdata *conn,
|
||||||
Curl_addrinfo *ai,
|
Curl_addrinfo *ai,
|
||||||
char *newhost, /* ascii version */
|
char *newhost, /* ascii version */
|
||||||
int port);
|
int port);
|
||||||
|
#endif
|
||||||
static CURLcode ftp_state_post_rest(struct connectdata *conn);
|
static CURLcode ftp_state_post_rest(struct connectdata *conn);
|
||||||
static CURLcode ftp_state_post_cwd(struct connectdata *conn);
|
static CURLcode ftp_state_post_cwd(struct connectdata *conn);
|
||||||
static CURLcode ftp_state_quote(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;
|
struct SessionHandle *data = conn->data;
|
||||||
curl_socket_t sock = conn->sock[SECONDARYSOCKET];
|
curl_socket_t sock = conn->sock[SECONDARYSOCKET];
|
||||||
struct timeval now = Curl_tvnow();
|
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:
|
long timeout = data->set.connecttimeout?data->set.connecttimeout:
|
||||||
(data->set.timeout?data->set.timeout: 0);
|
(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.
|
/* We allow the server 60 seconds to connect to us, or a custom timeout.
|
||||||
Note the typecast here. */
|
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 */
|
case -1: /* error */
|
||||||
/* let's die here */
|
/* let's die here */
|
||||||
failf(data, "Error while waiting for server connect");
|
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;
|
struct ftp_conn *ftpc = &conn->proto.ftpc;
|
||||||
int code = 0;
|
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;
|
ptr=buf + ftpc->nread_resp;
|
||||||
|
|
||||||
@@ -328,7 +331,7 @@ static CURLcode ftp_readresp(curl_socket_t sockfd,
|
|||||||
* line */
|
* line */
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
conn->headerbytecount += gotbytes;
|
data->reqdata.keep.headerbytecount += gotbytes;
|
||||||
|
|
||||||
ftpc->nread_resp += gotbytes;
|
ftpc->nread_resp += gotbytes;
|
||||||
for(i = 0; i < gotbytes; ptr++, i++) {
|
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 */
|
*ftpcode=code; /* return the initial number like this */
|
||||||
|
|
||||||
|
|
||||||
/* store the latest code for later retrieval */
|
/* store the latest code for later retrieval */
|
||||||
conn->data->info.httpcode=code;
|
conn->data->info.httpcode=code;
|
||||||
|
|
||||||
@@ -444,8 +446,8 @@ CURLcode Curl_GetFTPResponse(ssize_t *nreadp, /* return number of bytes read */
|
|||||||
bool keepon=TRUE;
|
bool keepon=TRUE;
|
||||||
ssize_t gotbytes;
|
ssize_t gotbytes;
|
||||||
char *ptr;
|
char *ptr;
|
||||||
long timeout; /* timeout in seconds */
|
long timeout; /* timeout in milliseconds */
|
||||||
int interval_ms;
|
long interval_ms;
|
||||||
struct SessionHandle *data = conn->data;
|
struct SessionHandle *data = conn->data;
|
||||||
char *line_start;
|
char *line_start;
|
||||||
int code=0; /* default ftp "error code" to return */
|
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
|
the response for any given ftp response, not for the time
|
||||||
from connect to the given ftp response. */
|
from connect to the given ftp response. */
|
||||||
timeout = data->set.ftp_response_timeout - /* timeout time */
|
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)
|
else if(data->set.timeout)
|
||||||
/* if timeout is requested, find out how much remaining time we have */
|
/* if timeout is requested, find out how much remaining time we have */
|
||||||
timeout = data->set.timeout - /* timeout time */
|
timeout = data->set.timeout - /* timeout time */
|
||||||
Curl_tvdiff(Curl_tvnow(), conn->now)/1000; /* spent time */
|
Curl_tvdiff(Curl_tvnow(), conn->now); /* spent time */
|
||||||
else
|
else
|
||||||
/* Even without a requested timeout, we only wait response_time
|
/* Even without a requested timeout, we only wait response_time
|
||||||
seconds for the full response to arrive before we bail out */
|
seconds for the full response to arrive before we bail out */
|
||||||
timeout = ftpc->response_time -
|
timeout = ftpc->response_time -
|
||||||
Curl_tvdiff(Curl_tvnow(), now)/1000; /* spent time */
|
Curl_tvdiff(Curl_tvnow(), now); /* spent time */
|
||||||
|
|
||||||
if(timeout <=0 ) {
|
if(timeout <=0 ) {
|
||||||
failf(data, "FTP response timeout");
|
failf(data, "FTP response timeout");
|
||||||
@@ -491,12 +493,14 @@ CURLcode Curl_GetFTPResponse(ssize_t *nreadp, /* return number of bytes read */
|
|||||||
|
|
||||||
if(!ftpc->cache) {
|
if(!ftpc->cache) {
|
||||||
interval_ms = 1 * 1000; /* use 1 second timeout intervals */
|
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 */
|
case -1: /* select() error, stop reading */
|
||||||
result = CURLE_RECV_ERROR;
|
result = CURLE_RECV_ERROR;
|
||||||
failf(data, "FTP response aborted due to select() error: %d",
|
failf(data, "FTP response aborted due to select/poll error: %d",
|
||||||
Curl_sockerrno());
|
SOCKERRNO);
|
||||||
break;
|
break;
|
||||||
case 0: /* timeout */
|
case 0: /* timeout */
|
||||||
if(Curl_pgrsUpdate(conn))
|
if(Curl_pgrsUpdate(conn))
|
||||||
@@ -560,7 +564,7 @@ CURLcode Curl_GetFTPResponse(ssize_t *nreadp, /* return number of bytes read */
|
|||||||
* line */
|
* line */
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
conn->headerbytecount += gotbytes;
|
data->reqdata.keep.headerbytecount += gotbytes;
|
||||||
|
|
||||||
*nreadp += gotbytes;
|
*nreadp += gotbytes;
|
||||||
for(i = 0; i < gotbytes; ptr++, i++) {
|
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,
|
static void state(struct connectdata *conn,
|
||||||
ftpstate state)
|
ftpstate state)
|
||||||
{
|
{
|
||||||
#ifdef CURLDEBUG
|
#if defined(CURLDEBUG) && !defined(CURL_DISABLE_VERBOSE_STRINGS)
|
||||||
/* for debug purposes */
|
/* for debug purposes */
|
||||||
const char *names[]={
|
const char *names[]={
|
||||||
"STOP",
|
"STOP",
|
||||||
@@ -693,7 +697,7 @@ static void state(struct connectdata *conn,
|
|||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
struct ftp_conn *ftpc = &conn->proto.ftpc;
|
struct ftp_conn *ftpc = &conn->proto.ftpc;
|
||||||
#ifdef CURLDEBUG
|
#if defined(CURLDEBUG) && !defined(CURL_DISABLE_VERBOSE_STRINGS)
|
||||||
if(ftpc->state != state)
|
if(ftpc->state != state)
|
||||||
infof(conn->data, "FTP %p state change from %s to %s\n",
|
infof(conn->data, "FTP %p state change from %s to %s\n",
|
||||||
ftpc, names[ftpc->state], names[state]);
|
ftpc, names[ftpc->state], names[state]);
|
||||||
@@ -839,7 +843,7 @@ static CURLcode ftp_state_use_port(struct connectdata *conn,
|
|||||||
sslen = sizeof(ss);
|
sslen = sizeof(ss);
|
||||||
if (getsockname(conn->sock[FIRSTSOCKET], (struct sockaddr *)&ss, &sslen)) {
|
if (getsockname(conn->sock[FIRSTSOCKET], (struct sockaddr *)&ss, &sslen)) {
|
||||||
failf(data, "getsockname() failed: %s",
|
failf(data, "getsockname() failed: %s",
|
||||||
Curl_strerror(conn, Curl_sockerrno()) );
|
Curl_strerror(conn, SOCKERRNO) );
|
||||||
return CURLE_FTP_PORT_FAILED;
|
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);
|
portsock = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
|
||||||
if (portsock == CURL_SOCKET_BAD) {
|
if (portsock == CURL_SOCKET_BAD) {
|
||||||
error = Curl_sockerrno();
|
error = SOCKERRNO;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -900,7 +904,7 @@ static CURLcode ftp_state_use_port(struct connectdata *conn,
|
|||||||
if (getsockname(conn->sock[FIRSTSOCKET],
|
if (getsockname(conn->sock[FIRSTSOCKET],
|
||||||
(struct sockaddr *)sa, &sslen)) {
|
(struct sockaddr *)sa, &sslen)) {
|
||||||
failf(data, "getsockname() failed: %s",
|
failf(data, "getsockname() failed: %s",
|
||||||
Curl_strerror(conn, Curl_sockerrno()) );
|
Curl_strerror(conn, SOCKERRNO) );
|
||||||
sclose(portsock);
|
sclose(portsock);
|
||||||
return CURLE_FTP_PORT_FAILED;
|
return CURLE_FTP_PORT_FAILED;
|
||||||
}
|
}
|
||||||
@@ -915,7 +919,7 @@ static CURLcode ftp_state_use_port(struct connectdata *conn,
|
|||||||
sslen = sizeof(ss);
|
sslen = sizeof(ss);
|
||||||
|
|
||||||
if(bind(portsock, (struct sockaddr *)sa, sslen)) {
|
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);
|
sclose(portsock);
|
||||||
return CURLE_FTP_PORT_FAILED;
|
return CURLE_FTP_PORT_FAILED;
|
||||||
}
|
}
|
||||||
@@ -926,7 +930,7 @@ static CURLcode ftp_state_use_port(struct connectdata *conn,
|
|||||||
sslen = sizeof(ss);
|
sslen = sizeof(ss);
|
||||||
if(getsockname(portsock, (struct sockaddr *)sa, &sslen)) {
|
if(getsockname(portsock, (struct sockaddr *)sa, &sslen)) {
|
||||||
failf(data, "getsockname() failed: %s",
|
failf(data, "getsockname() failed: %s",
|
||||||
Curl_strerror(conn, Curl_sockerrno()) );
|
Curl_strerror(conn, SOCKERRNO) );
|
||||||
sclose(portsock);
|
sclose(portsock);
|
||||||
return CURLE_FTP_PORT_FAILED;
|
return CURLE_FTP_PORT_FAILED;
|
||||||
}
|
}
|
||||||
@@ -934,7 +938,7 @@ static CURLcode ftp_state_use_port(struct connectdata *conn,
|
|||||||
/* step 4, listen on the socket */
|
/* step 4, listen on the socket */
|
||||||
|
|
||||||
if (listen(portsock, 1)) {
|
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);
|
sclose(portsock);
|
||||||
return CURLE_FTP_PORT_FAILED;
|
return CURLE_FTP_PORT_FAILED;
|
||||||
}
|
}
|
||||||
@@ -1078,7 +1082,7 @@ static CURLcode ftp_state_use_port(struct connectdata *conn,
|
|||||||
if (getsockname(conn->sock[FIRSTSOCKET],
|
if (getsockname(conn->sock[FIRSTSOCKET],
|
||||||
(struct sockaddr *)&sa, &sslen)) {
|
(struct sockaddr *)&sa, &sslen)) {
|
||||||
failf(data, "getsockname() failed: %s",
|
failf(data, "getsockname() failed: %s",
|
||||||
Curl_strerror(conn, Curl_sockerrno()) );
|
Curl_strerror(conn, SOCKERRNO) );
|
||||||
return CURLE_FTP_PORT_FAILED;
|
return CURLE_FTP_PORT_FAILED;
|
||||||
}
|
}
|
||||||
if (sslen > (socklen_t)sizeof(sa))
|
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,
|
if(getsockname(portsock, (struct sockaddr *) &add,
|
||||||
&socksize)) {
|
&socksize)) {
|
||||||
failf(data, "getsockname() failed: %s",
|
failf(data, "getsockname() failed: %s",
|
||||||
Curl_strerror(conn, Curl_sockerrno()) );
|
Curl_strerror(conn, SOCKERRNO) );
|
||||||
return CURLE_FTP_PORT_FAILED;
|
return CURLE_FTP_PORT_FAILED;
|
||||||
}
|
}
|
||||||
porttouse = ntohs(add.sin_port);
|
porttouse = ntohs(add.sin_port);
|
||||||
@@ -1586,7 +1590,7 @@ static CURLcode ftp_state_pasv_resp(struct connectdata *conn,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(ptr) {
|
if(ptr) {
|
||||||
newport = num;
|
newport = (unsigned short)(num & 0xffff);
|
||||||
|
|
||||||
if (conn->bits.tunnel_proxy)
|
if (conn->bits.tunnel_proxy)
|
||||||
/* proxy tunnel -> use other host info because ip_addr_str is the
|
/* 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
|
else
|
||||||
snprintf(newhost, sizeof(newhost),
|
snprintf(newhost, sizeof(newhost),
|
||||||
"%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]);
|
"%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) {
|
else if(ftpc->count1 == 0) {
|
||||||
/* EPSV failed, move on to PASV */
|
/* 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 */
|
/* this just dumps information about this second connection */
|
||||||
ftp_pasv_verbose(conn, conninfo, newhost, connectport);
|
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
|
#ifndef CURL_DISABLE_HTTP
|
||||||
if(conn->bits.tunnel_proxy && conn->bits.httpproxy) {
|
if(conn->bits.tunnel_proxy && conn->bits.httpproxy) {
|
||||||
/* FIX: this MUST wait for a proper connect first if 'connected' is
|
/* 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 */
|
/* we failed and bails out */
|
||||||
return CURLE_FTP_SSL_FAILED;
|
return CURLE_FTP_SSL_FAILED;
|
||||||
|
|
||||||
if(data->set.ftp_use_ccc) {
|
if(data->set.ftp_ccc) {
|
||||||
/* CCC - Clear Command Channel
|
/* CCC - Clear Command Channel
|
||||||
*/
|
*/
|
||||||
NBFTPSENDF(conn, "CCC", NULL);
|
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
|
time. Also, use ftp->response because FTP_RESPONSE_TIMEOUT is supposed
|
||||||
to govern the response for any given ftp response, not for the time
|
to govern the response for any given ftp response, not for the time
|
||||||
from connect to the given ftp response. */
|
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 */
|
Curl_tvdiff(Curl_tvnow(), ftpc->response); /* spent time */
|
||||||
else if(data->set.timeout)
|
else if(data->set.timeout)
|
||||||
/* if timeout is requested, find out how much remaining time we have */
|
/* 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 */
|
Curl_tvdiff(Curl_tvnow(), conn->now); /* spent time */
|
||||||
else
|
else
|
||||||
/* Without a requested timeout, we only wait 'response_time' seconds for
|
/* Without a requested timeout, we only wait 'response_time' seconds for
|
||||||
the full response to arrive before we bail out */
|
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 */
|
Curl_tvdiff(Curl_tvnow(), ftpc->response); /* spent time */
|
||||||
|
|
||||||
return timeout_ms;
|
return timeout_ms;
|
||||||
@@ -2785,12 +2806,12 @@ CURLcode Curl_ftp_multi_statemach(struct connectdata *conn,
|
|||||||
return CURLE_OPERATION_TIMEDOUT;
|
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 */
|
ftpc->sendleft?sock:CURL_SOCKET_BAD, /* writing */
|
||||||
0);
|
0);
|
||||||
|
|
||||||
if(rc == -1) {
|
if(rc == -1) {
|
||||||
failf(data, "select error");
|
failf(data, "select/poll error");
|
||||||
return CURLE_OUT_OF_MEMORY;
|
return CURLE_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
else if(rc != 0) {
|
else if(rc != 0) {
|
||||||
@@ -2818,12 +2839,12 @@ static CURLcode ftp_easy_statemach(struct connectdata *conn)
|
|||||||
return CURLE_OPERATION_TIMEDOUT; /* already too little time */
|
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 */
|
ftpc->sendleft?sock:CURL_SOCKET_BAD, /* writing */
|
||||||
(int)timeout_ms);
|
(int)timeout_ms);
|
||||||
|
|
||||||
if(rc == -1) {
|
if(rc == -1) {
|
||||||
failf(data, "select error");
|
failf(data, "select/poll error");
|
||||||
return CURLE_OUT_OF_MEMORY;
|
return CURLE_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
else if(rc == 0) {
|
else if(rc == 0) {
|
||||||
@@ -2904,7 +2925,7 @@ CURLcode Curl_ftp_connect(struct connectdata *conn,
|
|||||||
/* We always support persistant connections on ftp */
|
/* We always support persistant connections on ftp */
|
||||||
conn->bits.close = FALSE;
|
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
|
#ifndef CURL_DISABLE_HTTP
|
||||||
if (conn->bits.tunnel_proxy && conn->bits.httpproxy) {
|
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_RETR_FILE:
|
||||||
case CURLE_FTP_COULDNT_STOR_FILE:
|
case CURLE_FTP_COULDNT_STOR_FILE:
|
||||||
case CURLE_FTP_ACCESS_DENIED:
|
case CURLE_FTP_ACCESS_DENIED:
|
||||||
|
case CURLE_FILESIZE_EXCEEDED:
|
||||||
/* the connection stays alive fine even though this happened */
|
/* the connection stays alive fine even though this happened */
|
||||||
/* fall-through */
|
/* fall-through */
|
||||||
case CURLE_OK: /* doesn't affect the control connection's status */
|
case CURLE_OK: /* doesn't affect the control connection's status */
|
||||||
@@ -3063,7 +3085,7 @@ CURLcode Curl_ftp_done(struct connectdata *conn, CURLcode status, bool premature
|
|||||||
*/
|
*/
|
||||||
long old_time = ftpc->response_time;
|
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);
|
result = Curl_GetFTPResponse(&nread, conn, &ftpcode);
|
||||||
|
|
||||||
@@ -3208,7 +3230,7 @@ static CURLcode ftp_nb_type(struct connectdata *conn,
|
|||||||
state(conn, newstate);
|
state(conn, newstate);
|
||||||
|
|
||||||
/* keep track of our current transfer type */
|
/* keep track of our current transfer type */
|
||||||
ftpc->transfertype = want;
|
ftpc->transfertype = (char)want;
|
||||||
return CURLE_OK;
|
return CURLE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3221,6 +3243,7 @@ static CURLcode ftp_nb_type(struct connectdata *conn,
|
|||||||
* possibly new IP address.
|
* possibly new IP address.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
#ifndef CURL_DISABLE_VERBOSE_STRINGS
|
||||||
static void
|
static void
|
||||||
ftp_pasv_verbose(struct connectdata *conn,
|
ftp_pasv_verbose(struct connectdata *conn,
|
||||||
Curl_addrinfo *ai,
|
Curl_addrinfo *ai,
|
||||||
@@ -3231,6 +3254,7 @@ ftp_pasv_verbose(struct connectdata *conn,
|
|||||||
Curl_printable_address(ai, buf, sizeof(buf));
|
Curl_printable_address(ai, buf, sizeof(buf));
|
||||||
infof(conn->data, "Connecting to %s (%s) port %d\n", newhost, buf, port);
|
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
|
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));
|
from, to, data->reqdata.maxdownload));
|
||||||
ftpc->dont_check = TRUE; /* dont check for successful transfer */
|
ftpc->dont_check = TRUE; /* dont check for successful transfer */
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
data->reqdata.maxdownload = -1;
|
||||||
return CURLE_OK;
|
return CURLE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3621,7 +3647,6 @@ CURLcode Curl_ftp_disconnect(struct connectdata *conn)
|
|||||||
static
|
static
|
||||||
CURLcode ftp_parse_url_path(struct connectdata *conn)
|
CURLcode ftp_parse_url_path(struct connectdata *conn)
|
||||||
{
|
{
|
||||||
CURLcode retcode = CURLE_OK;
|
|
||||||
struct SessionHandle *data = conn->data;
|
struct SessionHandle *data = conn->data;
|
||||||
/* the ftp struct is already inited in ftp_connect() */
|
/* the ftp struct is already inited in ftp_connect() */
|
||||||
struct FTP *ftp = data->reqdata.proto.ftp;
|
struct FTP *ftp = data->reqdata.proto.ftp;
|
||||||
@@ -3646,7 +3671,7 @@ CURLcode ftp_parse_url_path(struct connectdata *conn)
|
|||||||
case FTPFILE_SINGLECWD:
|
case FTPFILE_SINGLECWD:
|
||||||
/* get the last slash */
|
/* get the last slash */
|
||||||
slash_pos=strrchr(cur_pos, '/');
|
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->dirdepth = 1; /* we consider it to be a single dir */
|
||||||
ftpc->dirs = (char **)calloc(1, sizeof(ftpc->dirs[0]));
|
ftpc->dirs = (char **)calloc(1, sizeof(ftpc->dirs[0]));
|
||||||
if(!ftpc->dirs)
|
if(!ftpc->dirs)
|
||||||
@@ -3694,6 +3719,7 @@ CURLcode ftp_parse_url_path(struct connectdata *conn)
|
|||||||
return CURLE_OUT_OF_MEMORY;
|
return CURLE_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
if (isBadFtpString(ftpc->dirs[ftpc->dirdepth])) {
|
if (isBadFtpString(ftpc->dirs[ftpc->dirdepth])) {
|
||||||
|
free(ftpc->dirs[ftpc->dirdepth]);
|
||||||
freedirs(conn);
|
freedirs(conn);
|
||||||
return CURLE_URL_MALFORMAT;
|
return CURLE_URL_MALFORMAT;
|
||||||
}
|
}
|
||||||
@@ -3703,20 +3729,17 @@ CURLcode ftp_parse_url_path(struct connectdata *conn)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!retcode) {
|
cur_pos = slash_pos + 1; /* jump to the rest of the string */
|
||||||
cur_pos = slash_pos + 1; /* jump to the rest of the string */
|
if(++ftpc->dirdepth >= ftpc->diralloc) {
|
||||||
if(++ftpc->dirdepth >= ftpc->diralloc) {
|
/* enlarge array */
|
||||||
/* enlarge array */
|
char *bigger;
|
||||||
char *bigger;
|
ftpc->diralloc *= 2; /* double the size each time */
|
||||||
ftpc->diralloc *= 2; /* double the size each time */
|
bigger = realloc(ftpc->dirs, ftpc->diralloc * sizeof(ftpc->dirs[0]));
|
||||||
bigger = realloc(ftpc->dirs, ftpc->diralloc * sizeof(ftpc->dirs[0]));
|
if(!bigger) {
|
||||||
if(!bigger) {
|
freedirs(conn);
|
||||||
ftpc->dirdepth--;
|
return CURLE_OUT_OF_MEMORY;
|
||||||
freedirs(conn);
|
}
|
||||||
return CURLE_OUT_OF_MEMORY;
|
ftpc->dirs = (char **)bigger;
|
||||||
}
|
|
||||||
ftpc->dirs = (char **)bigger;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3764,7 +3787,7 @@ CURLcode ftp_parse_url_path(struct connectdata *conn)
|
|||||||
free(path);
|
free(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
return retcode;
|
return CURLE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* call this when the DO phase has completed */
|
/* 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
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -75,16 +75,18 @@ CURLcode Curl_getinfo(struct SessionHandle *data, CURLINFO info, ...)
|
|||||||
double *param_doublep=NULL;
|
double *param_doublep=NULL;
|
||||||
char **param_charp=NULL;
|
char **param_charp=NULL;
|
||||||
struct curl_slist **param_slistp=NULL;
|
struct curl_slist **param_slistp=NULL;
|
||||||
|
#ifdef MSG_PEEK
|
||||||
char buf;
|
char buf;
|
||||||
|
#endif
|
||||||
|
int type;
|
||||||
|
|
||||||
if(!data)
|
if(!data)
|
||||||
return CURLE_BAD_FUNCTION_ARGUMENT;
|
return CURLE_BAD_FUNCTION_ARGUMENT;
|
||||||
|
|
||||||
va_start(arg, info);
|
va_start(arg, info);
|
||||||
|
|
||||||
switch(info&CURLINFO_TYPEMASK) {
|
type = CURLINFO_TYPEMASK & (int)info;
|
||||||
default:
|
switch(type) {
|
||||||
return CURLE_BAD_FUNCTION_ARGUMENT;
|
|
||||||
case CURLINFO_STRING:
|
case CURLINFO_STRING:
|
||||||
param_charp = va_arg(arg, char **);
|
param_charp = va_arg(arg, char **);
|
||||||
if(NULL == param_charp)
|
if(NULL == param_charp)
|
||||||
@@ -105,6 +107,8 @@ CURLcode Curl_getinfo(struct SessionHandle *data, CURLINFO info, ...)
|
|||||||
if(NULL == param_slistp)
|
if(NULL == param_slistp)
|
||||||
return CURLE_BAD_FUNCTION_ARGUMENT;
|
return CURLE_BAD_FUNCTION_ARGUMENT;
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
return CURLE_BAD_FUNCTION_ARGUMENT;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch(info) {
|
switch(info) {
|
||||||
|
21
lib/gtls.c
21
lib/gtls.c
@@ -37,9 +37,6 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#ifdef HAVE_SYS_TYPES_H
|
|
||||||
#include <sys/types.h>
|
|
||||||
#endif
|
|
||||||
#ifdef HAVE_SYS_SOCKET_H
|
#ifdef HAVE_SYS_SOCKET_H
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#endif
|
#endif
|
||||||
@@ -144,12 +141,12 @@ static CURLcode handshake(struct connectdata *conn,
|
|||||||
long has_passed;
|
long has_passed;
|
||||||
|
|
||||||
if(duringconnect && data->set.connecttimeout)
|
if(duringconnect && data->set.connecttimeout)
|
||||||
timeout_ms = data->set.connecttimeout*1000;
|
timeout_ms = data->set.connecttimeout;
|
||||||
|
|
||||||
if(data->set.timeout) {
|
if(data->set.timeout) {
|
||||||
/* get the strictest timeout of the ones converted to milliseconds */
|
/* get the strictest timeout of the ones converted to milliseconds */
|
||||||
if((data->set.timeout*1000) < timeout_ms)
|
if(data->set.timeout < timeout_ms)
|
||||||
timeout_ms = data->set.timeout*1000;
|
timeout_ms = data->set.timeout;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Evaluate in milliseconds how much time that has passed */
|
/* Evaluate in milliseconds how much time that has passed */
|
||||||
@@ -164,7 +161,7 @@ static CURLcode handshake(struct connectdata *conn,
|
|||||||
return CURLE_OPERATION_TIMEOUTED;
|
return CURLE_OPERATION_TIMEOUTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
rc = Curl_select(conn->sock[sockindex],
|
rc = Curl_socket_ready(conn->sock[sockindex],
|
||||||
conn->sock[sockindex], (int)timeout_ms);
|
conn->sock[sockindex], (int)timeout_ms);
|
||||||
if(rc > 0)
|
if(rc > 0)
|
||||||
/* reabable or writable, go loop*/
|
/* reabable or writable, go loop*/
|
||||||
@@ -176,7 +173,7 @@ static CURLcode handshake(struct connectdata *conn,
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* anything that gets here is fatally bad */
|
/* 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;
|
return CURLE_SSL_CONNECT_ERROR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -526,7 +523,6 @@ int Curl_gtls_shutdown(struct connectdata *conn, int sockindex)
|
|||||||
int retval = 0;
|
int retval = 0;
|
||||||
struct SessionHandle *data = conn->data;
|
struct SessionHandle *data = conn->data;
|
||||||
int done = 0;
|
int done = 0;
|
||||||
ssize_t nread;
|
|
||||||
char buf[120];
|
char buf[120];
|
||||||
|
|
||||||
/* This has only been tested on the proftpd server, and the mod_tls code
|
/* 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
|
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... */
|
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) {
|
if(conn->ssl[sockindex].session) {
|
||||||
while(!done) {
|
while(!done) {
|
||||||
int what = Curl_select(conn->sock[sockindex],
|
int what = Curl_socket_ready(conn->sock[sockindex],
|
||||||
CURL_SOCKET_BAD, SSL_SHUTDOWN_TIMEOUT);
|
CURL_SOCKET_BAD, SSL_SHUTDOWN_TIMEOUT);
|
||||||
if(what > 0) {
|
if(what > 0) {
|
||||||
/* Something to read, let's do it and hope that it is the close
|
/* 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 {
|
else {
|
||||||
/* anything that gets here is fatally bad */
|
/* 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;
|
retval = -1;
|
||||||
done = 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
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -28,9 +28,6 @@
|
|||||||
#ifdef NEED_MALLOC_H
|
#ifdef NEED_MALLOC_H
|
||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_SYS_TYPES_H
|
|
||||||
#include <sys/types.h>
|
|
||||||
#endif
|
|
||||||
#ifdef HAVE_SYS_SOCKET_H
|
#ifdef HAVE_SYS_SOCKET_H
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#endif
|
#endif
|
||||||
@@ -76,7 +73,8 @@
|
|||||||
#include "strerror.h"
|
#include "strerror.h"
|
||||||
#include "url.h"
|
#include "url.h"
|
||||||
#include "multiif.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 */
|
#define _MPRINTF_REPLACE /* use our functions only */
|
||||||
#include <curl/mprintf.h>
|
#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);
|
nfds = ares_fds(data->state.areschannel, &read_fds, &write_fds);
|
||||||
|
|
||||||
(void)select(nfds, &read_fds, &write_fds, NULL,
|
(void)Curl_select(nfds, &read_fds, &write_fds, NULL,
|
||||||
(struct timeval *)&tv);
|
(struct timeval *)&tv);
|
||||||
|
|
||||||
/* Call ares_process() unconditonally here, even if we simply timed out
|
/* Call ares_process() unconditonally here, even if we simply timed out
|
||||||
above, as otherwise the ares name resolve won't timeout! */
|
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;
|
CURLcode rc=CURLE_OK;
|
||||||
struct SessionHandle *data = conn->data;
|
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
|
/* now, see if there's a connect timeout or a regular timeout to
|
||||||
use instead of the default one */
|
use instead of the default one */
|
||||||
@@ -191,14 +189,8 @@ CURLcode Curl_wait_for_resolv(struct connectdata *conn,
|
|||||||
timeout = conn->data->set.connecttimeout;
|
timeout = conn->data->set.connecttimeout;
|
||||||
else if(conn->data->set.timeout)
|
else if(conn->data->set.timeout)
|
||||||
timeout = 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
|
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. */
|
/* Wait for the name resolve query to complete. */
|
||||||
while (1) {
|
while (1) {
|
||||||
@@ -219,8 +211,8 @@ CURLcode Curl_wait_for_resolv(struct connectdata *conn,
|
|||||||
/* no file descriptors means we're done waiting */
|
/* no file descriptors means we're done waiting */
|
||||||
break;
|
break;
|
||||||
tvp = ares_timeout(data->state.areschannel, &store, &tv);
|
tvp = ares_timeout(data->state.areschannel, &store, &tv);
|
||||||
count = select(nfds, &read_fds, &write_fds, NULL, tvp);
|
count = Curl_select(nfds, &read_fds, &write_fds, NULL, tvp);
|
||||||
if (count < 0 && Curl_sockerrno() != EINVAL)
|
if ((count < 0) && (SOCKERRNO != EINVAL))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
ares_process(data->state.areschannel, &read_fds, &write_fds);
|
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
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -28,9 +28,6 @@
|
|||||||
#ifdef NEED_MALLOC_H
|
#ifdef NEED_MALLOC_H
|
||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_SYS_TYPES_H
|
|
||||||
#include <sys/types.h>
|
|
||||||
#endif
|
|
||||||
#ifdef HAVE_SYS_SOCKET_H
|
#ifdef HAVE_SYS_SOCKET_H
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#endif
|
#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
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -28,9 +28,6 @@
|
|||||||
#ifdef NEED_MALLOC_H
|
#ifdef NEED_MALLOC_H
|
||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_SYS_TYPES_H
|
|
||||||
#include <sys/types.h>
|
|
||||||
#endif
|
|
||||||
#ifdef HAVE_SYS_SOCKET_H
|
#ifdef HAVE_SYS_SOCKET_H
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#endif
|
#endif
|
||||||
@@ -512,7 +509,7 @@ int Curl_resolv(struct connectdata *conn,
|
|||||||
*/
|
*/
|
||||||
void Curl_resolv_unlock(struct SessionHandle *data, struct Curl_dns_entry *dns)
|
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)
|
if(data->share)
|
||||||
Curl_share_lock(data, CURL_LOCK_DATA_DNS, CURL_LOCK_ACCESS_SINGLE);
|
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
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -29,9 +29,6 @@
|
|||||||
#ifdef NEED_MALLOC_H
|
#ifdef NEED_MALLOC_H
|
||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_SYS_TYPES_H
|
|
||||||
#include <sys/types.h>
|
|
||||||
#endif
|
|
||||||
#ifdef HAVE_SYS_SOCKET_H
|
#ifdef HAVE_SYS_SOCKET_H
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#endif
|
#endif
|
||||||
@@ -124,12 +121,18 @@ Curl_addrinfo *Curl_getaddrinfo(struct connectdata *conn,
|
|||||||
int port,
|
int port,
|
||||||
int *waitp)
|
int *waitp)
|
||||||
{
|
{
|
||||||
|
#if defined(HAVE_GETHOSTBYNAME_R_3)
|
||||||
|
int res;
|
||||||
|
#endif
|
||||||
Curl_addrinfo *ai = NULL;
|
Curl_addrinfo *ai = NULL;
|
||||||
struct hostent *h = NULL;
|
struct hostent *h = NULL;
|
||||||
in_addr_t in;
|
in_addr_t in;
|
||||||
struct SessionHandle *data = conn->data;
|
|
||||||
struct hostent *buf = NULL;
|
struct hostent *buf = NULL;
|
||||||
|
|
||||||
|
#ifdef CURL_DISABLE_VERBOSE_STRINGS
|
||||||
|
(void)conn;
|
||||||
|
#endif
|
||||||
|
|
||||||
(void)port; /* unused in IPv4 code */
|
(void)port; /* unused in IPv4 code */
|
||||||
|
|
||||||
*waitp = 0; /* don't wait, we act synchronously */
|
*waitp = 0; /* don't wait, we act synchronously */
|
||||||
@@ -146,7 +149,6 @@ Curl_addrinfo *Curl_getaddrinfo(struct connectdata *conn,
|
|||||||
*/
|
*/
|
||||||
else {
|
else {
|
||||||
int h_errnop;
|
int h_errnop;
|
||||||
int res=ERANGE;
|
|
||||||
|
|
||||||
buf = (struct hostent *)calloc(CURL_HOSTENT_SIZE, 1);
|
buf = (struct hostent *)calloc(CURL_HOSTENT_SIZE, 1);
|
||||||
if(!buf)
|
if(!buf)
|
||||||
@@ -159,7 +161,6 @@ Curl_addrinfo *Curl_getaddrinfo(struct connectdata *conn,
|
|||||||
|
|
||||||
#ifdef HAVE_GETHOSTBYNAME_R_5
|
#ifdef HAVE_GETHOSTBYNAME_R_5
|
||||||
/* Solaris, IRIX and more */
|
/* Solaris, IRIX and more */
|
||||||
(void)res; /* prevent compiler warning */
|
|
||||||
h = gethostbyname_r(hostname,
|
h = gethostbyname_r(hostname,
|
||||||
(struct hostent *)buf,
|
(struct hostent *)buf,
|
||||||
(char *)buf + sizeof(struct hostent),
|
(char *)buf + sizeof(struct hostent),
|
||||||
@@ -180,7 +181,7 @@ Curl_addrinfo *Curl_getaddrinfo(struct connectdata *conn,
|
|||||||
#ifdef HAVE_GETHOSTBYNAME_R_6
|
#ifdef HAVE_GETHOSTBYNAME_R_6
|
||||||
/* Linux */
|
/* Linux */
|
||||||
|
|
||||||
res=gethostbyname_r(hostname,
|
(void)gethostbyname_r(hostname,
|
||||||
(struct hostent *)buf,
|
(struct hostent *)buf,
|
||||||
(char *)buf + sizeof(struct hostent),
|
(char *)buf + sizeof(struct hostent),
|
||||||
CURL_HOSTENT_SIZE - 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 *)buf,
|
||||||
(struct hostent_data *)((char *)buf +
|
(struct hostent_data *)((char *)buf +
|
||||||
sizeof(struct hostent)));
|
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
|
else
|
||||||
res = -1; /* failure, too smallish buffer size */
|
res = -1; /* failure, too smallish buffer size */
|
||||||
@@ -273,7 +274,7 @@ Curl_addrinfo *Curl_getaddrinfo(struct connectdata *conn,
|
|||||||
else
|
else
|
||||||
#endif /* HAVE_GETHOSTBYNAME_R_3 */
|
#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 */
|
h = NULL; /* set return code to NULL */
|
||||||
free(buf);
|
free(buf);
|
||||||
}
|
}
|
||||||
@@ -285,7 +286,7 @@ Curl_addrinfo *Curl_getaddrinfo(struct connectdata *conn,
|
|||||||
else {
|
else {
|
||||||
h = gethostbyname(hostname);
|
h = gethostbyname(hostname);
|
||||||
if (!h)
|
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 */
|
#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 */
|
addr = (struct sockaddr_in *)ai->ai_addr; /* storage area for this info */
|
||||||
|
|
||||||
memcpy((char *)&(addr->sin_addr), curr, sizeof(struct in_addr));
|
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);
|
addr->sin_port = htons((unsigned short)port);
|
||||||
|
|
||||||
prevai = ai;
|
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
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -28,9 +28,6 @@
|
|||||||
#ifdef NEED_MALLOC_H
|
#ifdef NEED_MALLOC_H
|
||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_SYS_TYPES_H
|
|
||||||
#include <sys/types.h>
|
|
||||||
#endif
|
|
||||||
#ifdef HAVE_SYS_SOCKET_H
|
#ifdef HAVE_SYS_SOCKET_H
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#endif
|
#endif
|
||||||
@@ -210,7 +207,7 @@ static void dump_addrinfo(struct connectdata *conn, const struct addrinfo *ai)
|
|||||||
if (Curl_printable_address(ai, buf, sizeof(buf)))
|
if (Curl_printable_address(ai, buf, sizeof(buf)))
|
||||||
printf("%s\n", buf);
|
printf("%s\n", buf);
|
||||||
else
|
else
|
||||||
printf("failed; %s\n", Curl_strerror(conn, Curl_sockerrno()));
|
printf("failed; %s\n", Curl_strerror(conn, SOCKERRNO));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#else
|
#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
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -28,9 +28,6 @@
|
|||||||
#ifdef NEED_MALLOC_H
|
#ifdef NEED_MALLOC_H
|
||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_SYS_TYPES_H
|
|
||||||
#include <sys/types.h>
|
|
||||||
#endif
|
|
||||||
#ifdef HAVE_SYS_SOCKET_H
|
#ifdef HAVE_SYS_SOCKET_H
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#endif
|
#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
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@@ -29,9 +29,6 @@
|
|||||||
#ifdef NEED_MALLOC_H
|
#ifdef NEED_MALLOC_H
|
||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_SYS_TYPES_H
|
|
||||||
#include <sys/types.h>
|
|
||||||
#endif
|
|
||||||
#ifdef HAVE_SYS_SOCKET_H
|
#ifdef HAVE_SYS_SOCKET_H
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#endif
|
#endif
|
||||||
@@ -147,7 +144,7 @@ static void dump_addrinfo (struct connectdata *conn, const struct addrinfo *ai)
|
|||||||
if (Curl_printable_address(ai, buf, sizeof(buf)))
|
if (Curl_printable_address(ai, buf, sizeof(buf)))
|
||||||
trace_it("%s\n", buf);
|
trace_it("%s\n", buf);
|
||||||
else
|
else
|
||||||
trace_it("failed; %s\n", Curl_strerror(conn,WSAGetLastError()));
|
trace_it("failed; %s\n", Curl_strerror(conn, SOCKERRNO));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -301,7 +298,8 @@ static unsigned __stdcall gethostbyname_thread (void *arg)
|
|||||||
return (unsigned)-1;
|
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
|
/* Signaling that we have initialized all copies of data and handles we
|
||||||
need */
|
need */
|
||||||
@@ -318,7 +316,7 @@ static unsigned __stdcall gethostbyname_thread (void *arg)
|
|||||||
rc = Curl_addrinfo4_callback(conn, CURL_ASYNC_SUCCESS, he);
|
rc = Curl_addrinfo4_callback(conn, CURL_ASYNC_SUCCESS, he);
|
||||||
}
|
}
|
||||||
else {
|
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,
|
TRACE(("Winsock-error %d, addr %s\n", conn->async.status,
|
||||||
he ? inet_ntoa(*(struct in_addr*)he->h_addr) : "unknown"));
|
he ? inet_ntoa(*(struct in_addr*)he->h_addr) : "unknown"));
|
||||||
@@ -362,7 +360,8 @@ static unsigned __stdcall getaddrinfo_thread (void *arg)
|
|||||||
|
|
||||||
itoa(conn->async.port, service, 10);
|
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
|
/* Signaling that we have initialized all copies of data and handles we
|
||||||
need */
|
need */
|
||||||
@@ -383,7 +382,7 @@ static unsigned __stdcall getaddrinfo_thread (void *arg)
|
|||||||
rc = Curl_addrinfo6_callback(conn, CURL_ASYNC_SUCCESS, res);
|
rc = Curl_addrinfo6_callback(conn, CURL_ASYNC_SUCCESS, res);
|
||||||
}
|
}
|
||||||
else {
|
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));
|
TRACE(("Winsock-error %d, no address\n", conn->async.status));
|
||||||
}
|
}
|
||||||
release_thread_sync(&tsd);
|
release_thread_sync(&tsd);
|
||||||
@@ -461,7 +460,7 @@ static bool init_resolve_thread (struct connectdata *conn,
|
|||||||
HANDLE thread_and_event[2] = {0};
|
HANDLE thread_and_event[2] = {0};
|
||||||
|
|
||||||
if (!td) {
|
if (!td) {
|
||||||
SetLastError(ENOMEM);
|
SET_ERRNO(ENOMEM);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -469,7 +468,7 @@ static bool init_resolve_thread (struct connectdata *conn,
|
|||||||
conn->async.hostname = strdup(hostname);
|
conn->async.hostname = strdup(hostname);
|
||||||
if (!conn->async.hostname) {
|
if (!conn->async.hostname) {
|
||||||
free(td);
|
free(td);
|
||||||
SetLastError(ENOMEM);
|
SET_ERRNO(ENOMEM);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -486,7 +485,7 @@ static bool init_resolve_thread (struct connectdata *conn,
|
|||||||
td->mutex_waiting = CreateMutex(NULL, TRUE, NULL);
|
td->mutex_waiting = CreateMutex(NULL, TRUE, NULL);
|
||||||
if (td->mutex_waiting == NULL) {
|
if (td->mutex_waiting == NULL) {
|
||||||
Curl_destroy_thread_data(&conn->async);
|
Curl_destroy_thread_data(&conn->async);
|
||||||
SetLastError(EAGAIN);
|
SET_ERRNO(EAGAIN);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -496,7 +495,7 @@ static bool init_resolve_thread (struct connectdata *conn,
|
|||||||
td->event_resolved = CreateEvent(NULL, TRUE, FALSE, NULL);
|
td->event_resolved = CreateEvent(NULL, TRUE, FALSE, NULL);
|
||||||
if (td->event_resolved == NULL) {
|
if (td->event_resolved == NULL) {
|
||||||
Curl_destroy_thread_data(&conn->async);
|
Curl_destroy_thread_data(&conn->async);
|
||||||
SetLastError(EAGAIN);
|
SET_ERRNO(EAGAIN);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
/* Create the mutex used to serialize access to event_terminated
|
/* 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);
|
td->mutex_terminate = CreateMutex(NULL, FALSE, NULL);
|
||||||
if (td->mutex_terminate == NULL) {
|
if (td->mutex_terminate == NULL) {
|
||||||
Curl_destroy_thread_data(&conn->async);
|
Curl_destroy_thread_data(&conn->async);
|
||||||
SetLastError(EAGAIN);
|
SET_ERRNO(EAGAIN);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
/* Create the event used to signal thread that it should terminate.
|
/* 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);
|
td->event_terminate = CreateEvent(NULL, TRUE, FALSE, NULL);
|
||||||
if (td->event_terminate == NULL) {
|
if (td->event_terminate == NULL) {
|
||||||
Curl_destroy_thread_data(&conn->async);
|
Curl_destroy_thread_data(&conn->async);
|
||||||
SetLastError(EAGAIN);
|
SET_ERRNO(EAGAIN);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
/* Create the event used by thread to inform it has initialized its own data.
|
/* 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);
|
td->event_thread_started = CreateEvent(NULL, TRUE, FALSE, NULL);
|
||||||
if (td->event_thread_started == NULL) {
|
if (td->event_thread_started == NULL) {
|
||||||
Curl_destroy_thread_data(&conn->async);
|
Curl_destroy_thread_data(&conn->async);
|
||||||
SetLastError(EAGAIN);
|
SET_ERRNO(EAGAIN);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -535,7 +534,7 @@ static bool init_resolve_thread (struct connectdata *conn,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CURLRES_IPV6
|
#ifdef CURLRES_IPV6
|
||||||
curlassert(hints);
|
DEBUGASSERT(hints);
|
||||||
td->hints = *hints;
|
td->hints = *hints;
|
||||||
#else
|
#else
|
||||||
(void) hints;
|
(void) hints;
|
||||||
@@ -543,10 +542,10 @@ static bool init_resolve_thread (struct connectdata *conn,
|
|||||||
|
|
||||||
if (!td->thread_hnd) {
|
if (!td->thread_hnd) {
|
||||||
#ifdef _WIN32_WCE
|
#ifdef _WIN32_WCE
|
||||||
TRACE(("CreateThread() failed; %s\n", Curl_strerror(conn,GetLastError())));
|
TRACE(("CreateThread() failed; %s\n", Curl_strerror(conn, ERRNO)));
|
||||||
#else
|
#else
|
||||||
SetLastError(errno);
|
SET_ERRNO(errno);
|
||||||
TRACE(("_beginthreadex() failed; %s\n", Curl_strerror(conn,errno)));
|
TRACE(("_beginthreadex() failed; %s\n", Curl_strerror(conn, ERRNO)));
|
||||||
#endif
|
#endif
|
||||||
Curl_destroy_thread_data(&conn->async);
|
Curl_destroy_thread_data(&conn->async);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
@@ -589,7 +588,7 @@ CURLcode Curl_wait_for_resolv(struct connectdata *conn,
|
|||||||
DWORD status, ticks;
|
DWORD status, ticks;
|
||||||
CURLcode rc;
|
CURLcode rc;
|
||||||
|
|
||||||
curlassert (conn && td);
|
DEBUGASSERT(conn && td);
|
||||||
|
|
||||||
/* now, see if there's a connect timeout or a regular timeout to
|
/* now, see if there's a connect timeout or a regular timeout to
|
||||||
use instead of the default one */
|
use instead of the default one */
|
||||||
@@ -600,7 +599,7 @@ CURLcode Curl_wait_for_resolv(struct connectdata *conn,
|
|||||||
ticks = GetTickCount();
|
ticks = GetTickCount();
|
||||||
|
|
||||||
/* wait for the thread to resolve the name */
|
/* 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 */
|
/* mark that we are now done waiting */
|
||||||
ReleaseMutex(td->mutex_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
|
* thread. 'conn->async.done = TRUE' is set in
|
||||||
* Curl_addrinfo4/6_callback().
|
* Curl_addrinfo4/6_callback().
|
||||||
*/
|
*/
|
||||||
WSASetLastError(conn->async.status);
|
SET_SOCKERRNO(conn->async.status);
|
||||||
GetExitCodeThread(td->thread_hnd, &td->thread_status);
|
GetExitCodeThread(td->thread_hnd, &td->thread_status);
|
||||||
TRACE(("%s() status %lu, thread retval %lu, ",
|
TRACE(("%s() status %lu, thread retval %lu, ",
|
||||||
THREAD_NAME, status, td->thread_status));
|
THREAD_NAME, status, td->thread_status));
|
||||||
@@ -749,12 +748,12 @@ Curl_addrinfo *Curl_getaddrinfo(struct connectdata *conn,
|
|||||||
|
|
||||||
/* fall-back to blocking version */
|
/* fall-back to blocking version */
|
||||||
infof(data, "init_resolve_thread() failed for %s; %s\n",
|
infof(data, "init_resolve_thread() failed for %s; %s\n",
|
||||||
hostname, Curl_strerror(conn,GetLastError()));
|
hostname, Curl_strerror(conn, ERRNO));
|
||||||
|
|
||||||
h = gethostbyname(hostname);
|
h = gethostbyname(hostname);
|
||||||
if (!h) {
|
if (!h) {
|
||||||
infof(data, "gethostbyname(2) failed for %s:%d; %s\n",
|
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 NULL;
|
||||||
}
|
}
|
||||||
return Curl_he2ai(h, port);
|
return Curl_he2ai(h, port);
|
||||||
@@ -826,12 +825,12 @@ Curl_addrinfo *Curl_getaddrinfo(struct connectdata *conn,
|
|||||||
|
|
||||||
/* fall-back to blocking version */
|
/* fall-back to blocking version */
|
||||||
infof(data, "init_resolve_thread() failed for %s; %s\n",
|
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);
|
error = getaddrinfo(hostname, sbuf, &hints, &res);
|
||||||
if (error) {
|
if (error) {
|
||||||
infof(data, "getaddrinfo() failed for %s:%d; %s\n",
|
infof(data, "getaddrinfo() failed for %s:%d; %s\n",
|
||||||
hostname, port, Curl_strerror(conn,WSAGetLastError()));
|
hostname, port, Curl_strerror(conn, SOCKERRNO));
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
|
585
lib/http.c
585
lib/http.c
@@ -30,12 +30,6 @@
|
|||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <ctype.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
|
#ifdef WIN32
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
@@ -60,14 +54,18 @@
|
|||||||
#ifdef HAVE_UNISTD_H
|
#ifdef HAVE_UNISTD_H
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef HAVE_NETDB_H
|
||||||
#include <netdb.h>
|
#include <netdb.h>
|
||||||
|
#endif
|
||||||
#ifdef HAVE_ARPA_INET_H
|
#ifdef HAVE_ARPA_INET_H
|
||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_NET_IF_H
|
#ifdef HAVE_NET_IF_H
|
||||||
#include <net/if.h>
|
#include <net/if.h>
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef HAVE_SYS_IOCTL_H
|
||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
|
#endif
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
|
|
||||||
#ifdef HAVE_SYS_PARAM_H
|
#ifdef HAVE_SYS_PARAM_H
|
||||||
@@ -159,6 +157,8 @@ static CURLcode Curl_output_basic(struct connectdata *conn, bool proxy)
|
|||||||
proxy?"Proxy-":"",
|
proxy?"Proxy-":"",
|
||||||
authorization);
|
authorization);
|
||||||
free(authorization);
|
free(authorization);
|
||||||
|
if(!*userp)
|
||||||
|
return CURLE_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
return CURLE_OUT_OF_MEMORY;
|
return CURLE_OUT_OF_MEMORY;
|
||||||
@@ -332,6 +332,8 @@ CURLcode Curl_http_auth_act(struct connectdata *conn)
|
|||||||
|
|
||||||
if(pickhost || pickproxy) {
|
if(pickhost || pickproxy) {
|
||||||
data->reqdata.newurl = strdup(data->change.url); /* clone URL */
|
data->reqdata.newurl = strdup(data->change.url); /* clone URL */
|
||||||
|
if (!data->reqdata.newurl)
|
||||||
|
return CURLE_OUT_OF_MEMORY;
|
||||||
|
|
||||||
if((data->set.httpreq != HTTPREQ_GET) &&
|
if((data->set.httpreq != HTTPREQ_GET) &&
|
||||||
(data->set.httpreq != HTTPREQ_HEAD) &&
|
(data->set.httpreq != HTTPREQ_HEAD) &&
|
||||||
@@ -352,6 +354,8 @@ CURLcode Curl_http_auth_act(struct connectdata *conn)
|
|||||||
if((data->set.httpreq != HTTPREQ_GET) &&
|
if((data->set.httpreq != HTTPREQ_GET) &&
|
||||||
(data->set.httpreq != HTTPREQ_HEAD)) {
|
(data->set.httpreq != HTTPREQ_HEAD)) {
|
||||||
data->reqdata.newurl = strdup(data->change.url); /* clone URL */
|
data->reqdata.newurl = strdup(data->change.url); /* clone URL */
|
||||||
|
if (!data->reqdata.newurl)
|
||||||
|
return CURLE_OUT_OF_MEMORY;
|
||||||
data->state.authhost.done = TRUE;
|
data->state.authhost.done = TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -391,7 +395,7 @@ Curl_http_output_auth(struct connectdata *conn,
|
|||||||
struct auth *authhost;
|
struct auth *authhost;
|
||||||
struct auth *authproxy;
|
struct auth *authproxy;
|
||||||
|
|
||||||
curlassert(data);
|
DEBUGASSERT(data);
|
||||||
|
|
||||||
authhost = &data->state.authhost;
|
authhost = &data->state.authhost;
|
||||||
authproxy = &data->state.authproxy;
|
authproxy = &data->state.authproxy;
|
||||||
@@ -676,9 +680,9 @@ int Curl_http_should_fail(struct connectdata *conn)
|
|||||||
struct SessionHandle *data;
|
struct SessionHandle *data;
|
||||||
struct Curl_transfer_keeper *k;
|
struct Curl_transfer_keeper *k;
|
||||||
|
|
||||||
curlassert(conn);
|
DEBUGASSERT(conn);
|
||||||
data = conn->data;
|
data = conn->data;
|
||||||
curlassert(data);
|
DEBUGASSERT(data);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** For readability
|
** 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
|
** 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
|
** Examine the current authentication state to see if this
|
||||||
@@ -864,7 +868,7 @@ CURLcode add_buffer_send(send_buffer *in,
|
|||||||
size_t sendsize;
|
size_t sendsize;
|
||||||
curl_socket_t sockfd;
|
curl_socket_t sockfd;
|
||||||
|
|
||||||
curlassert(socketindex <= SECONDARYSOCKET);
|
DEBUGASSERT(socketindex <= SECONDARYSOCKET);
|
||||||
|
|
||||||
sockfd = conn->sock[socketindex];
|
sockfd = conn->sock[socketindex];
|
||||||
|
|
||||||
@@ -992,8 +996,7 @@ CURLcode add_bufferf(send_buffer *in, const char *fmt, ...)
|
|||||||
if(s) {
|
if(s) {
|
||||||
CURLcode result = add_buffer(in, s, strlen(s));
|
CURLcode result = add_buffer(in, s, strlen(s));
|
||||||
free(s);
|
free(s);
|
||||||
if(CURLE_OK == result)
|
return result;
|
||||||
return CURLE_OK;
|
|
||||||
}
|
}
|
||||||
/* If we failed, we cleanup the whole buffer and return error */
|
/* If we failed, we cleanup the whole buffer and return error */
|
||||||
if(in->buffer)
|
if(in->buffer)
|
||||||
@@ -1021,8 +1024,12 @@ CURLcode add_buffer(send_buffer *in, const void *inptr, size_t size)
|
|||||||
/* create a new buffer */
|
/* create a new buffer */
|
||||||
new_rb = (char *)malloc(new_size);
|
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;
|
return CURLE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
in->buffer = new_rb;
|
in->buffer = new_rb;
|
||||||
in->size_max = new_size;
|
in->size_max = new_size;
|
||||||
@@ -1115,258 +1122,315 @@ CURLcode Curl_proxyCONNECT(struct connectdata *conn,
|
|||||||
struct Curl_transfer_keeper *k = &data->reqdata.keep;
|
struct Curl_transfer_keeper *k = &data->reqdata.keep;
|
||||||
CURLcode result;
|
CURLcode result;
|
||||||
int res;
|
int res;
|
||||||
size_t nread; /* total size read */
|
|
||||||
int perline; /* count bytes per line */
|
|
||||||
int keepon=TRUE;
|
|
||||||
ssize_t gotbytes;
|
|
||||||
char *ptr;
|
|
||||||
long timeout =
|
long timeout =
|
||||||
data->set.timeout?data->set.timeout:3600; /* in seconds */
|
data->set.timeout?data->set.timeout:3600000; /* in milliseconds */
|
||||||
char *line_start;
|
|
||||||
char *host_port;
|
|
||||||
curl_socket_t tunnelsocket = conn->sock[sockindex];
|
curl_socket_t tunnelsocket = conn->sock[sockindex];
|
||||||
send_buffer *req_buffer;
|
|
||||||
curl_off_t cl=0;
|
curl_off_t cl=0;
|
||||||
bool closeConnection = FALSE;
|
bool closeConnection = FALSE;
|
||||||
|
long check;
|
||||||
|
|
||||||
#define SELECT_OK 0
|
#define SELECT_OK 0
|
||||||
#define SELECT_ERROR 1
|
#define SELECT_ERROR 1
|
||||||
#define SELECT_TIMEOUT 2
|
#define SELECT_TIMEOUT 2
|
||||||
int error = SELECT_OK;
|
int error = SELECT_OK;
|
||||||
|
|
||||||
infof(data, "Establish HTTP proxy tunnel to %s:%d\n", hostname, remote_port);
|
|
||||||
conn->bits.proxy_connect_closed = FALSE;
|
conn->bits.proxy_connect_closed = FALSE;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
if(data->reqdata.newurl) {
|
if (!conn->bits.tunnel_connecting) { /* BEGIN CONNECT PHASE */
|
||||||
/* This only happens if we've looped here due to authentication reasons,
|
char *host_port;
|
||||||
and we don't really use the newly cloned URL here then. Just free()
|
send_buffer *req_buffer;
|
||||||
it. */
|
|
||||||
free(data->reqdata.newurl);
|
|
||||||
data->reqdata.newurl = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* initialize a dynamic send-buffer */
|
infof(data, "Establish HTTP proxy tunnel to %s:%d\n",
|
||||||
req_buffer = add_buffer_init();
|
hostname, remote_port);
|
||||||
|
|
||||||
if(!req_buffer)
|
if(data->reqdata.newurl) {
|
||||||
return CURLE_OUT_OF_MEMORY;
|
/* This only happens if we've looped here due to authentication
|
||||||
|
reasons, and we don't really use the newly cloned URL here
|
||||||
host_port = aprintf("%s:%d", hostname, remote_port);
|
then. Just free() it. */
|
||||||
if(!host_port)
|
free(data->reqdata.newurl);
|
||||||
return CURLE_OUT_OF_MEMORY;
|
data->reqdata.newurl = NULL;
|
||||||
|
|
||||||
/* 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(!checkheaders(data, "Proxy-Connection:"))
|
|
||||||
proxyconn = "Proxy-Connection: Keep-Alive\r\n";
|
|
||||||
|
|
||||||
if(!checkheaders(data, "User-Agent:") && data->set.useragent)
|
/* initialize a dynamic send-buffer */
|
||||||
useragent = conn->allocptr.uagent;
|
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) {
|
if(CURLE_OK == result) {
|
||||||
/* Send the connect request to the proxy */
|
char *host=(char *)"";
|
||||||
/* BLOCKING */
|
const char *proxyconn="";
|
||||||
result =
|
const char *useragent="";
|
||||||
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)
|
if(!checkheaders(data, "Host:")) {
|
||||||
result = add_custom_headers(conn, req_buffer);
|
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)
|
if(!checkheaders(data, "User-Agent:") && data->set.useragent)
|
||||||
free(host);
|
useragent = conn->allocptr.uagent;
|
||||||
|
|
||||||
if(CURLE_OK == result)
|
/* Send the connect request to the proxy */
|
||||||
/* CRLF terminate the request */
|
/* BLOCKING */
|
||||||
result = add_bufferf(req_buffer, "\r\n");
|
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)
|
if(host && *host)
|
||||||
/* Now send off the request */
|
free(host);
|
||||||
result = add_buffer_send(req_buffer, conn,
|
|
||||||
&data->info.request_size, 0, sockindex);
|
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)
|
if(result)
|
||||||
failf(data, "Failed sending CONNECT to proxy");
|
return result;
|
||||||
}
|
|
||||||
free(host_port);
|
|
||||||
if(result)
|
|
||||||
return result;
|
|
||||||
|
|
||||||
ptr=data->state.buffer;
|
conn->bits.tunnel_connecting = TRUE;
|
||||||
line_start = ptr;
|
} /* END CONNECT PHASE */
|
||||||
|
|
||||||
nread=0;
|
/* now we've issued the CONNECT and we're waiting to hear back -
|
||||||
perline=0;
|
we try not to block here in multi-mode because that might be a LONG
|
||||||
keepon=TRUE;
|
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 */
|
||||||
|
check = timeout - /* timeout time */
|
||||||
/* if timeout is requested, find out how much remaining time we have */
|
Curl_tvdiff(Curl_tvnow(), conn->now); /* spent time */
|
||||||
long check = timeout - /* timeout time */
|
if(check <=0 ) {
|
||||||
Curl_tvdiff(Curl_tvnow(), conn->now)/1000; /* spent time */
|
failf(data, "Proxy CONNECT aborted due to timeout");
|
||||||
if(check <=0 ) {
|
error = SELECT_TIMEOUT; /* already too little time */
|
||||||
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;
|
|
||||||
break;
|
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);
|
} while(data->reqdata.newurl);
|
||||||
|
|
||||||
if(200 != k->httpcode) {
|
if(200 != k->httpcode) {
|
||||||
@@ -1402,6 +1466,10 @@ CURLcode Curl_http_connect(struct connectdata *conn, bool *done)
|
|||||||
|
|
||||||
data=conn->data;
|
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
|
/* 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
|
* 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
|
* 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;
|
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) {
|
if(!data->state.this_is_a_follow) {
|
||||||
/* this is not a followed location, get the original host name */
|
/* this is not a followed location, get the original host name */
|
||||||
if (data->state.first_host)
|
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 Curl_https_connecting(struct connectdata *conn, bool *done)
|
||||||
{
|
{
|
||||||
CURLcode result;
|
CURLcode result;
|
||||||
curlassert(conn->protocol & PROT_HTTPS);
|
DEBUGASSERT((conn) && (conn->protocol & PROT_HTTPS));
|
||||||
|
|
||||||
/* perform SSL initialization for this socket */
|
/* perform SSL initialization for this socket */
|
||||||
result = Curl_ssl_connect_nonblocking(conn, FIRSTSOCKET, done);
|
result = Curl_ssl_connect_nonblocking(conn, FIRSTSOCKET, done);
|
||||||
@@ -1501,6 +1574,18 @@ int Curl_https_getsock(struct connectdata *conn,
|
|||||||
(void)numsocks;
|
(void)numsocks;
|
||||||
return GETSOCK_BLANK;
|
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
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -1550,8 +1635,8 @@ CURLcode Curl_http_done(struct connectdata *conn,
|
|||||||
|
|
||||||
if(!conn->bits.retry &&
|
if(!conn->bits.retry &&
|
||||||
((http->readbytecount +
|
((http->readbytecount +
|
||||||
conn->headerbytecount -
|
data->reqdata.keep.headerbytecount -
|
||||||
conn->deductheadercount)) <= 0) {
|
data->reqdata.keep.deductheadercount)) <= 0) {
|
||||||
/* If this connection isn't simply closed to be retried, AND nothing was
|
/* 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
|
read from the HTTP server (that counts), this can't be right so we
|
||||||
return an error here */
|
return an error here */
|
||||||
@@ -1586,7 +1671,6 @@ static CURLcode expect100(struct SessionHandle *data,
|
|||||||
static CURLcode add_custom_headers(struct connectdata *conn,
|
static CURLcode add_custom_headers(struct connectdata *conn,
|
||||||
send_buffer *req_buffer)
|
send_buffer *req_buffer)
|
||||||
{
|
{
|
||||||
CURLcode result = CURLE_OK;
|
|
||||||
char *ptr;
|
char *ptr;
|
||||||
struct curl_slist *headers=conn->data->set.headers;
|
struct curl_slist *headers=conn->data->set.headers;
|
||||||
|
|
||||||
@@ -1613,7 +1697,7 @@ static CURLcode add_custom_headers(struct connectdata *conn,
|
|||||||
strlen("Content-Type:")))
|
strlen("Content-Type:")))
|
||||||
;
|
;
|
||||||
else {
|
else {
|
||||||
result = add_bufferf(req_buffer, "%s\r\n", headers->data);
|
CURLcode result = add_bufferf(req_buffer, "%s\r\n", headers->data);
|
||||||
if(result)
|
if(result)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@@ -1621,7 +1705,7 @@ static CURLcode add_custom_headers(struct connectdata *conn,
|
|||||||
}
|
}
|
||||||
headers = headers->next;
|
headers = headers->next;
|
||||||
}
|
}
|
||||||
return result;
|
return CURLE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -1661,9 +1745,6 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
|
|||||||
else
|
else
|
||||||
http = data->reqdata.proto.http;
|
http = data->reqdata.proto.http;
|
||||||
|
|
||||||
/* We default to persistent connections */
|
|
||||||
conn->bits.close = FALSE;
|
|
||||||
|
|
||||||
if ( (conn->protocol&(PROT_HTTP|PROT_FTP)) &&
|
if ( (conn->protocol&(PROT_HTTP|PROT_FTP)) &&
|
||||||
data->set.upload) {
|
data->set.upload) {
|
||||||
httpreq = HTTPREQ_PUT;
|
httpreq = HTTPREQ_PUT;
|
||||||
@@ -1676,7 +1757,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
|
|||||||
if(conn->bits.no_body)
|
if(conn->bits.no_body)
|
||||||
request = (char *)"HEAD";
|
request = (char *)"HEAD";
|
||||||
else {
|
else {
|
||||||
curlassert((httpreq > HTTPREQ_NONE) && (httpreq < HTTPREQ_LAST));
|
DEBUGASSERT((httpreq > HTTPREQ_NONE) && (httpreq < HTTPREQ_LAST));
|
||||||
switch(httpreq) {
|
switch(httpreq) {
|
||||||
case HTTPREQ_POST:
|
case HTTPREQ_POST:
|
||||||
case HTTPREQ_POST_FORM:
|
case HTTPREQ_POST_FORM:
|
||||||
@@ -2368,11 +2449,15 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
|
|||||||
/* set the upload size to the progress meter */
|
/* set the upload size to the progress meter */
|
||||||
Curl_pgrsSetUploadSize(data, http->postsize);
|
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 {
|
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) {
|
if(data->set.postfieldsize) {
|
||||||
/* set the upload size to the progress meter */
|
/* set the upload size to the progress meter */
|
||||||
@@ -2398,7 +2483,9 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
add_buffer(req_buffer, "\r\n", 2);
|
result = add_buffer(req_buffer, "\r\n", 2);
|
||||||
|
if(result)
|
||||||
|
return result;
|
||||||
|
|
||||||
/* issue the request */
|
/* issue the request */
|
||||||
result = add_buffer_send(req_buffer, conn,
|
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