Compare commits
839 Commits
curl-7_15_
...
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 | ||
|
|
ef442d5803 | ||
|
|
8680e010c2 | ||
|
|
4d8dcf7b77 | ||
|
|
abdbd3100f | ||
|
|
ddace02efe | ||
|
|
1f4c8c4f09 | ||
|
|
8162b32bad | ||
|
|
daf527b276 | ||
|
|
ee51c07be6 | ||
|
|
856ba4c6c6 | ||
|
|
b3e23373bd | ||
|
|
e5adab39b1 | ||
|
|
d31153584e | ||
|
|
823d296e12 | ||
|
|
e09450103b | ||
|
|
fbc4407583 | ||
|
|
a79e5d7925 | ||
|
|
82491d5c06 | ||
|
|
b6f889085d | ||
|
|
cdbbb7d900 | ||
|
|
2bf4d9a22c | ||
|
|
f1918aa343 | ||
|
|
56580fc6f8 | ||
|
|
2e6600425e | ||
|
|
cc021fc200 | ||
|
|
e6aed92742 | ||
|
|
02fb4d96d1 | ||
|
|
43e3c5e5fa | ||
|
|
4f496f2f70 | ||
|
|
d681bc7520 | ||
|
|
f21a2b3270 | ||
|
|
5f5a28d20e | ||
|
|
89f9cb4041 | ||
|
|
2b280bcc69 | ||
|
|
1c0224be42 | ||
|
|
dbdb7fa55a | ||
|
|
83a43bea8a | ||
|
|
abb4cdafe9 | ||
|
|
2b7bcf2505 | ||
|
|
5aefdd93cb | ||
|
|
4b27fae069 | ||
|
|
10a13eba72 | ||
|
|
44ac2776ae | ||
|
|
36e3e6ed16 | ||
|
|
5f9cbc4209 | ||
|
|
3239f059b8 | ||
|
|
45bac25d90 | ||
|
|
354c8dcd82 | ||
|
|
b1e4cc370d | ||
|
|
2293474b90 | ||
|
|
9e1aef7183 | ||
|
|
f68323da7d | ||
|
|
a61aafa325 | ||
|
|
33bea767eb | ||
|
|
9ab7cda010 | ||
|
|
6da70628c6 | ||
|
|
3bae748256 | ||
|
|
521c4b303d | ||
|
|
a2effd123a | ||
|
|
7b704e173c | ||
|
|
6045d051d7 | ||
|
|
cfe00ed4ad | ||
|
|
0b4bdcf18f | ||
|
|
8cade952bf | ||
|
|
385e612fa5 | ||
|
|
1886388791 | ||
|
|
32fe5b14ec | ||
|
|
bbdc483671 | ||
|
|
f11d3c329c | ||
|
|
b0d13fa4cb | ||
|
|
0fb5a65a58 | ||
|
|
c8afb02b4c | ||
|
|
869d65337e | ||
|
|
277df1c6b1 | ||
|
|
5ec5b95f54 | ||
|
|
9e61c904ac | ||
|
|
7efb955fd0 | ||
|
|
75899741b9 | ||
|
|
d465199411 | ||
|
|
55123424c8 | ||
|
|
f5e4a78b59 | ||
|
|
7515a75206 | ||
|
|
4750e6f3c5 | ||
|
|
b7aaa4d907 | ||
|
|
e61e09f658 | ||
|
|
058e993acb | ||
|
|
359d500908 | ||
|
|
cb42855445 | ||
|
|
d8ff0336a5 | ||
|
|
0682d25da5 | ||
|
|
d86d14074d | ||
|
|
8500397cf1 | ||
|
|
bd600fbebe | ||
|
|
064bbb999f | ||
|
|
bedc61ac45 | ||
|
|
61a6992559 | ||
|
|
ebee2e323d | ||
|
|
b2f8de571f | ||
|
|
cb4a5f5a2b | ||
|
|
1beb7de7e0 | ||
|
|
89ab5f4380 | ||
|
|
439b84c782 | ||
|
|
0e899d7728 | ||
|
|
1a85fb2bd0 | ||
|
|
8d11767048 | ||
|
|
fcccf9aa0d | ||
|
|
72bd027537 | ||
|
|
1d44c9ccc1 | ||
|
|
33831759b5 | ||
|
|
6fe932b255 | ||
|
|
8da02df8e0 | ||
|
|
587c99351d | ||
|
|
88c8d72a21 | ||
|
|
cf99fed17a | ||
|
|
ca48b6bf35 | ||
|
|
4dcd606b47 | ||
|
|
393ddd6e1f | ||
|
|
840e796aa9 | ||
|
|
5fd096da8d | ||
|
|
eb29c5c285 | ||
|
|
1eb286e43e | ||
|
|
ae76ebe2d1 | ||
|
|
e4505aefd9 | ||
|
|
d6b0612882 | ||
|
|
4c65eb0af8 | ||
|
|
318a8258fd | ||
|
|
17ae28e0fe | ||
|
|
3c4f622479 | ||
|
|
3ce43764be | ||
|
|
b555c60e49 | ||
|
|
2336d010ef | ||
|
|
b9af0d89d5 | ||
|
|
6f2afe0c30 | ||
|
|
d8c61d459e | ||
|
|
7ae5ebbeb2 | ||
|
|
7335b71dfb | ||
|
|
9583b03074 | ||
|
|
3c81d5f125 | ||
|
|
688699a046 | ||
|
|
090f5a9a45 | ||
|
|
da58d03ff7 | ||
|
|
9ea3831c08 | ||
|
|
a46f55b9de | ||
|
|
a634f64400 | ||
|
|
bcd8a3b240 | ||
|
|
04d5d1895c | ||
|
|
abd2775a70 | ||
|
|
73226415fc | ||
|
|
ab160ef445 | ||
|
|
268fe09322 | ||
|
|
7a557e984a | ||
|
|
f1a55cbe6d | ||
|
|
1e35d95df8 | ||
|
|
d8387b418d | ||
|
|
adea16a294 | ||
|
|
7f2d5cab2d | ||
|
|
c6ff612f6e | ||
|
|
8db353e1d7 | ||
|
|
e6978117a7 | ||
|
|
5dcb055077 | ||
|
|
0b5e1a9b2f | ||
|
|
2e17a97474 | ||
|
|
74ddbd8a3b | ||
|
|
b8039a821b | ||
|
|
438312f00e | ||
|
|
381ccaa391 | ||
|
|
3204494883 | ||
|
|
e264f699d4 | ||
|
|
68d4b77d44 | ||
|
|
e1ac99af1f | ||
|
|
be0d17e812 | ||
|
|
4eb35406f4 | ||
|
|
624745ab20 | ||
|
|
9354822e09 | ||
|
|
17d4f9513e | ||
|
|
f830d77307 | ||
|
|
a03c76b228 | ||
|
|
35ad61429d | ||
|
|
b5b3d9e5c7 | ||
|
|
6e682c2b01 | ||
|
|
7e2ea2ece0 | ||
|
|
01926d66d7 | ||
|
|
69f7d0a0ce | ||
|
|
d1c84705ec | ||
|
|
3274908551 | ||
|
|
c730934498 | ||
|
|
471a8b223b | ||
|
|
47ee9202c3 | ||
|
|
1bcbe89802 | ||
|
|
bf57e9bb12 | ||
|
|
318a7584f3 | ||
|
|
961ec228d4 | ||
|
|
a777eb3d81 | ||
|
|
7f79b52dae | ||
|
|
db680edc26 | ||
|
|
e6ce80458f | ||
|
|
cdcb123aa8 | ||
|
|
78081a1652 | ||
|
|
7408976b15 | ||
|
|
763bb73cc3 | ||
|
|
1dee2cd55e | ||
|
|
426ecfd136 | ||
|
|
4913baed16 | ||
|
|
675f6a8901 | ||
|
|
2147284cad | ||
|
|
7f1870da5f | ||
|
|
2149a095f7 | ||
|
|
e8d21adbaa | ||
|
|
fa28531322 | ||
|
|
deef85ca9a | ||
|
|
4f4427ff41 | ||
|
|
0ed285e84d | ||
|
|
905ca77c9e | ||
|
|
61043c7e74 | ||
|
|
4545c9f22f | ||
|
|
ad772d7b48 | ||
|
|
a56ef92729 | ||
|
|
561d01c450 | ||
|
|
c6c8a30da1 | ||
|
|
914dbeb12c | ||
|
|
56dc90eaab | ||
|
|
f51c567de3 | ||
|
|
9b2acca63e | ||
|
|
afcd9f1b1c | ||
|
|
755ccbc468 | ||
|
|
0af7aec211 | ||
|
|
ee085ad6bd | ||
|
|
719bec2606 | ||
|
|
b1db9dbb16 | ||
|
|
609044aea2 | ||
|
|
ba481718a4 | ||
|
|
1be60dde7f | ||
|
|
e92e811a61 | ||
|
|
5aa0db8681 | ||
|
|
d5691211dd | ||
|
|
a93695a70e | ||
|
|
ce935a2697 | ||
|
|
812ce0d93f | ||
|
|
bbae5b49f9 | ||
|
|
772a985dc3 | ||
|
|
8a7514de8a | ||
|
|
32ad212ac9 | ||
|
|
8a8d5c784c | ||
|
|
125830ab4b | ||
|
|
5b75b423e6 | ||
|
|
012d7e2878 | ||
|
|
cd3029f36f | ||
|
|
6adaac7e18 | ||
|
|
cde5e35d9b | ||
|
|
ee17fba72e | ||
|
|
6296b89319 | ||
|
|
5450db9151 | ||
|
|
b4700f026b | ||
|
|
d771fa7c48 | ||
|
|
b2c378267b | ||
|
|
384c8f3560 | ||
|
|
f44ef427a2 | ||
|
|
c54a4301ee | ||
|
|
36a3514225 | ||
|
|
e1edd41e1b | ||
|
|
13e60c55a1 | ||
|
|
9b8b1a68f0 | ||
|
|
4ec9316155 | ||
|
|
ef769500d4 | ||
|
|
23692574a2 | ||
|
|
5f6fd682a5 | ||
|
|
db24518a30 | ||
|
|
90933ac660 | ||
|
|
087579a6f4 | ||
|
|
de59cde155 | ||
|
|
3cd95eacdf | ||
|
|
deb81b2ad4 | ||
|
|
4e717cdb30 | ||
|
|
33acd6f041 | ||
|
|
7575e6afc4 | ||
|
|
316a9f6480 | ||
|
|
c6de584cad | ||
|
|
d997ff6aa8 | ||
|
|
b9ccecf86e | ||
|
|
bd5d21aaf2 | ||
|
|
19e07771d1 | ||
|
|
ef267ab449 | ||
|
|
4f6ed683e8 | ||
|
|
c818e7064f | ||
|
|
ead6ab2ef7 | ||
|
|
5c3dc49f44 | ||
|
|
83884180ac | ||
|
|
4cac96c33a | ||
|
|
5df4be1165 | ||
|
|
96445f1b7d | ||
|
|
4bdd7596d3 | ||
|
|
18aae32015 | ||
|
|
a8996b9e52 | ||
|
|
94095c61d8 | ||
|
|
1cddd744ad | ||
|
|
786738dd00 | ||
|
|
5b8d5fdf2f | ||
|
|
694f31ca37 | ||
|
|
9c1ad0f9f7 | ||
|
|
71c6335293 | ||
|
|
8c38ea4ebc | ||
|
|
44d84ac164 | ||
|
|
930f9bd534 | ||
|
|
b61fbbde46 | ||
|
|
ec956b0334 | ||
|
|
44ffe0dc79 | ||
|
|
e3a61fba52 | ||
|
|
65794f60ec | ||
|
|
7a710b4970 | ||
|
|
0bb20cc611 | ||
|
|
433c0c895e | ||
|
|
67e8d22958 | ||
|
|
10d1fc0e73 | ||
|
|
2260c8aa11 | ||
|
|
97eb62aff8 | ||
|
|
1855fc35f2 | ||
|
|
dc3ed35313 | ||
|
|
6b868df554 | ||
|
|
5ccbbe40c2 | ||
|
|
86f93a53d6 | ||
|
|
f53347631e | ||
|
|
efe3cb6e1a | ||
|
|
32ac4edeed | ||
|
|
4c04c09138 | ||
|
|
47ea80baee | ||
|
|
95c3fa836b | ||
|
|
ab60a12465 | ||
|
|
2d38e51867 | ||
|
|
a5dda669e3 | ||
|
|
3c4f3a680a | ||
|
|
b61c06384a | ||
|
|
e7742bfb7c | ||
|
|
22307ae0ee | ||
|
|
e150150d9f | ||
|
|
943f0733bb | ||
|
|
8274447dd9 | ||
|
|
083a84e5d0 | ||
|
|
d5eb386d00 | ||
|
|
1ce7b48057 | ||
|
|
cbcdd337aa | ||
|
|
c144adf77c | ||
|
|
d390039873 | ||
|
|
7d0c58a285 | ||
|
|
9263001b21 | ||
|
|
66ee6d07f8 | ||
|
|
a40dcca794 | ||
|
|
15e3dfe1d3 | ||
|
|
a1de9367ec | ||
|
|
eceb37bde2 | ||
|
|
56fcf85ab6 | ||
|
|
77db81d661 | ||
|
|
2ad7fcbc2f | ||
|
|
2c62dfd124 | ||
|
|
ef66497a0d | ||
|
|
1128029599 | ||
|
|
befc30bc55 | ||
|
|
ca5846cde9 | ||
|
|
8547ab1663 | ||
|
|
9c0e6ac365 | ||
|
|
552b963e6d | ||
|
|
e2b48366d3 | ||
|
|
5e0d9aea32 | ||
|
|
ae13c93b7d | ||
|
|
b9f8a4a477 | ||
|
|
68e9f75708 | ||
|
|
d569693f24 | ||
|
|
15d8bb2105 | ||
|
|
b2ca777a08 | ||
|
|
ba01198e6c | ||
|
|
6ebd5e1761 | ||
|
|
2723eda1e4 | ||
|
|
1fa3a5cce9 | ||
|
|
fe8aee6b08 | ||
|
|
0639e2a6e2 | ||
|
|
f1d707705e | ||
|
|
296a7db960 | ||
|
|
4c0936e72f | ||
|
|
0992e391ba | ||
|
|
b22aaeef6a | ||
|
|
8090ee0e5d | ||
|
|
f7d31bb3e3 | ||
|
|
9cd928674f | ||
|
|
3ea8a4d220 | ||
|
|
b0d3ba76a0 | ||
|
|
ab798fe5ba | ||
|
|
e7d90e08b9 | ||
|
|
c2404f77e9 | ||
|
|
ec4a16f2e0 | ||
|
|
ca5de26f50 | ||
|
|
71920d61e6 | ||
|
|
5de75eee56 | ||
|
|
2d5fc39d35 | ||
|
|
c001ed53fa | ||
|
|
39e01e9349 | ||
|
|
9e54d4c7d2 | ||
|
|
56bf97ffc9 | ||
|
|
7d3e719a2c | ||
|
|
e55d4fd5c1 | ||
|
|
5ee231415f | ||
|
|
c866771cd2 | ||
|
|
4a24219a1a | ||
|
|
733a184ce0 | ||
|
|
eee09e79e8 | ||
|
|
6df85adf3e | ||
|
|
3ee6036551 | ||
|
|
fb65080548 | ||
|
|
3a5f21b0d1 | ||
|
|
13a5598dc3 | ||
|
|
5a6c89661a | ||
|
|
7c5745720a | ||
|
|
00ae13f966 | ||
|
|
29dc39fce1 | ||
|
|
5c184cfc0d | ||
|
|
055022a55f | ||
|
|
c30e908034 | ||
|
|
8d24c0212e | ||
|
|
8240cea628 | ||
|
|
f2a33eb372 | ||
|
|
e134a40208 | ||
|
|
690888cfc1 | ||
|
|
fb8d9b6645 | ||
|
|
f7ddb39ee1 | ||
|
|
145084b699 | ||
|
|
f1ba12607a | ||
|
|
bb87b65f08 | ||
|
|
b0f6e7cee4 | ||
|
|
ed72d4e104 | ||
|
|
8ec1bfe897 | ||
|
|
1dec17562f | ||
|
|
9cc3795f1a | ||
|
|
be1306a6c2 | ||
|
|
e9160a31e0 | ||
|
|
0a670c578f | ||
|
|
e3c15fc4b9 | ||
|
|
dc7c915553 | ||
|
|
b7eeb6e67f |
@@ -1,3 +1,4 @@
|
|||||||
|
compile
|
||||||
config.log
|
config.log
|
||||||
Makefile
|
Makefile
|
||||||
libtool
|
libtool
|
||||||
|
|||||||
802
CHANGES
802
CHANGES
@@ -6,7 +6,809 @@
|
|||||||
|
|
||||||
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)
|
||||||
|
|
||||||
|
Daniel (29 January 2007)
|
||||||
|
- Michael Wallner reported that when doing a CONNECT with a custom User-Agent
|
||||||
|
header, you got _two_ User-Agent headers in the CONNECT request...! Added
|
||||||
|
test case 287 to verify the fix.
|
||||||
|
|
||||||
|
Daniel (28 January 2007)
|
||||||
|
- curl_easy_reset() now resets the CA bundle path correctly.
|
||||||
|
|
||||||
|
- David McCreedy fixed the Curl command line tool for HTTP on non-ASCII
|
||||||
|
platforms.
|
||||||
|
|
||||||
|
Daniel (25 January 2007)
|
||||||
|
- Added the --libcurl [file] option to curl. 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 operation of what your command
|
||||||
|
line operation does!
|
||||||
|
|
||||||
|
Dan F (24 January 2007)
|
||||||
|
- Fixed a dangling pointer problem that prevented the http_proxy environment
|
||||||
|
variable from being properly used in many cases (and caused test case 63
|
||||||
|
to fail).
|
||||||
|
|
||||||
|
Daniel (23 January 2007)
|
||||||
|
- David McCreedy did NTLM changes mainly for non-ASCII platforms:
|
||||||
|
|
||||||
|
#1
|
||||||
|
There's a compilation error in http_ntlm.c if USE_NTLM2SESSION is NOT
|
||||||
|
defined. I noticed this while testing various configurations. Line 867 of
|
||||||
|
the current http_ntlm.c is a closing bracket for an if/else pair that only
|
||||||
|
gets compiled in if USE_NTLM2SESSION is defined. But this closing bracket
|
||||||
|
wasn't in an #ifdef so the code fails to compile unless USE_NTLM2SESSION was
|
||||||
|
defined. Lines 198 and 140 of my patch wraps that closing bracket in an
|
||||||
|
#ifdef USE_NTLM2SESSION.
|
||||||
|
|
||||||
|
#2
|
||||||
|
I noticed several picky compiler warnings when DEBUG_ME is defined. I've
|
||||||
|
fixed them with casting. By the way, DEBUG_ME was a huge help in
|
||||||
|
understanding this code.
|
||||||
|
|
||||||
|
#3
|
||||||
|
Hopefully the last non-ASCII conversion patch for libcurl in a while. I
|
||||||
|
changed the "NTLMSSP" literal to hex since this signature must always be in
|
||||||
|
ASCII.
|
||||||
|
|
||||||
|
Conversion code was strategically added where necessary. And the
|
||||||
|
Curl_base64_encode calls were changed so the binary "blobs" http_ntlm.c
|
||||||
|
creates are NOT translated on non-ASCII platforms.
|
||||||
|
|
||||||
|
Dan F (22 January 2007)
|
||||||
|
- Converted (most of) the test data files into genuine XML. A handful still
|
||||||
|
are not, due mainly to the lack of support for XML character entities
|
||||||
|
(e.g. & => & ). This will make it easier to validate test files using
|
||||||
|
tools like xmllint, as well as to edit and view them using XML tools.
|
||||||
|
|
||||||
|
Daniel (16 January 2007)
|
||||||
|
- Armel Asselin improved libcurl to behave a lot better when an easy handle
|
||||||
|
doing an FTP transfer is removed from a multi handle before completion. The
|
||||||
|
fix also fixed the "alive counter" to be correct on "premature removal" for
|
||||||
|
all protocols.
|
||||||
|
|
||||||
|
Dan F (16 January 2007)
|
||||||
|
- Fixed a small memory leak in tftp uploads discovered by curl's memory leak
|
||||||
|
detector. Also changed tftp downloads to URL-unescape the downloaded
|
||||||
|
file name.
|
||||||
|
|
||||||
|
Daniel (14 January 2007)
|
||||||
|
- David McCreedy provided libcurl changes for doing HTTP communication on
|
||||||
|
non-ASCII platforms. It does add some complexity, most notably with more
|
||||||
|
#ifdefs, but I want to see this supported added and I can't see how we can
|
||||||
|
add it without the extra stuff added.
|
||||||
|
|
||||||
|
- Setting CURLOPT_COOKIELIST to "ALL" when no cookies at all was present,
|
||||||
|
libcurl would crash when trying to read a NULL pointer.
|
||||||
|
|
||||||
|
Daniel (12 January 2007)
|
||||||
|
- Toby Peterson found a nasty bug that prevented (lib)curl from properly
|
||||||
|
downloading (most) things that were larger than 4GB on 32 bit systems. Matt
|
||||||
|
Witherspoon helped as narrow down the problem.
|
||||||
|
|
||||||
|
Daniel (5 January 2007)
|
||||||
|
- Linus Nielsen Feltzing introduced the --ftp-ssl-ccc command line option to
|
||||||
|
curl that uses the new CURLOPT_FTP_SSL_CCC option in libcurl. If enabled, it
|
||||||
|
will make libcurl shutdown SSL/TLS after the authentication is done on a
|
||||||
|
FTP-SSL operation.
|
||||||
|
|
||||||
|
Daniel (4 January 2007)
|
||||||
|
- David McCreedy made changes to allow base64 encoding/decoding to work on
|
||||||
|
non-ASCII platforms.
|
||||||
|
|
||||||
|
Daniel (3 January 2007)
|
||||||
|
- Matt Witherspoon fixed the flaw which made libcurl 7.16.0 always store
|
||||||
|
downloaded data in two buffers, just to be able to deal with a special HTTP
|
||||||
|
pipelining case. That is now only activated for pipelined transfers. In
|
||||||
|
Matt's case, it showed as a considerable performance difference,
|
||||||
|
|
||||||
|
Daniel (2 January 2007)
|
||||||
|
- Victor Snezhko helped us fix bug report #1603712
|
||||||
|
(http://curl.haxx.se/bug/view.cgi?id=1603712) (known bug #36) --limit-rate
|
||||||
|
(CURLOPT_MAX_SEND_SPEED_LARGE and CURLOPT_MAX_RECV_SPEED_LARGE) are broken
|
||||||
|
on Windows (since 7.16.0, but that's when they were introduced as previous
|
||||||
|
to that the limiting logic was made in the application only and not in the
|
||||||
|
library). It was actually also broken on select()-based systems (as apposed
|
||||||
|
to poll()) but we haven't had any such reports. We now use select(), Sleep()
|
||||||
|
or delay() properly to sleep a while without waiting for anything input or
|
||||||
|
output when the rate limiting is activated with the easy interface.
|
||||||
|
|
||||||
|
- Modified libcurl.pc.in to use Libs.private for the libs libcurl itself needs
|
||||||
|
to get built static. It has been mentioned before and was again brought to
|
||||||
|
our attention by Nathanael Nerode who filed debian bug report #405226
|
||||||
|
(http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=405226).
|
||||||
|
|
||||||
|
Daniel (29 December 2006)
|
||||||
|
- Make curl_easy_duphandle() set the magic number in the new handle.
|
||||||
|
|
||||||
|
Daniel (22 December 2006)
|
||||||
|
- Robert Foreman provided a prime example snippet showing how libcurl would
|
||||||
|
get confused and not acknowledge the 'no_proxy' variable properly once it
|
||||||
|
had used the proxy and you re-used the same easy handle. I made sure the
|
||||||
|
proxy name is properly stored in the connect struct rather than the
|
||||||
|
sessionhandle/easy struct.
|
||||||
|
|
||||||
|
- David McCreedy fixed a bad call to getsockname() that wrongly used a size_t
|
||||||
|
variable to point to when it should be a socklen_t.
|
||||||
|
|
||||||
|
- When setting a proxy with environment variables and (for example) running
|
||||||
|
'curl [URL]' with a URL without a protocol prefix, curl would not send a
|
||||||
|
correct request as it failed to add the protocol prefix.
|
||||||
|
|
||||||
|
Daniel (21 December 2006)
|
||||||
|
- Robson Braga Araujo reported bug #1618359
|
||||||
|
(http://curl.haxx.se/bug/view.cgi?id=1618359) and subsequently provided a
|
||||||
|
patch for it: when downloading 2 zero byte files in a row, curl 7.16.0
|
||||||
|
enters an infinite loop, while curl 7.16.1-20061218 does one additional
|
||||||
|
unnecessary request.
|
||||||
|
|
||||||
|
Fix: During the "Major overhaul introducing http pipelining support and
|
||||||
|
shared connection cache within the multi handle." change, headerbytecount
|
||||||
|
was moved to live in the Curl_transfer_keeper structure. But that structure
|
||||||
|
is reset in the Transfer method, losing the information that we had about
|
||||||
|
the header size. This patch moves it back to the connectdata struct.
|
||||||
|
|
||||||
|
Daniel (16 December 2006)
|
||||||
|
- Brendan Jurd provided a fix that now prevents libcurl from getting a SIGPIPE
|
||||||
|
during certain conditions when GnuTLS is used.
|
||||||
|
|
||||||
|
Daniel (11 December 2006)
|
||||||
|
- Alexey Simak found out that when doing FTP with the multi interface and
|
||||||
|
something went wrong like it got a bad response code back from the server,
|
||||||
|
libcurl would leak memory. Added test case 538 to verify the fix.
|
||||||
|
|
||||||
|
I also noted that the connection would get cached in that case, which
|
||||||
|
doesn't make sense since it cannot be re-use when the authentication has
|
||||||
|
failed. I fixed that issue too at the same time, and also that the path
|
||||||
|
would be "remembered" in vain for cases where the connection was about to
|
||||||
|
get closed.
|
||||||
|
|
||||||
|
Daniel (6 December 2006)
|
||||||
|
- Sebastien Willemijns reported bug #1603712
|
||||||
|
(http://curl.haxx.se/bug/view.cgi?id=1603712) which is about connections
|
||||||
|
getting cut off prematurely when --limit-rate is used. While I found no such
|
||||||
|
problems in my tests nor in my reading of the code, I found that the
|
||||||
|
--limit-rate code was severly flawed (since it was moved into the lib, since
|
||||||
|
7.15.5) when used with the easy interface and it didn't work as documented
|
||||||
|
so I reworked it somewhat and now it works for my tests.
|
||||||
|
|
||||||
|
Daniel (5 December 2006)
|
||||||
|
- Stefan Krause pointed out a compiler warning with a picky MSCV compiler when
|
||||||
|
passing a curl_off_t argument to the Curl_read_rewind() function which takes
|
||||||
|
an size_t argument. Curl_read_rewind() also had debug code left in it and it
|
||||||
|
was put in a different source file with no good reason when only used from
|
||||||
|
one single spot.
|
||||||
|
|
||||||
|
- Sh Diao reported that CURLOPT_CLOSEPOLICY doesn't work, and indeed, there is
|
||||||
|
no code present in the library that receives the option. Since it was not
|
||||||
|
possible to use, we know that no current users exist and thus we simply
|
||||||
|
removed it from the docs and made the code always use the default path of
|
||||||
|
the code.
|
||||||
|
|
||||||
|
- Jared Lundell filed bug report #1604956
|
||||||
|
(http://curl.haxx.se/bug/view.cgi?id=1604956) which identified setting
|
||||||
|
CURLOPT_MAXCONNECTS to zero caused libcurl to SIGSEGV. Starting now, libcurl
|
||||||
|
will always internally use no less than 1 entry in the connection cache.
|
||||||
|
|
||||||
|
- Sh Diao reported that CURLOPT_FORBID_REUSE no works, and indeed it broke in
|
||||||
|
the 7.16.0 release.
|
||||||
|
|
||||||
|
- Martin Skinner brought back bug report #1230118 to haunt us once again.
|
||||||
|
(http://curl.haxx.se/bug/view.cgi?id=1230118) curl_getdate() did not work
|
||||||
|
properly for all input dates on Windows. It was mostly seen on some TZ time
|
||||||
|
zones using DST. Luckily, Martin also provided a fix.
|
||||||
|
|
||||||
|
- Alexey Simak filed bug report #1600447
|
||||||
|
(http://curl.haxx.se/bug/view.cgi?id=1600447) in which he noted that active
|
||||||
|
FTP connections don't work with the multi interface. The problem is here
|
||||||
|
that the multi interface state machine has a state during which it can wait
|
||||||
|
for the data connection to connect, but the active connection is not done in
|
||||||
|
the same step in the sequence as the passive one is so it doesn't quite work
|
||||||
|
for active. The active FTP code still use a blocking function to allow the
|
||||||
|
remote server to connect.
|
||||||
|
|
||||||
|
The fix (work-around is a better word) for this problem is to set the
|
||||||
|
boolean prematurely that the data connection is completed, so that the "wait
|
||||||
|
for connect" phase ends at once.
|
||||||
|
|
||||||
|
The proper fix, left for the future, is of course to make the active FTP
|
||||||
|
case to act in a non-blocking way too.
|
||||||
|
|
||||||
|
- Matt Witherspoon fixed a problem case when the CPU load went to 100% when a
|
||||||
|
HTTP upload was disconnected:
|
||||||
|
|
||||||
|
"What appears to be happening is that my system (Linux 2.6.17 and 2.6.13) is
|
||||||
|
setting *only* POLLHUP on poll() when the conditions in my previous mail
|
||||||
|
occur. As you can see, select.c:Curl_select() does not check for POLLHUP. So
|
||||||
|
basically what was happening, is poll() was returning immediately (with
|
||||||
|
POLLHUP set), but when Curl_select() looked at the bits, neither POLLERR or
|
||||||
|
POLLOUT was set. This still caused Curl_readwrite() to be called, which
|
||||||
|
quickly returned. Then the transfer() loop kept continuing at full speed
|
||||||
|
forever."
|
||||||
|
|
||||||
|
Daniel (1 December 2006)
|
||||||
|
- Toon Verwaest reported that there are servers that send the Content-Range:
|
||||||
|
header in a third, not suppported by libcurl, format and we agreed that we
|
||||||
|
could make the parser more forgiving to accept all the three found
|
||||||
|
variations.
|
||||||
|
|
||||||
|
Daniel (25 November 2006)
|
||||||
|
- Venkat Akella found out that libcurl did not like HTTP responses that simply
|
||||||
|
responded with a single status line and no headers nor body. Starting now, a
|
||||||
|
HTTP response on a persistent connection (i.e not set to be closed after the
|
||||||
|
response has been taken care of) must have Content-Length or chunked
|
||||||
|
encoding set, or libcurl will simply assume that there is no body.
|
||||||
|
|
||||||
|
To my horror I learned that we had no less than 57(!) test cases that did bad
|
||||||
|
HTTP responses like this, and even the test http server (sws) responded badly
|
||||||
|
when queried by the test system if it is the test system. So although the
|
||||||
|
actual fix for the problem was tiny, going through all the newly failing test
|
||||||
|
cases got really painful and boring.
|
||||||
|
|
||||||
|
Daniel (24 November 2006)
|
||||||
|
- James Housley did lots of work and introduced SFTP downloads.
|
||||||
|
|
||||||
|
Daniel (13 November 2006)
|
||||||
|
- Ron in bug #1595348 (http://curl.haxx.se/bug/view.cgi?id=1595348) pointed
|
||||||
|
out a stack overwrite (and the corresponding fix) on 64bit Windows when
|
||||||
|
dealing with HTTP chunked encoding.
|
||||||
|
|
||||||
|
Daniel (9 November 2006)
|
||||||
|
- Nir Soffer updated libcurl.framework.make:
|
||||||
|
o fix symlinks, should link to Versions, not to ./Versions
|
||||||
|
o indentation improvments
|
||||||
|
|
||||||
|
- Dmitriy Sergeyev found a SIGSEGV with his test04.c example posted on 7 Nov
|
||||||
|
2006. It turned out we wrongly assumed that the connection cache was present
|
||||||
|
when tearing down a connection.
|
||||||
|
|
||||||
|
- Ciprian Badescu found a SIGSEGV when doing multiple TFTP transfers using the
|
||||||
|
multi interface, but I could also repeat it doing multiple sequential ones
|
||||||
|
with the easy interface. Using Ciprian's test case, I could fix it.
|
||||||
|
|
||||||
|
Daniel (8 November 2006)
|
||||||
|
- Bradford Bruce reported that when setting CURLOPT_DEBUGFUNCTION without
|
||||||
|
CURLOPT_VERBOSE set to non-zero, you still got a few debug messages from the
|
||||||
|
SSL handshake. This is now stopped.
|
||||||
|
|
||||||
|
Daniel (7 November 2006)
|
||||||
|
- Olaf fixed a leftover problem with the CONNECT fix of his that would leave a
|
||||||
|
wrong error message in the error message buffer.
|
||||||
|
|
||||||
|
Daniel (3 November 2006)
|
||||||
|
- Olaf Stueben provided a patch that I edited slightly. It fixes the notorious
|
||||||
|
KNOWN_BUGS #25, which happens when a proxy closes the connection when
|
||||||
|
libcurl has sent CONNECT, as part of an authentication negotiation. Starting
|
||||||
|
now, libcurl will re-connect accordingly and continue the authentication as
|
||||||
|
it should.
|
||||||
|
|
||||||
|
Daniel (2 November 2006)
|
||||||
|
- James Housley brought support for SCP transfers, based on the libssh2 library
|
||||||
|
for the actual network protocol stuff.
|
||||||
|
|
||||||
|
Added these new curl_easy_setopt() options:
|
||||||
|
|
||||||
|
CURLOPT_SSH_AUTH_TYPES
|
||||||
|
CURLOPT_SSH_PUBLIC_KEYFILE
|
||||||
|
CURLOPT_SSH_PRIVATE_KEYFILE
|
||||||
|
|
||||||
|
Version 7.16.0 (30 October 2006)
|
||||||
|
|
||||||
|
Daniel (25 October 2006)
|
||||||
|
- Fixed CURLOPT_FAILONERROR to return CURLE_HTTP_RETURNED_ERROR even for the
|
||||||
|
case when 401 or 407 are returned, *IF* no auth credentials have been given.
|
||||||
|
The CURLOPT_FAILONERROR option is not possible to make fool-proof for 401
|
||||||
|
and 407 cases when auth credentials is given, but we've now covered this
|
||||||
|
somewhat more.
|
||||||
|
|
||||||
|
You might get some amounts of headers transferred before this situation is
|
||||||
|
detected, like for when a "100-continue" is received as a response to a
|
||||||
|
POST/PUT and a 401 or 407 is received immediately afterwards.
|
||||||
|
|
||||||
|
Added test 281 to verify this change.
|
||||||
|
|
||||||
|
Daniel (23 October 2006)
|
||||||
|
- Ravi Pratap provided a major update with pipelining fixes. We also no longer
|
||||||
|
re-use connections (for pipelining) before the name resolving is done.
|
||||||
|
|
||||||
|
Daniel (21 October 2006)
|
||||||
|
- Nir Soffer made the tests/libtest/Makefile.am use a proper variable for all
|
||||||
|
the single test applications' link and dependences, so that you easier can
|
||||||
|
override those from the command line when using make.
|
||||||
|
|
||||||
|
- Armel Asselin separated CA cert verification problems from problems with
|
||||||
|
reading the (local) CA cert file to let users easier pinpoint the actual
|
||||||
|
problem. CURLE_SSL_CACERT_BADFILE (77) is the new libcurl error code.
|
||||||
|
|
||||||
|
Daniel (18 October 2006)
|
||||||
|
- Removed the "protocol-guessing" for URLs with host names starting with FTPS
|
||||||
|
or TELNET since they are practically non-existant. This leaves us with only
|
||||||
|
three different prefixes that would assume the protocol is anything but
|
||||||
|
HTTP, and they are host names starting with "ftp.", "dict." or "ldap.".
|
||||||
|
|
||||||
|
Daniel (17 October 2006)
|
||||||
|
- Bug report #1579171 pointed out code flaws detected with "prefast", and they
|
||||||
|
were 1 - a too small memory clear with memset() in the threaded resolver and
|
||||||
|
2 - a range of potentially bad uses of the ctype family of is*() functions
|
||||||
|
such as isdigit(), isalnum(), isprint() and more. The latter made me switch
|
||||||
|
to using our own set of these functions/macros using uppercase letters, and
|
||||||
|
with some extra set of crazy typecasts to avoid mistakingly passing in
|
||||||
|
negative numbers to the underlying is*() functions.
|
||||||
|
|
||||||
|
- With Jeff Pohlmeyer's help, I fixed the expire timer when using
|
||||||
|
curl_multi_socket() during name resolves with c-ares and the LOW_SPEED
|
||||||
|
options now work fine with curl_multi_socket() as well.
|
||||||
|
|
||||||
|
Daniel (16 October 2006)
|
||||||
|
- Added a check in configure that simply tries to run a program (not when
|
||||||
|
cross-compiling) in order to detect problems with run-time libraries that
|
||||||
|
otherwise would occur when the sizeof tests for curl_off_t would run and
|
||||||
|
thus be much more confusing to users. The check of course should run after
|
||||||
|
all lib-checks are done and before any other test is used that would run an
|
||||||
|
executable built for testing-purposes.
|
||||||
|
|
||||||
|
Dan F (13 October 2006)
|
||||||
|
- The tagging of application/x-www-form-urlencoded POST body data sent
|
||||||
|
to the CURLOPT_DEBUGFUNCTION callback has been fixed (it was erroneously
|
||||||
|
included as part of the header). A message was also added to the
|
||||||
|
command line tool to show when data is being sent, enabled when
|
||||||
|
--verbose is used.
|
||||||
|
|
||||||
|
Daniel (12 October 2006)
|
||||||
|
- Starting now, adding an easy handle to a multi stack that was already added
|
||||||
|
to a multi stack will cause CURLM_BAD_EASY_HANDLE to get returned.
|
||||||
|
|
||||||
|
- Jeff Pohlmeyer has been working with the hiperfifo.c example source code,
|
||||||
|
and while doing so it became apparent that the current timeout system for
|
||||||
|
the socket API really was a bit awkward since it become quite some work to
|
||||||
|
be sure we have the correct timeout set.
|
||||||
|
|
||||||
|
Jeff then provided the new CURLMOPT_TIMERFUNCTION that is yet another
|
||||||
|
callback the app can set to get to know when the general timeout time
|
||||||
|
changes and thus for an application like hiperfifo.c it makes everything a
|
||||||
|
lot easier and nicer. There's a CURLMOPT_TIMERDATA option too of course in
|
||||||
|
good old libcurl tradition.
|
||||||
|
|
||||||
|
Jeff has also updated the hiperfifo.c example code to use this news.
|
||||||
|
|
||||||
|
Daniel (9 October 2006)
|
||||||
|
- Bogdan Nicula's second test case (posted Sun, 08 Oct 2006) converted to test
|
||||||
|
case 535 and it now runs fine. Again a problem with the pipelining code not
|
||||||
|
taking all possible (error) conditions into account.
|
||||||
|
|
||||||
|
Daniel (6 October 2006)
|
||||||
|
- Bogdan Nicula's hanging test case (posted Wed, 04 Oct 2006) was converted to
|
||||||
|
test case 533 and the test now runs fine.
|
||||||
|
|
||||||
|
Daniel (4 October 2006)
|
||||||
|
- Dmitriy Sergeyev provided an example source code that crashed CVS libcurl
|
||||||
|
but that worked nicely in 7.15.5. I converted it into test case 532 and
|
||||||
|
fixed the problem.
|
||||||
|
|
||||||
|
Daniel (29 September 2006)
|
||||||
|
- Removed a few other no-longer present options from the header file.
|
||||||
|
|
||||||
|
- Support for FTP third party transfers was removed. Here's why:
|
||||||
|
|
||||||
|
o The recent multi interface changes broke it and the design of the 3rd party
|
||||||
|
transfers made it very hard to fix the problems
|
||||||
|
o It was still blocking and thus nasty for the multi interface
|
||||||
|
o It was a lot of extra code for a very rarely used feature
|
||||||
|
o It didn't use the same code as for "plain" FTP transfers, so it didn't work
|
||||||
|
fine for IPv6 and it didn't properly re-use connections and more
|
||||||
|
o There's nobody around who's willing to work on and improve the existing
|
||||||
|
code
|
||||||
|
|
||||||
|
This does not mean that third party transfers are banned forever, only that
|
||||||
|
they need to be done better if they are to be re-added in the future.
|
||||||
|
|
||||||
|
The CURLOPT_SOURCE_* options are removed from the lib and so are the --3p*
|
||||||
|
options from the command line tool. For this reason, I also bumped the
|
||||||
|
version info for the lib.
|
||||||
|
|
||||||
|
Daniel (28 September 2006)
|
||||||
|
- Reported in #1561470 (http://curl.haxx.se/bug/view.cgi?id=1561470), libcurl
|
||||||
|
would crash if a bad function sequence was used when shutting down after
|
||||||
|
using the multi interface (i.e using easy_cleanup after multi_cleanup) so
|
||||||
|
precautions have been added to make sure it doesn't any more - test case 529
|
||||||
|
was added to verify.
|
||||||
|
|
||||||
|
Daniel (27 September 2006)
|
||||||
|
- The URL in the cookie jar file is now changed since it was giving a 404.
|
||||||
|
Reported by Timothy Stone. The new URL will take the visitor to a curl web
|
||||||
|
site mirror with the document.
|
||||||
|
|
||||||
|
Daniel (24 September 2006)
|
||||||
|
- Bernard Leak fixed configure --with-gssapi-libs.
|
||||||
|
|
||||||
|
- Cory Nelson made libcurl use the WSAPoll() function if built for Windows
|
||||||
|
Vista (_WIN32_WINNT >= 0x0600)
|
||||||
|
|
||||||
|
Daniel (23 September 2006)
|
||||||
|
- Mike Protts added --ftp-ssl-control to make curl use FTP-SSL, but only
|
||||||
|
encrypt the control connection and use the data connection "plain".
|
||||||
|
|
||||||
|
- Dmitriy Sergeyev provided a patch that made the SOCKS[45] code work better
|
||||||
|
as it now will read the full data sent from servers. The SOCKS-related code
|
||||||
|
was also moved to the new lib/socks.c source file.
|
||||||
|
|
||||||
|
Daniel (21 September 2006)
|
||||||
|
- Added test case 531 in an attempt to repeat bug report #1561470
|
||||||
|
(http://curl.haxx.se/bug/view.cgi?id=1561470) that is said to crash when an
|
||||||
|
FTP upload fails with the multi interface. It did not, but I made a failed
|
||||||
|
upload still assume the control connection to be fine.
|
||||||
|
|
||||||
|
Daniel (20 September 2006)
|
||||||
|
- Armel Asselin fixed problems when you gave a proxy URL with user name and
|
||||||
|
empty password or no password at all. Test case 278 and 279 were added to
|
||||||
|
verify.
|
||||||
|
|
||||||
|
Daniel (12 September 2006)
|
||||||
|
- Added docs/examples/10-at-a-time.c by Michael Wallner
|
||||||
|
|
||||||
|
- Added docs/examples/hiperfifo.c by Jeff Pohlmeyer
|
||||||
|
|
||||||
|
Daniel (11 September 2006)
|
||||||
|
- Fixed my breakage from earlier today so that doing curl_easy_cleanup() on a
|
||||||
|
handle that is part of a multi handle first removes the handle from the
|
||||||
|
stack.
|
||||||
|
|
||||||
|
- Added CURLOPT_SSL_SESSIONID_CACHE and --no-sessionid to disable SSL
|
||||||
|
session-ID re-use on demand since there obviously are broken servers out
|
||||||
|
there that misbehave with session-IDs used.
|
||||||
|
|
||||||
|
- Jeff Pohlmeyer presented a *multi_socket()-using program that exposed a
|
||||||
|
problem with it (SIGSEGV-style). It clearly showed that the existing
|
||||||
|
socket-state and state-difference function wasn't good enough so I rewrote
|
||||||
|
it and could then re-run Jeff's program without any crash. The previous
|
||||||
|
version clearly could miss to tell the application when a handle changed
|
||||||
|
from using one socket to using another.
|
||||||
|
|
||||||
|
While I was at it (as I could use this as a means to track this problem
|
||||||
|
down), I've now added a 'magic' number to the easy handle struct that is
|
||||||
|
inited at curl_easy_init() time and cleared at curl_easy_cleanup() time that
|
||||||
|
we can use internally to detect that an easy handle seems to be fine, or at
|
||||||
|
least not closed or freed (freeing in debug builds fill the area with 0x13
|
||||||
|
bytes but in normal builds we can of course not assume any particular data
|
||||||
|
in the freed areas).
|
||||||
|
|
||||||
|
Daniel (9 September 2006)
|
||||||
|
- Michele Bini fixed how the hostname is put in NTLM packages. As servers
|
||||||
|
don't expect fully qualified names we need to cut them off at the first dot.
|
||||||
|
|
||||||
|
- Peter Sylvester cleaned up and fixed the getsockname() uses in ftp.c. Some
|
||||||
|
of them can be completetly removed though...
|
||||||
|
|
||||||
|
Daniel (6 September 2006)
|
||||||
|
- Ravi Pratap and I have implemented HTTP Pipelining support. Enable it for a
|
||||||
|
multi handle using CURLMOPT_PIPELINING and all HTTP connections done on that
|
||||||
|
handle will be attempted to get pipelined instead of done in parallell as
|
||||||
|
they are performed otherwise.
|
||||||
|
|
||||||
|
As a side-effect from this work, connections are now shared between all easy
|
||||||
|
handles within a multi handle, so if you use N easy handles for transfers,
|
||||||
|
each of them can pick up and re-use a connection that was previously used by
|
||||||
|
any of the handles, be it the same or one of the others.
|
||||||
|
|
||||||
|
This separation of the tight relationship between connections and easy
|
||||||
|
handles is most noticable when you close easy handles that have been used in
|
||||||
|
a multi handle and check amount of used memory or watch the debug output, as
|
||||||
|
there are times when libcurl will keep the easy handle around for a while
|
||||||
|
longer to be able to close it properly. Like for sending QUIT to close down
|
||||||
|
an FTP connection.
|
||||||
|
|
||||||
|
This is a major change.
|
||||||
|
|
||||||
Daniel (4 September 2006)
|
Daniel (4 September 2006)
|
||||||
- Dmitry Rechkin (http://curl.haxx.se/bug/view.cgi?id=1551412) provided a
|
- Dmitry Rechkin (http://curl.haxx.se/bug/view.cgi?id=1551412) provided a
|
||||||
patch that while not fixing things very nicely, it does make the SOCKS5
|
patch that while not fixing things very nicely, it does make the SOCKS5
|
||||||
|
|||||||
2
COPYING
2
COPYING
@@ -1,6 +1,6 @@
|
|||||||
COPYRIGHT AND PERMISSION NOTICE
|
COPYRIGHT AND PERMISSION NOTICE
|
||||||
|
|
||||||
Copyright (c) 1996 - 2006, Daniel Stenberg, <daniel@haxx.se>.
|
Copyright (c) 1996 - 2007, Daniel Stenberg, <daniel@haxx.se>.
|
||||||
|
|
||||||
All rights reserved.
|
All rights reserved.
|
||||||
|
|
||||||
|
|||||||
112
Makefile.dist
112
Makefile.dist
@@ -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$
|
||||||
###########################################################################
|
###########################################################################
|
||||||
|
|
||||||
|
VC=vc6
|
||||||
|
|
||||||
all:
|
all:
|
||||||
./configure
|
./configure
|
||||||
make
|
make
|
||||||
@@ -73,112 +75,120 @@ mingw32-ssl:
|
|||||||
$(MAKE) -C lib -f Makefile.m32 SSL=1 ZLIB=1
|
$(MAKE) -C lib -f Makefile.m32 SSL=1 ZLIB=1
|
||||||
$(MAKE) -C src -f Makefile.m32 SSL=1 ZLIB=1
|
$(MAKE) -C src -f Makefile.m32 SSL=1 ZLIB=1
|
||||||
|
|
||||||
|
mingw32-ssh2-ssl:
|
||||||
|
$(MAKE) -C lib -f Makefile.m32 SSH2=1 SSL=1 ZLIB=1
|
||||||
|
$(MAKE) -C src -f Makefile.m32 SSH2=1 SSL=1 ZLIB=1
|
||||||
|
|
||||||
|
mingw32-ssh2-ssl-sspi:
|
||||||
|
$(MAKE) -C lib -f Makefile.m32 SSH2=1 SSL=1 SSPI=1 ZLIB=1
|
||||||
|
$(MAKE) -C src -f Makefile.m32 SSH2=1 SSL=1 SSPI=1 ZLIB=1
|
||||||
|
|
||||||
mingw32-clean:
|
mingw32-clean:
|
||||||
$(MAKE) -C lib -f Makefile.m32 clean
|
$(MAKE) -C lib -f Makefile.m32 clean
|
||||||
$(MAKE) -C src -f Makefile.m32 clean
|
$(MAKE) -C src -f Makefile.m32 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
|
||||||
@@ -212,6 +222,10 @@ netware-ssl-zlib:
|
|||||||
$(MAKE) -C lib -f Makefile.netware WITH_SSL=1 WITH_ZLIB=1
|
$(MAKE) -C lib -f Makefile.netware WITH_SSL=1 WITH_ZLIB=1
|
||||||
$(MAKE) -C src -f Makefile.netware WITH_SSL=1 WITH_ZLIB=1
|
$(MAKE) -C src -f Makefile.netware WITH_SSL=1 WITH_ZLIB=1
|
||||||
|
|
||||||
|
netware-ssh2-ssl-zlib:
|
||||||
|
$(MAKE) -C lib -f Makefile.netware WITH_SSH2=1 WITH_SSL=1 WITH_ZLIB=1
|
||||||
|
$(MAKE) -C src -f Makefile.netware WITH_SSH2=1 WITH_SSL=1 WITH_ZLIB=1
|
||||||
|
|
||||||
netware-zlib:
|
netware-zlib:
|
||||||
$(MAKE) -C lib -f Makefile.netware WITH_ZLIB=1
|
$(MAKE) -C lib -f Makefile.netware WITH_ZLIB=1
|
||||||
$(MAKE) -C src -f Makefile.netware WITH_ZLIB=1
|
$(MAKE) -C src -f Makefile.netware WITH_ZLIB=1
|
||||||
|
|||||||
@@ -1,48 +1,78 @@
|
|||||||
Curl and libcurl 7.15.6
|
Curl and libcurl 7.16.2
|
||||||
|
|
||||||
Public curl release number: 96
|
Public curl release number: 98
|
||||||
Releases counted from the very beginning: 123
|
Releases counted from the very beginning: 125
|
||||||
Available command line options: 114
|
Available command line options: 118
|
||||||
Available curl_easy_setopt() options: 135
|
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: 33
|
Amount of public web site mirrors: 38
|
||||||
Number of known libcurl bindings: 32
|
Number of known libcurl bindings: 35
|
||||||
Number of contributors: 515
|
Number of contributors: 539
|
||||||
|
|
||||||
This release includes the following changes:
|
This release includes the following changes:
|
||||||
|
|
||||||
o Added support for other MS-DOS compilers (besides djgpp)
|
o added CURLOPT_TIMEOUT_MS and CURLOPT_CONNECTTIMEOUT_MS
|
||||||
o CURLOPT_SOCKOPTFUNCTION and CURLOPT_SOCKOPTDATA were added
|
o added CURLOPT_HTTP_CONTENT_DECODING, CURLOPT_HTTP_TRANSFER_DECODING and
|
||||||
o (FTP) libcurl avoids sending TYPE if the desired type was already set
|
--raw
|
||||||
o (FTP) CURLOPT_PREQUOTE works even when CURLOPT_NOBODY is set true
|
o added support for using the NSS library for TLS/SSL
|
||||||
|
o changed default anonymous FTP password
|
||||||
|
o changed the CURLOPT_FTP_SSL_CCC option to handle active and passive
|
||||||
|
CCC shutdown
|
||||||
|
o added the --ftp-ssl-ccc-mode command line option
|
||||||
|
o includes VC8 Makefiles in the release archive
|
||||||
|
o --ftp-ssl-control is now honoured on ftps:// URLs
|
||||||
|
o added experimental CURL_ACKNOWLEDGE_EINTR symbol definition check
|
||||||
|
o --key and new --pubkey options for SSH public key file logins
|
||||||
|
o --pass now works for a SSH public key file, too
|
||||||
|
o select (2) support no longer needed to build the library if poll() used
|
||||||
|
o CURLOPT_POSTQUOTE works for SFTP
|
||||||
|
|
||||||
This release includes the following bugfixes:
|
This release includes the following bugfixes:
|
||||||
|
|
||||||
o SOCKS5 proxy connects can now time-out
|
o in testsuite, update test cookies expiration from 2007-Feb-1 to year 2035
|
||||||
o SOCKS5 connects that require auth no longer segfaults when auth not given
|
o socks5 works
|
||||||
o multi interface using asynch resolves could get stuck in wrong state
|
o builds fine with VC2005
|
||||||
o the 'running_handles' counter wasn't always updated properly when
|
o CURLOPT_RANGE set to NULL resets the range for FTP
|
||||||
curl_multi_remove_handle() was used
|
o curl_multi_remove_handle() rare crash
|
||||||
o (FTP) EPRT transfers with IPv6 didn't work properly
|
o passive FTP transfers work with SOCKS
|
||||||
o (FTP) SINGLECWD mode and using files in the root dir
|
o multi interface HTTPS connection re-use memory leak
|
||||||
o (HTTP) Expect: header disabling work better
|
o libcurl.m4's --with-libcurl is improved
|
||||||
o (HTTP) "Expect: 100-continue" disable on second POST on re-used connection
|
o curl-config --libs and libcurl.pc no longer list unnecessary dependencies
|
||||||
o src/config.h.in is fixed
|
o fixed an issue with CCC not working on some servers
|
||||||
|
o several HTTP pipelining problems
|
||||||
|
o HTTP CONNECT thru a proxy is now less blocking when the multi interface is
|
||||||
|
used
|
||||||
|
o HTTP Digest header parsing fix for unquoted last word ending with CRLF
|
||||||
|
o CURLOPT_PORT, HTTP proxy, re-using connections and non-HTTP protocols
|
||||||
|
o CURLOPT_INTERFACE for ipv6
|
||||||
|
o use-after-free issue with HTTP transfers with the multi interface
|
||||||
|
o the progress callback can get called more frequently
|
||||||
|
o timeout would restart when signal caught while awaiting socket events
|
||||||
|
o curl -f with user+password embedded in the URL
|
||||||
|
o 26 flaws identified by coverity.com
|
||||||
|
o builds on QNX 6 again
|
||||||
|
|
||||||
|
This release includes the following known bugs:
|
||||||
|
|
||||||
|
o see docs/KNOWN_BUGS (http://curl.haxx.se/docs/knownbugs.html)
|
||||||
|
|
||||||
Other curl-related news:
|
Other curl-related news:
|
||||||
|
|
||||||
o pycurl-7.15.5 was released: http://pycurl.sf.net
|
o pycurl 7.16.1 was released: http://pycurl.sf.net/
|
||||||
|
|
||||||
New curl mirrors:
|
New curl mirrors:
|
||||||
|
|
||||||
o http://curl.geosdreams.info/ is a new Polish mirror
|
o http://curl.basemirror.de is a new mirror in Germany
|
||||||
o http://curl.gfiles.org/ is a new Russian 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:
|
||||||
|
|
||||||
Domenico Andreoli, Armel Asselin, Gisle Vanem, Yang Tse, Andrew Biggs,
|
Yang Tse, Manfred Schwarb, Michael Wallner, Jeff Pohlmeyer, Shmulik Regev,
|
||||||
Peter Sylvester, David McCreedy, Dmitriy Sergeyev, Dmitry Rechkin,
|
Rob Crittenden, Robert A. Monat, Dan Fandrich, Duncan Mac-Vicar Prett,
|
||||||
Jari Sundell
|
Michal Marek, Robson Braga Araujo, Ian Turner, Linus Nielsen Feltzing,
|
||||||
|
Ravi Pratap, Adam D. Moss, Jose Kahan, Hang Kin Lau, Justin Fletcher,
|
||||||
|
Robert Iakobashvili, Bryan Henderson, Eygene Ryabinkin, Daniel Johnson,
|
||||||
|
Matt Kraai, Nick Zitzmann, Rob Jones
|
||||||
|
|
||||||
Thanks! (and sorry if I forgot to mention someone)
|
Thanks! (and sorry if I forgot to mention someone)
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
To get fixed in 7.15.5 (planned release: August 2006)
|
To be addressed before 7.16.3 (planned release: June 2007)
|
||||||
======================
|
=============================
|
||||||
|
|
||||||
66 -
|
93 -
|
||||||
|
|
||||||
|
|||||||
248
acinclude.m4
248
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
|
||||||
@@ -976,6 +976,107 @@ AC_DEFUN([CURL_CHECK_MSG_NOSIGNAL], [
|
|||||||
]) # AC_DEFUN
|
]) # AC_DEFUN
|
||||||
|
|
||||||
|
|
||||||
|
dnl CURL_CHECK_STRUCT_TIMEVAL
|
||||||
|
dnl -------------------------------------------------
|
||||||
|
dnl Check for timeval struct
|
||||||
|
|
||||||
|
AC_DEFUN([CURL_CHECK_STRUCT_TIMEVAL], [
|
||||||
|
AC_REQUIRE([AC_HEADER_TIME])dnl
|
||||||
|
AC_REQUIRE([CURL_CHECK_HEADER_WINSOCK])dnl
|
||||||
|
AC_REQUIRE([CURL_CHECK_HEADER_WINSOCK2])dnl
|
||||||
|
AC_CHECK_HEADERS(sys/types.h sys/time.h time.h)
|
||||||
|
AC_CACHE_CHECK([for struct timeval], [ac_cv_struct_timeval], [
|
||||||
|
AC_COMPILE_IFELSE([
|
||||||
|
AC_LANG_PROGRAM([
|
||||||
|
#undef inline
|
||||||
|
#ifdef HAVE_WINDOWS_H
|
||||||
|
#ifndef WIN32_LEAN_AND_MEAN
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#endif
|
||||||
|
#include <windows.h>
|
||||||
|
#ifdef HAVE_WINSOCK2_H
|
||||||
|
#include <winsock2.h>
|
||||||
|
#else
|
||||||
|
#ifdef HAVE_WINSOCK_H
|
||||||
|
#include <winsock.h>
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_SYS_TYPES_H
|
||||||
|
#include <sys/types.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
|
||||||
|
],[
|
||||||
|
struct timeval ts;
|
||||||
|
ts.tv_sec = 0;
|
||||||
|
ts.tv_usec = 0;
|
||||||
|
])
|
||||||
|
],[
|
||||||
|
ac_cv_struct_timeval="yes"
|
||||||
|
],[
|
||||||
|
ac_cv_struct_timeval="no"
|
||||||
|
])
|
||||||
|
])
|
||||||
|
case "$ac_cv_struct_timeval" in
|
||||||
|
yes)
|
||||||
|
AC_DEFINE_UNQUOTED(HAVE_STRUCT_TIMEVAL, 1,
|
||||||
|
[Define to 1 if you have the timeval struct.])
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
]) # AC_DEFUN
|
||||||
|
|
||||||
|
|
||||||
|
dnl TYPE_SIG_ATOMIC_T
|
||||||
|
dnl -------------------------------------------------
|
||||||
|
dnl Check if the sig_atomic_t type is available, and
|
||||||
|
dnl verify if it is already defined as volatile.
|
||||||
|
|
||||||
|
AC_DEFUN([TYPE_SIG_ATOMIC_T], [
|
||||||
|
AC_CHECK_HEADERS(signal.h)
|
||||||
|
AC_CHECK_TYPE([sig_atomic_t],[
|
||||||
|
AC_DEFINE(HAVE_SIG_ATOMIC_T, 1,
|
||||||
|
[Define to 1 if sig_atomic_t is an available typedef.])
|
||||||
|
], ,[
|
||||||
|
#ifdef HAVE_SIGNAL_H
|
||||||
|
#include <signal.h>
|
||||||
|
#endif
|
||||||
|
])
|
||||||
|
case "$ac_cv_type_sig_atomic_t" in
|
||||||
|
yes)
|
||||||
|
#
|
||||||
|
AC_MSG_CHECKING([if sig_atomic_t is already defined as volatile])
|
||||||
|
AC_TRY_LINK([
|
||||||
|
#ifdef HAVE_SIGNAL_H
|
||||||
|
#include <signal.h>
|
||||||
|
#endif
|
||||||
|
],[
|
||||||
|
static volatile sig_atomic_t dummy = 0;
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT([no])
|
||||||
|
ac_cv_sig_atomic_t_volatile="no"
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT([yes])
|
||||||
|
ac_cv_sig_atomic_t_volatile="yes"
|
||||||
|
])
|
||||||
|
#
|
||||||
|
if test "$ac_cv_sig_atomic_t_volatile" = "yes"; then
|
||||||
|
AC_DEFINE(HAVE_SIG_ATOMIC_T_VOLATILE, 1,
|
||||||
|
[Define to 1 if sig_atomic_t is already defined as volatile.])
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
]) # AC_DEFUN
|
||||||
|
|
||||||
|
|
||||||
dnl CURL_CHECK_NONBLOCKING_SOCKET
|
dnl CURL_CHECK_NONBLOCKING_SOCKET
|
||||||
dnl -------------------------------------------------
|
dnl -------------------------------------------------
|
||||||
dnl Check for how to set a socket to non-blocking state. There seems to exist
|
dnl Check for how to set a socket to non-blocking state. There seems to exist
|
||||||
@@ -1750,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"
|
||||||
|
|
||||||
@@ -1758,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
|
||||||
@@ -1814,3 +1920,137 @@ else
|
|||||||
AC_MSG_WARN([`missing' script is too old or missing])
|
AC_MSG_WARN([`missing' script is too old or missing])
|
||||||
fi
|
fi
|
||||||
])
|
])
|
||||||
|
|
||||||
|
|
||||||
|
dnl CURL_VERIFY_RUNTIMELIBS
|
||||||
|
dnl -------------------------------------------------
|
||||||
|
dnl Verify that the shared libs found so far can be used when running
|
||||||
|
dnl programs, since otherwise the situation will create odd configure errors
|
||||||
|
dnl that are misleading people.
|
||||||
|
dnl
|
||||||
|
dnl Make sure this test is run BEFORE the first test in the script that
|
||||||
|
dnl runs anything, which at the time of this writing is the AC_CHECK_SIZEOF
|
||||||
|
dnl macro. It must also run AFTER all lib-checking macros are complete.
|
||||||
|
|
||||||
|
AC_DEFUN([CURL_VERIFY_RUNTIMELIBS], [
|
||||||
|
|
||||||
|
dnl this test is of course not sensible if we are cross-compiling!
|
||||||
|
if test "x$cross_compiling" != xyes; then
|
||||||
|
|
||||||
|
dnl just run a program to verify that the libs checked for previous to this
|
||||||
|
dnl point also is available run-time!
|
||||||
|
AC_MSG_CHECKING([run-time libs availability])
|
||||||
|
AC_TRY_RUN([
|
||||||
|
main()
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
],
|
||||||
|
AC_MSG_RESULT([fine]),
|
||||||
|
AC_MSG_RESULT([failed])
|
||||||
|
AC_MSG_ERROR([one or more libs available at link-time are not available run-time. Libs used at link-time: $LIBS])
|
||||||
|
)
|
||||||
|
|
||||||
|
dnl if this test fails, configure has already stopped
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
|
||||||
|
|
||||||
|
dnl CURL_CHECK_VARIADIC_MACROS
|
||||||
|
dnl -------------------------------------------------
|
||||||
|
dnl Check compiler support of variadic macros
|
||||||
|
|
||||||
|
AC_DEFUN([CURL_CHECK_VARIADIC_MACROS], [
|
||||||
|
AC_CACHE_CHECK([for compiler support of C99 variadic macro style],
|
||||||
|
[curl_cv_variadic_macros_c99], [
|
||||||
|
AC_COMPILE_IFELSE([
|
||||||
|
AC_LANG_PROGRAM([
|
||||||
|
#define c99_vmacro3(first, ...) fun3(first, __VA_ARGS__)
|
||||||
|
#define c99_vmacro2(first, ...) fun2(first, __VA_ARGS__)
|
||||||
|
int fun3(int arg1, int arg2, int arg3);
|
||||||
|
int fun2(int arg1, int arg2);
|
||||||
|
int fun3(int arg1, int arg2, int arg3)
|
||||||
|
{ return arg1 + arg2 + arg3; }
|
||||||
|
int fun2(int arg1, int arg2)
|
||||||
|
{ return arg1 + arg2; }
|
||||||
|
],[
|
||||||
|
int res3 = c99_vmacro3(1, 2, 3);
|
||||||
|
int res2 = c99_vmacro2(1, 2);
|
||||||
|
])
|
||||||
|
],[
|
||||||
|
curl_cv_variadic_macros_c99="yes"
|
||||||
|
],[
|
||||||
|
curl_cv_variadic_macros_c99="no"
|
||||||
|
])
|
||||||
|
])
|
||||||
|
case "$curl_cv_variadic_macros_c99" in
|
||||||
|
yes)
|
||||||
|
AC_DEFINE_UNQUOTED(HAVE_VARIADIC_MACROS_C99, 1,
|
||||||
|
[Define to 1 if compiler supports C99 variadic macro style.])
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
AC_CACHE_CHECK([for compiler support of old gcc variadic macro style],
|
||||||
|
[curl_cv_variadic_macros_gcc], [
|
||||||
|
AC_COMPILE_IFELSE([
|
||||||
|
AC_LANG_PROGRAM([
|
||||||
|
#define gcc_vmacro3(first, args...) fun3(first, args)
|
||||||
|
#define gcc_vmacro2(first, args...) fun2(first, args)
|
||||||
|
int fun3(int arg1, int arg2, int arg3);
|
||||||
|
int fun2(int arg1, int arg2);
|
||||||
|
int fun3(int arg1, int arg2, int arg3)
|
||||||
|
{ return arg1 + arg2 + arg3; }
|
||||||
|
int fun2(int arg1, int arg2)
|
||||||
|
{ return arg1 + arg2; }
|
||||||
|
],[
|
||||||
|
int res3 = gcc_vmacro3(1, 2, 3);
|
||||||
|
int res2 = gcc_vmacro2(1, 2);
|
||||||
|
])
|
||||||
|
],[
|
||||||
|
curl_cv_variadic_macros_gcc="yes"
|
||||||
|
],[
|
||||||
|
curl_cv_variadic_macros_gcc="no"
|
||||||
|
])
|
||||||
|
])
|
||||||
|
case "$curl_cv_variadic_macros_gcc" in
|
||||||
|
yes)
|
||||||
|
AC_DEFINE_UNQUOTED(HAVE_VARIADIC_MACROS_GCC, 1,
|
||||||
|
[Define to 1 if compiler supports old gcc variadic macro style.])
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
])
|
||||||
|
|
||||||
|
|
||||||
|
dnl CURL_CHECK_NATIVE_WINDOWS
|
||||||
|
dnl -------------------------------------------------
|
||||||
|
dnl Check if building a native Windows target
|
||||||
|
|
||||||
|
AC_DEFUN([CURL_CHECK_NATIVE_WINDOWS], [
|
||||||
|
AC_REQUIRE([CURL_CHECK_HEADER_WINDOWS])dnl
|
||||||
|
AC_CACHE_CHECK([whether build target is a native Windows one], [ac_cv_native_windows], [
|
||||||
|
if test "$ac_cv_header_windows_h" = "no"; then
|
||||||
|
ac_cv_native_windows="no"
|
||||||
|
else
|
||||||
|
AC_COMPILE_IFELSE([
|
||||||
|
AC_LANG_PROGRAM([
|
||||||
|
],[
|
||||||
|
#ifdef __MINGW32__
|
||||||
|
int dummy=1;
|
||||||
|
#else
|
||||||
|
Not a native Windows build target.
|
||||||
|
#endif
|
||||||
|
])
|
||||||
|
],[
|
||||||
|
ac_cv_native_windows="yes"
|
||||||
|
],[
|
||||||
|
ac_cv_native_windows="no"
|
||||||
|
])
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
case "$ac_cv_native_windows" in
|
||||||
|
yes)
|
||||||
|
AC_DEFINE_UNQUOTED(NATIVE_WINDOWS, 1,
|
||||||
|
[Define to 1 if you are building a native Windows target.])
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
])
|
||||||
|
|
||||||
|
|||||||
@@ -14,3 +14,9 @@ Henrik Stoerner
|
|||||||
Yang Tse
|
Yang Tse
|
||||||
Nick Mathewson
|
Nick Mathewson
|
||||||
Alexander Lazic
|
Alexander Lazic
|
||||||
|
Andreas Rieke
|
||||||
|
Guilherme Balena Versiani
|
||||||
|
Brad Spencer
|
||||||
|
Ravi Pratap
|
||||||
|
William Ahern
|
||||||
|
Bram Matthys
|
||||||
|
|||||||
42
ares/CHANGES
42
ares/CHANGES
@@ -1,5 +1,47 @@
|
|||||||
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
|
||||||
|
|
||||||
|
- Install ares_dns.h too
|
||||||
|
|
||||||
|
- Michael Wallner fixed this problem: When I set domains in the options
|
||||||
|
struct, and there are domain/search entries in /etc/resolv.conf, the domains
|
||||||
|
of the options struct will be overridden.
|
||||||
|
|
||||||
|
* November 6
|
||||||
|
|
||||||
|
- Yang Tse removed a couple of potential zero size memory allocations.
|
||||||
|
|
||||||
|
- Andreas Rieke fixed the line endings in the areslib.dsp file that I (Daniel)
|
||||||
|
broke in the 1.3.2 release. We should switch to a system where that file is
|
||||||
|
auto-generated. We could rip some code for that from curl...
|
||||||
|
|
||||||
|
Version 1.3.2 (November 3, 2006)
|
||||||
|
|
||||||
|
* October 12 2006
|
||||||
|
|
||||||
|
- Prevent ares_getsock() to overflow if more than 16 sockets are used.
|
||||||
|
|
||||||
|
* September 11 2006
|
||||||
|
|
||||||
|
- Guilherme Balena Versiani: I noted a strange BUG in Win32 port
|
||||||
|
(ares_init.c/get_iphlpapi_dns_info() function): when I disable the network
|
||||||
|
by hand or disconnect the network cable in Windows 2000 or Windows XP, my
|
||||||
|
application gets 127.0.0.1 as the only name server. The problem comes from
|
||||||
|
'GetNetworkParams' function, that returns the empty string "" as the only
|
||||||
|
name server in that case. Moreover, the Windows implementation of
|
||||||
|
inet_addr() returns INADDR_LOOPBACK instead of INADDR_NONE.
|
||||||
|
|
||||||
* August 29 2006
|
* August 29 2006
|
||||||
|
|
||||||
- Brad Spencer did
|
- Brad Spencer did
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ libcares_la_SOURCES = $(CSOURCES) $(HHEADERS)
|
|||||||
# where to install the c-ares headers
|
# where to install the c-ares headers
|
||||||
libcares_ladir = $(includedir)
|
libcares_ladir = $(includedir)
|
||||||
# what headers to install on 'make install':
|
# what headers to install on 'make install':
|
||||||
libcares_la_HEADERS = ares.h ares_version.h
|
libcares_la_HEADERS = ares.h ares_version.h ares_dns.h
|
||||||
|
|
||||||
# Make files named *.dist replace the file without .dist extension
|
# Make files named *.dist replace the file without .dist extension
|
||||||
dist-hook:
|
dist-hook:
|
||||||
|
|||||||
@@ -2,39 +2,63 @@
|
|||||||
# c-ares Makefile for djgpp/gcc/Watt-32.
|
# c-ares Makefile for djgpp/gcc/Watt-32.
|
||||||
# By Gisle Vanem <giva@bgnett.no> 2004.
|
# By Gisle Vanem <giva@bgnett.no> 2004.
|
||||||
#
|
#
|
||||||
.SUFFIXES: .exe
|
# $Id$
|
||||||
|
|
||||||
|
TOPDIR = ..
|
||||||
|
|
||||||
|
include ../packages/DOS/common.dj
|
||||||
|
|
||||||
include Makefile.inc
|
include Makefile.inc
|
||||||
|
|
||||||
WATT32_ROOT = $(subst \,/,$(WATT_ROOT))
|
CFLAGS += -DWATT32 -DHAVE_AF_INET6 -DHAVE_PF_INET6 -DHAVE_FIONBIO \
|
||||||
|
-DHAVE_STRUCT_IN6_ADDR -DHAVE_SOCKADDR_IN6_SIN6_SCOPE_ID \
|
||||||
CC = gcc
|
-DHAVE_SYS_TIME_H -DHAVE_STRUCT_SOCKADDR_IN6 -DHAVE_STRUCT_ADDRINFO \
|
||||||
CFLAGS = -O2 -Wall -DWATT32 -Dselect=select_s -DHAVE_AF_INET6 \
|
-DHAVE_SIGNAL_H -DHAVE_SIG_ATOMIC_T -DRETSIGTYPE='void' -DHAVE_PROCESS_H \
|
||||||
-DHAVE_PF_INET6 -DHAVE_IOCTLSOCKET -DHAVE_STRUCT_IN6_ADDR \
|
-DHAVE_ARPA_NAMESER_H -DNS_INADDRSZ=4 -DHAVE_RECV -DHAVE_SEND \
|
||||||
-DHAVE_STRUCT_SOCKADDR_IN6 -DHAVE_STRUCT_ADDRINFO \
|
-DSEND_TYPE_ARG1='int' -DSEND_QUAL_ARG2='const' \
|
||||||
-DHAVE_ARPA_NAMESER_H -DNS_INADDRSZ=4 \
|
-DSEND_TYPE_ARG2='void*' -DSEND_TYPE_ARG3='int' \
|
||||||
-DHAVE_SOCKADDR_IN6_SIN6_SCOPE_ID -I$(WATT32_ROOT)/inc
|
-DSEND_TYPE_ARG4='int' -DSEND_TYPE_RETV='int' \
|
||||||
|
-DRECV_TYPE_ARG1='int' -DRECV_TYPE_ARG2='void*' \
|
||||||
|
-DRECV_TYPE_ARG3='int' -DRECV_TYPE_ARG4='int' \
|
||||||
|
-DRECV_TYPE_RETV='int' -DHAVE_STRUCT_TIMEVAL \
|
||||||
|
-UHAVE_CONFIG_H
|
||||||
|
|
||||||
LDFLAGS = -s
|
LDFLAGS = -s
|
||||||
EX_LIBS = $(WATT32_ROOT)/lib/libwatt.a
|
|
||||||
|
|
||||||
OBJ_DIR = djgpp
|
ifeq ($(USE_DEBUG),1)
|
||||||
|
EX_LIBS = ../lib/libcurl.a
|
||||||
|
OBJ_HACK = $(OBJECTS)
|
||||||
|
else
|
||||||
|
OBJ_HACK = libcares.a
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(USE_SSL),1)
|
||||||
|
EX_LIBS += $(OPENSSL_ROOT)/lib/libssl.a $(OPENSSL_ROOT)/lib/libcrypt.a
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(USE_ZLIB),1)
|
||||||
|
EX_LIBS += $(ZLIB_ROOT)/libz.a
|
||||||
|
CFLAGS += -DUSE_MANUAL
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(USE_IDNA),1)
|
||||||
|
EX_LIBS += $(LIBIDN_ROOT)/lib/dj_obj/libidn.a -liconv
|
||||||
|
endif
|
||||||
|
|
||||||
|
EX_LIBS += $(WATT32_ROOT)/lib/libwatt.a
|
||||||
|
|
||||||
OBJECTS = $(addprefix $(OBJ_DIR)/, $(CSOURCES:.c=.o))
|
OBJECTS = $(addprefix $(OBJ_DIR)/, $(CSOURCES:.c=.o))
|
||||||
|
|
||||||
all: $(OBJ_DIR) libcares.a ahost.exe adig.exe
|
all: $(OBJ_DIR) libcares.a ahost.exe adig.exe
|
||||||
@echo Welcome to c-ares.
|
@echo Welcome to c-ares.
|
||||||
|
|
||||||
$(OBJ_DIR):
|
|
||||||
- mkdir $(OBJ_DIR)
|
|
||||||
|
|
||||||
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:
|
||||||
@@ -44,12 +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)
|
||||||
|
|
||||||
$(OBJ_DIR)/%.o: %.c
|
|
||||||
$(CC) $(CFLAGS) -o $@ -c $<
|
|
||||||
@echo
|
|
||||||
|
|
||||||
depend:
|
|
||||||
$(CC) -MM $(CFLAGS) $(CSOURCES) | \
|
|
||||||
sed -e 's/^\([a-zA-Z0-9_-]*\.o:\)/$$(OBJ_DIR)\/\1/' > depend.dj
|
|
||||||
|
|
||||||
-include depend.dj
|
-include depend.dj
|
||||||
|
|
||||||
|
|||||||
@@ -5,17 +5,18 @@ ares_gethostbyname.c ares_strerror.c ares_cancel.c ares_init.c \
|
|||||||
ares_timeout.c ares_destroy.c ares_mkquery.c ares_version.c \
|
ares_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,9 +19,9 @@ 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 - 2006, 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
|
||||||
MTSAFE = YES
|
MTSAFE = YES
|
||||||
STACK = 64000
|
STACK = 64000
|
||||||
@@ -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) >> $@
|
||||||
@@ -281,6 +287,8 @@ config.h: Makefile.netware
|
|||||||
@echo $(DL)#define HAVE_SEND 1$(DL) >> $@
|
@echo $(DL)#define HAVE_SEND 1$(DL) >> $@
|
||||||
@echo $(DL)#define HAVE_SETJMP_H 1$(DL) >> $@
|
@echo $(DL)#define HAVE_SETJMP_H 1$(DL) >> $@
|
||||||
@echo $(DL)#define HAVE_SIGNAL 1$(DL) >> $@
|
@echo $(DL)#define HAVE_SIGNAL 1$(DL) >> $@
|
||||||
|
@echo $(DL)#define HAVE_SIGNAL_H 1$(DL) >> $@
|
||||||
|
@echo $(DL)#define HAVE_SIG_ATOMIC_T 1$(DL) >> $@
|
||||||
@echo $(DL)#define HAVE_SOCKET 1$(DL) >> $@
|
@echo $(DL)#define HAVE_SOCKET 1$(DL) >> $@
|
||||||
@echo $(DL)#define HAVE_STDINT_H 1$(DL) >> $@
|
@echo $(DL)#define HAVE_STDINT_H 1$(DL) >> $@
|
||||||
@echo $(DL)#define HAVE_STDLIB_H 1$(DL) >> $@
|
@echo $(DL)#define HAVE_STDLIB_H 1$(DL) >> $@
|
||||||
@@ -316,9 +324,10 @@ config.h: Makefile.netware
|
|||||||
@echo $(DL)#define TIME_WITH_SYS_TIME 1$(DL) >> $@
|
@echo $(DL)#define TIME_WITH_SYS_TIME 1$(DL) >> $@
|
||||||
@echo $(DL)#define HAVE_AF_INET6 1$(DL) >> $@
|
@echo $(DL)#define HAVE_AF_INET6 1$(DL) >> $@
|
||||||
@echo $(DL)#define HAVE_PF_INET6 1$(DL) >> $@
|
@echo $(DL)#define HAVE_PF_INET6 1$(DL) >> $@
|
||||||
|
@echo $(DL)#define HAVE_STRUCT_ADDRINFO 1$(DL) >> $@
|
||||||
@echo $(DL)#define HAVE_STRUCT_IN6_ADDR 1$(DL) >> $@
|
@echo $(DL)#define HAVE_STRUCT_IN6_ADDR 1$(DL) >> $@
|
||||||
@echo $(DL)#define HAVE_STRUCT_SOCKADDR_IN6 1$(DL) >> $@
|
@echo $(DL)#define HAVE_STRUCT_SOCKADDR_IN6 1$(DL) >> $@
|
||||||
@echo $(DL)#define HAVE_STRUCT_ADDRINFO 1$(DL) >> $@
|
@echo $(DL)#define HAVE_STRUCT_TIMEVAL 1$(DL) >> $@
|
||||||
@echo $(DL)#define SIZEOF_STRUCT_IN6_ADDR 16$(DL) >> $@
|
@echo $(DL)#define SIZEOF_STRUCT_IN6_ADDR 16$(DL) >> $@
|
||||||
@echo $(DL)#define SIZEOF_STRUCT_IN_ADDR 4$(DL) >> $@
|
@echo $(DL)#define SIZEOF_STRUCT_IN_ADDR 4$(DL) >> $@
|
||||||
ifdef NW_WINSOCK
|
ifdef NW_WINSOCK
|
||||||
@@ -329,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 >> $@
|
||||||
@@ -121,8 +124,8 @@ $(DEF_FILE): $(OBJECTS) Makefile.VC6
|
|||||||
@echo ares_gettimeofday >> $@
|
@echo ares_gettimeofday >> $@
|
||||||
@echo ares_parse_aaaa_reply >> $@
|
@echo ares_parse_aaaa_reply >> $@
|
||||||
|
|
||||||
ahost.exe: $(OBJ_DIR) $(OBJ_DIR)\ahost.obj cares_imp.lib
|
ahost.exe: $(OBJ_DIR) $(OBJ_DIR)\ahost.obj $(OBJ_DIR)\getopt.obj cares_imp.lib
|
||||||
link $(LDFLAGS) -out:$@ $(OBJ_DIR)\ahost.obj cares_imp.lib $(EX_LIBS)
|
link $(LDFLAGS) -out:$@ $(OBJ_DIR)\ahost.obj $(OBJ_DIR)\getopt.obj cares_imp.lib $(EX_LIBS)
|
||||||
|
|
||||||
adig.exe: $(OBJ_DIR) $(OBJ_DIR)\adig.obj $(OBJ_DIR)\getopt.obj cares_imp.lib
|
adig.exe: $(OBJ_DIR) $(OBJ_DIR)\adig.obj $(OBJ_DIR)\getopt.obj cares_imp.lib
|
||||||
link $(LDFLAGS) -out:$@ $(OBJ_DIR)\adig.obj $(OBJ_DIR)\getopt.obj cares_imp.lib $(EX_LIBS)
|
link $(LDFLAGS) -out:$@ $(OBJ_DIR)\adig.obj $(OBJ_DIR)\getopt.obj cares_imp.lib $(EX_LIBS)
|
||||||
@@ -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
|
||||||
@@ -954,6 +954,107 @@ AC_DEFUN([CURL_CHECK_MSG_NOSIGNAL], [
|
|||||||
]) # AC_DEFUN
|
]) # AC_DEFUN
|
||||||
|
|
||||||
|
|
||||||
|
dnl CURL_CHECK_STRUCT_TIMEVAL
|
||||||
|
dnl -------------------------------------------------
|
||||||
|
dnl Check for timeval struct
|
||||||
|
|
||||||
|
AC_DEFUN([CURL_CHECK_STRUCT_TIMEVAL], [
|
||||||
|
AC_REQUIRE([AC_HEADER_TIME])dnl
|
||||||
|
AC_REQUIRE([CURL_CHECK_HEADER_WINSOCK])dnl
|
||||||
|
AC_REQUIRE([CURL_CHECK_HEADER_WINSOCK2])dnl
|
||||||
|
AC_CHECK_HEADERS(sys/types.h sys/time.h time.h)
|
||||||
|
AC_CACHE_CHECK([for struct timeval], [ac_cv_struct_timeval], [
|
||||||
|
AC_COMPILE_IFELSE([
|
||||||
|
AC_LANG_PROGRAM([
|
||||||
|
#undef inline
|
||||||
|
#ifdef HAVE_WINDOWS_H
|
||||||
|
#ifndef WIN32_LEAN_AND_MEAN
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#endif
|
||||||
|
#include <windows.h>
|
||||||
|
#ifdef HAVE_WINSOCK2_H
|
||||||
|
#include <winsock2.h>
|
||||||
|
#else
|
||||||
|
#ifdef HAVE_WINSOCK_H
|
||||||
|
#include <winsock.h>
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_SYS_TYPES_H
|
||||||
|
#include <sys/types.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
|
||||||
|
],[
|
||||||
|
struct timeval ts;
|
||||||
|
ts.tv_sec = 0;
|
||||||
|
ts.tv_usec = 0;
|
||||||
|
])
|
||||||
|
],[
|
||||||
|
ac_cv_struct_timeval="yes"
|
||||||
|
],[
|
||||||
|
ac_cv_struct_timeval="no"
|
||||||
|
])
|
||||||
|
])
|
||||||
|
case "$ac_cv_struct_timeval" in
|
||||||
|
yes)
|
||||||
|
AC_DEFINE_UNQUOTED(HAVE_STRUCT_TIMEVAL, 1,
|
||||||
|
[Define to 1 if you have the timeval struct.])
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
]) # AC_DEFUN
|
||||||
|
|
||||||
|
|
||||||
|
dnl TYPE_SIG_ATOMIC_T
|
||||||
|
dnl -------------------------------------------------
|
||||||
|
dnl Check if the sig_atomic_t type is available, and
|
||||||
|
dnl verify if it is already defined as volatile.
|
||||||
|
|
||||||
|
AC_DEFUN([TYPE_SIG_ATOMIC_T], [
|
||||||
|
AC_CHECK_HEADERS(signal.h)
|
||||||
|
AC_CHECK_TYPE([sig_atomic_t],[
|
||||||
|
AC_DEFINE(HAVE_SIG_ATOMIC_T, 1,
|
||||||
|
[Define to 1 if sig_atomic_t is an available typedef.])
|
||||||
|
], ,[
|
||||||
|
#ifdef HAVE_SIGNAL_H
|
||||||
|
#include <signal.h>
|
||||||
|
#endif
|
||||||
|
])
|
||||||
|
case "$ac_cv_type_sig_atomic_t" in
|
||||||
|
yes)
|
||||||
|
#
|
||||||
|
AC_MSG_CHECKING([if sig_atomic_t is already defined as volatile])
|
||||||
|
AC_TRY_LINK([
|
||||||
|
#ifdef HAVE_SIGNAL_H
|
||||||
|
#include <signal.h>
|
||||||
|
#endif
|
||||||
|
],[
|
||||||
|
static volatile sig_atomic_t dummy = 0;
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT([no])
|
||||||
|
ac_cv_sig_atomic_t_volatile="no"
|
||||||
|
],[
|
||||||
|
AC_MSG_RESULT([yes])
|
||||||
|
ac_cv_sig_atomic_t_volatile="yes"
|
||||||
|
])
|
||||||
|
#
|
||||||
|
if test "$ac_cv_sig_atomic_t_volatile" = "yes"; then
|
||||||
|
AC_DEFINE(HAVE_SIG_ATOMIC_T_VOLATILE, 1,
|
||||||
|
[Define to 1 if sig_atomic_t is already defined as volatile.])
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
]) # AC_DEFUN
|
||||||
|
|
||||||
|
|
||||||
dnl CURL_CHECK_NONBLOCKING_SOCKET
|
dnl CURL_CHECK_NONBLOCKING_SOCKET
|
||||||
dnl -------------------------------------------------
|
dnl -------------------------------------------------
|
||||||
dnl Check for how to set a socket to non-blocking state. There seems to exist
|
dnl Check for how to set a socket to non-blocking state. There seems to exist
|
||||||
@@ -1096,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()
|
||||||
@@ -1215,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.
|
||||||
@@ -1231,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!
|
||||||
@@ -1241,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"
|
||||||
;;
|
;;
|
||||||
@@ -1303,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
|
||||||
@@ -1415,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
|
|
||||||
])]
|
|
||||||
)
|
|
||||||
|
|||||||
41
ares/adig.c
41
ares/adig.c
@@ -1,4 +1,6 @@
|
|||||||
/* Copyright 1998 by the Massachusetts Institute of Technology.
|
/* Copyright 1998 by the Massachusetts Institute of Technology.
|
||||||
|
*
|
||||||
|
* $Id$
|
||||||
*
|
*
|
||||||
* Permission to use, copy, modify, and distribute this
|
* Permission to use, copy, modify, and distribute this
|
||||||
* software and its documentation for any purpose and without
|
* software and its documentation for any purpose and without
|
||||||
@@ -14,17 +16,20 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "setup.h"
|
#include "setup.h"
|
||||||
#include <sys/types.h>
|
|
||||||
|
|
||||||
#ifdef WIN32
|
#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
|
||||||
@@ -45,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 */
|
||||||
@@ -153,8 +154,8 @@ int main(int argc, char **argv)
|
|||||||
fd_set read_fds, write_fds;
|
fd_set read_fds, write_fds;
|
||||||
struct timeval *tvp, tv;
|
struct timeval *tvp, tv;
|
||||||
|
|
||||||
#ifdef WIN32
|
#ifdef USE_WINSOCK
|
||||||
WORD wVersionRequested = MAKEWORD(1,1);
|
WORD wVersionRequested = MAKEWORD(USE_WINSOCK,USE_WINSOCK);
|
||||||
WSADATA wsaData;
|
WSADATA wsaData;
|
||||||
WSAStartup(wVersionRequested, &wsaData);
|
WSAStartup(wVersionRequested, &wsaData);
|
||||||
#endif
|
#endif
|
||||||
@@ -162,10 +163,16 @@ int main(int argc, char **argv)
|
|||||||
options.flags = ARES_FLAG_NOCHECKRESP;
|
options.flags = ARES_FLAG_NOCHECKRESP;
|
||||||
options.servers = NULL;
|
options.servers = NULL;
|
||||||
options.nservers = 0;
|
options.nservers = 0;
|
||||||
while ((c = getopt(argc, argv, "f:s:c:t:T:U:")) != -1)
|
while ((c = getopt(argc, argv, "df:s:c:t:T:U:")) != -1)
|
||||||
{
|
{
|
||||||
switch (c)
|
switch (c)
|
||||||
{
|
{
|
||||||
|
case 'd':
|
||||||
|
#ifdef WATT32
|
||||||
|
dbug_init();
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
|
||||||
case 'f':
|
case 'f':
|
||||||
/* Add a flag. */
|
/* Add a flag. */
|
||||||
for (i = 0; i < nflags; i++)
|
for (i = 0; i < nflags; i++)
|
||||||
@@ -225,7 +232,7 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
case 'T':
|
case 'T':
|
||||||
/* Set the TCP port number. */
|
/* Set the TCP port number. */
|
||||||
if (!isdigit((unsigned char)*optarg))
|
if (!ISDIGIT(*optarg))
|
||||||
usage();
|
usage();
|
||||||
options.tcp_port = (unsigned short)strtol(optarg, NULL, 0);
|
options.tcp_port = (unsigned short)strtol(optarg, NULL, 0);
|
||||||
optmask |= ARES_OPT_TCP_PORT;
|
optmask |= ARES_OPT_TCP_PORT;
|
||||||
@@ -233,7 +240,7 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
case 'U':
|
case 'U':
|
||||||
/* Set the UDP port number. */
|
/* Set the UDP port number. */
|
||||||
if (!isdigit((unsigned char)*optarg))
|
if (!ISDIGIT(*optarg))
|
||||||
usage();
|
usage();
|
||||||
options.udp_port = (unsigned short)strtol(optarg, NULL, 0);
|
options.udp_port = (unsigned short)strtol(optarg, NULL, 0);
|
||||||
optmask |= ARES_OPT_UDP_PORT;
|
optmask |= ARES_OPT_UDP_PORT;
|
||||||
@@ -277,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;
|
||||||
@@ -286,6 +293,11 @@ int main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
ares_destroy(channel);
|
ares_destroy(channel);
|
||||||
|
|
||||||
|
#ifdef USE_WINSOCK
|
||||||
|
WSACleanup();
|
||||||
|
#endif
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -543,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:
|
||||||
|
|||||||
29
ares/ahost.c
29
ares/ahost.c
@@ -16,17 +16,19 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "setup.h"
|
#include "setup.h"
|
||||||
#include <sys/types.h>
|
|
||||||
|
|
||||||
#ifdef WIN32
|
#if !defined(WIN32) || defined(WATT32)
|
||||||
#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 <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>
|
||||||
@@ -41,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
|
||||||
@@ -64,16 +67,21 @@ int main(int argc, char **argv)
|
|||||||
struct in_addr addr4;
|
struct in_addr addr4;
|
||||||
struct in6_addr addr6;
|
struct in6_addr addr6;
|
||||||
|
|
||||||
#ifdef WIN32
|
#ifdef USE_WINSOCK
|
||||||
WORD wVersionRequested = MAKEWORD(1,1);
|
WORD wVersionRequested = MAKEWORD(USE_WINSOCK,USE_WINSOCK);
|
||||||
WSADATA wsaData;
|
WSADATA wsaData;
|
||||||
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;
|
||||||
@@ -134,6 +142,11 @@ int main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
ares_destroy(channel);
|
ares_destroy(channel);
|
||||||
|
|
||||||
|
#ifdef USE_WINSOCK
|
||||||
|
WSACleanup();
|
||||||
|
#endif
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -31,7 +31,7 @@
|
|||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#include <tcp.h>
|
#include <tcp.h>
|
||||||
#elif defined(WIN32) && !defined(__CYGWIN__)
|
#elif defined(WIN32)
|
||||||
#include <winsock2.h>
|
#include <winsock2.h>
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#else
|
#else
|
||||||
@@ -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>
|
||||||
@@ -54,7 +53,7 @@ int ares__get_hostent(FILE *fp, int family, struct hostent **host)
|
|||||||
|
|
||||||
/* Get the address part. */
|
/* Get the address part. */
|
||||||
p = line;
|
p = line;
|
||||||
while (*p && !isspace((unsigned char)*p))
|
while (*p && !ISSPACE(*p))
|
||||||
p++;
|
p++;
|
||||||
if (!*p)
|
if (!*p)
|
||||||
continue;
|
continue;
|
||||||
@@ -76,12 +75,12 @@ int ares__get_hostent(FILE *fp, int family, struct hostent **host)
|
|||||||
|
|
||||||
/* Get the canonical hostname. */
|
/* Get the canonical hostname. */
|
||||||
p++;
|
p++;
|
||||||
while (isspace((unsigned char)*p))
|
while (ISSPACE(*p))
|
||||||
p++;
|
p++;
|
||||||
if (!*p)
|
if (!*p)
|
||||||
continue;
|
continue;
|
||||||
q = p;
|
q = p;
|
||||||
while (*q && !isspace((unsigned char)*q))
|
while (*q && !ISSPACE(*q))
|
||||||
q++;
|
q++;
|
||||||
end_at_hostname = (*q == 0);
|
end_at_hostname = (*q == 0);
|
||||||
*q = 0;
|
*q = 0;
|
||||||
@@ -92,13 +91,13 @@ int ares__get_hostent(FILE *fp, int family, struct hostent **host)
|
|||||||
{
|
{
|
||||||
/* Count the aliases. */
|
/* Count the aliases. */
|
||||||
p = q + 1;
|
p = q + 1;
|
||||||
while (isspace((unsigned char)*p))
|
while (ISSPACE(*p))
|
||||||
p++;
|
p++;
|
||||||
while (*p)
|
while (*p)
|
||||||
{
|
{
|
||||||
while (*p && !isspace((unsigned char)*p))
|
while (*p && !ISSPACE(*p))
|
||||||
p++;
|
p++;
|
||||||
while (isspace((unsigned char)*p))
|
while (ISSPACE(*p))
|
||||||
p++;
|
p++;
|
||||||
naliases++;
|
naliases++;
|
||||||
}
|
}
|
||||||
@@ -128,12 +127,12 @@ int ares__get_hostent(FILE *fp, int family, struct hostent **host)
|
|||||||
if (!end_at_hostname)
|
if (!end_at_hostname)
|
||||||
{
|
{
|
||||||
p = canonical + strlen(canonical) + 1;
|
p = canonical + strlen(canonical) + 1;
|
||||||
while (isspace((unsigned char)*p))
|
while (ISSPACE(*p))
|
||||||
p++;
|
p++;
|
||||||
while (*p)
|
while (*p)
|
||||||
{
|
{
|
||||||
q = p;
|
q = p;
|
||||||
while (*q && !isspace((unsigned char)*q))
|
while (*q && !ISSPACE(*q))
|
||||||
q++;
|
q++;
|
||||||
hostent->h_aliases[naliases] = malloc(q - p + 1);
|
hostent->h_aliases[naliases] = malloc(q - p + 1);
|
||||||
if (hostent->h_aliases[naliases] == NULL)
|
if (hostent->h_aliases[naliases] == NULL)
|
||||||
@@ -141,7 +140,7 @@ int ares__get_hostent(FILE *fp, int family, struct hostent **host)
|
|||||||
memcpy(hostent->h_aliases[naliases], p, q - p);
|
memcpy(hostent->h_aliases[naliases], p, q - p);
|
||||||
hostent->h_aliases[naliases][q - p] = 0;
|
hostent->h_aliases[naliases][q - p] = 0;
|
||||||
p = q;
|
p = q;
|
||||||
while (isspace((unsigned char)*p))
|
while (ISSPACE(*p))
|
||||||
p++;
|
p++;
|
||||||
naliases++;
|
naliases++;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -39,7 +39,10 @@ void ares_cancel(ares_channel channel)
|
|||||||
channel->queries = NULL;
|
channel->queries = NULL;
|
||||||
if (!(channel->flags & ARES_FLAG_STAYOPEN))
|
if (!(channel->flags & ARES_FLAG_STAYOPEN))
|
||||||
{
|
{
|
||||||
for (i = 0; i < channel->nservers; i++)
|
if (channel->servers)
|
||||||
ares__close_sockets(channel, &channel->servers[i]);
|
{
|
||||||
|
for (i = 0; i < channel->nservers; i++)
|
||||||
|
ares__close_sockets(channel, &channel->servers[i]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,23 +25,37 @@ void ares_destroy(ares_channel channel)
|
|||||||
int i;
|
int i;
|
||||||
struct query *query;
|
struct query *query;
|
||||||
|
|
||||||
for (i = 0; i < channel->nservers; i++)
|
if (!channel)
|
||||||
ares__close_sockets(channel, &channel->servers[i]);
|
return;
|
||||||
free(channel->servers);
|
|
||||||
for (i = 0; i < channel->ndomains; i++)
|
if (channel->servers) {
|
||||||
free(channel->domains[i]);
|
for (i = 0; i < channel->nservers; i++)
|
||||||
free(channel->domains);
|
ares__close_sockets(channel, &channel->servers[i]);
|
||||||
|
free(channel->servers);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (channel->domains) {
|
||||||
|
for (i = 0; i < channel->ndomains; i++)
|
||||||
|
free(channel->domains[i]);
|
||||||
|
free(channel->domains);
|
||||||
|
}
|
||||||
|
|
||||||
if(channel->sortlist)
|
if(channel->sortlist)
|
||||||
free(channel->sortlist);
|
free(channel->sortlist);
|
||||||
free(channel->lookups);
|
|
||||||
while (channel->queries)
|
if (channel->lookups)
|
||||||
{
|
free(channel->lookups);
|
||||||
query = channel->queries;
|
|
||||||
channel->queries = query->next;
|
while (channel->queries) {
|
||||||
query->callback(query->arg, ARES_EDESTRUCTION, NULL, 0);
|
query = channel->queries;
|
||||||
|
channel->queries = query->next;
|
||||||
|
query->callback(query->arg, ARES_EDESTRUCTION, NULL, 0);
|
||||||
|
if (query->tcpbuf)
|
||||||
free(query->tcpbuf);
|
free(query->tcpbuf);
|
||||||
|
if (query->skip_server)
|
||||||
free(query->skip_server);
|
free(query->skip_server);
|
||||||
free(query);
|
free(query);
|
||||||
}
|
}
|
||||||
|
|
||||||
free(channel);
|
free(channel);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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"
|
||||||
@@ -81,8 +79,8 @@ static char *ares_striendstr(const char *s1, const char *s2);
|
|||||||
void ares_getnameinfo(ares_channel channel, const struct sockaddr *sa, socklen_t salen,
|
void ares_getnameinfo(ares_channel channel, const struct sockaddr *sa, socklen_t salen,
|
||||||
int flags, ares_nameinfo_callback callback, void *arg)
|
int flags, ares_nameinfo_callback callback, void *arg)
|
||||||
{
|
{
|
||||||
struct sockaddr_in *addr;
|
struct sockaddr_in *addr = NULL;
|
||||||
struct sockaddr_in6 *addr6;
|
struct sockaddr_in6 *addr6 = NULL;
|
||||||
struct nameinfo_query *niquery;
|
struct nameinfo_query *niquery;
|
||||||
|
|
||||||
/* Verify the buffer size */
|
/* Verify the buffer size */
|
||||||
@@ -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 */
|
||||||
@@ -264,11 +265,11 @@ static char *lookup_service(unsigned short port, int flags,
|
|||||||
char tmpbuf[4096];
|
char tmpbuf[4096];
|
||||||
|
|
||||||
if (port)
|
if (port)
|
||||||
{
|
{
|
||||||
if (flags & ARES_NI_NUMERICSERV)
|
if (flags & ARES_NI_NUMERICSERV)
|
||||||
sep = NULL;
|
sep = NULL;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (flags & ARES_NI_UDP)
|
if (flags & ARES_NI_UDP)
|
||||||
proto = "udp";
|
proto = "udp";
|
||||||
else if (flags & ARES_NI_SCTP)
|
else if (flags & ARES_NI_SCTP)
|
||||||
@@ -288,21 +289,21 @@ static char *lookup_service(unsigned short port, int flags,
|
|||||||
#elif GETSERVBYPORT_R_ARGS == 4
|
#elif GETSERVBYPORT_R_ARGS == 4
|
||||||
if (getservbyport_r(port, proto, &se, (void *)tmpbuf) != 0)
|
if (getservbyport_r(port, proto, &se, (void *)tmpbuf) != 0)
|
||||||
sep = NULL;
|
sep = NULL;
|
||||||
#else
|
#else
|
||||||
/* Lets just hope the OS uses TLS! */
|
/* Lets just hope the OS uses TLS! */
|
||||||
sep = getservbyport(port, proto);
|
sep = getservbyport(port, proto);
|
||||||
#endif
|
#endif
|
||||||
#else
|
#else
|
||||||
/* Lets just hope the OS uses TLS! */
|
/* Lets just hope the OS uses TLS! */
|
||||||
sep = getservbyport(port, proto);
|
sep = getservbyport(port, proto);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
if (sep && sep->s_name)
|
if (sep && sep->s_name)
|
||||||
/* get service name */
|
/* get service name */
|
||||||
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 2005 by 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>
|
||||||
@@ -39,7 +38,9 @@ int ares_getsock(ares_channel channel,
|
|||||||
if (!channel->queries)
|
if (!channel->queries)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
for (i = 0; i < channel->nservers; i++)
|
for (i = 0;
|
||||||
|
(i < channel->nservers) && (sockindex < ARES_GETSOCK_MAXNUM);
|
||||||
|
i++)
|
||||||
{
|
{
|
||||||
server = &channel->servers[i];
|
server = &channel->servers[i];
|
||||||
if (server->udp_socket != ARES_SOCKET_BAD)
|
if (server->udp_socket != ARES_SOCKET_BAD)
|
||||||
@@ -56,13 +57,12 @@ int ares_getsock(ares_channel channel,
|
|||||||
break;
|
break;
|
||||||
socks[sockindex] = server->tcp_socket;
|
socks[sockindex] = server->tcp_socket;
|
||||||
bitmap |= ARES_GETSOCK_READABLE(setbits, sockindex);
|
bitmap |= ARES_GETSOCK_READABLE(setbits, sockindex);
|
||||||
sockindex++;
|
|
||||||
|
|
||||||
if (server->qhead) {
|
if (server->qhead)
|
||||||
/* then the tcp socket is also writable! */
|
/* then the tcp socket is also writable! */
|
||||||
bitmap |= ARES_GETSOCK_WRITABLE(setbits, sockindex-1);
|
bitmap |= ARES_GETSOCK_WRITABLE(setbits, sockindex);
|
||||||
}
|
|
||||||
|
|
||||||
|
sockindex++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return bitmap;
|
return bitmap;
|
||||||
|
|||||||
251
ares/ares_init.c
251
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.
|
||||||
@@ -125,22 +130,42 @@ int ares_init_options(ares_channel *channelptr, struct ares_options *options,
|
|||||||
channel->queries = NULL;
|
channel->queries = NULL;
|
||||||
channel->domains = NULL;
|
channel->domains = NULL;
|
||||||
channel->sortlist = NULL;
|
channel->sortlist = NULL;
|
||||||
|
channel->servers = NULL;
|
||||||
channel->sock_state_cb = NULL;
|
channel->sock_state_cb = NULL;
|
||||||
|
channel->sock_state_cb_data = NULL;
|
||||||
|
|
||||||
/* 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. */
|
||||||
if (channel->nservers != -1)
|
if (channel->servers)
|
||||||
free(channel->servers);
|
free(channel->servers);
|
||||||
if (channel->domains)
|
if (channel->domains)
|
||||||
{
|
{
|
||||||
@@ -179,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;
|
||||||
|
|
||||||
@@ -214,12 +239,16 @@ static int init_by_options(ares_channel channel, struct ares_options *options,
|
|||||||
/* Copy the servers, if given. */
|
/* Copy the servers, if given. */
|
||||||
if ((optmask & ARES_OPT_SERVERS) && channel->nservers == -1)
|
if ((optmask & ARES_OPT_SERVERS) && channel->nservers == -1)
|
||||||
{
|
{
|
||||||
channel->servers =
|
/* Avoid zero size allocations at any cost */
|
||||||
malloc(options->nservers * sizeof(struct server_state));
|
if (options->nservers > 0)
|
||||||
if (!channel->servers && options->nservers != 0)
|
{
|
||||||
return ARES_ENOMEM;
|
channel->servers =
|
||||||
for (i = 0; i < options->nservers; i++)
|
malloc(options->nservers * sizeof(struct server_state));
|
||||||
channel->servers[i].addr = options->servers[i];
|
if (!channel->servers)
|
||||||
|
return ARES_ENOMEM;
|
||||||
|
for (i = 0; i < options->nservers; i++)
|
||||||
|
channel->servers[i].addr = options->servers[i];
|
||||||
|
}
|
||||||
channel->nservers = options->nservers;
|
channel->nservers = options->nservers;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -228,16 +257,20 @@ static int init_by_options(ares_channel channel, struct ares_options *options,
|
|||||||
*/
|
*/
|
||||||
if ((optmask & ARES_OPT_DOMAINS) && channel->ndomains == -1)
|
if ((optmask & ARES_OPT_DOMAINS) && channel->ndomains == -1)
|
||||||
{
|
{
|
||||||
channel->domains = malloc(options->ndomains * sizeof(char *));
|
/* Avoid zero size allocations at any cost */
|
||||||
if (!channel->domains && options->ndomains != 0)
|
if (options->ndomains > 0)
|
||||||
return ARES_ENOMEM;
|
{
|
||||||
for (i = 0; i < options->ndomains; i++)
|
channel->domains = malloc(options->ndomains * sizeof(char *));
|
||||||
{
|
if (!channel->domains)
|
||||||
channel->ndomains = i;
|
return ARES_ENOMEM;
|
||||||
channel->domains[i] = strdup(options->domains[i]);
|
for (i = 0; i < options->ndomains; i++)
|
||||||
if (!channel->domains[i])
|
{
|
||||||
return ARES_ENOMEM;
|
channel->ndomains = i;
|
||||||
}
|
channel->domains[i] = strdup(options->domains[i]);
|
||||||
|
if (!channel->domains[i])
|
||||||
|
return ARES_ENOMEM;
|
||||||
|
}
|
||||||
|
}
|
||||||
channel->ndomains = options->ndomains;
|
channel->ndomains = options->ndomains;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -373,7 +406,8 @@ static int get_iphlpapi_dns_info (char *ret_buf, size_t ret_size)
|
|||||||
printf ("DNS Servers:\n"
|
printf ("DNS Servers:\n"
|
||||||
" %s (primary)\n", fi->DnsServerList.IpAddress.String);
|
" %s (primary)\n", fi->DnsServerList.IpAddress.String);
|
||||||
}
|
}
|
||||||
if (inet_addr(fi->DnsServerList.IpAddress.String) != INADDR_NONE &&
|
if (strlen(fi->DnsServerList.IpAddress.String) > 0 &&
|
||||||
|
inet_addr(fi->DnsServerList.IpAddress.String) != INADDR_NONE &&
|
||||||
left > ip_size)
|
left > ip_size)
|
||||||
{
|
{
|
||||||
ret += sprintf (ret, "%s,", fi->DnsServerList.IpAddress.String);
|
ret += sprintf (ret, "%s,", fi->DnsServerList.IpAddress.String);
|
||||||
@@ -539,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;
|
||||||
@@ -575,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")))
|
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")))
|
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) {
|
||||||
@@ -611,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) {
|
||||||
@@ -624,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) {
|
||||||
@@ -637,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)
|
||||||
@@ -710,7 +801,6 @@ static int init_by_defaults(ares_channel channel)
|
|||||||
if (gethostname(hostname, sizeof(hostname)) == -1
|
if (gethostname(hostname, sizeof(hostname)) == -1
|
||||||
|| !strchr(hostname, '.'))
|
|| !strchr(hostname, '.'))
|
||||||
{
|
{
|
||||||
channel->domains = malloc(0);
|
|
||||||
channel->ndomains = 0;
|
channel->ndomains = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -749,9 +839,9 @@ static int config_domain(ares_channel channel, char *str)
|
|||||||
|
|
||||||
/* Set a single search domain. */
|
/* Set a single search domain. */
|
||||||
q = str;
|
q = str;
|
||||||
while (*q && !isspace((unsigned char)*q))
|
while (*q && !ISSPACE(*q))
|
||||||
q++;
|
q++;
|
||||||
*q = 0;
|
*q = '\0';
|
||||||
return set_search(channel, str);
|
return set_search(channel, str);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -773,12 +863,12 @@ static int config_lookup(ares_channel channel, const char *str,
|
|||||||
if (*p == *bindch) *l++ = 'b';
|
if (*p == *bindch) *l++ = 'b';
|
||||||
else *l++ = 'f';
|
else *l++ = 'f';
|
||||||
}
|
}
|
||||||
while (*p && !isspace((unsigned char)*p) && (*p != ','))
|
while (*p && !ISSPACE(*p) && (*p != ','))
|
||||||
p++;
|
p++;
|
||||||
while (*p && (isspace((unsigned char)*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;
|
||||||
}
|
}
|
||||||
@@ -800,12 +890,12 @@ static int config_nameserver(struct server_state **servers, int *nservers,
|
|||||||
while (more)
|
while (more)
|
||||||
{
|
{
|
||||||
more = 0;
|
more = 0;
|
||||||
while (*p && !isspace(*p) && *p != ',')
|
while (*p && !ISSPACE(*p) && *p != ',')
|
||||||
p++;
|
p++;
|
||||||
|
|
||||||
if (*p)
|
if (*p)
|
||||||
{
|
{
|
||||||
*p = 0;
|
*p = '\0';
|
||||||
more = 1;
|
more = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -860,22 +950,22 @@ static int config_sortlist(struct apattern **sortlist, int *nsort,
|
|||||||
char ipbuf[16], ipbufpfx[32];
|
char ipbuf[16], ipbufpfx[32];
|
||||||
/* Find just the IP */
|
/* Find just the IP */
|
||||||
q = str;
|
q = str;
|
||||||
while (*q && *q != '/' && *q != ';' && !isspace((unsigned char)*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 == '/')
|
||||||
{
|
{
|
||||||
const char *str2 = q+1;
|
const char *str2 = q+1;
|
||||||
while (*q && *q != ';' && !isspace((unsigned char)*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,
|
||||||
@@ -883,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;
|
||||||
@@ -893,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;
|
||||||
@@ -904,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);
|
||||||
}
|
}
|
||||||
@@ -917,11 +1007,11 @@ static int config_sortlist(struct apattern **sortlist, int *nsort,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
while (*q && *q != ';' && !isspace((unsigned char)*q))
|
while (*q && *q != ';' && !ISSPACE(*q))
|
||||||
q++;
|
q++;
|
||||||
}
|
}
|
||||||
str = q;
|
str = q;
|
||||||
while (isspace((unsigned char)*str))
|
while (ISSPACE(*str))
|
||||||
str++;
|
str++;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -939,6 +1029,7 @@ static int set_search(ares_channel channel, const char *str)
|
|||||||
for(n=0; n < channel->ndomains; n++)
|
for(n=0; n < channel->ndomains; n++)
|
||||||
free(channel->domains[n]);
|
free(channel->domains[n]);
|
||||||
free(channel->domains);
|
free(channel->domains);
|
||||||
|
channel->domains = NULL;
|
||||||
channel->ndomains = -1;
|
channel->ndomains = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -947,15 +1038,21 @@ static int set_search(ares_channel channel, const char *str)
|
|||||||
p = str;
|
p = str;
|
||||||
while (*p)
|
while (*p)
|
||||||
{
|
{
|
||||||
while (*p && !isspace((unsigned char)*p))
|
while (*p && !ISSPACE(*p))
|
||||||
p++;
|
p++;
|
||||||
while (isspace((unsigned char)*p))
|
while (ISSPACE(*p))
|
||||||
p++;
|
p++;
|
||||||
n++;
|
n++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!n)
|
||||||
|
{
|
||||||
|
channel->ndomains = 0;
|
||||||
|
return ARES_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
channel->domains = malloc(n * sizeof(char *));
|
channel->domains = malloc(n * sizeof(char *));
|
||||||
if (!channel->domains && n)
|
if (!channel->domains)
|
||||||
return ARES_ENOMEM;
|
return ARES_ENOMEM;
|
||||||
|
|
||||||
/* Now copy the domains. */
|
/* Now copy the domains. */
|
||||||
@@ -965,7 +1062,7 @@ static int set_search(ares_channel channel, const char *str)
|
|||||||
{
|
{
|
||||||
channel->ndomains = n;
|
channel->ndomains = n;
|
||||||
q = p;
|
q = p;
|
||||||
while (*q && !isspace((unsigned char)*q))
|
while (*q && !ISSPACE(*q))
|
||||||
q++;
|
q++;
|
||||||
channel->domains[n] = malloc(q - p + 1);
|
channel->domains[n] = malloc(q - p + 1);
|
||||||
if (!channel->domains[n])
|
if (!channel->domains[n])
|
||||||
@@ -973,7 +1070,7 @@ static int set_search(ares_channel channel, const char *str)
|
|||||||
memcpy(channel->domains[n], p, q - p);
|
memcpy(channel->domains[n], p, q - p);
|
||||||
channel->domains[n][q - p] = 0;
|
channel->domains[n][q - p] = 0;
|
||||||
p = q;
|
p = q;
|
||||||
while (isspace((unsigned char)*p))
|
while (ISSPACE(*p))
|
||||||
p++;
|
p++;
|
||||||
n++;
|
n++;
|
||||||
}
|
}
|
||||||
@@ -990,7 +1087,7 @@ static int set_options(ares_channel channel, const char *str)
|
|||||||
while (*p)
|
while (*p)
|
||||||
{
|
{
|
||||||
q = p;
|
q = p;
|
||||||
while (*q && !isspace((unsigned char)*q))
|
while (*q && !ISSPACE(*q))
|
||||||
q++;
|
q++;
|
||||||
val = try_option(p, q, "ndots:");
|
val = try_option(p, q, "ndots:");
|
||||||
if (val && channel->ndots == -1)
|
if (val && channel->ndots == -1)
|
||||||
@@ -1002,7 +1099,7 @@ static int set_options(ares_channel channel, const char *str)
|
|||||||
if (val && channel->tries == -1)
|
if (val && channel->tries == -1)
|
||||||
channel->tries = atoi(val);
|
channel->tries = atoi(val);
|
||||||
p = q;
|
p = q;
|
||||||
while (isspace((unsigned char)*p))
|
while (ISSPACE(*p))
|
||||||
p++;
|
p++;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1015,10 +1112,10 @@ static char *try_config(char *s, const char *opt)
|
|||||||
size_t len;
|
size_t len;
|
||||||
|
|
||||||
len = strlen(opt);
|
len = strlen(opt);
|
||||||
if (strncmp(s, opt, len) != 0 || !isspace((unsigned char)s[len]))
|
if (strncmp(s, opt, len) != 0 || !ISSPACE(s[len]))
|
||||||
return NULL;
|
return NULL;
|
||||||
s += len;
|
s += len;
|
||||||
while (isspace((unsigned char)*s))
|
while (ISSPACE(*s))
|
||||||
s++;
|
s++;
|
||||||
return s;
|
return 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"
|
||||||
@@ -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
|
|
||||||
|
|
||||||
#if (defined(WIN32) || defined(WATT32)) && !defined(MSDOS)
|
|
||||||
#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
|
||||||
*
|
*
|
||||||
@@ -160,11 +149,11 @@ static void write_tcp_data(ares_channel channel, fd_set *write_fds, time_t now)
|
|||||||
vec[n].iov_len = sendreq->len;
|
vec[n].iov_len = sendreq->len;
|
||||||
n++;
|
n++;
|
||||||
}
|
}
|
||||||
wcount = (ssize_t)writev(server->tcp_socket, vec, n);
|
wcount = (ssize_t)writev(server->tcp_socket, vec, (int)n);
|
||||||
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.
|
||||||
@@ -239,15 +241,15 @@ static int single_domain(ares_channel channel, const char *name, char **s)
|
|||||||
== ARES_SUCCESS)
|
== ARES_SUCCESS)
|
||||||
{
|
{
|
||||||
if (strncasecmp(line, name, len) != 0 ||
|
if (strncasecmp(line, name, len) != 0 ||
|
||||||
!isspace((unsigned char)line[len]))
|
!ISSPACE(line[len]))
|
||||||
continue;
|
continue;
|
||||||
p = line + len;
|
p = line + len;
|
||||||
while (isspace((unsigned char)*p))
|
while (ISSPACE(*p))
|
||||||
p++;
|
p++;
|
||||||
if (*p)
|
if (*p)
|
||||||
{
|
{
|
||||||
q = p + 1;
|
q = p + 1;
|
||||||
while (*q && !isspace((unsigned char)*q))
|
while (*q && !ISSPACE(*q))
|
||||||
q++;
|
q++;
|
||||||
*s = malloc(q - p + 1);
|
*s = malloc(q - p + 1);
|
||||||
if (*s)
|
if (*s)
|
||||||
@@ -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>
|
||||||
|
|||||||
@@ -5,11 +5,11 @@
|
|||||||
|
|
||||||
#define ARES_VERSION_MAJOR 1
|
#define ARES_VERSION_MAJOR 1
|
||||||
#define ARES_VERSION_MINOR 3
|
#define ARES_VERSION_MINOR 3
|
||||||
#define ARES_VERSION_PATCH 1
|
#define ARES_VERSION_PATCH 3
|
||||||
#define ARES_VERSION ((ARES_VERSION_MAJOR<<16)|\
|
#define ARES_VERSION ((ARES_VERSION_MAJOR<<16)|\
|
||||||
(ARES_VERSION_MINOR<<8)|\
|
(ARES_VERSION_MINOR<<8)|\
|
||||||
(ARES_VERSION_PATCH))
|
(ARES_VERSION_PATCH))
|
||||||
#define ARES_VERSION_STR "1.3.1"
|
#define ARES_VERSION_STR "1.3.3-CVS"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
/* $Id$ */
|
/* $Id$ */
|
||||||
|
|
||||||
/* Copyright (C) 2004 - 2005 by Daniel Stenberg et al
|
/* Copyright (C) 2004 - 2006 by Daniel Stenberg et al
|
||||||
*
|
*
|
||||||
* 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
|
||||||
@@ -17,7 +17,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/* ================================================================ */
|
/* ================================================================ */
|
||||||
/* ares/config-win32.h - Hand crafted config file for windows */
|
/* ares/config-win32.h - Hand crafted config file for Windows */
|
||||||
/* ================================================================ */
|
/* ================================================================ */
|
||||||
|
|
||||||
/* ---------------------------------------------------------------- */
|
/* ---------------------------------------------------------------- */
|
||||||
@@ -29,6 +29,18 @@
|
|||||||
#define HAVE_GETOPT_H 1
|
#define HAVE_GETOPT_H 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Define if you have the <signal.h> header file. */
|
||||||
|
#define HAVE_SIGNAL_H 1
|
||||||
|
|
||||||
|
/* Define if you have the <sys/time.h> header file */
|
||||||
|
/* #define HAVE_SYS_TIME_H 1 */
|
||||||
|
|
||||||
|
/* Define if you have the <time.h> header file. */
|
||||||
|
#define HAVE_TIME_H 1
|
||||||
|
|
||||||
|
/* Define if you have the <process.h> header file. */
|
||||||
|
#define HAVE_PROCESS_H 1
|
||||||
|
|
||||||
/* Define if you have the <unistd.h> header file. */
|
/* 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__)
|
||||||
@@ -47,6 +59,19 @@
|
|||||||
/* Define if you have the <ws2tcpip.h> header file. */
|
/* Define if you have the <ws2tcpip.h> header file. */
|
||||||
#define HAVE_WS2TCPIP_H 1
|
#define HAVE_WS2TCPIP_H 1
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------- */
|
||||||
|
/* OTHER HEADER INFO */
|
||||||
|
/* ---------------------------------------------------------------- */
|
||||||
|
|
||||||
|
/* Define if sig_atomic_t is an available typedef. */
|
||||||
|
#define HAVE_SIG_ATOMIC_T 1
|
||||||
|
|
||||||
|
/* Define if you have the ANSI C header files. */
|
||||||
|
#define STDC_HEADERS 1
|
||||||
|
|
||||||
|
/* Define if you can safely include both <sys/time.h> and <time.h>. */
|
||||||
|
/* #define TIME_WITH_SYS_TIME 1 */
|
||||||
|
|
||||||
/* ---------------------------------------------------------------- */
|
/* ---------------------------------------------------------------- */
|
||||||
/* FUNCTIONS */
|
/* FUNCTIONS */
|
||||||
/* ---------------------------------------------------------------- */
|
/* ---------------------------------------------------------------- */
|
||||||
@@ -54,24 +79,6 @@
|
|||||||
/* Define if you have the ioctlsocket function. */
|
/* Define if you have the ioctlsocket function. */
|
||||||
#define HAVE_IOCTLSOCKET 1
|
#define HAVE_IOCTLSOCKET 1
|
||||||
|
|
||||||
/* Define if you have the getnameinfo function. */
|
|
||||||
#define HAVE_GETNAMEINFO 1
|
|
||||||
|
|
||||||
/* Define to the type qualifier of arg 1 for getnameinfo. */
|
|
||||||
#define GETNAMEINFO_QUAL_ARG1 const
|
|
||||||
|
|
||||||
/* Define to the type of arg 1 for getnameinfo. */
|
|
||||||
#define GETNAMEINFO_TYPE_ARG1 struct sockaddr *
|
|
||||||
|
|
||||||
/* Define to the type of arg 2 for getnameinfo. */
|
|
||||||
#define GETNAMEINFO_TYPE_ARG2 socklen_t
|
|
||||||
|
|
||||||
/* Define to the type of args 4 and 6 for getnameinfo. */
|
|
||||||
#define GETNAMEINFO_TYPE_ARG46 DWORD
|
|
||||||
|
|
||||||
/* Define to the type of arg 7 for getnameinfo. */
|
|
||||||
#define GETNAMEINFO_TYPE_ARG7 int
|
|
||||||
|
|
||||||
/* Define if you have the recv function. */
|
/* Define if you have the recv function. */
|
||||||
#define HAVE_RECV 1
|
#define HAVE_RECV 1
|
||||||
|
|
||||||
@@ -111,6 +118,39 @@
|
|||||||
/* Define to the function return type for send. */
|
/* Define to the function return type for send. */
|
||||||
#define SEND_TYPE_RETV int
|
#define SEND_TYPE_RETV int
|
||||||
|
|
||||||
|
/* Specifics for the Watt-32 tcp/ip stack */
|
||||||
|
#ifdef WATT32
|
||||||
|
#define SOCKET int
|
||||||
|
#define NS_INADDRSZ 4
|
||||||
|
#define HAVE_ARPA_NAMESER_H 1
|
||||||
|
#undef HAVE_WINSOCK_H
|
||||||
|
#undef HAVE_WINSOCK2_H
|
||||||
|
#undef HAVE_WS2TCPIP_H
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------- */
|
||||||
|
/* TYPEDEF REPLACEMENTS */
|
||||||
|
/* ---------------------------------------------------------------- */
|
||||||
|
|
||||||
|
/* Define this if in_addr_t is not an available 'typedefed' type */
|
||||||
|
#define in_addr_t unsigned long
|
||||||
|
|
||||||
|
/* Define as the return type of signal handlers (int or void). */
|
||||||
|
#define RETSIGTYPE void
|
||||||
|
|
||||||
|
/* Define ssize_t if it is not an available 'typedefed' type */
|
||||||
|
#if (defined(__WATCOMC__) && (__WATCOMC__ >= 1240)) || defined(__POCC__)
|
||||||
|
#elif defined(_WIN64)
|
||||||
|
#define ssize_t __int64
|
||||||
|
#else
|
||||||
|
#define ssize_t int
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Define to 'int' if socklen_t is not an available 'typedefed' type */
|
||||||
|
#ifndef HAVE_WS2TCPIP_H
|
||||||
|
#define socklen_t int
|
||||||
|
#endif
|
||||||
|
|
||||||
/* ---------------------------------------------------------------- */
|
/* ---------------------------------------------------------------- */
|
||||||
/* STRUCT RELATED */
|
/* STRUCT RELATED */
|
||||||
/* ---------------------------------------------------------------- */
|
/* ---------------------------------------------------------------- */
|
||||||
@@ -121,6 +161,9 @@
|
|||||||
/* Define this if you have struct sockaddr_storage */
|
/* Define this if you have struct sockaddr_storage */
|
||||||
#define HAVE_STRUCT_SOCKADDR_STORAGE 1
|
#define HAVE_STRUCT_SOCKADDR_STORAGE 1
|
||||||
|
|
||||||
|
/* Define this if you have struct timeval */
|
||||||
|
#define HAVE_STRUCT_TIMEVAL 1
|
||||||
|
|
||||||
/* ---------------------------------------------------------------- */
|
/* ---------------------------------------------------------------- */
|
||||||
/* IPV6 COMPATIBILITY */
|
/* IPV6 COMPATIBILITY */
|
||||||
/* ---------------------------------------------------------------- */
|
/* ---------------------------------------------------------------- */
|
||||||
|
|||||||
@@ -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,
|
||||||
@@ -265,6 +378,7 @@ dnl Checks for typedefs, structures, and compiler characteristics.
|
|||||||
AC_C_CONST
|
AC_C_CONST
|
||||||
AC_TYPE_SIZE_T
|
AC_TYPE_SIZE_T
|
||||||
AC_HEADER_TIME
|
AC_HEADER_TIME
|
||||||
|
CURL_CHECK_STRUCT_TIMEVAL
|
||||||
|
|
||||||
AC_CHECK_SIZEOF(size_t)
|
AC_CHECK_SIZEOF(size_t)
|
||||||
AC_CHECK_SIZEOF(long)
|
AC_CHECK_SIZEOF(long)
|
||||||
@@ -289,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
|
||||||
|
|
||||||
@@ -296,6 +423,10 @@ TYPE_IN_ADDR_T
|
|||||||
|
|
||||||
TYPE_SOCKADDR_STORAGE
|
TYPE_SOCKADDR_STORAGE
|
||||||
|
|
||||||
|
TYPE_SIG_ATOMIC_T
|
||||||
|
|
||||||
|
AC_TYPE_SIGNAL
|
||||||
|
|
||||||
CURL_CHECK_FUNC_RECV
|
CURL_CHECK_FUNC_RECV
|
||||||
|
|
||||||
CURL_CHECK_FUNC_SEND
|
CURL_CHECK_FUNC_SEND
|
||||||
|
|||||||
@@ -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
|
||||||
*/
|
*/
|
||||||
@@ -79,15 +81,14 @@ inet_net_pton_ipv4(const char *src, unsigned char *dst, size_t size)
|
|||||||
|
|
||||||
ch = *src++;
|
ch = *src++;
|
||||||
if (ch == '0' && (src[0] == 'x' || src[0] == 'X')
|
if (ch == '0' && (src[0] == 'x' || src[0] == 'X')
|
||||||
&& isascii((unsigned char)(src[1]))
|
&& ISXDIGIT(src[1])) {
|
||||||
&& isxdigit((unsigned char)(src[1]))) {
|
|
||||||
/* Hexadecimal: Eat nybble string. */
|
/* Hexadecimal: Eat nybble string. */
|
||||||
if (size <= 0U)
|
if (size <= 0U)
|
||||||
goto emsgsize;
|
goto emsgsize;
|
||||||
dirty = 0;
|
dirty = 0;
|
||||||
src++; /* skip x or X. */
|
src++; /* skip x or X. */
|
||||||
while ((ch = *src++) != '\0' && isascii(ch) && 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)
|
||||||
@@ -106,7 +107,7 @@ inet_net_pton_ipv4(const char *src, unsigned char *dst, size_t size)
|
|||||||
goto emsgsize;
|
goto emsgsize;
|
||||||
*dst++ = (unsigned char) (tmp << 4);
|
*dst++ = (unsigned char) (tmp << 4);
|
||||||
}
|
}
|
||||||
} else if (isascii(ch) && isdigit(ch)) {
|
} else if (ISDIGIT(ch)) {
|
||||||
/* Decimal: eat dotted digit string. */
|
/* Decimal: eat dotted digit string. */
|
||||||
for (;;) {
|
for (;;) {
|
||||||
tmp = 0;
|
tmp = 0;
|
||||||
@@ -117,7 +118,7 @@ inet_net_pton_ipv4(const char *src, unsigned char *dst, size_t size)
|
|||||||
if (tmp > 255)
|
if (tmp > 255)
|
||||||
goto enoent;
|
goto enoent;
|
||||||
} while ((ch = *src++) != '\0' &&
|
} while ((ch = *src++) != '\0' &&
|
||||||
isascii(ch) && isdigit(ch));
|
ISDIGIT(ch));
|
||||||
if (size-- <= 0U)
|
if (size-- <= 0U)
|
||||||
goto emsgsize;
|
goto emsgsize;
|
||||||
*dst++ = (unsigned char) tmp;
|
*dst++ = (unsigned char) tmp;
|
||||||
@@ -126,15 +127,15 @@ inet_net_pton_ipv4(const char *src, unsigned char *dst, size_t size)
|
|||||||
if (ch != '.')
|
if (ch != '.')
|
||||||
goto enoent;
|
goto enoent;
|
||||||
ch = *src++;
|
ch = *src++;
|
||||||
if (!isascii(ch) || !isdigit(ch))
|
if (!ISDIGIT(ch))
|
||||||
goto enoent;
|
goto enoent;
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
goto enoent;
|
goto enoent;
|
||||||
|
|
||||||
bits = -1;
|
bits = -1;
|
||||||
if (ch == '/' && isascii((unsigned char)(src[0])) &&
|
if (ch == '/' &&
|
||||||
isdigit((unsigned char)(src[0])) && dst > odst) {
|
ISDIGIT(src[0]) && dst > odst) {
|
||||||
/* CIDR width specifier. Nothing can follow it. */
|
/* CIDR width specifier. Nothing can follow it. */
|
||||||
ch = *src++; /* Skip over the /. */
|
ch = *src++; /* Skip over the /. */
|
||||||
bits = 0;
|
bits = 0;
|
||||||
@@ -142,7 +143,7 @@ inet_net_pton_ipv4(const char *src, unsigned char *dst, size_t size)
|
|||||||
n = (int)(strchr(digits, ch) - digits);
|
n = (int)(strchr(digits, ch) - digits);
|
||||||
bits *= 10;
|
bits *= 10;
|
||||||
bits += n;
|
bits += n;
|
||||||
} while ((ch = *src++) != '\0' && isascii(ch) && isdigit(ch));
|
} while ((ch = *src++) != '\0' && ISDIGIT(ch));
|
||||||
if (ch != '\0')
|
if (ch != '\0')
|
||||||
goto enoent;
|
goto enoent;
|
||||||
if (bits > 32)
|
if (bits > 32)
|
||||||
@@ -187,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);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -253,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;
|
||||||
@@ -266,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);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -322,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;
|
||||||
@@ -343,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;
|
||||||
@@ -382,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);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -400,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
|
||||||
*/
|
*/
|
||||||
@@ -412,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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -430,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)
|
||||||
|
|||||||
20
ares/setup.h
20
ares/setup.h
@@ -69,6 +69,22 @@
|
|||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Define USE_WINSOCK to 2 if we have and use WINSOCK2 API, else
|
||||||
|
* define USE_WINSOCK to 1 if we have and use WINSOCK API, else
|
||||||
|
* undefine USE_WINSOCK.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#undef USE_WINSOCK
|
||||||
|
|
||||||
|
#ifdef HAVE_WINSOCK2_H
|
||||||
|
# define USE_WINSOCK 2
|
||||||
|
#else
|
||||||
|
# ifdef HAVE_WINSOCK_H
|
||||||
|
# define USE_WINSOCK 1
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Work-arounds for systems without configure support
|
* Work-arounds for systems without configure support
|
||||||
*/
|
*/
|
||||||
@@ -105,7 +121,7 @@
|
|||||||
* Typedef our socket type
|
* Typedef our socket type
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#if defined(WIN32) && !defined(WATT32)
|
#ifdef USE_WINSOCK
|
||||||
typedef SOCKET ares_socket_t;
|
typedef SOCKET ares_socket_t;
|
||||||
#define ARES_SOCKET_BAD INVALID_SOCKET
|
#define ARES_SOCKET_BAD INVALID_SOCKET
|
||||||
#else
|
#else
|
||||||
@@ -117,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
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
/* $Id$ */
|
/* $Id$ */
|
||||||
|
|
||||||
/* Copyright (C) 2004 - 2006 by Daniel Stenberg et al
|
/* Copyright (C) 2004 - 2007 by Daniel Stenberg et al
|
||||||
*
|
*
|
||||||
* 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
|
||||||
@@ -17,9 +17,71 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/********************************************************************
|
||||||
|
* NOTICE *
|
||||||
|
* ======== *
|
||||||
|
* *
|
||||||
|
* Content of header files lib/setup_once.h and ares/setup_once.h *
|
||||||
|
* must be kept in sync. Modify the other one if you change this. *
|
||||||
|
* *
|
||||||
|
********************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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 send() and recv()
|
* it as the fourth argument of function send()
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef HAVE_MSG_NOSIGNAL
|
#ifdef HAVE_MSG_NOSIGNAL
|
||||||
@@ -64,12 +126,9 @@
|
|||||||
#define sread(x,y,z) (ssize_t)recv((RECV_TYPE_ARG1)(x), \
|
#define sread(x,y,z) (ssize_t)recv((RECV_TYPE_ARG1)(x), \
|
||||||
(RECV_TYPE_ARG2)(y), \
|
(RECV_TYPE_ARG2)(y), \
|
||||||
(RECV_TYPE_ARG3)(z), \
|
(RECV_TYPE_ARG3)(z), \
|
||||||
(RECV_TYPE_ARG4)(SEND_4TH_ARG))
|
(RECV_TYPE_ARG4)(0))
|
||||||
#endif
|
#endif
|
||||||
#else /* HAVE_RECV */
|
#else /* HAVE_RECV */
|
||||||
#ifdef DJGPP
|
|
||||||
#define sread(x,y,z) (ssize_t)read_s((int)(x), (char *)(y), (int)(z))
|
|
||||||
#endif
|
|
||||||
#ifndef sread
|
#ifndef sread
|
||||||
/* */
|
/* */
|
||||||
Error Missing_definition_of_macro_sread
|
Error Missing_definition_of_macro_sread
|
||||||
@@ -94,9 +153,6 @@
|
|||||||
(SEND_TYPE_ARG4)(SEND_4TH_ARG))
|
(SEND_TYPE_ARG4)(SEND_4TH_ARG))
|
||||||
#endif
|
#endif
|
||||||
#else /* HAVE_SEND */
|
#else /* HAVE_SEND */
|
||||||
#ifdef DJGPP
|
|
||||||
#define swrite(x,y,z) (ssize_t)write_s((int)(x), (char *)(y), (int)(z))
|
|
||||||
#endif
|
|
||||||
#ifndef swrite
|
#ifndef swrite
|
||||||
/* */
|
/* */
|
||||||
Error Missing_definition_of_macro_swrite
|
Error Missing_definition_of_macro_swrite
|
||||||
@@ -105,5 +161,181 @@
|
|||||||
#endif /* HAVE_SEND */
|
#endif /* HAVE_SEND */
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Uppercase macro versions of ANSI/ISO is*() functions/macros which
|
||||||
|
* avoid negative number inputs with argument byte codes > 127.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define ISSPACE(x) (isspace((int) ((unsigned char)x)))
|
||||||
|
#define ISDIGIT(x) (isdigit((int) ((unsigned char)x)))
|
||||||
|
#define ISALNUM(x) (isalnum((int) ((unsigned char)x)))
|
||||||
|
#define ISXDIGIT(x) (isxdigit((int) ((unsigned char)x)))
|
||||||
|
#define ISGRAPH(x) (isgraph((int) ((unsigned char)x)))
|
||||||
|
#define ISALPHA(x) (isalpha((int) ((unsigned char)x)))
|
||||||
|
#define ISPRINT(x) (isprint((int) ((unsigned char)x)))
|
||||||
|
#define ISUPPER(x) (isupper((int) ((unsigned char)x)))
|
||||||
|
#define ISLOWER(x) (islower((int) ((unsigned char)x)))
|
||||||
|
|
||||||
|
#define ISBLANK(x) (int)((((unsigned char)x) == ' ') || \
|
||||||
|
(((unsigned char)x) == '\t'))
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Typedef to 'unsigned char' if bool is not an available 'typedefed' type.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef HAVE_BOOL_T
|
||||||
|
typedef unsigned char bool;
|
||||||
|
#define HAVE_BOOL_T
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Default definition of uppercase TRUE and FALSE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef TRUE
|
||||||
|
#define TRUE 1
|
||||||
|
#endif
|
||||||
|
#ifndef FALSE
|
||||||
|
#define FALSE 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Typedef to 'int' if sig_atomic_t is not an available 'typedefed' type.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef HAVE_SIG_ATOMIC_T
|
||||||
|
typedef int sig_atomic_t;
|
||||||
|
#define HAVE_SIG_ATOMIC_T
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Convenience SIG_ATOMIC_T definition
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_SIG_ATOMIC_T_VOLATILE
|
||||||
|
#define SIG_ATOMIC_T static sig_atomic_t
|
||||||
|
#else
|
||||||
|
#define SIG_ATOMIC_T static volatile sig_atomic_t
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Default return type for signal handlers.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef RETSIGTYPE
|
||||||
|
#define RETSIGTYPE void
|
||||||
|
#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 */
|
||||||
|
|
||||||
|
|||||||
@@ -129,6 +129,10 @@ SOURCE=..\..\ares_gethostbyname.c
|
|||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=..\..\ares_getsock.c
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
SOURCE=..\..\ares_init.c
|
SOURCE=..\..\ares_init.c
|
||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
# | (__| |_| | _ <| |___
|
# | (__| |_| | _ <| |___
|
||||||
# \___|\___/|_| \_\_____|
|
# \___|\___/|_| \_\_____|
|
||||||
#
|
#
|
||||||
# Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al.
|
# Copyright (C) 1998 - 2006, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
#
|
#
|
||||||
# This software is licensed as described in the file COPYING, which
|
# 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
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ REM $Date$
|
|||||||
|
|
||||||
REM create ca-bundle.h
|
REM create ca-bundle.h
|
||||||
echo /* This file is generated automatically */ >lib\ca-bundle.h
|
echo /* This file is generated automatically */ >lib\ca-bundle.h
|
||||||
echo #define CURL_CA_BUNDLE getenv("CURL_CA_BUNDLE") >>lib\ca-bundle.h
|
|
||||||
|
|
||||||
REM create hugehelp.c
|
REM create hugehelp.c
|
||||||
copy src\hugehelp.c.cvs src\hugehelp.c
|
copy src\hugehelp.c.cvs src\hugehelp.c
|
||||||
|
|||||||
464
configure.ac
464
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
|
||||||
@@ -28,7 +28,7 @@ dnl We don't know the version number "staticly" so we use a dash here
|
|||||||
AC_INIT(curl, [-], [a suitable curl mailing list => http://curl.haxx.se/mail/])
|
AC_INIT(curl, [-], [a suitable curl mailing list => http://curl.haxx.se/mail/])
|
||||||
|
|
||||||
dnl configure script copyright
|
dnl configure script copyright
|
||||||
AC_COPYRIGHT([Copyright (c) 1998 - 2005 Daniel Stenberg, <daniel@haxx.se>
|
AC_COPYRIGHT([Copyright (c) 1998 - 2006 Daniel Stenberg, <daniel@haxx.se>
|
||||||
This configure script may be copied, distributed and modified under the
|
This configure script may be copied, distributed and modified under the
|
||||||
terms of the curl license; see COPYING for more details])
|
terms of the curl license; see COPYING for more details])
|
||||||
|
|
||||||
@@ -78,6 +78,7 @@ AC_SUBST(PKGADD_VENDOR)
|
|||||||
dnl
|
dnl
|
||||||
dnl initialize all the info variables
|
dnl initialize all the info variables
|
||||||
curl_ssl_msg="no (--with-ssl / --with-gnutls)"
|
curl_ssl_msg="no (--with-ssl / --with-gnutls)"
|
||||||
|
curl_ssh_msg="no (--with-libssh2)"
|
||||||
curl_zlib_msg="no (--with-zlib)"
|
curl_zlib_msg="no (--with-zlib)"
|
||||||
curl_krb4_msg="no (--with-krb4*)"
|
curl_krb4_msg="no (--with-krb4*)"
|
||||||
curl_gss_msg="no (--with-gssapi)"
|
curl_gss_msg="no (--with-gssapi)"
|
||||||
@@ -89,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
|
||||||
@@ -106,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
|
||||||
|
|
||||||
@@ -157,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
|
||||||
@@ -417,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)
|
||||||
@@ -434,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 **********************************************************************
|
||||||
@@ -747,7 +794,7 @@ AC_ARG_WITH(gssapi-includes,
|
|||||||
AC_ARG_WITH(gssapi-libs,
|
AC_ARG_WITH(gssapi-libs,
|
||||||
AC_HELP_STRING([--with-gssapi-libs=DIR],
|
AC_HELP_STRING([--with-gssapi-libs=DIR],
|
||||||
[Specify location of GSSAPI libs]),
|
[Specify location of GSSAPI libs]),
|
||||||
[ GSSAPI_LIBS="-L$withval"
|
[ GSSAPI_LIB_DIR="-L$withval"
|
||||||
want_gss="yes" ]
|
want_gss="yes" ]
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -1021,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
|
||||||
@@ -1043,6 +1113,152 @@ 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 Check for the presence of LIBSSH2 libraries and headers
|
||||||
|
dnl **********************************************************************
|
||||||
|
|
||||||
|
dnl Default to compiler & linker defaults for LIBSSH2 files & libraries.
|
||||||
|
OPT_LIBSSH2=off
|
||||||
|
AC_ARG_WITH(libssh2,dnl
|
||||||
|
AC_HELP_STRING([--with-libssh2=PATH],[Where to look for libssh2, PATH points to the LIBSSH2 installation (default: /usr/local/lib); when possible, set the PKG_CONFIG_PATH environment variable instead of using this option])
|
||||||
|
AC_HELP_STRING([--without-libssh2], [disable LIBSSH2]),
|
||||||
|
OPT_LIBSSH2=$withval)
|
||||||
|
|
||||||
|
if test X"$OPT_LIBSSH2" != Xno; then
|
||||||
|
dnl backup the pre-libssh2 variables
|
||||||
|
CLEANLDFLAGS="$LDFLAGS"
|
||||||
|
CLEANCPPFLAGS="$CPPFLAGS"
|
||||||
|
CLEANLIBS="$LIBS"
|
||||||
|
|
||||||
|
case "$OPT_LIBSSH2" in
|
||||||
|
yes)
|
||||||
|
dnl --with-libssh2 (without path) used
|
||||||
|
PREFIX_LIBSSH2=/usr/local/lib
|
||||||
|
LIB_LIBSSH2="$PREFIX_LIBSSH2/lib$libsuff"
|
||||||
|
;;
|
||||||
|
off)
|
||||||
|
dnl no --with-libssh2 option given, just check default places
|
||||||
|
PREFIX_LIBSSH2=
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
dnl use the given --with-libssh2 spot
|
||||||
|
PREFIX_LIBSSH2=$OPT_LIBSSH2
|
||||||
|
LIB_LIBSSH2="$PREFIX_LIBSSH2/lib$libsuff"
|
||||||
|
LDFLAGS="$LDFLAGS -L$LIB_LIBSSH2"
|
||||||
|
CPPFLAGS="$CPPFLAGS -I$PREFIX_LIBSSH2/include"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
AC_CHECK_LIB(ssh2, libssh2_channel_open_ex)
|
||||||
|
|
||||||
|
AC_CHECK_HEADERS(libssh2.h,
|
||||||
|
curl_ssh_msg="enabled (libSSH2)"
|
||||||
|
LIBSSH2_ENABLED=1
|
||||||
|
AC_DEFINE(USE_LIBSSH2, 1, [if libSSH2 is in use]))
|
||||||
|
|
||||||
|
if test X"$OPT_LIBSSH2" != Xoff &&
|
||||||
|
test "$LIBSSH2_ENABLED" != "1"; then
|
||||||
|
AC_MSG_ERROR([libSSH2 libs and/or directories were not found where specified!])
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test "$LIBSSH2_ENABLED" = "1"; then
|
||||||
|
if test -n "$LIB_LIBSSH2"; then
|
||||||
|
dnl when the libssh2 shared libs were found in a path that the run-time
|
||||||
|
dnl linker doesn't search through, we need to add it to LD_LIBRARY_PATH
|
||||||
|
dnl to prevent further configure tests to fail due to this
|
||||||
|
|
||||||
|
LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$LIB_LIBSSH2"
|
||||||
|
export LD_LIBRARY_PATH
|
||||||
|
AC_MSG_NOTICE([Added $LIB_LIBSSH2 to LD_LIBRARY_PATH])
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
dnl **********************************************************************
|
dnl **********************************************************************
|
||||||
dnl Check for the random seed preferences
|
dnl Check for the random seed preferences
|
||||||
dnl **********************************************************************
|
dnl **********************************************************************
|
||||||
@@ -1121,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)"
|
||||||
],
|
],
|
||||||
@@ -1146,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 **********************************************************************
|
||||||
@@ -1182,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])
|
||||||
@@ -1397,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"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@@ -1413,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.
|
||||||
|
|
||||||
@@ -1496,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,
|
||||||
@@ -1525,8 +1736,11 @@ 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_VERIFY_RUNTIMELIBS
|
||||||
|
|
||||||
AC_CHECK_SIZEOF(curl_off_t, ,[
|
AC_CHECK_SIZEOF(curl_off_t, ,[
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@@ -1555,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
|
||||||
|
|
||||||
@@ -1562,6 +1789,10 @@ TYPE_IN_ADDR_T
|
|||||||
|
|
||||||
TYPE_SOCKADDR_STORAGE
|
TYPE_SOCKADDR_STORAGE
|
||||||
|
|
||||||
|
TYPE_SIG_ATOMIC_T
|
||||||
|
|
||||||
|
AC_TYPE_SIGNAL
|
||||||
|
|
||||||
AC_FUNC_SELECT_ARGTYPES
|
AC_FUNC_SELECT_ARGTYPES
|
||||||
|
|
||||||
CURL_CHECK_FUNC_RECV
|
CURL_CHECK_FUNC_RECV
|
||||||
@@ -1572,7 +1803,7 @@ CURL_CHECK_MSG_NOSIGNAL
|
|||||||
|
|
||||||
dnl Checks for library functions.
|
dnl Checks for library functions.
|
||||||
dnl AC_PROG_GCC_TRADITIONAL
|
dnl AC_PROG_GCC_TRADITIONAL
|
||||||
AC_TYPE_SIGNAL
|
|
||||||
dnl AC_FUNC_VPRINTF
|
dnl AC_FUNC_VPRINTF
|
||||||
case $host in
|
case $host in
|
||||||
*msdosdjgpp)
|
*msdosdjgpp)
|
||||||
@@ -1616,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
|
||||||
@@ -1892,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)
|
||||||
@@ -2030,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 \
|
||||||
@@ -2074,6 +2327,7 @@ AC_MSG_NOTICE([Configured to build curl/libcurl:
|
|||||||
Install prefix: ${prefix}
|
Install prefix: ${prefix}
|
||||||
Compiler: ${CC}
|
Compiler: ${CC}
|
||||||
SSL support: ${curl_ssl_msg}
|
SSL support: ${curl_ssl_msg}
|
||||||
|
SSH support: ${curl_ssh_msg}
|
||||||
zlib support: ${curl_zlib_msg}
|
zlib support: ${curl_zlib_msg}
|
||||||
krb4 support: ${curl_krb4_msg}
|
krb4 support: ${curl_krb4_msg}
|
||||||
GSSAPI support: ${curl_gss_msg}
|
GSSAPI support: ${curl_gss_msg}
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -142,8 +142,8 @@ Rexx
|
|||||||
|
|
||||||
Ruby
|
Ruby
|
||||||
|
|
||||||
Written by Hirotaka Matsuyuki
|
Written by Ross Bamford
|
||||||
http://www.d1.dion.ne.jp/~matuyuki/ruby.html
|
http://curb.rubyforge.org/
|
||||||
|
|
||||||
Scheme
|
Scheme
|
||||||
|
|
||||||
@@ -155,6 +155,11 @@ S-Lang
|
|||||||
S-Lang binding written by John E Davis
|
S-Lang binding written by John E Davis
|
||||||
http://www.jedsoft.org/slang/modules/curl.html
|
http://www.jedsoft.org/slang/modules/curl.html
|
||||||
|
|
||||||
|
Smalltalk
|
||||||
|
|
||||||
|
Smalltalk binding written by Danil Osipchuk
|
||||||
|
http://www.squeaksource.com/CurlPlugin/
|
||||||
|
|
||||||
SPL
|
SPL
|
||||||
|
|
||||||
SPL binding written by Clifford Wolf
|
SPL binding written by Clifford Wolf
|
||||||
@@ -177,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
|
||||||
|
|||||||
@@ -87,7 +87,6 @@ FTP
|
|||||||
- via http-proxy
|
- via http-proxy
|
||||||
- all operations can be tunneled through a http-proxy
|
- all operations can be tunneled through a http-proxy
|
||||||
- customizable to retrieve file modification date
|
- customizable to retrieve file modification date
|
||||||
- third party transfers
|
|
||||||
- no dir depth limit
|
- no dir depth limit
|
||||||
|
|
||||||
FTPS (*1)
|
FTPS (*1)
|
||||||
@@ -117,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
|
||||||
|
|||||||
51
docs/INSTALL
51
docs/INSTALL
@@ -51,12 +51,12 @@ UNIX
|
|||||||
path for your compiler/linker, you don't need to do anything special. If
|
path for your compiler/linker, you don't need to do anything special. If
|
||||||
you have OpenSSL installed in /usr/local/ssl, you can run configure like:
|
you have OpenSSL installed in /usr/local/ssl, you can run configure like:
|
||||||
|
|
||||||
./configure --with-ssl
|
./configure --with-ssl
|
||||||
|
|
||||||
If you have OpenSSL installed somewhere else (for example, /opt/OpenSSL,)
|
If you have OpenSSL installed somewhere else (for example, /opt/OpenSSL,)
|
||||||
you can run configure like this:
|
you can run configure like this:
|
||||||
|
|
||||||
./configure --with-ssl=/opt/OpenSSL
|
./configure --with-ssl=/opt/OpenSSL
|
||||||
|
|
||||||
If you insist on forcing a build without SSL support, even though you may
|
If you insist on forcing a build without SSL support, even though you may
|
||||||
have OpenSSL installed in your system, you can run configure like this:
|
have OpenSSL installed in your system, you can run configure like this:
|
||||||
@@ -140,20 +140,55 @@ 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
|
||||||
-------
|
-------
|
||||||
|
|
||||||
Run the 'mingw32.bat' file to get the proper environment variables set,
|
Run the 'mingw32.bat' file to get the proper environment variables set,
|
||||||
then run 'make mingw32' in the root dir. Use 'make mingw32-ssl' to build
|
then run 'make mingw32' in the root dir. Use 'make mingw32-ssl' to build
|
||||||
curl SSL enabled.
|
curl SSL enabled.
|
||||||
|
|
||||||
If you have any problems linking libraries or finding header files, be sure
|
If you have any problems linking libraries or finding header files, be sure
|
||||||
to verify that the provided "Makefile.m32" files use the proper paths, and
|
to verify that the provided "Makefile.m32" files use the proper paths, and
|
||||||
adjust as necessary.
|
adjust as necessary. It is also possible to override these paths with
|
||||||
|
environment variables, for example:
|
||||||
|
|
||||||
|
set ZLIB_PATH=c:\zlib-1.2.3
|
||||||
|
set OPENSSL_PATH=c:\openssl-0.9.8d
|
||||||
|
set LIBSSH2_PATH=c:\libssh2-0.15
|
||||||
|
|
||||||
|
ATTENTION: if you want to build with libssh2 support you have to use latest
|
||||||
|
sources fetched from CVS - the current 0.14 release will NOT work!
|
||||||
|
Use 'make mingw32-ssh2-ssl' to build curl with SSH2 and SSL enabled.
|
||||||
|
|
||||||
Cygwin
|
Cygwin
|
||||||
------
|
------
|
||||||
@@ -184,7 +219,7 @@ Win32
|
|||||||
documentation on how to compile zlib. Define the ZLIB_PATH environment
|
documentation on how to compile zlib. Define the ZLIB_PATH environment
|
||||||
variable to the location of zlib.h and zlib.lib, for example:
|
variable to the location of zlib.h and zlib.lib, for example:
|
||||||
|
|
||||||
set ZLIB_PATH=c:\zlib-1.2.1
|
set ZLIB_PATH=c:\zlib-1.2.3
|
||||||
|
|
||||||
Then run 'nmake vc-zlib' in curl's root directory.
|
Then run 'nmake vc-zlib' in curl's root directory.
|
||||||
|
|
||||||
@@ -198,7 +233,7 @@ Win32
|
|||||||
Before running nmake define the OPENSSL_PATH environment variable with
|
Before running nmake define the OPENSSL_PATH environment variable with
|
||||||
the root/base directory of OpenSSL, for example:
|
the root/base directory of OpenSSL, for example:
|
||||||
|
|
||||||
set OPENSSL_PATH=c:\openssl-0.9.7d
|
set OPENSSL_PATH=c:\openssl-0.9.8d
|
||||||
|
|
||||||
Then run 'nmake vc-ssl' or 'nmake vc-ssl-dll' in curl's root
|
Then run 'nmake vc-ssl' or 'nmake vc-ssl-dll' in curl's root
|
||||||
directory. 'nmake vc-ssl' will create a libcurl static and dynamic
|
directory. 'nmake vc-ssl' will create a libcurl static and dynamic
|
||||||
@@ -676,6 +711,7 @@ PORTS
|
|||||||
- PowerPC Linux
|
- PowerPC Linux
|
||||||
- PowerPC Mac OS 9
|
- PowerPC Mac OS 9
|
||||||
- PowerPC Mac OS X
|
- PowerPC Mac OS X
|
||||||
|
- SuperH4 Linux 2.6.X
|
||||||
- SINIX-Z v5
|
- SINIX-Z v5
|
||||||
- Sparc Linux
|
- Sparc Linux
|
||||||
- Sparc Solaris 2.4, 2.5, 2.5.1, 2.6, 7, 8, 9, 10
|
- Sparc Solaris 2.4, 2.5, 2.5.1, 2.6, 7, 8, 9, 10
|
||||||
@@ -717,3 +753,6 @@ OpenSSL http://www.openssl.org
|
|||||||
MingW http://www.mingw.org
|
MingW http://www.mingw.org
|
||||||
OpenLDAP http://www.openldap.org
|
OpenLDAP http://www.openldap.org
|
||||||
Zlib http://www.gzip.org/zlib/
|
Zlib http://www.gzip.org/zlib/
|
||||||
|
libssh2 http://www.libssh2.org
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -3,11 +3,33 @@ join in and help us correct one or more of these! Also be sure to check the
|
|||||||
changelog of the current development status, as one or more of these problems
|
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. When doing an operation over FTP that requires the ACCT command (but not
|
||||||
|
when logging in), the operation will fail since libcurl doesn't detect this
|
||||||
|
and thus fails to issue the correct command:
|
||||||
|
http://curl.haxx.se/bug/view.cgi?id=1693337
|
||||||
|
|
||||||
|
40. Mac OS X test failures (Daniel Johnson)
|
||||||
|
http://curl.haxx.se/mail/lib-2007-03/0095.html
|
||||||
|
|
||||||
|
39. Steffen Rumler's Race Condition in Curl_proxyCONNECT:
|
||||||
|
http://curl.haxx.se/mail/lib-2007-01/0045.html
|
||||||
|
|
||||||
|
38. Kumar Swamy Bhatt's problem in ftp/ssl "LIST" operation:
|
||||||
|
http://curl.haxx.se/mail/lib-2007-01/0103.html
|
||||||
|
|
||||||
|
37. Having more than one connection to the same host when doing NTLM
|
||||||
|
authentication (with performs multiple "passes" and authenticates a
|
||||||
|
connection rather than a HTTP request), and particularly when using the
|
||||||
|
multi interface, there's a risk that libcurl will re-use a wrong connection
|
||||||
|
when doing the different passes in the NTLM negotiation and thus fail to
|
||||||
|
negotiate (in seemingly mysterious ways).
|
||||||
|
|
||||||
35. Both SOCKS5 and SOCKS4 proxy connections are done blocking, which is very
|
35. Both SOCKS5 and SOCKS4 proxy connections are done blocking, which is very
|
||||||
bad when used with the multi interface.
|
bad when used with the multi interface.
|
||||||
|
|
||||||
34. The SOCKS4 connection codes don't properly acknowledge (connect) timeouts.
|
34. The SOCKS4 connection codes don't properly acknowledge (connect) timeouts.
|
||||||
Also see #12.
|
Also see #12. According to bug #1556528, even the SOCKS5 connect code does
|
||||||
|
not do it right: http://curl.haxx.se/bug/view.cgi?id=1556528,
|
||||||
|
|
||||||
33. Doing multi-pass HTTP authentication on a non-default port does not work.
|
33. Doing multi-pass HTTP authentication on a non-default port does not work.
|
||||||
This happens because the multi-pass code abuses the redirect following code
|
This happens because the multi-pass code abuses the redirect following code
|
||||||
@@ -43,17 +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
|
||||||
|
|
||||||
25. When doing a CONNECT request with curl it doesn't properly handle if the
|
23. SOCKS-related problems:
|
||||||
proxy closes the connection within the authentication "negotiation phase".
|
A) libcurl doesn't support SOCKS for IPv6.
|
||||||
Like if you do HTTPS or similar over a proxy and you use perhaps
|
B) libcurl doesn't support FTPS over a SOCKS proxy.
|
||||||
--proxy-anyauth. There's work in progress on this problem, and a recent
|
C) We don't have any test cases for SOCKS proxy.
|
||||||
patch was posted here: http://curl.haxx.se/mail/lib-2005-08/0074.html
|
E) libcurl doesn't support active FTP over a SOCKS proxy
|
||||||
|
|
||||||
23. We don't support SOCKS for IPv6. We don't support FTPS over a SOCKS proxy.
|
We probably have even more bugs and lack of features when a SOCKS proxy is
|
||||||
We don't have any test cases for SOCKS proxy. We probably have even more
|
used.
|
||||||
bugs and lack of features when a SOCKS proxy is used. And there seem to be a
|
|
||||||
problem with SOCKS when doing FTP: See
|
|
||||||
http://curl.haxx.se/bug/view.cgi?id=1371540
|
|
||||||
|
|
||||||
22. Sending files to a FTP server using curl on VMS, might lead to curl
|
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
|
||||||
@@ -72,9 +91,6 @@ may have been fixed since this was written!
|
|||||||
|
|
||||||
Since 7.15.4 at least line endings are converted.
|
Since 7.15.4 at least line endings are converted.
|
||||||
|
|
||||||
19. FTP 3rd party transfers with the multi interface doesn't work. Test:
|
|
||||||
define CURL_MULTIEASY, rebuild curl, run test case 230 - 232.
|
|
||||||
|
|
||||||
16. FTP URLs passed to curl may contain NUL (0x00) in the RFC 1738 <user>,
|
16. FTP URLs passed to curl may contain NUL (0x00) in the RFC 1738 <user>,
|
||||||
<password>, and <fpath> components, encoded as "%00". The problem is that
|
<password>, and <fpath> components, encoded as "%00". The problem is that
|
||||||
curl_unescape does not detect this, but instead returns a shortened C
|
curl_unescape does not detect this, but instead returns a shortened C
|
||||||
@@ -98,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 '-'.
|
||||||
|
|||||||
24
docs/THANKS
24
docs/THANKS
@@ -17,6 +17,7 @@ Alexander Kourakos
|
|||||||
Alexander Krasnostavsky
|
Alexander Krasnostavsky
|
||||||
Alexander Lazic
|
Alexander Lazic
|
||||||
Alexander Zhuravlev
|
Alexander Zhuravlev
|
||||||
|
Alexey Simak
|
||||||
Alexis Carvalho
|
Alexis Carvalho
|
||||||
Amol Pattekar
|
Amol Pattekar
|
||||||
Andi Jahja
|
Andi Jahja
|
||||||
@@ -26,6 +27,7 @@ Andreas Olsson
|
|||||||
Andreas Rieke
|
Andreas Rieke
|
||||||
Andres Garcia
|
Andres Garcia
|
||||||
Andrew Benham
|
Andrew Benham
|
||||||
|
Andrew Biggs
|
||||||
Andrew Bushnell
|
Andrew Bushnell
|
||||||
Andrew Francis
|
Andrew Francis
|
||||||
Andrew Fuller
|
Andrew Fuller
|
||||||
@@ -36,6 +38,7 @@ Angus Mackay
|
|||||||
Antoine Calando
|
Antoine Calando
|
||||||
Anton Kalmykov
|
Anton Kalmykov
|
||||||
Arkadiusz Miskiewicz
|
Arkadiusz Miskiewicz
|
||||||
|
Armel Asselin
|
||||||
Arve Knudsen
|
Arve Knudsen
|
||||||
Ates Goral
|
Ates Goral
|
||||||
Augustus Saunders
|
Augustus Saunders
|
||||||
@@ -43,12 +46,15 @@ Avery Fay
|
|||||||
Ben Greear
|
Ben Greear
|
||||||
Ben Madsen
|
Ben Madsen
|
||||||
Benjamin Gerard
|
Benjamin Gerard
|
||||||
|
Bernard Leak
|
||||||
Bertrand Demiddelaer
|
Bertrand Demiddelaer
|
||||||
Bjorn Reese
|
Bjorn Reese
|
||||||
Bj<EFBFBD>rn Stenberg
|
Bj<EFBFBD>rn Stenberg
|
||||||
Bob Schader
|
Bob Schader
|
||||||
|
Bogdan Nicula
|
||||||
Brad Burdick
|
Brad Burdick
|
||||||
Bradford Bruce
|
Bradford Bruce
|
||||||
|
Brendan Jurd
|
||||||
Brent Beardsley
|
Brent Beardsley
|
||||||
Brian Akins
|
Brian Akins
|
||||||
Brian Dessent
|
Brian Dessent
|
||||||
@@ -68,6 +74,7 @@ Christian Robottom Reis
|
|||||||
Christophe Demory
|
Christophe Demory
|
||||||
Christophe Legry
|
Christophe Legry
|
||||||
Christopher R. Palmer
|
Christopher R. Palmer
|
||||||
|
Ciprian Badescu
|
||||||
Clarence Gardner
|
Clarence Gardner
|
||||||
Clifford Wolf
|
Clifford Wolf
|
||||||
Cody Jones
|
Cody Jones
|
||||||
@@ -116,7 +123,9 @@ Dimitris Sarris
|
|||||||
Dinar
|
Dinar
|
||||||
Dirk Eddelbuettel
|
Dirk Eddelbuettel
|
||||||
Dirk Manske
|
Dirk Manske
|
||||||
|
Dmitriy Sergeyev
|
||||||
Dmitry Bartsevich
|
Dmitry Bartsevich
|
||||||
|
Dmitry Rechkin
|
||||||
Dolbneff A.V
|
Dolbneff A.V
|
||||||
Domenico Andreoli
|
Domenico Andreoli
|
||||||
Dominick Meglio
|
Dominick Meglio
|
||||||
@@ -206,11 +215,13 @@ James Clancy
|
|||||||
James Cone
|
James Cone
|
||||||
James Gallagher
|
James Gallagher
|
||||||
James Griffiths
|
James Griffiths
|
||||||
|
James Housley
|
||||||
James MacMillan
|
James MacMillan
|
||||||
Jamie Lokier
|
Jamie Lokier
|
||||||
Jamie Newton
|
Jamie Newton
|
||||||
Jamie Wilkinson
|
Jamie Wilkinson
|
||||||
Jan Kunder
|
Jan Kunder
|
||||||
|
Jared Lundell
|
||||||
Jari Sundell
|
Jari Sundell
|
||||||
Jason S. Priebe
|
Jason S. Priebe
|
||||||
Jaz Fresh
|
Jaz Fresh
|
||||||
@@ -313,12 +324,14 @@ Markus Oberhumer
|
|||||||
Martijn Koster
|
Martijn Koster
|
||||||
Martin C. Martin
|
Martin C. Martin
|
||||||
Martin Hedenfalk
|
Martin Hedenfalk
|
||||||
|
Martin Skinner
|
||||||
Marty Kuhrt
|
Marty Kuhrt
|
||||||
Maruko
|
Maruko
|
||||||
Massimiliano Ziccardi
|
Massimiliano Ziccardi
|
||||||
Mathias Axelsson
|
Mathias Axelsson
|
||||||
Mats Lidell
|
Mats Lidell
|
||||||
Matt Veenstra
|
Matt Veenstra
|
||||||
|
Matt Witherspoon
|
||||||
Matthew Blain
|
Matthew Blain
|
||||||
Matthew Clarke
|
Matthew Clarke
|
||||||
Maurice Barnum
|
Maurice Barnum
|
||||||
@@ -337,12 +350,14 @@ Mihai Ionescu
|
|||||||
Mikael Sennerholm
|
Mikael Sennerholm
|
||||||
Mike Bytnar
|
Mike Bytnar
|
||||||
Mike Dobbs
|
Mike Dobbs
|
||||||
|
Mike Protts
|
||||||
Miklos Nemeth
|
Miklos Nemeth
|
||||||
Mitz Wark
|
Mitz Wark
|
||||||
Mohamed Lrhazi
|
Mohamed Lrhazi
|
||||||
Mohun Biswas
|
Mohun Biswas
|
||||||
Moonesamy
|
Moonesamy
|
||||||
Nathan O'Sullivan
|
Nathan O'Sullivan
|
||||||
|
Nathanael Nerode
|
||||||
Naveen Noel
|
Naveen Noel
|
||||||
Neil Dunbar
|
Neil Dunbar
|
||||||
Neil Spring
|
Neil Spring
|
||||||
@@ -355,10 +370,12 @@ Nicolas Croiset
|
|||||||
Nicolas Fran<61>ois
|
Nicolas Fran<61>ois
|
||||||
Niels van Tongeren
|
Niels van Tongeren
|
||||||
Nikita Schmidt
|
Nikita Schmidt
|
||||||
|
Nir Soffer
|
||||||
Nis Jorgensen
|
Nis Jorgensen
|
||||||
Nodak Sodak
|
Nodak Sodak
|
||||||
Norbert Novotny
|
Norbert Novotny
|
||||||
Ofer
|
Ofer
|
||||||
|
Olaf Stueben
|
||||||
Olaf St<53>ben
|
Olaf St<53>ben
|
||||||
Oren Tirosh
|
Oren Tirosh
|
||||||
P R Schaffner
|
P R Schaffner
|
||||||
@@ -398,6 +415,7 @@ Ralph Beckmann
|
|||||||
Ralph Mitchell
|
Ralph Mitchell
|
||||||
Ramana Mokkapati
|
Ramana Mokkapati
|
||||||
Randy McMurchy
|
Randy McMurchy
|
||||||
|
Ravi Pratap
|
||||||
Reinout van Schouwen
|
Reinout van Schouwen
|
||||||
Renaud Chaillat
|
Renaud Chaillat
|
||||||
Renaud Duhaut
|
Renaud Duhaut
|
||||||
@@ -416,6 +434,7 @@ Rick Jones
|
|||||||
Rick Richardson
|
Rick Richardson
|
||||||
Rob Stanzel
|
Rob Stanzel
|
||||||
Robert D. Young
|
Robert D. Young
|
||||||
|
Robert Foreman
|
||||||
Robert Olson
|
Robert Olson
|
||||||
Robert Weaver
|
Robert Weaver
|
||||||
Robin Kay
|
Robin Kay
|
||||||
@@ -442,6 +461,7 @@ Scott Davis
|
|||||||
Sebastien Willemijns
|
Sebastien Willemijns
|
||||||
Sergio Ballestrero
|
Sergio Ballestrero
|
||||||
Seshubabu Pasam
|
Seshubabu Pasam
|
||||||
|
Sh Diao
|
||||||
Shard
|
Shard
|
||||||
Shawn Poulson
|
Shawn Poulson
|
||||||
Shmulik Regev
|
Shmulik Regev
|
||||||
@@ -452,6 +472,7 @@ Simon Liu
|
|||||||
Spiridonoff A.V
|
Spiridonoff A.V
|
||||||
Stadler Stephan
|
Stadler Stephan
|
||||||
Stefan Esser
|
Stefan Esser
|
||||||
|
Stefan Krause
|
||||||
Stefan Ulrich
|
Stefan Ulrich
|
||||||
Stephan Bergmann
|
Stephan Bergmann
|
||||||
Stephen Kick
|
Stephen Kick
|
||||||
@@ -489,6 +510,7 @@ Tomas Szepe
|
|||||||
Tomasz Lacki
|
Tomasz Lacki
|
||||||
Tommy Tam
|
Tommy Tam
|
||||||
Ton Voon
|
Ton Voon
|
||||||
|
Toon Verwaest
|
||||||
Tor Arntsen
|
Tor Arntsen
|
||||||
Torsten Foertsch
|
Torsten Foertsch
|
||||||
Toshiyuki Maezawa
|
Toshiyuki Maezawa
|
||||||
@@ -498,6 +520,8 @@ Troy Engel
|
|||||||
Tupone Alfredo
|
Tupone Alfredo
|
||||||
Ulf H<>rnhammar
|
Ulf H<>rnhammar
|
||||||
Ulrich Zadow
|
Ulrich Zadow
|
||||||
|
Venkat Akella
|
||||||
|
Victor Snezhko
|
||||||
Vilmos Nebehaj
|
Vilmos Nebehaj
|
||||||
Vincent Bronner
|
Vincent Bronner
|
||||||
Vincent Penquerc'h
|
Vincent Penquerc'h
|
||||||
|
|||||||
30
docs/TODO
30
docs/TODO
@@ -43,10 +43,6 @@ TODO
|
|||||||
powered libcurl the default build (which of course would require that we'd
|
powered libcurl the default build (which of course would require that we'd
|
||||||
bundle the c-ares source code in the libcurl source code releases).
|
bundle the c-ares source code in the libcurl source code releases).
|
||||||
|
|
||||||
* Support CONNECT 407 responses that kill the connection and expect the
|
|
||||||
client to reconnect to complete the authentication. Currently libcurl
|
|
||||||
assumes that a proxy connection will be kept alive.
|
|
||||||
|
|
||||||
* Make the curl/*.h headers include the proper system includes based on what
|
* Make the curl/*.h headers include the proper system includes based on what
|
||||||
was present at the time when configure was run. Currently, the sys/select.h
|
was present at the time when configure was run. Currently, the sys/select.h
|
||||||
header is for example included by curl/multi.h only on specific platforms
|
header is for example included by curl/multi.h only on specific platforms
|
||||||
@@ -115,10 +111,6 @@ TODO
|
|||||||
|
|
||||||
HTTP
|
HTTP
|
||||||
|
|
||||||
* Pipelining. Sending multiple requests before the previous one(s) are done.
|
|
||||||
This could possibly be implemented using the multi interface to queue
|
|
||||||
requests and the response data.
|
|
||||||
|
|
||||||
* When doing CONNECT to a HTTP proxy, libcurl always uses HTTP/1.0. This has
|
* When doing CONNECT to a HTTP proxy, libcurl always uses HTTP/1.0. This has
|
||||||
never been reported as causing trouble to anyone, but should be considered
|
never been reported as causing trouble to anyone, but should be considered
|
||||||
to use the HTTP version the user has chosen.
|
to use the HTTP version the user has chosen.
|
||||||
@@ -165,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
|
||||||
|
|
||||||
@@ -192,8 +180,8 @@ TODO
|
|||||||
|
|
||||||
* Fix the connection phase to be non-blocking when multi interface is used
|
* Fix the connection phase to be non-blocking when multi interface is used
|
||||||
|
|
||||||
* Add a way to check if the connection seems to be alive, to corrspond to the
|
* Add a way to check if the connection seems to be alive, to correspond to
|
||||||
SSL_peak() way we use with OpenSSL.
|
the SSL_peak() way we use with OpenSSL.
|
||||||
|
|
||||||
LDAP
|
LDAP
|
||||||
|
|
||||||
@@ -205,10 +193,6 @@ TODO
|
|||||||
|
|
||||||
* RTSP - RFC2326 (protocol - very HTTP-like, also contains URL description)
|
* RTSP - RFC2326 (protocol - very HTTP-like, also contains URL description)
|
||||||
|
|
||||||
* SFTP/SCP/SSH (no RFCs for protocol nor URI/URL format). An implementation
|
|
||||||
should most probably use an existing ssh library, such as OpenSSH. or
|
|
||||||
libssh2.org
|
|
||||||
|
|
||||||
* RSYNC (no RFCs for protocol nor URI/URL format). An implementation should
|
* RSYNC (no RFCs for protocol nor URI/URL format). An implementation should
|
||||||
most probably use an existing rsync library, such as librsync.
|
most probably use an existing rsync library, such as librsync.
|
||||||
|
|
||||||
@@ -277,6 +261,10 @@ TODO
|
|||||||
|
|
||||||
TEST SUITE
|
TEST SUITE
|
||||||
|
|
||||||
|
* Make our own version of stunnel for simple port forwarding to enable HTTPS
|
||||||
|
and FTP-SSL tests without the stunnel dependency, and it could allow us to
|
||||||
|
provide test tools built with either OpenSSL or GnuTLS
|
||||||
|
|
||||||
* Make the test servers able to serve multiple running test suites. Like if
|
* Make the test servers able to serve multiple running test suites. Like if
|
||||||
two users run 'make test' at once.
|
two users run 'make test' at once.
|
||||||
|
|
||||||
|
|||||||
183
docs/curl.1
183
docs/curl.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
|
||||||
@@ -21,7 +21,7 @@
|
|||||||
.\" * $Id$
|
.\" * $Id$
|
||||||
.\" **************************************************************************
|
.\" **************************************************************************
|
||||||
.\"
|
.\"
|
||||||
.TH curl 1 "21 Mar 2006" "Curl 7.15.4" "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
|
||||||
@@ -30,13 +30,13 @@ curl \- transfer a URL
|
|||||||
.SH DESCRIPTION
|
.SH DESCRIPTION
|
||||||
.B curl
|
.B curl
|
||||||
is a tool to transfer data from or to a server, using one of the supported
|
is a tool to transfer data from or to a server, using one of the supported
|
||||||
protocols (HTTP, HTTPS, FTP, FTPS, TFTP, DICT, TELNET, LDAP or FILE).
|
protocols (HTTP, HTTPS, FTP, FTPS, SCP, SFTP, TFTP, DICT, TELNET, LDAP or
|
||||||
The command is designed to work without user interaction.
|
FILE). The command is designed to work without user interaction.
|
||||||
|
|
||||||
curl offers a busload of useful tricks like proxy support, user
|
curl offers a busload of useful tricks like proxy support, user
|
||||||
authentication, ftp upload, HTTP post, SSL (https:) connections, cookies, file
|
authentication, ftp upload, HTTP post, SSL connections, cookies, file transfer
|
||||||
transfer resume and more. As you will see below, the amount of features will
|
resume and more. As you will see below, the amount of features will make your
|
||||||
make your head spin!
|
head spin!
|
||||||
|
|
||||||
curl is powered by libcurl for all transfer-related features. See
|
curl is powered by libcurl for all transfer-related features. See
|
||||||
.BR libcurl (3)
|
.BR libcurl (3)
|
||||||
@@ -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
|
||||||
@@ -312,25 +316,29 @@ run curl.
|
|||||||
|
|
||||||
If this option is used several times, each occurrence will toggle this on/off.
|
If this option is used several times, each occurrence will toggle this on/off.
|
||||||
.IP "--egd-file <file>"
|
.IP "--egd-file <file>"
|
||||||
(HTTPS) Specify the path name to the Entropy Gathering Daemon socket. The
|
(SSL) Specify the path name to the Entropy Gathering Daemon socket. The socket
|
||||||
socket is used to seed the random engine for SSL connections. See also the
|
is used to seed the random engine for SSL connections. See also the
|
||||||
\fI--random-file\fP option.
|
\fI--random-file\fP option.
|
||||||
.IP "-E/--cert <certificate[:password]>"
|
.IP "-E/--cert <certificate[:password]>"
|
||||||
(HTTPS)
|
(SSL) Tells curl to use the specified certificate file when getting a file
|
||||||
Tells curl to use the specified certificate file when getting a file
|
with HTTPS or FTPS. The certificate must be in PEM format. If the optional
|
||||||
with HTTPS. The certificate must be in PEM format.
|
password isn't specified, it will be queried for on the terminal. Note that
|
||||||
If the optional password isn't specified, it will be queried for on
|
this option assumes a \&"certificate" file that is the private key and the
|
||||||
the terminal. Note that this certificate is the private key and the private
|
private certificate concatenated! See \fI--cert\fP and \fI--key\fP to specify
|
||||||
certificate concatenated!
|
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,
|
||||||
DER and ENG are recognized types.
|
DER and ENG are recognized types. If not specified, PEM is assumed.
|
||||||
|
|
||||||
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 "--cacert <CA certificate>"
|
.IP "--cacert <CA certificate>"
|
||||||
(HTTPS) Tells curl to use the specified certificate file to verify the
|
(SSL) Tells curl to use the specified certificate file to verify the
|
||||||
peer. The file may contain multiple CA certificates. The certificate(s) must
|
peer. The file may contain multiple CA certificates. The certificate(s) must
|
||||||
be in PEM format.
|
be in PEM format.
|
||||||
|
|
||||||
@@ -342,12 +350,15 @@ 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>"
|
||||||
(HTTPS) Tells curl to use the specified certificate directory to verify the
|
(SSL) Tells curl to use the specified certificate directory to verify the
|
||||||
peer. The certificates must be in PEM format, and the directory must have been
|
peer. The certificates must be in PEM format, and the directory must have been
|
||||||
processed using the c_rehash utility supplied with openssl. Using
|
processed using the c_rehash utility supplied with openssl. Using
|
||||||
\fI--capath\fP can allow curl to make https connections much more efficiently
|
\fI--capath\fP can allow curl to make SSL-connections much more efficiently
|
||||||
than using \fI--cacert\fP if the \fI--cacert\fP file contains many CA
|
than using \fI--cacert\fP if the \fI--cacert\fP file contains many CA
|
||||||
certificates.
|
certificates.
|
||||||
|
|
||||||
@@ -359,6 +370,10 @@ normal cases when a HTTP server fails to deliver a document, it returns an
|
|||||||
HTML document stating so (which often also describes why and more). This flag
|
HTML document stating so (which often also describes why and more). This flag
|
||||||
will prevent curl from outputting that and return error 22.
|
will prevent curl from outputting that and return error 22.
|
||||||
|
|
||||||
|
This method is not fail-safe and there are occasions where non-succesful
|
||||||
|
response codes will slip through, especially when authentication is involved
|
||||||
|
(response codes 401 and 407).
|
||||||
|
|
||||||
If this option is used twice, the second will again disable silent failure.
|
If this option is used twice, the second will again disable silent failure.
|
||||||
.IP "--ftp-account [data]"
|
.IP "--ftp-account [data]"
|
||||||
(FTP) When an FTP server asks for "account data" after user name and password
|
(FTP) When an FTP server asks for "account data" after user name and password
|
||||||
@@ -395,7 +410,6 @@ in 7.11.0)
|
|||||||
|
|
||||||
If this option is used several times, the following occurrences make no
|
If this option is used several times, the following occurrences make no
|
||||||
difference.
|
difference.
|
||||||
|
|
||||||
.IP "--ftp-alternative-to-user <command>"
|
.IP "--ftp-alternative-to-user <command>"
|
||||||
(FTP) If authenticating with the USER and PASS commands fails, send this
|
(FTP) If authenticating with the USER and PASS commands fails, send this
|
||||||
command. When connecting to Tumbleweed's Secure Transport server over FTPS
|
command. When connecting to Tumbleweed's Secure Transport server over FTPS
|
||||||
@@ -412,9 +426,16 @@ This option has no effect if PORT, EPRT or EPSV is used instead of PASV.
|
|||||||
If this option is used twice, the second will again use the server's suggested
|
If this option is used twice, the second will again use the server's suggested
|
||||||
address.
|
address.
|
||||||
.IP "--ftp-ssl"
|
.IP "--ftp-ssl"
|
||||||
(FTP) Try to use SSL/TLS for the FTP connection.
|
(FTP) Try to use SSL/TLS for the FTP connection. Reverts to a non-secure
|
||||||
Reverts to a non-secure connection if the server doesn't support SSL/TLS.
|
connection if the server doesn't support SSL/TLS. See also
|
||||||
(Added in 7.11.0)
|
\fI--ftp-ssl-control\fP and \fI--ftp-ssl-reqd\fP for different levels of
|
||||||
|
encryption required. (Added in 7.11.0)
|
||||||
|
|
||||||
|
If this option is used twice, the second will again disable this.
|
||||||
|
.IP "--ftp-ssl-control"
|
||||||
|
(FTP) Require SSL/TLS for the ftp login, clear for transfer. Allows secure
|
||||||
|
authentication, but non-encrypted data transfers for efficiency. Fails the
|
||||||
|
transfer if the server doesn't support SSL/TLS. (Added in 7.16.0)
|
||||||
|
|
||||||
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-reqd"
|
.IP "--ftp-ssl-reqd"
|
||||||
@@ -423,6 +444,22 @@ Terminates the connection if the server doesn't support SSL/TLS.
|
|||||||
(Added in 7.15.5)
|
(Added in 7.15.5)
|
||||||
|
|
||||||
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"
|
||||||
|
(FTP) Use CCC (Clear Command Channel)
|
||||||
|
Shuts down the SSL/TLS layer after authenticating. The rest of the
|
||||||
|
control channel communication will be unencrypted. This allows
|
||||||
|
NAT routers to follow the FTP transaction. The default mode is
|
||||||
|
passive. See --ftp-ssl-ccc-mode for other modes.
|
||||||
|
(Added in 7.16.1)
|
||||||
|
|
||||||
|
If this option is used twice, the second will again disable this.
|
||||||
|
.IP "--ftp-ssl-ccc-mode [active/passive]"
|
||||||
|
(FTP) Use CCC (Clear Command Channel)
|
||||||
|
Sets the CCC mode. The passive mode will not initiate the shutdown, but
|
||||||
|
instead wait for the server to do it, and will not reply to the
|
||||||
|
shutdown from the server. The active mode initiates the shutdown and
|
||||||
|
waits for a reply from the server.
|
||||||
|
(Added in 7.16.2)
|
||||||
.IP "-F/--form <name=content>"
|
.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
|
||||||
@@ -489,9 +526,9 @@ of extra headers. Note that if you should add a custom header that has the
|
|||||||
same name as one of the internal ones curl would use, your externally set
|
same name as one of the internal ones curl would use, your externally set
|
||||||
header will be used instead of the internal one. This allows you to make even
|
header will be used instead of the internal one. This allows you to make even
|
||||||
trickier stuff than curl would normally do. You should not replace internally
|
trickier stuff than curl would normally do. You should not replace internally
|
||||||
set headers without knowing perfectly well what you're doing. Replacing an
|
set headers without knowing perfectly well what you're doing. Remove an
|
||||||
internal header with one without content on the right side of the colon will
|
internal header by giving a replacement without content on the right side of
|
||||||
prevent that header from appearing.
|
the colon, as in: -H \&"Host:".
|
||||||
|
|
||||||
curl will make sure that each header you add/replace get sent with the proper
|
curl will make sure that each header you add/replace get sent with the proper
|
||||||
end of line marker, you should thus \fBnot\fP add that as a part of the header
|
end of line marker, you should thus \fBnot\fP add that as a part of the header
|
||||||
@@ -540,15 +577,19 @@ and transfers. All SSL connections are attempted to be made secure by using
|
|||||||
the CA certificate bundle installed by default. This makes all connections
|
the CA certificate bundle installed by default. This makes all connections
|
||||||
considered "insecure" to fail unless \fI-k/--insecure\fP is used.
|
considered "insecure" to fail unless \fI-k/--insecure\fP is used.
|
||||||
|
|
||||||
|
See this online resource for further details:
|
||||||
|
\fBhttp://curl.haxx.se/docs/sslcerts.html\fP
|
||||||
|
|
||||||
If this option is used twice, the second time will again disable it.
|
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.
|
||||||
.IP "--key-type <type>"
|
.IP "--key-type <type>"
|
||||||
(SSL) Private key file type. Specify which type your \fI--key\fP provided
|
(SSL) Private key file type. Specify which type your \fI--key\fP provided
|
||||||
private key is. DER, PEM and ENG are supported.
|
private key is. DER, PEM and ENG are supported. If not specified, PEM is
|
||||||
|
assumed.
|
||||||
|
|
||||||
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 "--krb4 <level>"
|
.IP "--krb4 <level>"
|
||||||
@@ -567,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
|
||||||
@@ -577,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.
|
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
|
||||||
@@ -592,6 +636,28 @@ 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>"
|
||||||
|
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
|
||||||
|
operation of what your command line operation does!
|
||||||
|
|
||||||
|
If this option is used several times, the last given file name will be used.
|
||||||
.IP "--limit-rate <speed>"
|
.IP "--limit-rate <speed>"
|
||||||
Specify the maximum transfer rate you want curl to use. This feature is useful
|
Specify the maximum transfer rate you want curl to use. This feature is useful
|
||||||
if you have a limited pipe and you'd like your transfer not use your entire
|
if you have a limited pipe and you'd like your transfer not use your entire
|
||||||
@@ -601,6 +667,10 @@ The given speed is measured in bytes/second, unless a suffix is appended.
|
|||||||
Appending 'k' or 'K' will count the number as kilobytes, 'm' or M' makes it
|
Appending 'k' or 'K' will count the number as kilobytes, 'm' or M' makes it
|
||||||
megabytes while 'g' or 'G' makes it gigabytes. Examples: 200K, 3m and 1G.
|
megabytes while 'g' or 'G' makes it gigabytes. Examples: 200K, 3m and 1G.
|
||||||
|
|
||||||
|
The given rate is the average speed, counted during the entire transfer. It
|
||||||
|
means that curl might use higher transfer speeds in short bursts, but over
|
||||||
|
time it uses no more than the given rate.
|
||||||
|
|
||||||
If you are also using the \fI-Y/--speed-limit\fP option, that option will take
|
If you are also using the \fI-Y/--speed-limit\fP option, that option will take
|
||||||
precedence and might cripple the rate-limiting slightly, to help keeping the
|
precedence and might cripple the rate-limiting slightly, to help keeping the
|
||||||
speed-limit logic working.
|
speed-limit logic working.
|
||||||
@@ -705,6 +775,15 @@ will output the data in chunks, not necessarily exactly when the data arrives.
|
|||||||
Using this option will disable that buffering.
|
Using this option will disable that buffering.
|
||||||
|
|
||||||
If this option is used twice, the second will again switch on buffering.
|
If this option is used twice, the second will again switch on buffering.
|
||||||
|
.IP "--no-sessionid"
|
||||||
|
(SSL) Disable curl's use of SSL session-ID caching. By default all transfers
|
||||||
|
are done using the cache. Note that while nothing ever should get hurt by
|
||||||
|
attempting to reuse SSL session-IDs, there seem to be broken SSL
|
||||||
|
implementations in the wild that may require you to disable this in order for
|
||||||
|
you to succeed. (Added in 7.16.0)
|
||||||
|
|
||||||
|
If this option is used twice, the second will again switch on use of the
|
||||||
|
session cache.
|
||||||
.IP "--ntlm"
|
.IP "--ntlm"
|
||||||
(HTTP) Enables NTLM authentication. The NTLM authentication method was
|
(HTTP) Enables NTLM authentication. The NTLM authentication method was
|
||||||
designed by Microsoft and is used by IIS web servers. It is a proprietary
|
designed by Microsoft and is used by IIS web servers. It is a proprietary
|
||||||
@@ -746,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"
|
||||||
@@ -781,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
|
||||||
@@ -818,7 +902,7 @@ must send syntactically correct FTP commands as RFC959 defines.
|
|||||||
|
|
||||||
This option can be used multiple times.
|
This option can be used multiple times.
|
||||||
.IP "--random-file <file>"
|
.IP "--random-file <file>"
|
||||||
(HTTPS) Specify the path name to file containing what will be considered as
|
(SSL) Specify the path name to file containing what will be considered as
|
||||||
random data. The data is used to seed the random engine for SSL connections.
|
random data. The data is used to seed the random engine for SSL connections.
|
||||||
See also the \fI--egd-file\fP option.
|
See also the \fI--egd-file\fP option.
|
||||||
.IP "-r/--range <range>"
|
.IP "-r/--range <range>"
|
||||||
@@ -860,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
|
||||||
@@ -968,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
|
||||||
@@ -978,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.
|
||||||
@@ -1019,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.
|
||||||
|
|
||||||
@@ -1196,7 +1292,7 @@ not set.
|
|||||||
|
|
||||||
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 "-z/--time-cond <date expression>"
|
.IP "-z/--time-cond <date expression>"
|
||||||
(HTTP) Request a file that has been modified later than the given time and
|
(HTTP/FTP) Request a file that has been modified later than the given time and
|
||||||
date, or one that has been modified before that time. The date expression can
|
date, or one that has been modified before that time. The date expression can
|
||||||
be all sorts of date strings or if it doesn't match any internal ones, it
|
be all sorts of date strings or if it doesn't match any internal ones, it
|
||||||
tries to get the time from a given file name instead! See the
|
tries to get the time from a given file name instead! See the
|
||||||
@@ -1218,25 +1314,14 @@ If this option is used several times, the last one will be used.
|
|||||||
(HTTP) Forces curl to issue its requests using HTTP 1.0 instead of using its
|
(HTTP) Forces curl to issue its requests using HTTP 1.0 instead of using its
|
||||||
internally preferred: HTTP 1.1.
|
internally preferred: HTTP 1.1.
|
||||||
.IP "-1/--tlsv1"
|
.IP "-1/--tlsv1"
|
||||||
(HTTPS)
|
(SSL)
|
||||||
Forces curl to use TSL version 1 when negotiating with a remote TLS server.
|
Forces curl to use TSL version 1 when negotiating with a remote TLS server.
|
||||||
.IP "-2/--sslv2"
|
.IP "-2/--sslv2"
|
||||||
(HTTPS)
|
(SSL)
|
||||||
Forces curl to use SSL version 2 when negotiating with a remote SSL server.
|
Forces curl to use SSL version 2 when negotiating with a remote SSL server.
|
||||||
.IP "-3/--sslv3"
|
.IP "-3/--sslv3"
|
||||||
(HTTPS)
|
(SSL)
|
||||||
Forces curl to use SSL version 3 when negotiating with a remote SSL server.
|
Forces curl to use SSL version 3 when negotiating with a remote SSL server.
|
||||||
.IP "--3p-quote"
|
|
||||||
(FTP) Specify arbitrary commands to send to the source server. See the
|
|
||||||
\fI-Q/--quote\fP option for details. (Added in 7.13.0)
|
|
||||||
.IP "--3p-url"
|
|
||||||
(FTP) Activates a FTP 3rd party transfer. Specifies the source URL to get a
|
|
||||||
file from, while the "normal" URL will be used as target URL, the file that
|
|
||||||
will be written/created.
|
|
||||||
|
|
||||||
Note that not all FTP server allow 3rd party transfers. (Added in 7.13.0)
|
|
||||||
.IP "--3p-user"
|
|
||||||
(FTP) Specify user:password for the source URL transfer. (Added in 7.13.0)
|
|
||||||
.IP "-4/--ipv4"
|
.IP "-4/--ipv4"
|
||||||
If libcurl is capable of resolving an address to multiple IP versions (which
|
If libcurl is capable of resolving an address to multiple IP versions (which
|
||||||
it is if it is ipv6-capable), this option tells libcurl to resolve names to
|
it is if it is ipv6-capable), this option tells libcurl to resolve names to
|
||||||
|
|||||||
166
docs/examples/10-at-a-time.c
Normal file
166
docs/examples/10-at-a-time.c
Normal file
@@ -0,0 +1,166 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* _ _ ____ _
|
||||||
|
* Project ___| | | | _ \| |
|
||||||
|
* / __| | | | |_) | |
|
||||||
|
* | (__| |_| | _ <| |___
|
||||||
|
* \___|\___/|_| \_\_____|
|
||||||
|
*
|
||||||
|
* $Id$
|
||||||
|
*
|
||||||
|
* Example application source code using the multi interface to download many
|
||||||
|
* files, but with a capped maximum amount of simultaneous transfers.
|
||||||
|
*
|
||||||
|
* Written by Michael Wallner
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <curl/multi.h>
|
||||||
|
|
||||||
|
static const char *urls[] = {
|
||||||
|
"http://www.microsoft.com",
|
||||||
|
"http://www.opensource.org",
|
||||||
|
"http://www.google.com",
|
||||||
|
"http://www.yahoo.com",
|
||||||
|
"http://www.ibm.com",
|
||||||
|
"http://www.mysql.com",
|
||||||
|
"http://www.oracle.com",
|
||||||
|
"http://www.ripe.net",
|
||||||
|
"http://www.iana.org",
|
||||||
|
"http://www.amazon.com",
|
||||||
|
"http://www.netcraft.com",
|
||||||
|
"http://www.heise.de",
|
||||||
|
"http://www.chip.de",
|
||||||
|
"http://www.ca.com",
|
||||||
|
"http://www.cnet.com",
|
||||||
|
"http://www.news.com",
|
||||||
|
"http://www.cnn.com",
|
||||||
|
"http://www.wikipedia.org",
|
||||||
|
"http://www.dell.com",
|
||||||
|
"http://www.hp.com",
|
||||||
|
"http://www.cert.org",
|
||||||
|
"http://www.mit.edu",
|
||||||
|
"http://www.nist.gov",
|
||||||
|
"http://www.ebay.com",
|
||||||
|
"http://www.playstation.com",
|
||||||
|
"http://www.uefa.com",
|
||||||
|
"http://www.ieee.org",
|
||||||
|
"http://www.apple.com",
|
||||||
|
"http://www.sony.com",
|
||||||
|
"http://www.symantec.com",
|
||||||
|
"http://www.zdnet.com",
|
||||||
|
"http://www.fujitsu.com",
|
||||||
|
"http://www.supermicro.com",
|
||||||
|
"http://www.hotmail.com",
|
||||||
|
"http://www.ecma.com",
|
||||||
|
"http://www.bbc.co.uk",
|
||||||
|
"http://news.google.com",
|
||||||
|
"http://www.foxnews.com",
|
||||||
|
"http://www.msn.com",
|
||||||
|
"http://www.wired.com",
|
||||||
|
"http://www.sky.com",
|
||||||
|
"http://www.usatoday.com",
|
||||||
|
"http://www.cbs.com",
|
||||||
|
"http://www.nbc.com",
|
||||||
|
"http://slashdot.org",
|
||||||
|
"http://www.bloglines.com",
|
||||||
|
"http://www.techweb.com",
|
||||||
|
"http://www.newslink.org",
|
||||||
|
"http://www.un.org",
|
||||||
|
};
|
||||||
|
|
||||||
|
#define MAX 10 /* number of simultaneous transfers */
|
||||||
|
#define CNT sizeof(urls)/sizeof(char*) /* total number of transfers to do */
|
||||||
|
|
||||||
|
static int cb(char *d, size_t n, size_t l, void *p)
|
||||||
|
{
|
||||||
|
/* take care of the data here, ignored in this example */
|
||||||
|
(void)d;
|
||||||
|
(void)p;
|
||||||
|
return n*l;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void init(CURLM *cm, int i)
|
||||||
|
{
|
||||||
|
CURL *eh = curl_easy_init();
|
||||||
|
|
||||||
|
curl_easy_setopt(eh, CURLOPT_WRITEFUNCTION, cb);
|
||||||
|
curl_easy_setopt(eh, CURLOPT_HEADER, 0);
|
||||||
|
curl_easy_setopt(eh, CURLOPT_URL, urls[i]);
|
||||||
|
curl_easy_setopt(eh, CURLOPT_PRIVATE, urls[i]);
|
||||||
|
curl_easy_setopt(eh, CURLOPT_VERBOSE, 0);
|
||||||
|
|
||||||
|
curl_multi_add_handle(cm, eh);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
CURLM *cm;
|
||||||
|
CURLMsg *msg;
|
||||||
|
long L;
|
||||||
|
unsigned int C=0;
|
||||||
|
int M, Q, U = -1;
|
||||||
|
fd_set R, W, E;
|
||||||
|
struct timeval T;
|
||||||
|
|
||||||
|
curl_global_init(CURL_GLOBAL_ALL);
|
||||||
|
|
||||||
|
cm = curl_multi_init();
|
||||||
|
|
||||||
|
for (C = 0; C < MAX; ++C) {
|
||||||
|
init(cm, C);
|
||||||
|
}
|
||||||
|
|
||||||
|
while (U) {
|
||||||
|
while (CURLM_CALL_MULTI_PERFORM == curl_multi_perform(cm, &U));
|
||||||
|
|
||||||
|
if (U) {
|
||||||
|
FD_ZERO(&R);
|
||||||
|
FD_ZERO(&W);
|
||||||
|
FD_ZERO(&E);
|
||||||
|
|
||||||
|
if (curl_multi_fdset(cm, &R, &W, &E, &M)) {
|
||||||
|
fprintf(stderr, "E: curl_multi_fdset\n");
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* In a real-world program you OF COURSE check the return that maxfd is
|
||||||
|
bigger than -1 so that the call to select() below makes sense! */
|
||||||
|
|
||||||
|
if (curl_multi_timeout(cm, &L)) {
|
||||||
|
fprintf(stderr, "E: curl_multi_timeout\n");
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
T.tv_sec = L/1000;
|
||||||
|
T.tv_usec = (L%1000)*1000;
|
||||||
|
|
||||||
|
if (0 > select(M+1, &R, &W, &E, &T)) {
|
||||||
|
fprintf(stderr, "E: select\n");
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
while ((msg = curl_multi_info_read(cm, &Q))) {
|
||||||
|
if (msg->msg == CURLMSG_DONE) {
|
||||||
|
char *url;
|
||||||
|
CURL *e = msg->easy_handle;
|
||||||
|
curl_easy_getinfo(msg->easy_handle, CURLINFO_PRIVATE, &url);
|
||||||
|
fprintf(stderr, "R: %d - %s <%s>\n",
|
||||||
|
msg->data.result, curl_easy_strerror(msg->data.result), url);
|
||||||
|
curl_multi_remove_handle(cm, e);
|
||||||
|
curl_easy_cleanup(e);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
fprintf(stderr, "E: CURLMsg (%d)\n", msg->msg);
|
||||||
|
}
|
||||||
|
if (C < CNT) {
|
||||||
|
init(cm, C++);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
curl_multi_cleanup(cm);
|
||||||
|
curl_global_cleanup();
|
||||||
|
|
||||||
|
return EXIT_SUCCESS;
|
||||||
|
}
|
||||||
@@ -11,7 +11,8 @@ EXTRA_DIST = README curlgtk.c sepheaders.c simple.c postit2.c \
|
|||||||
multi-post.c fopen.c simplepost.c makefile.dj curlx.c https.c \
|
multi-post.c fopen.c simplepost.c makefile.dj curlx.c https.c \
|
||||||
multi-debugcallback.c fileupload.c getinfo.c ftp3rdparty.c debug.c \
|
multi-debugcallback.c fileupload.c getinfo.c ftp3rdparty.c debug.c \
|
||||||
anyauthput.c htmltitle.cc htmltidy.c opensslthreadlock.c \
|
anyauthput.c htmltitle.cc htmltidy.c opensslthreadlock.c \
|
||||||
cookie_interface.c cacertinmem.c synctime.c sampleconv.c ftpuploadresume.c
|
cookie_interface.c cacertinmem.c synctime.c sampleconv.c ftpuploadresume.c \
|
||||||
|
10-at-a-time.c hiperfifo.c ghiper.c
|
||||||
|
|
||||||
all:
|
all:
|
||||||
@echo "done"
|
@echo "done"
|
||||||
|
|||||||
@@ -26,9 +26,9 @@ want you do reorganize them like:
|
|||||||
$ `curl-config --cc` -o example example.c `curl-config --cflags --libs`
|
$ `curl-config --cc` -o example example.c `curl-config --cflags --libs`
|
||||||
|
|
||||||
*PLEASE* do not use the curl.haxx.se site as a test target for your libcurl
|
*PLEASE* do not use the curl.haxx.se site as a test target for your libcurl
|
||||||
applications/experiments. Even if the examples in this directory use that site
|
applications/experiments. Even if some of the examples use that site as a URL
|
||||||
as an example URL at some places, it doesn't mean that the URLs work or that
|
at some places, it doesn't mean that the URLs work or that we expect you to
|
||||||
we expect you to actually torture our web site with your tests! Thanks.
|
actually torture our web site with your tests! Thanks.
|
||||||
|
|
||||||
EXAMPLES
|
EXAMPLES
|
||||||
|
|
||||||
@@ -43,9 +43,13 @@ fopen.c - fopen() layer that supports opening URLs and files
|
|||||||
ftp3rdparty.c - FTP 3rd party transfer
|
ftp3rdparty.c - FTP 3rd party transfer
|
||||||
ftpget.c - simple getting a file from FTP
|
ftpget.c - simple getting a file from FTP
|
||||||
ftpgetresp.c - get the response strings from the FTP server
|
ftpgetresp.c - get the response strings from the FTP server
|
||||||
ftpupload.c - upload a file to a FTP server
|
ftpupload.c - upload a file to an FTP server
|
||||||
|
ftpuploadresume.c - resume an upload to an FTP server
|
||||||
getinfo.c - get the Content-Type from the recent transfer
|
getinfo.c - get the Content-Type from the recent transfer
|
||||||
getinmemory.c - download a file to memory only
|
getinmemory.c - download a file to memory only
|
||||||
|
ghiper.c - curl_multi_socket() using code with glib-2
|
||||||
|
hiperfifo.c - downloads all URLs written to the fifo, using
|
||||||
|
curl_multi_socket() and libevent
|
||||||
htmltitle.cc - download a HTML file and extract the <title> tag from a HTML
|
htmltitle.cc - download a HTML file and extract the <title> tag from a HTML
|
||||||
page using libxml
|
page using libxml
|
||||||
http-post.c - HTTP POST
|
http-post.c - HTTP POST
|
||||||
@@ -61,8 +65,12 @@ opensslthreadlock.c - show how to do locking when using OpenSSL multi-threaded
|
|||||||
persistant.c - request two URLs with a persistant connection
|
persistant.c - request two URLs with a persistant connection
|
||||||
post-callback.c - send a HTTP POST using a callback
|
post-callback.c - send a HTTP POST using a callback
|
||||||
postit2.c - send a HTTP multipart formpost
|
postit2.c - send a HTTP multipart formpost
|
||||||
|
sampleconv.c - showing how a program on a non-ASCII platform would invoke
|
||||||
|
callbacks to do its own codeset conversions instead of using
|
||||||
|
the built-in iconv functions in libcurl
|
||||||
sepheaders.c - download headers to a separate file
|
sepheaders.c - download headers to a separate file
|
||||||
simple.c - the most simple download a URL source
|
simple.c - the most simple download a URL source
|
||||||
simplepost.c - HTTP POST
|
simplepost.c - HTTP POST
|
||||||
simplessl.c - HTTPS example with certificates many options set
|
simplessl.c - HTTPS example with certificates many options set
|
||||||
synctime.c - Sync local time by extracing date from remote HTTP servers
|
synctime.c - Sync local time by extracing date from remote HTTP servers
|
||||||
|
10-at-a-time.c - Download many files simultaneously, 10 at a time.
|
||||||
|
|||||||
@@ -114,6 +114,13 @@ static char *curlx_usage[]={
|
|||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We use this ZERO_NULL to avoid picky compiler warnings,
|
||||||
|
* when assigning a NULL pointer to a function pointer var.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define ZERO_NULL 0
|
||||||
|
|
||||||
/* This is a context that we pass to all callbacks */
|
/* This is a context that we pass to all callbacks */
|
||||||
|
|
||||||
typedef struct sslctxparm_st {
|
typedef struct sslctxparm_st {
|
||||||
@@ -236,7 +243,7 @@ static CURLcode sslctxfun(CURL * curl, void * sslctx, void * parm) {
|
|||||||
|
|
||||||
SSL_CTX_set_verify_depth(ctx,2);
|
SSL_CTX_set_verify_depth(ctx,2);
|
||||||
|
|
||||||
SSL_CTX_set_verify(ctx,SSL_VERIFY_PEER,NULL);
|
SSL_CTX_set_verify(ctx,SSL_VERIFY_PEER,ZERO_NULL);
|
||||||
|
|
||||||
SSL_CTX_set_cert_verify_callback(ctx, ssl_app_verify_callback, parm);
|
SSL_CTX_set_cert_verify_callback(ctx, ssl_app_verify_callback, parm);
|
||||||
|
|
||||||
|
|||||||
@@ -84,6 +84,9 @@ int my_trace(CURL *handle, curl_infotype type,
|
|||||||
case CURLINFO_DATA_OUT:
|
case CURLINFO_DATA_OUT:
|
||||||
text = "=> Send data";
|
text = "=> Send data";
|
||||||
break;
|
break;
|
||||||
|
case CURLINFO_SSL_DATA_OUT:
|
||||||
|
text = "=> Send SSL data";
|
||||||
|
break;
|
||||||
case CURLINFO_HEADER_IN:
|
case CURLINFO_HEADER_IN:
|
||||||
text = "<= Recv header";
|
text = "<= Recv header";
|
||||||
break;
|
break;
|
||||||
@@ -93,9 +96,6 @@ int my_trace(CURL *handle, curl_infotype type,
|
|||||||
case CURLINFO_SSL_DATA_IN:
|
case CURLINFO_SSL_DATA_IN:
|
||||||
text = "<= Recv SSL data";
|
text = "<= Recv SSL data";
|
||||||
break;
|
break;
|
||||||
case CURLINFO_SSL_DATA_OUT:
|
|
||||||
text = "<= Send SSL data";
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
dump(text, stderr, data, size, config->trace_ascii);
|
dump(text, stderr, data, size, config->trace_ascii);
|
||||||
|
|||||||
@@ -153,6 +153,10 @@ fill_buffer(URL_FILE *file,int want,int waittime)
|
|||||||
/* get file descriptors from the transfers */
|
/* get file descriptors from the transfers */
|
||||||
curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd);
|
curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd);
|
||||||
|
|
||||||
|
/* In a real-world program you OF COURSE check the return code of the
|
||||||
|
function calls, *and* you make sure that maxfd is bigger than -1
|
||||||
|
so that the call to select() below makes sense! */
|
||||||
|
|
||||||
rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
|
rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
|
||||||
|
|
||||||
switch(rc) {
|
switch(rc) {
|
||||||
|
|||||||
461
docs/examples/ghiper.c
Normal file
461
docs/examples/ghiper.c
Normal file
@@ -0,0 +1,461 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* _ _ ____ _
|
||||||
|
* Project ___| | | | _ \| |
|
||||||
|
* / __| | | | |_) | |
|
||||||
|
* | (__| |_| | _ <| |___
|
||||||
|
* \___|\___/|_| \_\_____|
|
||||||
|
*
|
||||||
|
* $Id$
|
||||||
|
*
|
||||||
|
* Example application source code using the multi socket interface to
|
||||||
|
* download many files at once.
|
||||||
|
*
|
||||||
|
* Written by Jeff Pohlmeyer
|
||||||
|
|
||||||
|
Requires glib-2.x and a (POSIX?) system that has mkfifo().
|
||||||
|
|
||||||
|
This is an adaptation of libcurl's "hipev.c" and libevent's "event-test.c"
|
||||||
|
sample programs, adapted to use glib's g_io_channel in place of libevent.
|
||||||
|
|
||||||
|
When running, the program creates the named pipe "hiper.fifo"
|
||||||
|
|
||||||
|
Whenever there is input into the fifo, the program reads the input as a list
|
||||||
|
of URL's and creates some new easy handles to fetch each URL via the
|
||||||
|
curl_multi "hiper" API.
|
||||||
|
|
||||||
|
|
||||||
|
Thus, you can try a single URL:
|
||||||
|
% echo http://www.yahoo.com > hiper.fifo
|
||||||
|
|
||||||
|
Or a whole bunch of them:
|
||||||
|
% cat my-url-list > hiper.fifo
|
||||||
|
|
||||||
|
The fifo buffer is handled almost instantly, so you can even add more URL's
|
||||||
|
while the previous requests are still being downloaded.
|
||||||
|
|
||||||
|
This is purely a demo app, all retrieved data is simply discarded by the write
|
||||||
|
callback.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <glib.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <curl/curl.h>
|
||||||
|
|
||||||
|
|
||||||
|
#define MSG_OUT g_print /* Change to "g_error" to write to stderr */
|
||||||
|
#define SHOW_VERBOSE 0 /* Set to non-zero for libcurl messages */
|
||||||
|
#define SHOW_PROGRESS 0 /* Set to non-zero to enable progress callback */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* Global information, common to all connections */
|
||||||
|
typedef struct _GlobalInfo {
|
||||||
|
CURLM *multi;
|
||||||
|
guint timer_event;
|
||||||
|
int prev_running;
|
||||||
|
int still_running;
|
||||||
|
int requested; /* count: curl_easy_init() */
|
||||||
|
int completed; /* count: curl_easy_cleanup() */
|
||||||
|
} GlobalInfo;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* Information associated with a specific easy handle */
|
||||||
|
typedef struct _ConnInfo {
|
||||||
|
CURL *easy;
|
||||||
|
char *url;
|
||||||
|
GlobalInfo *global;
|
||||||
|
char error[CURL_ERROR_SIZE];
|
||||||
|
} ConnInfo;
|
||||||
|
|
||||||
|
|
||||||
|
/* Information associated with a specific socket */
|
||||||
|
typedef struct _SockInfo {
|
||||||
|
curl_socket_t sockfd;
|
||||||
|
CURL *easy;
|
||||||
|
int action;
|
||||||
|
long timeout;
|
||||||
|
GIOChannel *ch;
|
||||||
|
guint ev;
|
||||||
|
GlobalInfo *global;
|
||||||
|
} SockInfo;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* Die if we get a bad CURLMcode somewhere */
|
||||||
|
static void mcode_or_die(char *where, CURLMcode code) {
|
||||||
|
if ( CURLM_OK != code ) {
|
||||||
|
char *s;
|
||||||
|
switch (code) {
|
||||||
|
case CURLM_CALL_MULTI_PERFORM: s="CURLM_CALL_MULTI_PERFORM"; break;
|
||||||
|
case CURLM_OK: s="CURLM_OK"; break;
|
||||||
|
case CURLM_BAD_HANDLE: s="CURLM_BAD_HANDLE"; break;
|
||||||
|
case CURLM_BAD_EASY_HANDLE: s="CURLM_BAD_EASY_HANDLE"; break;
|
||||||
|
case CURLM_OUT_OF_MEMORY: s="CURLM_OUT_OF_MEMORY"; break;
|
||||||
|
case CURLM_INTERNAL_ERROR: s="CURLM_INTERNAL_ERROR"; break;
|
||||||
|
case CURLM_BAD_SOCKET: s="CURLM_BAD_SOCKET"; break;
|
||||||
|
case CURLM_UNKNOWN_OPTION: s="CURLM_UNKNOWN_OPTION"; break;
|
||||||
|
case CURLM_LAST: s="CURLM_LAST"; break;
|
||||||
|
default: s="CURLM_unknown";
|
||||||
|
}
|
||||||
|
MSG_OUT("ERROR: %s returns %s\n", where, s);
|
||||||
|
exit(code);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* Check for completed transfers, and remove their easy handles */
|
||||||
|
static void check_run_count(GlobalInfo *g)
|
||||||
|
{
|
||||||
|
if (g->prev_running > g->still_running) {
|
||||||
|
char *eff_url=NULL;
|
||||||
|
CURLMsg *msg;
|
||||||
|
int msgs_left;
|
||||||
|
ConnInfo *conn=NULL;
|
||||||
|
CURL*easy;
|
||||||
|
CURLcode res;
|
||||||
|
|
||||||
|
MSG_OUT("REMAINING: %d\n", g->still_running);
|
||||||
|
/*
|
||||||
|
I am still uncertain whether it is safe to remove an easy handle
|
||||||
|
from inside the curl_multi_info_read loop, so here I will search
|
||||||
|
for completed transfers in the inner "while" loop, and then remove
|
||||||
|
them in the outer "do-while" loop...
|
||||||
|
*/
|
||||||
|
do {
|
||||||
|
easy=NULL;
|
||||||
|
while ((msg = curl_multi_info_read(g->multi, &msgs_left))) {
|
||||||
|
if (msg->msg == CURLMSG_DONE) {
|
||||||
|
easy=msg->easy_handle;
|
||||||
|
res=msg->data.result;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (easy) {
|
||||||
|
curl_easy_getinfo(easy, CURLINFO_PRIVATE, &conn);
|
||||||
|
curl_easy_getinfo(easy, CURLINFO_EFFECTIVE_URL, &eff_url);
|
||||||
|
MSG_OUT("DONE: %s => (%d) %s\n", eff_url, res, conn->error);
|
||||||
|
curl_multi_remove_handle(g->multi, easy);
|
||||||
|
g_free(conn->url);
|
||||||
|
curl_easy_cleanup(easy);
|
||||||
|
g_free(conn);
|
||||||
|
g->completed++;
|
||||||
|
}
|
||||||
|
} while ( easy );
|
||||||
|
MSG_OUT("Requested: %d Completed:%d\n", g->requested, g->completed);
|
||||||
|
}
|
||||||
|
g->prev_running = g->still_running;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* Called by glib when our timeout expires */
|
||||||
|
static gboolean timer_cb(gpointer data)
|
||||||
|
{
|
||||||
|
GlobalInfo *g = (GlobalInfo *)data;
|
||||||
|
CURLMcode rc;
|
||||||
|
|
||||||
|
do {
|
||||||
|
rc = curl_multi_socket(g->multi, CURL_SOCKET_TIMEOUT, &g->still_running);
|
||||||
|
} while (rc == CURLM_CALL_MULTI_PERFORM);
|
||||||
|
mcode_or_die("timer_cb: curl_multi_socket", rc);
|
||||||
|
check_run_count(g);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* Update the event timer after curl_multi library calls */
|
||||||
|
static int update_timeout_cb(CURLM *multi, long timeout_ms, void *userp)
|
||||||
|
{
|
||||||
|
struct timeval timeout;
|
||||||
|
GlobalInfo *g=(GlobalInfo *)userp;
|
||||||
|
timeout.tv_sec = timeout_ms/1000;
|
||||||
|
timeout.tv_usec = (timeout_ms%1000)*1000;
|
||||||
|
|
||||||
|
MSG_OUT("*** update_timeout_cb %ld => %ld:%ld ***\n",
|
||||||
|
timeout_ms, timeout.tv_sec, timeout.tv_usec);
|
||||||
|
|
||||||
|
g->timer_event = g_timeout_add(timeout_ms, timer_cb, g);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* Called by glib when we get action on a multi socket */
|
||||||
|
static gboolean event_cb(GIOChannel *ch, GIOCondition condition, gpointer data)
|
||||||
|
{
|
||||||
|
GlobalInfo *g = (GlobalInfo*) data;
|
||||||
|
CURLMcode rc;
|
||||||
|
int fd=g_io_channel_unix_get_fd(ch);
|
||||||
|
do {
|
||||||
|
rc = curl_multi_socket(g->multi, fd, &g->still_running);
|
||||||
|
} while (rc == CURLM_CALL_MULTI_PERFORM);
|
||||||
|
mcode_or_die("event_cb: curl_multi_socket", rc);
|
||||||
|
check_run_count(g);
|
||||||
|
if(g->still_running) {
|
||||||
|
return TRUE;
|
||||||
|
} else {
|
||||||
|
MSG_OUT("last transfer done, kill timeout\n");
|
||||||
|
if (g->timer_event) { g_source_remove(g->timer_event); }
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* Clean up the SockInfo structure */
|
||||||
|
static void remsock(SockInfo *f)
|
||||||
|
{
|
||||||
|
if (!f) { return; }
|
||||||
|
if (f->ev) { g_source_remove(f->ev); }
|
||||||
|
g_free(f);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* Assign information to a SockInfo structure */
|
||||||
|
static void setsock(SockInfo*f, curl_socket_t s, CURL*e, int act, GlobalInfo*g)
|
||||||
|
{
|
||||||
|
GIOCondition kind =
|
||||||
|
(act&CURL_POLL_IN?G_IO_IN:0)|(act&CURL_POLL_OUT?G_IO_OUT:0);
|
||||||
|
|
||||||
|
f->sockfd = s;
|
||||||
|
f->action = act;
|
||||||
|
f->easy = e;
|
||||||
|
if (f->ev) { g_source_remove(f->ev); }
|
||||||
|
f->ev=g_io_add_watch(f->ch, kind, event_cb,g);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* Initialize a new SockInfo structure */
|
||||||
|
static void addsock(curl_socket_t s, CURL *easy, int action, GlobalInfo *g)
|
||||||
|
{
|
||||||
|
SockInfo *fdp = g_malloc0(sizeof(SockInfo));
|
||||||
|
|
||||||
|
fdp->global = g;
|
||||||
|
fdp->ch=g_io_channel_unix_new(s);
|
||||||
|
setsock(fdp, s, easy, action, g);
|
||||||
|
curl_multi_assign(g->multi, s, fdp);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* CURLMOPT_SOCKETFUNCTION */
|
||||||
|
static int sock_cb(CURL *e, curl_socket_t s, int what, void *cbp, void *sockp)
|
||||||
|
{
|
||||||
|
GlobalInfo *g = (GlobalInfo*) cbp;
|
||||||
|
SockInfo *fdp = (SockInfo*) sockp;
|
||||||
|
char *whatstr[]={ "none", "IN", "OUT", "INOUT", "REMOVE" };
|
||||||
|
|
||||||
|
MSG_OUT("socket callback: s=%d e=%p what=%s ", s, e, whatstr[what]);
|
||||||
|
if (what == CURL_POLL_REMOVE) {
|
||||||
|
MSG_OUT("\n");
|
||||||
|
remsock(fdp);
|
||||||
|
} else {
|
||||||
|
if (!fdp) {
|
||||||
|
MSG_OUT("Adding data: %s%s\n",
|
||||||
|
what&CURL_POLL_IN?"READ":"",
|
||||||
|
what&CURL_POLL_OUT?"WRITE":"" );
|
||||||
|
addsock(s, e, what, g);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
MSG_OUT(
|
||||||
|
"Changing action from %d to %d\n", fdp->action, what);
|
||||||
|
setsock(fdp, s, e, what, g);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* CURLOPT_WRITEFUNCTION */
|
||||||
|
static size_t write_cb(void *ptr, size_t size, size_t nmemb, void *data)
|
||||||
|
{
|
||||||
|
size_t realsize = size * nmemb;
|
||||||
|
ConnInfo *conn = (ConnInfo*) data;
|
||||||
|
(void)ptr;
|
||||||
|
(void)conn;
|
||||||
|
return realsize;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* CURLOPT_PROGRESSFUNCTION */
|
||||||
|
static int prog_cb (void *p, double dltotal, double dlnow, double ult, double uln)
|
||||||
|
{
|
||||||
|
ConnInfo *conn = (ConnInfo *)p;
|
||||||
|
MSG_OUT("Progress: %s (%g/%g)\n", conn->url, dlnow, dltotal);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* Create a new easy handle, and add it to the global curl_multi */
|
||||||
|
static void new_conn(char *url, GlobalInfo *g )
|
||||||
|
{
|
||||||
|
ConnInfo *conn;
|
||||||
|
CURLMcode rc;
|
||||||
|
|
||||||
|
conn = g_malloc0(sizeof(ConnInfo));
|
||||||
|
|
||||||
|
conn->error[0]='\0';
|
||||||
|
|
||||||
|
conn->easy = curl_easy_init();
|
||||||
|
if (!conn->easy) {
|
||||||
|
MSG_OUT("curl_easy_init() failed, exiting!\n");
|
||||||
|
exit(2);
|
||||||
|
}
|
||||||
|
conn->global = g;
|
||||||
|
conn->url = g_strdup(url);
|
||||||
|
curl_easy_setopt(conn->easy, CURLOPT_URL, conn->url);
|
||||||
|
curl_easy_setopt(conn->easy, CURLOPT_WRITEFUNCTION, write_cb);
|
||||||
|
curl_easy_setopt(conn->easy, CURLOPT_WRITEDATA, &conn);
|
||||||
|
curl_easy_setopt(conn->easy, CURLOPT_VERBOSE, SHOW_VERBOSE);
|
||||||
|
curl_easy_setopt(conn->easy, CURLOPT_ERRORBUFFER, conn->error);
|
||||||
|
curl_easy_setopt(conn->easy, CURLOPT_PRIVATE, conn);
|
||||||
|
curl_easy_setopt(conn->easy, CURLOPT_NOPROGRESS, SHOW_PROGRESS?0:1);
|
||||||
|
curl_easy_setopt(conn->easy, CURLOPT_PROGRESSFUNCTION, prog_cb);
|
||||||
|
curl_easy_setopt(conn->easy, CURLOPT_PROGRESSDATA, conn);
|
||||||
|
curl_easy_setopt(conn->easy, CURLOPT_FOLLOWLOCATION, 1);
|
||||||
|
curl_easy_setopt(conn->easy, CURLOPT_CONNECTTIMEOUT, 30);
|
||||||
|
curl_easy_setopt(conn->easy, CURLOPT_LOW_SPEED_LIMIT, 1);
|
||||||
|
curl_easy_setopt(conn->easy, CURLOPT_LOW_SPEED_TIME, 30);
|
||||||
|
|
||||||
|
MSG_OUT("Adding easy %p to multi %p (%s)\n", conn->easy, g->multi, url);
|
||||||
|
rc =curl_multi_add_handle(g->multi, conn->easy);
|
||||||
|
mcode_or_die("new_conn: curl_multi_add_handle", rc);
|
||||||
|
g->requested++;
|
||||||
|
do {
|
||||||
|
rc = curl_multi_socket_all(g->multi, &g->still_running);
|
||||||
|
} while (CURLM_CALL_MULTI_PERFORM == rc);
|
||||||
|
mcode_or_die("new_conn: curl_multi_socket_all", rc);
|
||||||
|
check_run_count(g);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* This gets called by glib whenever data is received from the fifo */
|
||||||
|
static gboolean fifo_cb (GIOChannel *ch, GIOCondition condition, gpointer data)
|
||||||
|
{
|
||||||
|
#define BUF_SIZE 1024
|
||||||
|
gsize len, tp;
|
||||||
|
gchar *buf, *tmp, *all=NULL;
|
||||||
|
GIOStatus rv;
|
||||||
|
|
||||||
|
do {
|
||||||
|
GError *err=NULL;
|
||||||
|
rv = g_io_channel_read_line (ch,&buf,&len,&tp,&err);
|
||||||
|
if ( buf ) {
|
||||||
|
if (tp) { buf[tp]='\0'; }
|
||||||
|
new_conn(buf,(GlobalInfo*)data);
|
||||||
|
g_free(buf);
|
||||||
|
} else {
|
||||||
|
buf = g_malloc(BUF_SIZE+1);
|
||||||
|
while (TRUE) {
|
||||||
|
buf[BUF_SIZE]='\0';
|
||||||
|
g_io_channel_read_chars(ch,buf,BUF_SIZE,&len,&err);
|
||||||
|
if (len) {
|
||||||
|
buf[len]='\0';
|
||||||
|
if (all) {
|
||||||
|
tmp=all;
|
||||||
|
all=g_strdup_printf("%s%s", tmp, buf);
|
||||||
|
g_free(tmp);
|
||||||
|
} else {
|
||||||
|
all = g_strdup(buf);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (all) {
|
||||||
|
new_conn(all,(GlobalInfo*)data);
|
||||||
|
g_free(all);
|
||||||
|
}
|
||||||
|
g_free(buf);
|
||||||
|
}
|
||||||
|
if ( err ) {
|
||||||
|
g_error("fifo_cb: %s", err->message);
|
||||||
|
g_free(err);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} while ( (len) && (rv == G_IO_STATUS_NORMAL) );
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int init_fifo(void)
|
||||||
|
{
|
||||||
|
struct stat st;
|
||||||
|
char *fifo = "hiper.fifo";
|
||||||
|
int socket;
|
||||||
|
|
||||||
|
if (lstat (fifo, &st) == 0) {
|
||||||
|
if ((st.st_mode & S_IFMT) == S_IFREG) {
|
||||||
|
errno = EEXIST;
|
||||||
|
perror("lstat");
|
||||||
|
exit (1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
unlink (fifo);
|
||||||
|
if (mkfifo (fifo, 0600) == -1) {
|
||||||
|
perror("mkfifo");
|
||||||
|
exit (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
socket = open (fifo, O_RDWR | O_NONBLOCK, 0);
|
||||||
|
|
||||||
|
if (socket == -1) {
|
||||||
|
perror("open");
|
||||||
|
exit (1);
|
||||||
|
}
|
||||||
|
MSG_OUT("Now, pipe some URL's into > %s\n", fifo);
|
||||||
|
|
||||||
|
return socket;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
GlobalInfo *g;
|
||||||
|
CURLMcode rc;
|
||||||
|
GMainLoop*gmain;
|
||||||
|
int fd;
|
||||||
|
GIOChannel* ch;
|
||||||
|
g=g_malloc0(sizeof(GlobalInfo));
|
||||||
|
|
||||||
|
fd=init_fifo();
|
||||||
|
ch=g_io_channel_unix_new(fd);
|
||||||
|
g_io_add_watch(ch,G_IO_IN,fifo_cb,g);
|
||||||
|
gmain=g_main_loop_new(NULL,FALSE);
|
||||||
|
g->multi = curl_multi_init();
|
||||||
|
curl_multi_setopt(g->multi, CURLMOPT_SOCKETFUNCTION, sock_cb);
|
||||||
|
curl_multi_setopt(g->multi, CURLMOPT_SOCKETDATA, g);
|
||||||
|
curl_multi_setopt(g->multi, CURLMOPT_TIMERFUNCTION, update_timeout_cb);
|
||||||
|
curl_multi_setopt(g->multi, CURLMOPT_TIMERDATA, g);
|
||||||
|
do {
|
||||||
|
rc = curl_multi_socket_all(g->multi, &g->still_running);
|
||||||
|
} while (CURLM_CALL_MULTI_PERFORM == rc);
|
||||||
|
g_main_loop_run(gmain);
|
||||||
|
curl_multi_cleanup(g->multi);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
416
docs/examples/hiperfifo.c
Normal file
416
docs/examples/hiperfifo.c
Normal file
@@ -0,0 +1,416 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* _ _ ____ _
|
||||||
|
* Project ___| | | | _ \| |
|
||||||
|
* / __| | | | |_) | |
|
||||||
|
* | (__| |_| | _ <| |___
|
||||||
|
* \___|\___/|_| \_\_____|
|
||||||
|
*
|
||||||
|
* $Id$
|
||||||
|
*
|
||||||
|
* Example application source code using the multi socket interface to
|
||||||
|
* download many files at once.
|
||||||
|
*
|
||||||
|
* Written by Jeff Pohlmeyer
|
||||||
|
|
||||||
|
Requires libevent and a (POSIX?) system that has mkfifo().
|
||||||
|
|
||||||
|
This is an adaptation of libcurl's "hipev.c" and libevent's "event-test.c"
|
||||||
|
sample programs.
|
||||||
|
|
||||||
|
When running, the program creates the named pipe "hiper.fifo"
|
||||||
|
|
||||||
|
Whenever there is input into the fifo, the program reads the input as a list
|
||||||
|
of URL's and creates some new easy handles to fetch each URL via the
|
||||||
|
curl_multi "hiper" API.
|
||||||
|
|
||||||
|
|
||||||
|
Thus, you can try a single URL:
|
||||||
|
% echo http://www.yahoo.com > hiper.fifo
|
||||||
|
|
||||||
|
Or a whole bunch of them:
|
||||||
|
% cat my-url-list > hiper.fifo
|
||||||
|
|
||||||
|
The fifo buffer is handled almost instantly, so you can even add more URL's
|
||||||
|
while the previous requests are still being downloaded.
|
||||||
|
|
||||||
|
Note:
|
||||||
|
For the sake of simplicity, URL length is limited to 1023 char's !
|
||||||
|
|
||||||
|
This is purely a demo app, all retrieved data is simply discarded by the write
|
||||||
|
callback.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <sys/poll.h>
|
||||||
|
#include <curl/curl.h>
|
||||||
|
#include <event.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
|
||||||
|
#define MSG_OUT stdout /* Send info to stdout, change to stderr if you want */
|
||||||
|
|
||||||
|
|
||||||
|
/* Global information, common to all connections */
|
||||||
|
typedef struct _GlobalInfo {
|
||||||
|
struct event fifo_event;
|
||||||
|
struct event timer_event;
|
||||||
|
CURLM *multi;
|
||||||
|
int prev_running;
|
||||||
|
int still_running;
|
||||||
|
FILE* input;
|
||||||
|
} GlobalInfo;
|
||||||
|
|
||||||
|
|
||||||
|
/* Information associated with a specific easy handle */
|
||||||
|
typedef struct _ConnInfo {
|
||||||
|
CURL *easy;
|
||||||
|
char *url;
|
||||||
|
GlobalInfo *global;
|
||||||
|
char error[CURL_ERROR_SIZE];
|
||||||
|
} ConnInfo;
|
||||||
|
|
||||||
|
|
||||||
|
/* Information associated with a specific socket */
|
||||||
|
typedef struct _SockInfo {
|
||||||
|
curl_socket_t sockfd;
|
||||||
|
CURL *easy;
|
||||||
|
int action;
|
||||||
|
long timeout;
|
||||||
|
struct event ev;
|
||||||
|
int evset;
|
||||||
|
GlobalInfo *global;
|
||||||
|
} SockInfo;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* Update the event timer after curl_multi library calls */
|
||||||
|
static void update_timeout(GlobalInfo *g)
|
||||||
|
{
|
||||||
|
long timeout_ms;
|
||||||
|
struct timeval timeout;
|
||||||
|
|
||||||
|
curl_multi_timeout(g->multi, &timeout_ms);
|
||||||
|
if(timeout_ms < 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
timeout.tv_sec = timeout_ms/1000;
|
||||||
|
timeout.tv_usec = (timeout_ms%1000)*1000;
|
||||||
|
evtimer_add(&g->timer_event, &timeout);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* Die if we get a bad CURLMcode somewhere */
|
||||||
|
void mcode_or_die(char *where, CURLMcode code) {
|
||||||
|
if ( CURLM_OK != code ) {
|
||||||
|
char *s;
|
||||||
|
switch (code) {
|
||||||
|
case CURLM_CALL_MULTI_PERFORM: s="CURLM_CALL_MULTI_PERFORM"; break;
|
||||||
|
case CURLM_OK: s="CURLM_OK"; break;
|
||||||
|
case CURLM_BAD_HANDLE: s="CURLM_BAD_HANDLE"; break;
|
||||||
|
case CURLM_BAD_EASY_HANDLE: s="CURLM_BAD_EASY_HANDLE"; break;
|
||||||
|
case CURLM_OUT_OF_MEMORY: s="CURLM_OUT_OF_MEMORY"; break;
|
||||||
|
case CURLM_INTERNAL_ERROR: s="CURLM_INTERNAL_ERROR"; break;
|
||||||
|
case CURLM_BAD_SOCKET: s="CURLM_BAD_SOCKET"; break;
|
||||||
|
case CURLM_UNKNOWN_OPTION: s="CURLM_UNKNOWN_OPTION"; break;
|
||||||
|
case CURLM_LAST: s="CURLM_LAST"; break;
|
||||||
|
default: s="CURLM_unknown";
|
||||||
|
}
|
||||||
|
fprintf(MSG_OUT, "ERROR: %s returns %s\n", where, s);
|
||||||
|
exit(code);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* Check for completed transfers, and remove their easy handles */
|
||||||
|
static void check_run_count(GlobalInfo *g)
|
||||||
|
{
|
||||||
|
if (g->prev_running > g->still_running) {
|
||||||
|
char *eff_url=NULL;
|
||||||
|
CURLMsg *msg;
|
||||||
|
int msgs_left;
|
||||||
|
ConnInfo *conn=NULL;
|
||||||
|
CURL*easy;
|
||||||
|
CURLcode res;
|
||||||
|
|
||||||
|
fprintf(MSG_OUT, "REMAINING: %d\n", g->still_running);
|
||||||
|
/*
|
||||||
|
I am still uncertain whether it is safe to remove an easy handle
|
||||||
|
from inside the curl_multi_info_read loop, so here I will search
|
||||||
|
for completed transfers in the inner "while" loop, and then remove
|
||||||
|
them in the outer "do-while" loop...
|
||||||
|
*/
|
||||||
|
do {
|
||||||
|
easy=NULL;
|
||||||
|
while ((msg = curl_multi_info_read(g->multi, &msgs_left))) {
|
||||||
|
if (msg->msg == CURLMSG_DONE) {
|
||||||
|
easy=msg->easy_handle;
|
||||||
|
res=msg->data.result;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (easy) {
|
||||||
|
curl_easy_getinfo(easy, CURLINFO_PRIVATE, &conn);
|
||||||
|
curl_easy_getinfo(easy, CURLINFO_EFFECTIVE_URL, &eff_url);
|
||||||
|
fprintf(MSG_OUT, "DONE: %s => (%d) %s\n", eff_url, res, conn->error);
|
||||||
|
curl_multi_remove_handle(g->multi, easy);
|
||||||
|
free(conn->url);
|
||||||
|
curl_easy_cleanup(easy);
|
||||||
|
free(conn);
|
||||||
|
}
|
||||||
|
} while ( easy );
|
||||||
|
}
|
||||||
|
g->prev_running = g->still_running;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* Called by libevent when we get action on a multi socket */
|
||||||
|
static void event_cb(int fd, short kind, void *userp)
|
||||||
|
{
|
||||||
|
GlobalInfo *g = (GlobalInfo*) userp;
|
||||||
|
CURLMcode rc;
|
||||||
|
|
||||||
|
do {
|
||||||
|
rc = curl_multi_socket(g->multi, fd, &g->still_running);
|
||||||
|
} while (rc == CURLM_CALL_MULTI_PERFORM);
|
||||||
|
mcode_or_die("event_cb: curl_multi_socket", rc);
|
||||||
|
check_run_count(g);
|
||||||
|
if(g->still_running) {
|
||||||
|
update_timeout(g);
|
||||||
|
} else {
|
||||||
|
fprintf(MSG_OUT, "last transfer done, kill timeout\n");
|
||||||
|
if (evtimer_pending(&g->timer_event, NULL)) {
|
||||||
|
evtimer_del(&g->timer_event);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* Called by libevent when our timeout expires */
|
||||||
|
static void timer_cb(int fd, short kind, void *userp)
|
||||||
|
{
|
||||||
|
(void)fd;
|
||||||
|
(void)kind;
|
||||||
|
GlobalInfo *g = (GlobalInfo *)userp;
|
||||||
|
CURLMcode rc;
|
||||||
|
|
||||||
|
do {
|
||||||
|
rc = curl_multi_socket(g->multi, CURL_SOCKET_TIMEOUT, &g->still_running);
|
||||||
|
} while (rc == CURLM_CALL_MULTI_PERFORM);
|
||||||
|
mcode_or_die("timer_cb: curl_multi_socket", rc);
|
||||||
|
check_run_count(g);
|
||||||
|
if ( g->still_running ) { update_timeout(g); }
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* Clean up the SockInfo structure */
|
||||||
|
static void remsock(SockInfo *f)
|
||||||
|
{
|
||||||
|
if (!f) { return; }
|
||||||
|
if (f->evset) { event_del(&f->ev); }
|
||||||
|
free(f);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* Assign information to a SockInfo structure */
|
||||||
|
static void setsock(SockInfo*f, curl_socket_t s, CURL*e, int act, GlobalInfo*g)
|
||||||
|
{
|
||||||
|
int kind =
|
||||||
|
(act&CURL_POLL_IN?EV_READ:0)|(act&CURL_POLL_OUT?EV_WRITE:0)|EV_PERSIST;
|
||||||
|
|
||||||
|
f->sockfd = s;
|
||||||
|
f->action = act;
|
||||||
|
f->easy = e;
|
||||||
|
if (f->evset) { event_del(&f->ev); }
|
||||||
|
event_set( &f->ev, f->sockfd, kind, event_cb, g);
|
||||||
|
f->evset=1;
|
||||||
|
event_add(&f->ev, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* Initialize a new SockInfo structure */
|
||||||
|
static void addsock(curl_socket_t s, CURL *easy, int action, GlobalInfo *g) {
|
||||||
|
SockInfo *fdp = calloc(sizeof(SockInfo), 1);
|
||||||
|
|
||||||
|
fdp->global = g;
|
||||||
|
setsock(fdp, s, easy, action, g);
|
||||||
|
curl_multi_assign(g->multi, s, fdp);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* CURLMOPT_SOCKETFUNCTION */
|
||||||
|
static int sock_cb(CURL *e, curl_socket_t s, int what, void *cbp, void *sockp)
|
||||||
|
{
|
||||||
|
GlobalInfo *g = (GlobalInfo*) cbp;
|
||||||
|
SockInfo *fdp = (SockInfo*) sockp;
|
||||||
|
char *whatstr[]={ "none", "IN", "OUT", "INOUT", "REMOVE" };
|
||||||
|
|
||||||
|
fprintf(MSG_OUT,
|
||||||
|
"socket callback: s=%d e=%p what=%s ", s, e, whatstr[what]);
|
||||||
|
if (what == CURL_POLL_REMOVE) {
|
||||||
|
fprintf(MSG_OUT, "\n");
|
||||||
|
remsock(fdp);
|
||||||
|
} else {
|
||||||
|
if (!fdp) {
|
||||||
|
fprintf(MSG_OUT, "Adding data: %s%s\n",
|
||||||
|
what&CURL_POLL_IN?"READ":"",
|
||||||
|
what&CURL_POLL_OUT?"WRITE":"" );
|
||||||
|
addsock(s, e, what, g);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
fprintf(MSG_OUT,
|
||||||
|
"Changing action from %d to %d\n", fdp->action, what);
|
||||||
|
setsock(fdp, s, e, what, g);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* CURLOPT_WRITEFUNCTION */
|
||||||
|
static size_t write_cb(void *ptr, size_t size, size_t nmemb, void *data)
|
||||||
|
{
|
||||||
|
size_t realsize = size * nmemb;
|
||||||
|
ConnInfo *conn = (ConnInfo*) data;
|
||||||
|
(void)ptr;
|
||||||
|
(void)conn;
|
||||||
|
return realsize;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* CURLOPT_PROGRESSFUNCTION */
|
||||||
|
int prog_cb (void *p, double dltotal, double dlnow, double ult, double uln)
|
||||||
|
{
|
||||||
|
ConnInfo *conn = (ConnInfo *)p;
|
||||||
|
fprintf(MSG_OUT, "Progress: %s (%g/%g)\n", conn->url, dlnow, dltotal);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Create a new easy handle, and add it to the global curl_multi */
|
||||||
|
void new_conn(char *url, GlobalInfo *g ) {
|
||||||
|
ConnInfo *conn;
|
||||||
|
CURLMcode rc;
|
||||||
|
|
||||||
|
conn = calloc(1, sizeof(ConnInfo));
|
||||||
|
memset(conn, 0, sizeof(ConnInfo));
|
||||||
|
conn->error[0]='\0';
|
||||||
|
|
||||||
|
conn->easy = curl_easy_init();
|
||||||
|
if (!conn->easy) {
|
||||||
|
fprintf(MSG_OUT, "curl_easy_init() failed, exiting!\n");
|
||||||
|
exit(2);
|
||||||
|
}
|
||||||
|
conn->global = g;
|
||||||
|
conn->url = strdup(url);
|
||||||
|
curl_easy_setopt(conn->easy, CURLOPT_URL, conn->url);
|
||||||
|
curl_easy_setopt(conn->easy, CURLOPT_WRITEFUNCTION, write_cb);
|
||||||
|
curl_easy_setopt(conn->easy, CURLOPT_WRITEDATA, &conn);
|
||||||
|
curl_easy_setopt(conn->easy, CURLOPT_VERBOSE, 0);
|
||||||
|
curl_easy_setopt(conn->easy, CURLOPT_ERRORBUFFER, conn->error);
|
||||||
|
curl_easy_setopt(conn->easy, CURLOPT_PRIVATE, conn);
|
||||||
|
curl_easy_setopt(conn->easy, CURLOPT_NOPROGRESS, 0);
|
||||||
|
curl_easy_setopt(conn->easy, CURLOPT_PROGRESSFUNCTION, prog_cb);
|
||||||
|
curl_easy_setopt(conn->easy, CURLOPT_PROGRESSDATA, conn);
|
||||||
|
fprintf(MSG_OUT,
|
||||||
|
"Adding easy %p to multi %p (%s)\n", conn->easy, g->multi, url);
|
||||||
|
rc =curl_multi_add_handle(g->multi, conn->easy);
|
||||||
|
mcode_or_die("new_conn: curl_multi_add_handle", rc);
|
||||||
|
do {
|
||||||
|
rc = curl_multi_socket_all(g->multi, &g->still_running);
|
||||||
|
} while (CURLM_CALL_MULTI_PERFORM == rc);
|
||||||
|
mcode_or_die("new_conn: curl_multi_socket_all", rc);
|
||||||
|
check_run_count(g);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* This gets called whenever data is received from the fifo */
|
||||||
|
void fifo_cb(int fd, short event, void *arg) {
|
||||||
|
char s[1024];
|
||||||
|
long int rv=0;
|
||||||
|
int n=0;
|
||||||
|
GlobalInfo *g = (GlobalInfo *)arg;
|
||||||
|
|
||||||
|
do {
|
||||||
|
s[0]='\0';
|
||||||
|
rv=fscanf(g->input, "%1023s%n", s, &n);
|
||||||
|
s[n]='\0';
|
||||||
|
if ( n && s[0] ) {
|
||||||
|
new_conn(s,arg); /* if we read a URL, go get it! */
|
||||||
|
} else break;
|
||||||
|
} while ( rv != EOF);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* Create a named pipe and tell libevent to monitor it */
|
||||||
|
int init_fifo (GlobalInfo *g) {
|
||||||
|
struct stat st;
|
||||||
|
char *fifo = "hiper.fifo";
|
||||||
|
int socket;
|
||||||
|
|
||||||
|
fprintf(MSG_OUT, "Creating named pipe \"%s\"\n", fifo);
|
||||||
|
if (lstat (fifo, &st) == 0) {
|
||||||
|
if ((st.st_mode & S_IFMT) == S_IFREG) {
|
||||||
|
errno = EEXIST;
|
||||||
|
perror("lstat");
|
||||||
|
exit (1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
unlink(fifo);
|
||||||
|
if (mkfifo (fifo, 0600) == -1) {
|
||||||
|
perror("mkfifo");
|
||||||
|
exit (1);
|
||||||
|
}
|
||||||
|
socket = open(fifo, O_RDWR | O_NONBLOCK, 0);
|
||||||
|
if (socket == -1) {
|
||||||
|
perror("open");
|
||||||
|
exit (1);
|
||||||
|
}
|
||||||
|
g->input = fdopen(socket, "r");
|
||||||
|
|
||||||
|
fprintf(MSG_OUT, "Now, pipe some URL's into > %s\n", fifo);
|
||||||
|
event_set(&g->fifo_event, socket, EV_READ | EV_PERSIST, fifo_cb, g);
|
||||||
|
event_add(&g->fifo_event, NULL);
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
GlobalInfo g;
|
||||||
|
CURLMcode rc;
|
||||||
|
|
||||||
|
memset(&g, 0, sizeof(GlobalInfo));
|
||||||
|
event_init();
|
||||||
|
init_fifo(&g);
|
||||||
|
g.multi = curl_multi_init();
|
||||||
|
evtimer_set(&g.timer_event, timer_cb, &g);
|
||||||
|
curl_multi_setopt(g.multi, CURLMOPT_SOCKETFUNCTION, sock_cb);
|
||||||
|
curl_multi_setopt(g.multi, CURLMOPT_SOCKETDATA, &g);
|
||||||
|
do {
|
||||||
|
rc = curl_multi_socket_all(g.multi, &g.still_running);
|
||||||
|
} while (CURLM_CALL_MULTI_PERFORM == rc);
|
||||||
|
update_timeout(&g);
|
||||||
|
event_dispatch();
|
||||||
|
curl_multi_cleanup(g.multi);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
@@ -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,20 +18,24 @@ endif
|
|||||||
|
|
||||||
LIBS += $(WATT32_ROOT)/lib/libwatt.a $(ZLIB_ROOT)/libz.a
|
LIBS += $(WATT32_ROOT)/lib/libwatt.a $(ZLIB_ROOT)/libz.a
|
||||||
|
|
||||||
PROGRAMS = fopen.exe ftpget.exe ftpgetresp.exe ftpupload.exe \
|
CSOURCES = fopen.c ftpget.c ftpgetresp.c ftpupload.c getinmemory.c \
|
||||||
getinmemory.exe http-post.exe httpput.exe multi-app.exe \
|
http-post.c httpput.c https.c multi-app.c multi-double.c \
|
||||||
multi-double.exe multi-post.exe multi-single.exe \
|
multi-post.c multi-single.c persistant.c post-callback.c \
|
||||||
persistant.exe post-callback.exe postit2.exe \
|
postit2.c sepheaders.c simple.c simplepost.c simplessl.c \
|
||||||
sepheaders.exe simple.exe simplessl.exe https.exe \
|
multi-debugcallback.c fileupload.c getinfo.c anyauthput.c \
|
||||||
ftp3rdparty.exe getinfo.exe anyauthput.exe \
|
10-at-a-time.c # ftpuploadresume.c ftp3rdparty.c cookie_interface.c
|
||||||
cookie_interface.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
|
||||||
|
|
||||||
|
-include depend.dj
|
||||||
|
|
||||||
|
|||||||
@@ -80,6 +80,10 @@ int main(int argc, char **argv)
|
|||||||
/* get file descriptors from the transfers */
|
/* get file descriptors from the transfers */
|
||||||
curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd);
|
curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd);
|
||||||
|
|
||||||
|
/* In a real-world program you OF COURSE check the return code of the
|
||||||
|
function calls, *and* you make sure that maxfd is bigger than -1 so
|
||||||
|
that the call to select() below makes sense! */
|
||||||
|
|
||||||
rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
|
rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
|
||||||
|
|
||||||
switch(rc) {
|
switch(rc) {
|
||||||
|
|||||||
@@ -153,6 +153,10 @@ int main(int argc, char **argv)
|
|||||||
/* get file descriptors from the transfers */
|
/* get file descriptors from the transfers */
|
||||||
curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd);
|
curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd);
|
||||||
|
|
||||||
|
/* In a real-world program you OF COURSE check the return code of the
|
||||||
|
function calls, *and* you make sure that maxfd is bigger than -1
|
||||||
|
so that the call to select() below makes sense! */
|
||||||
|
|
||||||
rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
|
rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
|
||||||
|
|
||||||
switch(rc) {
|
switch(rc) {
|
||||||
|
|||||||
@@ -71,6 +71,10 @@ int main(int argc, char **argv)
|
|||||||
/* get file descriptors from the transfers */
|
/* get file descriptors from the transfers */
|
||||||
curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd);
|
curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd);
|
||||||
|
|
||||||
|
/* In a real-world program you OF COURSE check the return code of the
|
||||||
|
function calls, *and* you make sure that maxfd is bigger than -1 so
|
||||||
|
that the call to select() below makes sense! */
|
||||||
|
|
||||||
rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
|
rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
|
||||||
|
|
||||||
switch(rc) {
|
switch(rc) {
|
||||||
|
|||||||
@@ -93,6 +93,10 @@ int main(int argc, char *argv[])
|
|||||||
/* get file descriptors from the transfers */
|
/* get file descriptors from the transfers */
|
||||||
curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd);
|
curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd);
|
||||||
|
|
||||||
|
/* In a real-world program you OF COURSE check the return code of the
|
||||||
|
function calls, *and* you make sure that maxfd is bigger than -1
|
||||||
|
so that the call to select() below makes sense! */
|
||||||
|
|
||||||
rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
|
rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
|
||||||
|
|
||||||
switch(rc) {
|
switch(rc) {
|
||||||
|
|||||||
@@ -65,6 +65,10 @@ int main(int argc, char **argv)
|
|||||||
/* get file descriptors from the transfers */
|
/* get file descriptors from the transfers */
|
||||||
curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd);
|
curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd);
|
||||||
|
|
||||||
|
/* In a real-world program you OF COURSE check the return code of the
|
||||||
|
function calls, *and* you make sure that maxfd is bigger than -1 so
|
||||||
|
that the call to select() below makes sense! */
|
||||||
|
|
||||||
rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
|
rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
|
||||||
|
|
||||||
switch(rc) {
|
switch(rc) {
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* _ _ ____ _
|
* _ _ ____ _
|
||||||
* Project ___| | | | _ \| |
|
* Project ___| | | | _ \| |
|
||||||
* / __| | | | |_) | |
|
* / __| | | | |_) | |
|
||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* $Id$
|
* $Id$
|
||||||
@@ -41,9 +41,6 @@ int main(int argc, char **argv)
|
|||||||
/* no progress meter please */
|
/* no progress meter please */
|
||||||
curl_easy_setopt(curl_handle, CURLOPT_NOPROGRESS, 1);
|
curl_easy_setopt(curl_handle, CURLOPT_NOPROGRESS, 1);
|
||||||
|
|
||||||
/* shut up completely */
|
|
||||||
curl_easy_setopt(curl_handle, CURLOPT_MUTE, 1);
|
|
||||||
|
|
||||||
/* send all data to this function */
|
/* send all data to this function */
|
||||||
curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, write_data);
|
curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, write_data);
|
||||||
|
|
||||||
|
|||||||
@@ -9,6 +9,18 @@
|
|||||||
*
|
*
|
||||||
* This example code only builds as-is on Windows.
|
* This example code only builds as-is on Windows.
|
||||||
*
|
*
|
||||||
|
* While Unix/Linux user, you do not need this software.
|
||||||
|
* You can achieve the same result as synctime using curl, awk and date.
|
||||||
|
* Set proxy as according to your network, but beware of proxy Cache-Control.
|
||||||
|
*
|
||||||
|
* To set your system clock, root access is required.
|
||||||
|
* # date -s "`curl -sI http://nist.time.gov/timezone.cgi?UTC/s/0 \
|
||||||
|
* | awk -F': ' '/Date: / {print $2}'`"
|
||||||
|
*
|
||||||
|
* To view remote webserver date and time.
|
||||||
|
* $ curl -sI http://nist.time.gov/timezone.cgi?UTC/s/0 \
|
||||||
|
* | awk -F': ' '/Date: / {print $2}'
|
||||||
|
*
|
||||||
* Synchronising your computer clock via Internet time server usually relies
|
* Synchronising your computer clock via Internet time server usually relies
|
||||||
* on DAYTIME, TIME, or NTP protocols. These protocols provide good accurate
|
* on DAYTIME, TIME, or NTP protocols. These protocols provide good accurate
|
||||||
* time synchronisation but it does not work very well through a
|
* time synchronisation but it does not work very well through a
|
||||||
@@ -300,10 +312,11 @@ int main(int argc, char *argv[])
|
|||||||
MthStr[LOCALTime.wMonth-1], LOCALTime.wYear,
|
MthStr[LOCALTime.wMonth-1], LOCALTime.wYear,
|
||||||
LOCALTime.wHour, LOCALTime.wMinute, LOCALTime.wSecond,
|
LOCALTime.wHour, LOCALTime.wMinute, LOCALTime.wSecond,
|
||||||
LOCALTime.wMilliseconds);
|
LOCALTime.wMilliseconds);
|
||||||
fprintf(stderr, "\nBefore HTTP. Date: %s%s\n\n", timeBuf, tzoneBuf);
|
|
||||||
|
fprintf(stderr, "Fetch: %s\n\n", conf->timeserver);
|
||||||
|
fprintf(stderr, "Before HTTP. Date: %s%s\n\n", timeBuf, tzoneBuf);
|
||||||
|
|
||||||
/* HTTP HEAD command to the Webserver */
|
/* HTTP HEAD command to the Webserver */
|
||||||
fprintf(stderr, "Fetch: %s\n", conf->timeserver);
|
|
||||||
SyncTime_CURL_Fetch(curl, conf->timeserver, "index.htm",
|
SyncTime_CURL_Fetch(curl, conf->timeserver, "index.htm",
|
||||||
HTTP_COMMAND_HEAD);
|
HTTP_COMMAND_HEAD);
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
.\" nroff -man [file]
|
.\" nroff -man [file]
|
||||||
.\" $Id$
|
.\" $Id$
|
||||||
.\"
|
.\"
|
||||||
.TH curl_easy_cleanup 3 "13 Nov 2002" "libcurl 7.7" "libcurl Manual"
|
.TH curl_easy_cleanup 3 "12 Oct 2006" "libcurl 7.7" "libcurl Manual"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
curl_easy_cleanup - End a libcurl easy session
|
curl_easy_cleanup - End a libcurl easy session
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
@@ -21,6 +21,9 @@ more files.
|
|||||||
|
|
||||||
When you've called this, you can safely remove all the strings you've
|
When you've called this, you can safely remove all the strings you've
|
||||||
previously told libcurl to use, as it won't use them anymore now.
|
previously told libcurl to use, as it won't use them anymore now.
|
||||||
|
|
||||||
|
Any uses of the \fBhandle\fP after this function has been called are
|
||||||
|
illegal. This kills the handle and all memory associated with it!
|
||||||
.SH RETURN VALUE
|
.SH RETURN VALUE
|
||||||
None
|
None
|
||||||
.SH "SEE ALSO"
|
.SH "SEE ALSO"
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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 curl_easy_setopt 3 "19 Apr 2006" "libcurl 7.15.4" "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
|
||||||
@@ -344,6 +344,14 @@ when showing the progress meter and displaying \fICURLOPT_VERBOSE\fP data.
|
|||||||
A non-zero parameter tells the library to fail silently if the HTTP code
|
A non-zero parameter tells the library to fail silently if the HTTP code
|
||||||
returned is equal to or larger than 400. The default action would be to return
|
returned is equal to or larger than 400. The default action would be to return
|
||||||
the page normally, ignoring that code.
|
the page normally, ignoring that code.
|
||||||
|
|
||||||
|
This method is not fail-safe and there are occasions where non-succesful
|
||||||
|
response codes will slip through, especially when authentication is involved
|
||||||
|
(response codes 401 and 407).
|
||||||
|
|
||||||
|
You might get some amounts of headers transferred before this situation is
|
||||||
|
detected, like for when a "100-continue" is received as a response to a
|
||||||
|
POST/PUT and a 401 or 407 is received immediately afterwards.
|
||||||
.SH NETWORK OPTIONS
|
.SH NETWORK OPTIONS
|
||||||
.IP CURLOPT_URL
|
.IP CURLOPT_URL
|
||||||
The actual URL to deal with. The parameter should be a char * to a zero
|
The actual URL to deal with. The parameter should be a char * to a zero
|
||||||
@@ -381,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.
|
||||||
@@ -807,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
|
||||||
@@ -917,18 +937,21 @@ Try "AUTH SSL" first, and only if that fails try "AUTH TLS"
|
|||||||
.IP CURLFTPAUTH_TLS
|
.IP CURLFTPAUTH_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_SOURCE_URL
|
.IP CURLOPT_FTP_SSL_CCC
|
||||||
When set, it enables a FTP third party transfer, using the set URL as source,
|
If enabled, this option makes libcurl use CCC (Clear Command Channel). It
|
||||||
while \fICURLOPT_URL\fP is the target.
|
shuts down the SSL/TLS layer after authenticating. The rest of the
|
||||||
.IP CURLOPT_SOURCE_USERPWD
|
control channel communication will be unencrypted. This allows NAT routers
|
||||||
Set "username:password" to use for the source connection when doing FTP third
|
to follow the FTP transaction. Pass a long using one of the values below.
|
||||||
party transfers.
|
(Added in 7.16.1)
|
||||||
.IP CURLOPT_SOURCE_QUOTE
|
.RS
|
||||||
Exactly like \fICURLOPT_QUOTE\fP, but for the source host.
|
.IP CURLFTPSSL_CCC_NONE
|
||||||
.IP CURLOPT_SOURCE_PREQUOTE
|
Don't attempt to use CCC.
|
||||||
Exactly like \fICURLOPT_PREQUOTE\fP, but for the source host.
|
.IP CURLFTPSSL_CCC_PASSIVE
|
||||||
.IP CURLOPT_SOURCE_POSTQUOTE
|
Do not initiate the shutdown, but wait for the server to do it. Do not send
|
||||||
Exactly like \fICURLOPT_POSTQUOTE\fP, but for the source host.
|
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,
|
||||||
@@ -973,7 +996,9 @@ techniques). Pass a NULL to this option to disable the use of ranges.
|
|||||||
.IP CURLOPT_RESUME_FROM
|
.IP CURLOPT_RESUME_FROM
|
||||||
Pass a long as parameter. It contains the offset in number of bytes that you
|
Pass a long as parameter. It contains the offset in number of bytes that you
|
||||||
want the transfer to start from. Set this option to 0 to make the transfer
|
want the transfer to start from. Set this option to 0 to make the transfer
|
||||||
start from the beginning (effectively disabling resume).
|
start from the beginning (effectively disabling resume). For FTP, set this
|
||||||
|
option to -1 to make the transfer start from the end of the target file
|
||||||
|
(useful to continue an interrupted upload).
|
||||||
.IP CURLOPT_RESUME_FROM_LARGE
|
.IP CURLOPT_RESUME_FROM_LARGE
|
||||||
Pass a curl_off_t as parameter. It contains the offset in number of bytes that
|
Pass a curl_off_t as parameter. It contains the offset in number of bytes that
|
||||||
you want the transfer to start from. (Added in 7.11.0)
|
you want the transfer to start from. (Added in 7.11.0)
|
||||||
@@ -1010,10 +1035,16 @@ to POST with \fICURLOPT_POST\fP etc.
|
|||||||
When uploading a file to a remote site, this option should be used to tell
|
When uploading a file to a remote site, this option should be used to tell
|
||||||
libcurl what the expected size of the infile is. This value should be passed
|
libcurl what the expected size of the infile is. This value should be passed
|
||||||
as a long. See also \fICURLOPT_INFILESIZE_LARGE\fP.
|
as a long. See also \fICURLOPT_INFILESIZE_LARGE\fP.
|
||||||
|
|
||||||
|
Note that this option does not limit how much data libcurl will actually send,
|
||||||
|
as that is controlled entirely by what the read callback returns.
|
||||||
.IP CURLOPT_INFILESIZE_LARGE
|
.IP CURLOPT_INFILESIZE_LARGE
|
||||||
When uploading a file to a remote site, this option should be used to tell
|
When uploading a file to a remote site, this option should be used to tell
|
||||||
libcurl what the expected size of the infile is. This value should be passed
|
libcurl what the expected size of the infile is. This value should be passed
|
||||||
as a curl_off_t. (Added in 7.11.0)
|
as a curl_off_t. (Added in 7.11.0)
|
||||||
|
|
||||||
|
Note that this option does not limit how much data libcurl will actually send,
|
||||||
|
as that is controlled entirely by what the read callback returns.
|
||||||
.IP CURLOPT_UPLOAD
|
.IP CURLOPT_UPLOAD
|
||||||
A non-zero parameter tells the library to prepare for an upload. The
|
A non-zero parameter tells the library to prepare for an upload. The
|
||||||
\fICURLOPT_READDATA\fP and \fICURLOPT_INFILESIZE\fP or
|
\fICURLOPT_READDATA\fP and \fICURLOPT_INFILESIZE\fP or
|
||||||
@@ -1068,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
|
||||||
@@ -1077,13 +1112,15 @@ Pass a long as parameter. It contains the time in seconds that the transfer
|
|||||||
should be below the \fICURLOPT_LOW_SPEED_LIMIT\fP for the library to consider
|
should be below the \fICURLOPT_LOW_SPEED_LIMIT\fP for the library to consider
|
||||||
it too slow and abort.
|
it too slow and abort.
|
||||||
.IP CURLOPT_MAX_SEND_SPEED_LARGE
|
.IP CURLOPT_MAX_SEND_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 an upload exceeds this speed on cumulative
|
||||||
average during the transfer, the transfer will pause to keep the average rate
|
average during the transfer, the transfer will pause to keep the average rate
|
||||||
less than or equal to the parameter value. (default: 0, unlimited)
|
less than or equal to the parameter value. Defaults to unlimited
|
||||||
|
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. (default: 0, unlimited)
|
average rate less than or equal to the parameter value. Defaults to unlimited
|
||||||
|
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
|
||||||
@@ -1092,23 +1129,14 @@ value unless you are perfectly aware of how this work and changes libcurl's
|
|||||||
behaviour. This concerns connection using any of the protocols that support
|
behaviour. This concerns connection using any of the protocols that support
|
||||||
persistent connections.
|
persistent connections.
|
||||||
|
|
||||||
When reaching the maximum limit, curl uses the \fICURLOPT_CLOSEPOLICY\fP to
|
When reaching the maximum limit, curl closes the oldest one in the cache to
|
||||||
figure out which of the existing connections to close to prevent the number of
|
prevent the number of open connections to increase.
|
||||||
open connections to increase.
|
|
||||||
|
|
||||||
If you already have performed transfers with this curl handle, setting a
|
If you already have performed transfers with this curl handle, setting a
|
||||||
smaller MAXCONNECTS than before may cause open connections to get closed
|
smaller MAXCONNECTS than before may cause open connections to get closed
|
||||||
unnecessarily.
|
unnecessarily.
|
||||||
.IP CURLOPT_CLOSEPOLICY
|
.IP CURLOPT_CLOSEPOLICY
|
||||||
Pass a long. This option sets what policy libcurl should use when the
|
(Obsolete) This option does nothing.
|
||||||
connection cache is filled and one of the open connections has to be closed to
|
|
||||||
make room for a new connection. This must be one of the CURLCLOSEPOLICY_*
|
|
||||||
defines. Use \fICURLCLOSEPOLICY_LEAST_RECENTLY_USED\fP to make libcurl close
|
|
||||||
the connection that was least recently used, that connection is also least
|
|
||||||
likely to be capable of re-use. Use \fICURLCLOSEPOLICY_OLDEST\fP to make
|
|
||||||
libcurl close the oldest connection, the one that was created first among the
|
|
||||||
ones in the connection cache. The other close policies are not support
|
|
||||||
yet.
|
|
||||||
.IP CURLOPT_FRESH_CONNECT
|
.IP CURLOPT_FRESH_CONNECT
|
||||||
Pass a long. Set to non-zero to make the next transfer use a new (fresh)
|
Pass a long. Set to non-zero to make the next transfer use a new (fresh)
|
||||||
connection by force. If the connection cache is full before this connection,
|
connection by force. If the connection cache is full before this connection,
|
||||||
@@ -1132,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
|
||||||
@@ -1157,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
|
||||||
@@ -1182,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
|
||||||
@@ -1201,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
|
||||||
@@ -1245,15 +1281,18 @@ 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
|
Pass a char * to a zero terminated string naming a directory holding multiple
|
||||||
multiple CA certificates to verify the peer with. The certificate
|
CA certificates to verify the peer with. The certificate directory must be
|
||||||
directory must be prepared using the openssl c_rehash utility. This
|
prepared using the openssl c_rehash utility. This makes sense only when used
|
||||||
makes sense only when used in combination with the
|
in combination with the \fICURLOPT_SSL_VERIFYPEER\fP option. If
|
||||||
\fICURLOPT_SSL_VERIFYPEER\fP option. If \fICURLOPT_SSL_VERIFYPEER\fP
|
\fICURLOPT_SSL_VERIFYPEER\fP is zero, \fICURLOPT_CAPATH\fP need not even
|
||||||
is zero, \fICURLOPT_CAPATH\fP need not even indicate an accessible
|
indicate an accessible path. The \fICURLOPT_CAPATH\fP function apparently
|
||||||
path. The \fICURLOPT_CAPATH\fP function apparently does not work in
|
does not work in Windows due to some limitation in openssl. This option is
|
||||||
Windows due to some limitation in openssl. (Added in 7.9.8)
|
OpenSSL-specific and does nothing if libcurl is built to use GnuTLS.
|
||||||
.IP CURLOPT_RANDOM_FILE
|
.IP CURLOPT_RANDOM_FILE
|
||||||
Pass a char * to a zero terminated file name. The file will be used to read
|
Pass a char * to a zero terminated file name. The file will be used to read
|
||||||
from to seed the random engine for SSL. The more random the specified file is,
|
from to seed the random engine for SSL. The more random the specified file is,
|
||||||
@@ -1294,18 +1333,47 @@ 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
|
||||||
|
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
|
||||||
|
cache. Note that while nothing ever should get hurt by attempting to reuse SSL
|
||||||
|
session-IDs, there seem to be broken SSL implementations in the wild that may
|
||||||
|
require you to disable this in order for you to succeed. (Added in 7.16.0)
|
||||||
.IP CURLOPT_KRB4LEVEL
|
.IP CURLOPT_KRB4LEVEL
|
||||||
Pass a char * as parameter. Set the krb4 security level, this also enables
|
Pass a char * as parameter. Set the krb4 security level, this also enables
|
||||||
krb4 awareness. This is a string, 'clear', 'safe', 'confidential' or
|
krb4 awareness. This is a string, 'clear', 'safe', 'confidential' or
|
||||||
\&'private'. If the string is set but doesn't match one of these, 'private'
|
\&'private'. If the string is set but doesn't match one of these, 'private'
|
||||||
will be used. Set the string to NULL to disable kerberos4. The kerberos
|
will be used. Set the string to NULL to disable kerberos4. The kerberos
|
||||||
support only works for FTP.
|
support only works for FTP.
|
||||||
|
.SH SSH OPTIONS
|
||||||
|
.IP CURLOPT_SSH_AUTH_TYPES
|
||||||
|
Pass a long set to a bitmask consisting of one or more of
|
||||||
|
CURLSSH_AUTH_PUBLICKEY, CURLSSH_AUTH_PASSWORD, CURLSSH_AUTH_HOST,
|
||||||
|
CURLSSH_AUTH_KEYBOARD. Set CURLSSH_AUTH_ANY to let libcurl pick one.
|
||||||
|
.IP CURLOPT_SSH_PUBLIC_KEYFILE
|
||||||
|
Pass a char * pointing to a file name for your public key. If not used,
|
||||||
|
libcurl defaults to using \fB~/.ssh/id_dsa.pub\fP.
|
||||||
|
.IP CURLOPT_SSH_PRIVATE_KEYFILE
|
||||||
|
Pass a char * pointing to a file name for your private key. If not used,
|
||||||
|
libcurl defaults to using \fB~/.ssh/id_dsa\fP.
|
||||||
|
If the file is password-protected, set the password with \fICURLOPT_SSLKEYPASSWD\fP.
|
||||||
.SH OTHER OPTIONS
|
.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
|
||||||
|
|||||||
@@ -20,8 +20,14 @@ NULL is returned as a signal that there is no more to get at this point. The
|
|||||||
integer pointed to with \fImsgs_in_queue\fP will contain the number of
|
integer pointed to with \fImsgs_in_queue\fP will contain the number of
|
||||||
remaining messages after this function was called.
|
remaining messages after this function was called.
|
||||||
|
|
||||||
|
When you fetch a message using this function, it is removed from the internal
|
||||||
|
queue so calling this function again will not return the same message
|
||||||
|
again. It will instead return new messages at each new invoke until the queue
|
||||||
|
is emptied.
|
||||||
|
|
||||||
The data the returned pointer points to will not survive calling
|
The data the returned pointer points to will not survive calling
|
||||||
\fIcurl_multi_cleanup(3)\fP or \fIcurl_multi_remove_handle(3)\fP.
|
\fIcurl_multi_cleanup(3)\fP, \fIcurl_multi_remove_handle(3)\fP or
|
||||||
|
\fIcurl_easy_cleanup(3)\fP.
|
||||||
|
|
||||||
The 'CURLMsg' struct is very simple and only contain very basic information.
|
The 'CURLMsg' struct is very simple and only contain very basic information.
|
||||||
If more involved information is wanted, the particular "easy handle" in
|
If more involved information is wanted, the particular "easy handle" in
|
||||||
@@ -37,6 +43,12 @@ present in that struct and can thus be used in subsequent regular
|
|||||||
CURLcode result; /* return code for transfer */
|
CURLcode result; /* return code for transfer */
|
||||||
} data;
|
} data;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
When \fBmsg\fP is \fICURLMSG_DONE\fP, the message identifies a transfer that
|
||||||
|
is done, and then \fBresult\fP contains the return code for the easy handle
|
||||||
|
that just completed.
|
||||||
|
|
||||||
|
At this point, there is no other \fBmsg\fP types defined.
|
||||||
.SH "RETURN VALUE"
|
.SH "RETURN VALUE"
|
||||||
A pointer to a filled-in struct, or NULL if it failed or ran out of
|
A pointer to a filled-in struct, or NULL if it failed or ran out of
|
||||||
structs. It also writes the number of messages left in the queue (after this
|
structs. It also writes the number of messages left in the queue (after this
|
||||||
|
|||||||
@@ -30,11 +30,15 @@ If you receive \fICURLM_CALL_MULTI_PERFORM\fP, this basically means that you
|
|||||||
should call \fIcurl_multi_perform\fP again, before you select() on more
|
should call \fIcurl_multi_perform\fP again, before you select() on more
|
||||||
actions. You don't have to do it immediately, but the return code means that
|
actions. You don't have to do it immediately, but the return code means that
|
||||||
libcurl may have more data available to return or that there may be more data
|
libcurl may have more data available to return or that there may be more data
|
||||||
to send off before it is "satisfied".
|
to send off before it is "satisfied". Do note that \fIcurl_multi_perform(3)\fP
|
||||||
|
will return \fICURLM_CALL_MULTI_PERFORM\fP only when it wants to be called
|
||||||
|
again \fBimmediately\fP. When things are fine and there are nothing immediate
|
||||||
|
it wants done, it'll return \fICURLM_OK\fP and you need to wait for \&"action"
|
||||||
|
and then call this function again.
|
||||||
|
|
||||||
NOTE that this only returns errors etc regarding the whole multi stack. There
|
NOTE that this only returns errors etc regarding the whole multi stack. There
|
||||||
might still have occurred problems on individual transfers even when this
|
might still have occurred problems on individual transfers even when this
|
||||||
function returns OK.
|
function returns \fICURLM_OK\fP.
|
||||||
.SH "TYPICAL USAGE"
|
.SH "TYPICAL USAGE"
|
||||||
Most applications will use \fIcurl_multi_fdset(3)\fP to get the multi_handle's
|
Most applications will use \fIcurl_multi_fdset(3)\fP to get the multi_handle's
|
||||||
file descriptors, then it'll wait for action on them using \fBselect(3)\fP and
|
file descriptors, then it'll wait for action on them using \fBselect(3)\fP and
|
||||||
@@ -42,4 +46,5 @@ as soon as one or more of them are ready, \fIcurl_multi_perform(3)\fP gets
|
|||||||
called.
|
called.
|
||||||
.SH "SEE ALSO"
|
.SH "SEE ALSO"
|
||||||
.BR curl_multi_cleanup "(3), " curl_multi_init "(3), "
|
.BR curl_multi_cleanup "(3), " curl_multi_init "(3), "
|
||||||
.BR curl_multi_fdset "(3), " curl_multi_info_read "(3)"
|
.BR curl_multi_fdset "(3), " curl_multi_info_read "(3), "
|
||||||
|
.BR libcurl-errors "(3)"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
.\" $Id$
|
.\" $Id$
|
||||||
.\"
|
.\"
|
||||||
.TH curl_multi_setopt 3 "8 Jan 2006" "libcurl 7.16.0" "libcurl Manual"
|
.TH curl_multi_setopt 3 "10 Oct 2006" "libcurl 7.16.0" "libcurl Manual"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
curl_multi_setopt \- set options for a curl multi handle
|
curl_multi_setopt \- set options for a curl multi handle
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
@@ -9,7 +9,7 @@ curl_multi_setopt \- set options for a curl multi handle
|
|||||||
CURLMcode curl_multi_setopt(CURLM * multi_handle, CURLMoption option, param);
|
CURLMcode curl_multi_setopt(CURLM * multi_handle, CURLMoption option, param);
|
||||||
.SH DESCRIPTION
|
.SH DESCRIPTION
|
||||||
curl_multi_setopt() is used to tell a libcurl multi handle how to behave. By
|
curl_multi_setopt() is used to tell a libcurl multi handle how to behave. By
|
||||||
using the appropriate options to \fIcurl_multi_setopt\fP, you can change
|
using the appropriate options to \fIcurl_multi_setopt(3)\fP, you can change
|
||||||
libcurl's behaviour when using that multi handle. All options are set with
|
libcurl's behaviour when using that multi handle. All options are set with
|
||||||
the \fIoption\fP followed by the parameter \fIparam\fP. That parameter can be
|
the \fIoption\fP followed by the parameter \fIparam\fP. That parameter can be
|
||||||
a \fBlong\fP, a \fBfunction pointer\fP, an \fBobject pointer\fP or a
|
a \fBlong\fP, a \fBfunction pointer\fP, an \fBobject pointer\fP or a
|
||||||
@@ -19,19 +19,43 @@ You can only set one option in each function call.
|
|||||||
|
|
||||||
.SH OPTIONS
|
.SH OPTIONS
|
||||||
.IP CURLMOPT_SOCKETFUNCTION
|
.IP CURLMOPT_SOCKETFUNCTION
|
||||||
Pass a pointer to a function matching the curl_socket_callback prototype. The
|
Pass a pointer to a function matching the \fBcurl_socket_callback\fP
|
||||||
\fIcurl_multi_socket(3)\fP functions inform the application about updates in
|
prototype. The \fIcurl_multi_socket(3)\fP functions inform the application
|
||||||
the socket (file descriptor) status by doing none, one or multiple calls to
|
about updates in the socket (file descriptor) status by doing none, one or
|
||||||
the curl_socket_callback given in the \fBparam\fP argument. They update the
|
multiple calls to the curl_socket_callback given in the \fBparam\fP
|
||||||
status with changes since the previous time a \fIcurl_multi_socket(3)\fP
|
argument. They update the status with changes since the previous time a
|
||||||
function was called. If the given callback pointer is NULL, no callback will
|
\fIcurl_multi_socket(3)\fP function was called. If the given callback pointer
|
||||||
be called. Set the callback's \fBuserp\fP argument with
|
is NULL, no callback will be called. Set the callback's \fBuserp\fP argument
|
||||||
\fICURLMOPT_SOCKETDATA\fP. See \fIcurl_multi_socket(3)\fP for more callback
|
with \fICURLMOPT_SOCKETDATA\fP. See \fIcurl_multi_socket(3)\fP for more
|
||||||
details.
|
callback details.
|
||||||
.IP CURLMOPT_SOCKETDATA
|
.IP CURLMOPT_SOCKETDATA
|
||||||
Pass a pointer to whatever you want passed to the curl_socket_callback's forth
|
Pass a pointer to whatever you want passed to the \fBcurl_socket_callback\fP's
|
||||||
argument, the userp pointer. This is not used by libcurl but only passed-thru
|
forth argument, the userp pointer. This is not used by libcurl but only
|
||||||
as-is. Set the callback pointer with \fICURLMOPT_SOCKETFUNCTION\fP.
|
passed-thru as-is. Set the callback pointer with
|
||||||
|
\fICURLMOPT_SOCKETFUNCTION\fP.
|
||||||
|
.IP CURLMOPT_PIPELINING
|
||||||
|
Pass a long set to 1 to enable or 0 to disable. Enabling pipelining on a multi
|
||||||
|
handle will make it attempt to perform HTTP Pipelining as far as possible for
|
||||||
|
transfers using this handle. This means that if you add a second request that
|
||||||
|
can use an already existing connection, the second request will be \&"piped"
|
||||||
|
on the same connection rather than being executed in parallell. (Added in
|
||||||
|
7.16.0)
|
||||||
|
.IP CURLMOPT_TIMERFUNCTION
|
||||||
|
Pass a pointer to a function matching the \fBcurl_multi_timer_callback\fP
|
||||||
|
prototype. This function will then be called when the timeout value
|
||||||
|
changes. The timeout value is at what latest time the application should call
|
||||||
|
one of the \&"performing" functions of the multi interface
|
||||||
|
(\fIcurl_multi_socket(3)\fP, \fIcurl_multi_socket_all(3)\fP and
|
||||||
|
\fIcurl_multi_perform(3)\fP) - to allow libcurl to keep timeouts and retries
|
||||||
|
etc to work. Libcurl attempts to limit calling this only when the fixed future
|
||||||
|
timeout time actually change. See also \fICURLMOPT_TIMERDATA\fP. This callback
|
||||||
|
can be used instead of, or in addition to, \fIcurl_multi_timeout(3)\fP. (Added
|
||||||
|
in 7.16.0)
|
||||||
|
.IP CURLMOPT_TIMERDATA
|
||||||
|
Pass a pointer to whatever you want passed to the
|
||||||
|
\fBcurl_multi_timer_callback\fP's third argument, the userp pointer. This is
|
||||||
|
not used by libcurl but only passed-thru as-is. Set the callback pointer with
|
||||||
|
\fICURLMOPT_TIMERFUNCTION\fP. (Added in 7.16.0)
|
||||||
.SH RETURNS
|
.SH RETURNS
|
||||||
The standard CURLMcode for multi interface error codes. Note that it returns a
|
The standard CURLMcode for multi interface error codes. Note that it returns a
|
||||||
CURLM_UNKNOWN_OPTION if you try setting an option that this version of libcurl
|
CURLM_UNKNOWN_OPTION if you try setting an option that this version of libcurl
|
||||||
|
|||||||
@@ -24,8 +24,9 @@ The list should be freed again (after usage) with
|
|||||||
A null pointer is returned if anything went wrong, otherwise the new list
|
A null pointer is returned if anything went wrong, otherwise the new list
|
||||||
pointer is returned.
|
pointer is returned.
|
||||||
.SH EXAMPLE
|
.SH EXAMPLE
|
||||||
|
.nf
|
||||||
CURL handle;
|
CURL handle;
|
||||||
curl_slist *slist=NULL;
|
struct curl_slist *slist=NULL;
|
||||||
|
|
||||||
slist = curl_slist_append(slist, "pragma:");
|
slist = curl_slist_append(slist, "pragma:");
|
||||||
curl_easy_setopt(handle, CURLOPT_HTTPHEADER, slist);
|
curl_easy_setopt(handle, CURLOPT_HTTPHEADER, slist);
|
||||||
@@ -33,5 +34,6 @@ pointer is returned.
|
|||||||
curl_easy_perform(handle);
|
curl_easy_perform(handle);
|
||||||
|
|
||||||
curl_slist_free_all(slist); /* free the list again */
|
curl_slist_free_all(slist); /* free the list again */
|
||||||
|
.fi
|
||||||
.SH "SEE ALSO"
|
.SH "SEE ALSO"
|
||||||
.BR curl_slist_free_all "(3), "
|
.BR curl_slist_free_all "(3), "
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
.\" * $Id$
|
.\" * $Id$
|
||||||
.\" **************************************************************************
|
.\" **************************************************************************
|
||||||
.\"
|
.\"
|
||||||
.TH curl_version_info 3 "19 Apr 2006" "libcurl 7.15.4" "libcurl Manual"
|
.TH curl_version_info 3 "2 Nov 2006" "libcurl 7.16.1" "libcurl Manual"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
curl_version_info - returns run-time libcurl version info
|
curl_version_info - returns run-time libcurl version info
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
@@ -66,6 +66,11 @@ typedef struct {
|
|||||||
/* when 'age' is 2 or higher, the member below also exists: */
|
/* when 'age' is 2 or higher, the member below also exists: */
|
||||||
const char *libidn; /* human readable string */
|
const char *libidn; /* human readable string */
|
||||||
|
|
||||||
|
/* when 'age' is 3 or higher, the members below also exist: */
|
||||||
|
int iconv_ver_num; /* '_libiconv_version' if iconv support enabled */
|
||||||
|
|
||||||
|
const char *libssh_version; /* human readable string */
|
||||||
|
|
||||||
} curl_version_info_data;
|
} curl_version_info_data;
|
||||||
.fi
|
.fi
|
||||||
|
|
||||||
|
|||||||
@@ -174,7 +174,7 @@ problem with the local client certificate
|
|||||||
.IP "CURLE_SSL_CIPHER (59)"
|
.IP "CURLE_SSL_CIPHER (59)"
|
||||||
couldn't use specified cipher
|
couldn't use specified cipher
|
||||||
.IP "CURLE_SSL_CACERT (60)"
|
.IP "CURLE_SSL_CACERT (60)"
|
||||||
problem with the CA cert (path? access rights?)
|
peer certificate cannot be authenticated with known CA certificates
|
||||||
.IP "CURLE_BAD_CONTENT_ENCODING (61)"
|
.IP "CURLE_BAD_CONTENT_ENCODING (61)"
|
||||||
Unrecognized transfer encoding
|
Unrecognized transfer encoding
|
||||||
.IP "CURLE_LDAP_INVALID_URL (62)"
|
.IP "CURLE_LDAP_INVALID_URL (62)"
|
||||||
@@ -208,6 +208,8 @@ No such TFTP user
|
|||||||
Character conversion failed
|
Character conversion failed
|
||||||
.IP "CURLE_CONV_REQD (76)"
|
.IP "CURLE_CONV_REQD (76)"
|
||||||
Caller must register conversion callbacks
|
Caller must register conversion callbacks
|
||||||
|
.IP "CURLE_SSL_CACERT_BADFILE (77)"
|
||||||
|
Problem with reading the SSL CA cert (path? access rights?)
|
||||||
.SH "CURLMcode"
|
.SH "CURLMcode"
|
||||||
This is the generic return code used by functions in the libcurl multi
|
This is the generic return code used by functions in the libcurl multi
|
||||||
interface. Also consider \fIcurl_multi_strerror(3)\fP.
|
interface. Also consider \fIcurl_multi_strerror(3)\fP.
|
||||||
@@ -219,7 +221,9 @@ Things are fine.
|
|||||||
.IP "CURLM_BAD_HANDLE (1)"
|
.IP "CURLM_BAD_HANDLE (1)"
|
||||||
The passed-in handle is not a valid CURLM handle.
|
The passed-in handle is not a valid CURLM handle.
|
||||||
.IP "CURLM_BAD_EASY_HANDLE (2)"
|
.IP "CURLM_BAD_EASY_HANDLE (2)"
|
||||||
An easy handle was not good/valid.
|
An easy handle was not good/valid. It could mean that it isn't an easy handle
|
||||||
|
at all, or possibly that the handle already is in used by this or another
|
||||||
|
multi handle.
|
||||||
.IP "CURLM_OUT_OF_MEMORY (3)"
|
.IP "CURLM_OUT_OF_MEMORY (3)"
|
||||||
You are doomed.
|
You are doomed.
|
||||||
.IP "CURLM_INTERNAL_ERROR (4)"
|
.IP "CURLM_INTERNAL_ERROR (4)"
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -390,6 +390,15 @@ typedef enum {
|
|||||||
CURLOPT_CONV_FROM_NETWORK_FUNCTION,
|
CURLOPT_CONV_FROM_NETWORK_FUNCTION,
|
||||||
CURLOPT_CONV_TO_NETWORK_FUNCTION, and
|
CURLOPT_CONV_TO_NETWORK_FUNCTION, and
|
||||||
CURLOPT_CONV_FROM_UTF8_FUNCTION */
|
CURLOPT_CONV_FROM_UTF8_FUNCTION */
|
||||||
|
CURLE_SSL_CACERT_BADFILE, /* 77 - could not load CACERT file, missing
|
||||||
|
or wrong format */
|
||||||
|
CURLE_REMOTE_FILE_NOT_FOUND, /* 78 - remote file not found */
|
||||||
|
CURLE_SSH, /* 79 - error from the SSH layer, somewhat
|
||||||
|
generic so the error message will be of
|
||||||
|
interest when this has happened */
|
||||||
|
|
||||||
|
CURLE_SSL_SHUTDOWN_FAILED, /* 80 - Failed to shut down the SSL
|
||||||
|
connection */
|
||||||
CURL_LAST /* never use! */
|
CURL_LAST /* never use! */
|
||||||
} CURLcode;
|
} CURLcode;
|
||||||
|
|
||||||
@@ -425,6 +434,14 @@ typedef enum {
|
|||||||
#define CURLAUTH_ANY ~0 /* all types set */
|
#define CURLAUTH_ANY ~0 /* all types set */
|
||||||
#define CURLAUTH_ANYSAFE (~CURLAUTH_BASIC)
|
#define CURLAUTH_ANYSAFE (~CURLAUTH_BASIC)
|
||||||
|
|
||||||
|
#define CURLSSH_AUTH_ANY ~0 /* all types supported by the server */
|
||||||
|
#define CURLSSH_AUTH_NONE 0 /* none allowed, silly but complete */
|
||||||
|
#define CURLSSH_AUTH_PUBLICKEY (1<<0) /* public/private key files */
|
||||||
|
#define CURLSSH_AUTH_PASSWORD (1<<1) /* password */
|
||||||
|
#define CURLSSH_AUTH_HOST (1<<2) /* host key files */
|
||||||
|
#define CURLSSH_AUTH_KEYBOARD (1<<3) /* keyboard interactive */
|
||||||
|
#define CURLSSH_AUTH_DEFAULT CURLSSH_AUTH_ANY
|
||||||
|
|
||||||
#ifndef CURL_NO_OLDIES /* define this to test if your app builds with all
|
#ifndef CURL_NO_OLDIES /* define this to test if your app builds with all
|
||||||
the obsolete stuff removed! */
|
the obsolete stuff removed! */
|
||||||
/* this was the error code 50 in 7.7.3 and a few earlier versions, this
|
/* this was the error code 50 in 7.7.3 and a few earlier versions, this
|
||||||
@@ -448,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 */
|
||||||
@@ -941,22 +966,12 @@ typedef enum {
|
|||||||
CINIT(TCP_NODELAY, LONG, 121),
|
CINIT(TCP_NODELAY, LONG, 121),
|
||||||
|
|
||||||
/* 122 OBSOLETE, used in 7.12.3. Gone in 7.13.0 */
|
/* 122 OBSOLETE, used in 7.12.3. Gone in 7.13.0 */
|
||||||
|
/* 123 OBSOLETE. Gone in 7.16.0 */
|
||||||
/* When doing 3rd party transfer, set the source user and password with
|
|
||||||
this */
|
|
||||||
CINIT(SOURCE_USERPWD, OBJECTPOINT, 123),
|
|
||||||
|
|
||||||
/* 124 OBSOLETE, used in 7.12.3. Gone in 7.13.0 */
|
/* 124 OBSOLETE, used in 7.12.3. Gone in 7.13.0 */
|
||||||
/* 125 OBSOLETE, used in 7.12.3. Gone in 7.13.0 */
|
/* 125 OBSOLETE, used in 7.12.3. Gone in 7.13.0 */
|
||||||
/* 126 OBSOLETE, used in 7.12.3. Gone in 7.13.0 */
|
/* 126 OBSOLETE, used in 7.12.3. Gone in 7.13.0 */
|
||||||
|
/* 127 OBSOLETE. Gone in 7.16.0 */
|
||||||
/* When doing 3rd party transfer, set the source pre-quote linked list
|
/* 128 OBSOLETE. Gone in 7.16.0 */
|
||||||
of commands with this */
|
|
||||||
CINIT(SOURCE_PREQUOTE, OBJECTPOINT, 127),
|
|
||||||
|
|
||||||
/* When doing 3rd party transfer, set the source post-quote linked list
|
|
||||||
of commands with this */
|
|
||||||
CINIT(SOURCE_POSTQUOTE, OBJECTPOINT, 128),
|
|
||||||
|
|
||||||
/* When FTP over SSL/TLS is selected (with CURLOPT_FTP_SSL), this option
|
/* When FTP over SSL/TLS is selected (with CURLOPT_FTP_SSL), this option
|
||||||
can be used to change libcurl's default action which is to first try
|
can be used to change libcurl's default action which is to first try
|
||||||
@@ -973,12 +988,8 @@ typedef enum {
|
|||||||
CINIT(IOCTLFUNCTION, FUNCTIONPOINT, 130),
|
CINIT(IOCTLFUNCTION, FUNCTIONPOINT, 130),
|
||||||
CINIT(IOCTLDATA, OBJECTPOINT, 131),
|
CINIT(IOCTLDATA, OBJECTPOINT, 131),
|
||||||
|
|
||||||
/* To make a 3rd party transfer, set the source URL with this */
|
/* 132 OBSOLETE. Gone in 7.16.0 */
|
||||||
CINIT(SOURCE_URL, OBJECTPOINT, 132),
|
/* 133 OBSOLETE. Gone in 7.16.0 */
|
||||||
|
|
||||||
/* When doing 3rd party transfer, set the source quote linked list of
|
|
||||||
commands with this */
|
|
||||||
CINIT(SOURCE_QUOTE, OBJECTPOINT, 133),
|
|
||||||
|
|
||||||
/* zero terminated string for pass on to the FTP server when asked for
|
/* zero terminated string for pass on to the FTP server when asked for
|
||||||
"account" info */
|
"account" info */
|
||||||
@@ -1037,6 +1048,29 @@ typedef enum {
|
|||||||
CINIT(SOCKOPTFUNCTION, FUNCTIONPOINT, 148),
|
CINIT(SOCKOPTFUNCTION, FUNCTIONPOINT, 148),
|
||||||
CINIT(SOCKOPTDATA, OBJECTPOINT, 149),
|
CINIT(SOCKOPTDATA, OBJECTPOINT, 149),
|
||||||
|
|
||||||
|
/* set to 0 to disable session ID re-use for this transfer, default is
|
||||||
|
enabled (== 1) */
|
||||||
|
CINIT(SSL_SESSIONID_CACHE, LONG, 150),
|
||||||
|
|
||||||
|
/* allowed SSH authentication methods */
|
||||||
|
CINIT(SSH_AUTH_TYPES, LONG, 151),
|
||||||
|
|
||||||
|
/* Used by scp/sftp to do public/private key authentication */
|
||||||
|
CINIT(SSH_PUBLIC_KEYFILE, OBJECTPOINT, 152),
|
||||||
|
CINIT(SSH_PRIVATE_KEYFILE, OBJECTPOINT, 153),
|
||||||
|
|
||||||
|
/* Send CCC (Clear Command Channel) after authentication */
|
||||||
|
CINIT(FTP_SSL_CCC, LONG, 154),
|
||||||
|
|
||||||
|
/* Same as TIMEOUT and CONNECTTIMEOUT, but with ms resolution */
|
||||||
|
CINIT(TIMEOUT_MS, LONG, 155),
|
||||||
|
CINIT(CONNECTTIMEOUT_MS, LONG, 156),
|
||||||
|
|
||||||
|
/* set to zero to disable the libcurl's decoding and thus pass the raw body
|
||||||
|
data to the appliction even when it is encoded/compressed */
|
||||||
|
CINIT(HTTP_TRANSFER_DECODING, LONG, 157),
|
||||||
|
CINIT(HTTP_CONTENT_DECODING, LONG, 158),
|
||||||
|
|
||||||
CURLOPT_LASTENTRY /* the last unused */
|
CURLOPT_LASTENTRY /* the last unused */
|
||||||
} CURLoption;
|
} CURLoption;
|
||||||
|
|
||||||
@@ -1055,18 +1089,6 @@ typedef enum {
|
|||||||
|
|
||||||
#ifndef CURL_NO_OLDIES /* define this to test if your app builds with all
|
#ifndef CURL_NO_OLDIES /* define this to test if your app builds with all
|
||||||
the obsolete stuff removed! */
|
the obsolete stuff removed! */
|
||||||
#define CURLOPT_HTTPREQUEST -1
|
|
||||||
#define CURLOPT_FTPASCII CURLOPT_TRANSFERTEXT
|
|
||||||
#define CURLOPT_MUTE -2
|
|
||||||
#define CURLOPT_PASSWDFUNCTION -3
|
|
||||||
#define CURLOPT_PASSWDDATA -4
|
|
||||||
#define CURLOPT_CLOSEFUNCTION -5
|
|
||||||
|
|
||||||
#define CURLOPT_SOURCE_HOST -6
|
|
||||||
#define CURLOPT_SOURCE_PATH -7
|
|
||||||
#define CURLOPT_SOURCE_PORT -8
|
|
||||||
#define CURLOPT_PASV_HOST -9
|
|
||||||
|
|
||||||
#else
|
#else
|
||||||
/* This is set if CURL_NO_OLDIES is defined at compile-time */
|
/* This is set if CURL_NO_OLDIES is defined at compile-time */
|
||||||
#undef CURLOPT_DNS_USE_GLOBAL_CACHE /* soon obsolete */
|
#undef CURLOPT_DNS_USE_GLOBAL_CACHE /* soon obsolete */
|
||||||
@@ -1526,6 +1548,7 @@ typedef enum {
|
|||||||
CURLVERSION_FIRST,
|
CURLVERSION_FIRST,
|
||||||
CURLVERSION_SECOND,
|
CURLVERSION_SECOND,
|
||||||
CURLVERSION_THIRD,
|
CURLVERSION_THIRD,
|
||||||
|
CURLVERSION_FOURTH,
|
||||||
CURLVERSION_LAST /* never actually use this */
|
CURLVERSION_LAST /* never actually use this */
|
||||||
} CURLversion;
|
} CURLversion;
|
||||||
|
|
||||||
@@ -1534,7 +1557,7 @@ typedef enum {
|
|||||||
meant to be a built-in version number for what kind of struct the caller
|
meant to be a built-in version number for what kind of struct the caller
|
||||||
expects. If the struct ever changes, we redefine the NOW to another enum
|
expects. If the struct ever changes, we redefine the NOW to another enum
|
||||||
from above. */
|
from above. */
|
||||||
#define CURLVERSION_NOW CURLVERSION_THIRD
|
#define CURLVERSION_NOW CURLVERSION_FOURTH
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
CURLversion age; /* age of the returned struct */
|
CURLversion age; /* age of the returned struct */
|
||||||
@@ -1555,8 +1578,13 @@ typedef struct {
|
|||||||
/* This field was added in CURLVERSION_THIRD */
|
/* This field was added in CURLVERSION_THIRD */
|
||||||
const char *libidn;
|
const char *libidn;
|
||||||
|
|
||||||
|
/* These field were added in CURLVERSION_FOURTH */
|
||||||
|
|
||||||
/* Same as '_libiconv_version' if built with HAVE_ICONV */
|
/* Same as '_libiconv_version' if built with HAVE_ICONV */
|
||||||
int iconv_ver_num;
|
int iconv_ver_num;
|
||||||
|
|
||||||
|
const char *libssh_version; /* human readable string */
|
||||||
|
|
||||||
} curl_version_info_data;
|
} curl_version_info_data;
|
||||||
|
|
||||||
#define CURL_VERSION_IPV6 (1<<0) /* IPv6-enabled */
|
#define CURL_VERSION_IPV6 (1<<0) /* IPv6-enabled */
|
||||||
|
|||||||
@@ -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.15.6-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 15
|
#define LIBCURL_VERSION_MINOR 16
|
||||||
#define LIBCURL_VERSION_PATCH 6
|
#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 0x070f06
|
#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 */
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user