Compare commits
1111 Commits
curl-7_15_
...
curl-7_16_
Author | SHA1 | Date | |
---|---|---|---|
![]() |
b8d006b9d7 | ||
![]() |
af4edf10f5 | ||
![]() |
0f9e209534 | ||
![]() |
2aed8946b0 | ||
![]() |
03b03f7b60 | ||
![]() |
a1b650ad7b | ||
![]() |
d978f85d55 | ||
![]() |
6e7f47da5b | ||
![]() |
277bab0c7b | ||
![]() |
fc3c5dae87 | ||
![]() |
891dffb528 | ||
![]() |
f0b361ecc1 | ||
![]() |
df7eed16dd | ||
![]() |
61db4f3e2a | ||
![]() |
fe85ae15f3 | ||
![]() |
cc26cc5dcd | ||
![]() |
eb965e2a13 | ||
![]() |
4e35395d0e | ||
![]() |
b61b420cb8 | ||
![]() |
b0aa11fde7 | ||
![]() |
b691102ec7 | ||
![]() |
2785fe7f61 | ||
![]() |
db5d4bd811 | ||
![]() |
dc3b3c6916 | ||
![]() |
82d3f97659 | ||
![]() |
235632ed2c | ||
![]() |
68330c86e7 | ||
![]() |
f37dc9168a | ||
![]() |
17798ed740 | ||
![]() |
05ba9f9fcd | ||
![]() |
96f4af4db9 | ||
![]() |
3ec7f8a25a | ||
![]() |
375cdf89ad | ||
![]() |
ab7e7144ef | ||
![]() |
6f59e19b91 | ||
![]() |
7800b56dc8 | ||
![]() |
73c13220ee | ||
![]() |
99e0597c7b | ||
![]() |
3247ac1918 | ||
![]() |
c45d44fee9 | ||
![]() |
1e718a515a | ||
![]() |
d23d686de2 | ||
![]() |
c8677e9d3f | ||
![]() |
a32eaffa77 | ||
![]() |
1dcb99f0f7 | ||
![]() |
03bc2d34da | ||
![]() |
477e27f99d | ||
![]() |
6a84d492f1 | ||
![]() |
873d95a34c | ||
![]() |
1500e95839 | ||
![]() |
4f8ebd1673 | ||
![]() |
cd4e6fbcac | ||
![]() |
2fd2ca9dac | ||
![]() |
82d6240e7d | ||
![]() |
ad80490711 | ||
![]() |
38b490a310 | ||
![]() |
2ea052336f | ||
![]() |
3b9eefca89 | ||
![]() |
073a6cea45 | ||
![]() |
345ffd1163 | ||
![]() |
f0ffb35d55 | ||
![]() |
b4d2fbae6d | ||
![]() |
42a2138d11 | ||
![]() |
e86dfd9688 | ||
![]() |
a466b31574 | ||
![]() |
48064f8dee | ||
![]() |
e71378d3c8 | ||
![]() |
90d40aff72 | ||
![]() |
30808dca40 | ||
![]() |
8629620b1c | ||
![]() |
25d2a27c64 | ||
![]() |
b084dc8760 | ||
![]() |
2ae9536d32 | ||
![]() |
f5713dbb2e | ||
![]() |
b10ff9791b | ||
![]() |
86a25239ec | ||
![]() |
4c663ba9a8 | ||
![]() |
713c9f8602 | ||
![]() |
14b9b823e6 | ||
![]() |
6a674ded0e | ||
![]() |
2faba57c85 | ||
![]() |
79d59ec97b | ||
![]() |
a49e78d9b7 | ||
![]() |
9583b51d80 | ||
![]() |
670273968c | ||
![]() |
b6820b2674 | ||
![]() |
b9a6dfab03 | ||
![]() |
8bd7197a8f | ||
![]() |
ebb5e1db4b | ||
![]() |
4702807da8 | ||
![]() |
fe1fe64fd4 | ||
![]() |
9d904ee41b | ||
![]() |
fcc3e2ca34 | ||
![]() |
c25da51913 | ||
![]() |
05ab8d291c | ||
![]() |
70b1900dd1 | ||
![]() |
380e132da3 | ||
![]() |
f2eb3c1f79 | ||
![]() |
96c093f27c | ||
![]() |
a9d49769ff | ||
![]() |
d7616d8a0a | ||
![]() |
826bbfc01c | ||
![]() |
250f9670b7 | ||
![]() |
ed4936fd30 | ||
![]() |
4dd2628093 | ||
![]() |
8479785620 | ||
![]() |
0427e94465 | ||
![]() |
09fd3b4935 | ||
![]() |
3fef839f75 | ||
![]() |
ea43bb013b | ||
![]() |
b0a4c992e7 | ||
![]() |
85707460e5 | ||
![]() |
41ba7666f0 | ||
![]() |
4367e0513a | ||
![]() |
ed998270aa | ||
![]() |
1b7f00b2a6 | ||
![]() |
ad19f95f15 | ||
![]() |
bcfe3cb231 | ||
![]() |
805a5dcac8 | ||
![]() |
0b67ee7bad | ||
![]() |
9298037639 | ||
![]() |
f7472075d7 | ||
![]() |
9f72db13c4 | ||
![]() |
acc4868b78 | ||
![]() |
1afb67e31b | ||
![]() |
2f0539d880 | ||
![]() |
6f7d0a7cbd | ||
![]() |
3d513f7ab1 | ||
![]() |
6c8e6549d0 | ||
![]() |
eec105daba | ||
![]() |
19a80add95 | ||
![]() |
93844f64ef | ||
![]() |
60588b2455 | ||
![]() |
5187faeeb9 | ||
![]() |
1228ec9fbb | ||
![]() |
717adfeb96 | ||
![]() |
503557e5ce | ||
![]() |
f611f42dcf | ||
![]() |
7a0e0c36c5 | ||
![]() |
61edee979f | ||
![]() |
7a343a3f60 | ||
![]() |
b4d3c4a76c | ||
![]() |
f213d0db98 | ||
![]() |
6e835ef3aa | ||
![]() |
ed8cb57151 | ||
![]() |
9bdb05b4d6 | ||
![]() |
94b253fde7 | ||
![]() |
61d7e720a5 | ||
![]() |
17507eac85 | ||
![]() |
bc1ae973da | ||
![]() |
6a35841b2e | ||
![]() |
28dde78dde | ||
![]() |
37171809f6 | ||
![]() |
3398eca7c3 | ||
![]() |
3616912d22 | ||
![]() |
0abccc676d | ||
![]() |
a93af43974 | ||
![]() |
0bbc759c0c | ||
![]() |
56a5c49ac0 | ||
![]() |
02267eba4c | ||
![]() |
cea9695bcf | ||
![]() |
92039629c7 | ||
![]() |
c8d3327e92 | ||
![]() |
043070f90e | ||
![]() |
36626c4b6e | ||
![]() |
7f33aae067 | ||
![]() |
61022f3817 | ||
![]() |
bf648fcfc3 | ||
![]() |
b0e909329e | ||
![]() |
ae3d5949b8 | ||
![]() |
c234b9d04b | ||
![]() |
7a86740afd | ||
![]() |
8e719e3ef5 | ||
![]() |
66fc5498d2 | ||
![]() |
f30ae93a1f | ||
![]() |
365e8eb78e | ||
![]() |
76627b322e | ||
![]() |
827228bd69 | ||
![]() |
69c5506b69 | ||
![]() |
3a2e623fc8 | ||
![]() |
8aa9f01ed8 | ||
![]() |
b0b6a853f6 | ||
![]() |
0563a7a923 | ||
![]() |
945ba7cb7e | ||
![]() |
e3dab1bea2 | ||
![]() |
9c369c695d | ||
![]() |
011ccbc31a | ||
![]() |
f1596698ae | ||
![]() |
c60b52ab43 | ||
![]() |
71a0d50f48 | ||
![]() |
8d2a0fe85b | ||
![]() |
b039d883e5 | ||
![]() |
b3401ddbad | ||
![]() |
038fe54e21 | ||
![]() |
4b5a65455e | ||
![]() |
2566a5d4da | ||
![]() |
c38c339480 | ||
![]() |
ea74b4b8e1 | ||
![]() |
2364066be0 | ||
![]() |
b36376e12d | ||
![]() |
8aae15b630 | ||
![]() |
88bf2a2dc7 | ||
![]() |
45847c5324 | ||
![]() |
70cce4cddd | ||
![]() |
42c0ac2008 | ||
![]() |
70ddabbfb0 | ||
![]() |
e3716938bd | ||
![]() |
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 | ||
![]() |
7e4193b538 | ||
![]() |
a932803eac | ||
![]() |
52560142bf | ||
![]() |
874a4ef8c7 | ||
![]() |
0bb3ac7c31 | ||
![]() |
1e9f5845ab | ||
![]() |
c41dfc2501 | ||
![]() |
30ac7eced1 | ||
![]() |
466d093a92 | ||
![]() |
1e9be353c2 | ||
![]() |
4f4277d9c7 | ||
![]() |
6728bda5c5 | ||
![]() |
dc9f154823 | ||
![]() |
d7168a82e2 | ||
![]() |
c9c8ee3796 | ||
![]() |
c7aae10300 | ||
![]() |
909941405f | ||
![]() |
4031eb1d91 | ||
![]() |
59cf6fd4f0 | ||
![]() |
6de9732a88 | ||
![]() |
1f7f500922 | ||
![]() |
4b1462ec65 | ||
![]() |
6ed47f0aad | ||
![]() |
2d8c7ba9fc | ||
![]() |
3b342d18bc | ||
![]() |
f24ad3800c | ||
![]() |
e2ff369eba | ||
![]() |
9691a78f6b | ||
![]() |
7ff6b6fafd | ||
![]() |
7c621cfbdf | ||
![]() |
5acadc9cd7 | ||
![]() |
2ff609dd43 | ||
![]() |
da48a6ba87 | ||
![]() |
cd6c58216a | ||
![]() |
bdbd0cf27a | ||
![]() |
d792937686 | ||
![]() |
bac66ec26b | ||
![]() |
77516822f6 | ||
![]() |
37d8c67530 | ||
![]() |
cfdcae4bc7 | ||
![]() |
74a6921bc4 | ||
![]() |
490cccba3c | ||
![]() |
839441e236 | ||
![]() |
ba9ea943e2 | ||
![]() |
455087faae | ||
![]() |
31def9e217 | ||
![]() |
ee3514ccdc | ||
![]() |
cf606d7da0 | ||
![]() |
eb26a581f9 | ||
![]() |
b04cbebf86 | ||
![]() |
4272af801f | ||
![]() |
0b633027cb | ||
![]() |
93943ef949 | ||
![]() |
b184b87714 | ||
![]() |
a11473f85d | ||
![]() |
1eedad27a2 | ||
![]() |
ac02d379ba | ||
![]() |
a4ebf5b507 | ||
![]() |
c410769588 | ||
![]() |
997a987943 | ||
![]() |
6201dc083a | ||
![]() |
b33f47804d | ||
![]() |
7ba5e098a3 | ||
![]() |
824b78021c | ||
![]() |
31657c85e5 |
@@ -1,3 +1,4 @@
|
||||
compile
|
||||
config.log
|
||||
Makefile
|
||||
libtool
|
||||
|
835
CHANGES.1999
835
CHANGES.1999
@@ -1,835 +0,0 @@
|
||||
Daniel (28 December 1999):
|
||||
- Tim Verhoeven correctly identified that curl
|
||||
doesn't support URL formatted file names when getting ftp. Now, there's a
|
||||
problem with getting very weird file names off FTP servers. RFC 959 defines
|
||||
that the file name syntax to use should be the same as in the native OS of
|
||||
the server. Since we don't know the peer server system we currently just
|
||||
translate the URL syntax into plain letters. It is still better and with
|
||||
the solaris 2.6-supplied ftp server it works with spaces in the file names.
|
||||
|
||||
Daniel (27 December 1999):
|
||||
- When curl parsed cookies straight off a remote site, it corrupted the input
|
||||
data, which, if the downloaded headers were stored made very odd characters
|
||||
in the saved data. Correctly identified and reported by Paul Harrington.
|
||||
|
||||
Daniel (13 December 1999):
|
||||
- General cleanups in the library interface. There had been some bad kludges
|
||||
added during times of stress and I did my best to clean them off. It was
|
||||
both regarding the lib API as well as include file confusions.
|
||||
|
||||
Daniel (3 December 1999):
|
||||
- A small --stderr bug was reported by Eetu Ojanen...
|
||||
|
||||
- who also brought the suggestion of extending the -X flag to ftp list as
|
||||
well. So, now it is and the long option is now --request instead. It is
|
||||
only for ftp list for now (and the former http stuff too of course).
|
||||
|
||||
Lars J. Aas (24 November 1999):
|
||||
- Patched curl to compile and build under BeOS. Doesn't work yet though!
|
||||
|
||||
- Corrected the Makefile.am files to allow putting object files in
|
||||
different directories than the sources.
|
||||
|
||||
Version 6.3.1
|
||||
|
||||
Daniel (23 November 1999):
|
||||
- I've had this major disk crash. My good old trust-worthy source disk died
|
||||
along with the machine that hosted it. Thank goodness most of all the
|
||||
things I've done are either backed up elsewhere or stored in this CVS
|
||||
server!
|
||||
|
||||
- Michael S. Steuer pointed out a bug in the -F handling
|
||||
that made curl hang if you posted an empty variable such as '-F name='. It
|
||||
was one of those old bugs that never have worked properly...
|
||||
|
||||
- Jason Baietto pointed out a general flaw in the HTTP
|
||||
download. Curl didn't complain if it was prematurely aborted before the
|
||||
entire download was completed. It does now.
|
||||
|
||||
Daniel (19 November 1999):
|
||||
- Chris Maltby very accurately criticized the lack of
|
||||
return code checks on the fwrite() calls. I did a thorough check for all
|
||||
occurrences and corrected this.
|
||||
|
||||
Daniel (17 November 1999):
|
||||
- Paul Harrington pointed out that the -m/--max-time option
|
||||
doesn't work for the slow system calls like gethostbyname()... I don't have
|
||||
any good fix yet, just a slightly less bad one that makes curl exit hard
|
||||
when the timeout is reached.
|
||||
|
||||
- Bjorn Reese helped me point out a possible problem that might be the reason
|
||||
why Thomas Hurst experience problems in his Amiga version.
|
||||
|
||||
Daniel (12 November 1999):
|
||||
- I found a crash in the new cookie file parser. It crashed when you gave
|
||||
a plain http header file as input...
|
||||
|
||||
Version 6.3
|
||||
|
||||
Daniel (10 November 1999):
|
||||
- I kind of found out that the HTTP time-conditional GETs (-z) aren't always
|
||||
respected by the web server and the document is therefore sent in whole
|
||||
again, even though it doesn't match the requested condition. After reading
|
||||
section 13.3.4 of RFC 2616, I think I'm doing the right thing now when I do
|
||||
my own check as well. If curl thinks the condition isn't met, the transfer
|
||||
is aborted prematurely (after all the headers have been received).
|
||||
|
||||
- After comments from Robert Linden I also rewrote some parts of the man page
|
||||
to better describe how the -F works.
|
||||
|
||||
- Michael Anti put up a new curl download mirror in
|
||||
China: http://www.pshowing.com/curl/
|
||||
|
||||
- I added the list of download mirrors to the README file
|
||||
|
||||
- I did add more explanations to the man page
|
||||
|
||||
Daniel (8 November 1999):
|
||||
- I made the -b/--cookie option capable of reading netscape formatted cookie
|
||||
files as well as normal http-header files. It should be able to
|
||||
transparently figure out what kind of file it got as input.
|
||||
|
||||
Daniel (29 October 1999):
|
||||
- Another one of Sebastiaan van Erk's ideas (that has been requested before
|
||||
but I seem to have forgotten who it was), is to add support for ranges in
|
||||
FTP downloads. As usual, one request is just a request, when they're two
|
||||
it is a demand. I've added simple support for X-Y style fetches. X has to
|
||||
be the lower number, though you may omit one of the numbers. Use the -r/
|
||||
--range switch (previously HTTP-only).
|
||||
|
||||
- Sebastiaan van Erk suggested that curl should be
|
||||
able to show the file size of a specified file. I think this is a splendid
|
||||
idea and the -I flag is now working for FTP. It displays the file size in
|
||||
this manner:
|
||||
Content-Length: XXXX
|
||||
As it resembles normal headers, and leaves us the opportunity to add more
|
||||
info in that display if we can come up with more in the future! It also
|
||||
makes sense since if you access ftp through a HTTP proxy, you'd get the
|
||||
file size the same way.
|
||||
|
||||
I changed the order of the QUOTE command executions. They're now executed
|
||||
just after the login and before any other command. I made this to enable
|
||||
quote commands to run before the -I stuff is done too.
|
||||
|
||||
- I found out that -D/--dump-header and -V/--version weren't documented in
|
||||
the man page.
|
||||
|
||||
- Many HTTP/1.1 servers do not support ranges. Don't ask me why. I did add
|
||||
some text about this in the man page for the range option. The thread in
|
||||
the mailing list that started this was initiated by Michael Anti.
|
||||
|
||||
- I get reports about nroff crashes on solaris 2.6+ when displaying the curl
|
||||
man page. Switch to gnroff instead, it is reported to work(!). Adam Barclay
|
||||
reported and brought the suggestion.
|
||||
|
||||
- In a dialogue with Johannes G. Kristinsson we came
|
||||
up with the idea to let -H/--header specified headers replace the
|
||||
internally generated headers, if you happened to select to add a header
|
||||
that curl normally uses by itself. The advantage with this is not entirely
|
||||
obvious, but in Johannes' case it means that he can use another Host: than
|
||||
the one curl would set.
|
||||
|
||||
Daniel (27 October 1999):
|
||||
- Jongki Suwandi brought a nice patch for (yet another) crash when following
|
||||
a location:. This time you had to follow a https:// server's redirect to
|
||||
get the core.
|
||||
|
||||
Version 6.2
|
||||
|
||||
Daniel (21 October 1999):
|
||||
- I think I managed to remove the suspicious (nil) that has been seen just
|
||||
before the "Host:" in HTTP requests when -v was used.
|
||||
- I found out that if you followed a location: when using a proxy, without
|
||||
having specified http:// in the URL, the protocol part was added once again
|
||||
when moving to the next URL! (The protocol part has to be added to the
|
||||
URL when going through a proxy since it has no protocol-guessing system
|
||||
such as curl has.)
|
||||
- Benjamin Ritcey reported a core dump under solaris 2.6
|
||||
with OpenSSL 0.9.4. It turned out this was due to a bad free() in main.c
|
||||
that occurred after the download was done and completed.
|
||||
- Benjamin found ftp downloads to show the first line of the download meter
|
||||
to get written twice, and I removed that problem. It was introduced with
|
||||
the multiple URL support.
|
||||
- Dan Zitter correctly pointed out that curl 6.1 and earlier versions didn't
|
||||
honor RFC 2616 chapter 4 section 2, "Message Headers": "...Field names are
|
||||
case-insensitive..." HTTP header parsing assumed a certain casing. Dan
|
||||
also provided me with a patch that corrected this, which I took the liberty
|
||||
of editing slightly.
|
||||
- Dan Zitter also provided a nice patch for config.guess to better recognize
|
||||
the Mac OS X
|
||||
- Dan also corrected a minor problem in the lib/Makefile that caused linking
|
||||
to fail on OS X.
|
||||
|
||||
Daniel (19 October 1999):
|
||||
- Len Marinaccio came up with some problems with curl. Since Windows has a
|
||||
crippled shell, it can't redirect stderr and that causes trouble. I added
|
||||
--stderr today which allows the user to redirect the stderr stream to a
|
||||
file or stdout.
|
||||
|
||||
Daniel (18 October 1999):
|
||||
- The configure script now understands the '--without-ssl' flag, which now
|
||||
totally disable SSL/https support. Previously it wasn't possible to force
|
||||
the configure script to leave SSL alone. The previous functionality has
|
||||
been retained. Troy Engel helped test this new one.
|
||||
|
||||
Version 6.1
|
||||
|
||||
Daniel (17 October 1999):
|
||||
- I ifdef'ed or commented all the zlib stuff in the sources and configure
|
||||
script. It turned out we needed to mock more with zlib than I initially
|
||||
thought, to make it capable of downloading compressed HTTP documents and
|
||||
uncompress them on the fly. I didn't mean the zlib parts of curl to become
|
||||
more than minor so this means I halt the zlib expedition for now and wait
|
||||
until someone either writes the code or zlib gets updated and better
|
||||
adjusted for this kind of usage. I won't get into details here, but a
|
||||
short a summary is suitable:
|
||||
- zlib can't automatically detect whether to use zlib or gzip
|
||||
decompression methods.
|
||||
- zlib is very neat for reading gzipped files from a file descriptor,
|
||||
although not as nice for reading buffer-based data such as we would
|
||||
want it.
|
||||
- there are still some problems with the win32 version when reading from
|
||||
a file descriptor if that is a socket
|
||||
|
||||
Daniel (14 October 1999):
|
||||
- Moved the (external) include files for libcurl into a subdirectory named
|
||||
curl and adjusted all #include lines to use <curl/XXXX> to maintain a
|
||||
better name space and control of the headers. This has been requested.
|
||||
|
||||
Daniel (12 October 1999):
|
||||
- I modified the 'maketgz' script to perform a 'make' too before a release
|
||||
archive is put together in an attempt to make the time stamps better and
|
||||
hopefully avoid the double configure-running that use to occur.
|
||||
|
||||
Daniel (11 October 1999):
|
||||
- Applied J<>rn's patches that fixes zlib for mingw32 compiles as well as
|
||||
some other missing zlib #ifdef and more text on the multiple URL docs in
|
||||
the man page.
|
||||
|
||||
Version 6.1beta
|
||||
|
||||
Daniel (6 October 1999):
|
||||
- Douglas E. Wegscheid sent me a patch that made the exact same thing as I
|
||||
just made: the -d switch is now capable of reading post data from a named
|
||||
file or stdin. Use it similarly to the -F. To read the post data from a
|
||||
given file:
|
||||
|
||||
curl -d @path/to/filename www.postsite.com
|
||||
|
||||
or let curl read it out from stdin:
|
||||
|
||||
curl -d @- www.postit.com
|
||||
|
||||
J<>rn Hartroth (3 October 1999):
|
||||
- Brought some more patches for multiple URL functionality. The MIME
|
||||
separation ideas are almost scrapped now, and a custom separator is being
|
||||
used instead. This is still compile-time "flagged".
|
||||
|
||||
Daniel
|
||||
- Updated curl.1 with multiple URL info.
|
||||
|
||||
Daniel (30 September 1999):
|
||||
- Felix von Leitner brought openssl-check fixes for configure.in to work
|
||||
out-of-the-box when the openssl files are installed in the system default
|
||||
dirs.
|
||||
|
||||
Daniel (28 September 1999)
|
||||
- Added libz functionality. This should enable decompressing gzip, compress
|
||||
or deflate encoding HTTP documents. It also makes curl send an accept that
|
||||
it accepts that kind of encoding. Compressed contents usually shortens
|
||||
download time. I *need* someone to tell me a site that uses compressed HTTP
|
||||
documents so that I can test this out properly.
|
||||
|
||||
- As a result of the adding of zlib awareness, I changed the version string
|
||||
a little. I plan to add openldap version reporting in there too.
|
||||
|
||||
Daniel (17 September 1999)
|
||||
- Made the -F option allow stdin when specifying files. By using '-' instead
|
||||
of file name, the data will be read from stdin.
|
||||
|
||||
Version 6.0
|
||||
|
||||
Daniel (13 September 1999)
|
||||
- Added -X/--http-request <request> to enable any HTTP command to be sent.
|
||||
Do not that your server has to support the exact string you enter. This
|
||||
should possibly a string like DELETE or TRACE.
|
||||
|
||||
- Applied Douglas' mingw32-fixes for the makefiles.
|
||||
|
||||
Daniel (10 September 1999)
|
||||
- Douglas E. Wegscheid pointed out a problem. Curl didn't check the FTP
|
||||
servers return code properly after the --quote commands were issued. It
|
||||
took anything non 200 as an error, when all 2XX codes should be accepted as
|
||||
OK.
|
||||
|
||||
- Sending cookies to the same site in multiple lines like curl used to do
|
||||
turned out to be bad and breaking the cookie specs. Curl now sends all
|
||||
cookies on a single Cookie: line. Curl is not yet RFC 2109 compliant, but I
|
||||
doubt that many servers do use that syntax (yet).
|
||||
|
||||
Daniel (8 September 1999)
|
||||
- J<>rn helped me make sure it still compiles nicely with mingw32 under win32.
|
||||
|
||||
Daniel (7 September 1999)
|
||||
- FTP upload through proxy is now turned into a HTTP PUT. Requested by
|
||||
Stefan Kanthak.
|
||||
|
||||
- Added the ldap files to the .m32 makefile.
|
||||
|
||||
Daniel (3 September 1999)
|
||||
- Made cookie matching work while using HTTP proxy.
|
||||
|
||||
Bjorn Reese (31 August 1999)
|
||||
- Passed his ldap:// patch. Note that this requires the openldap shared
|
||||
library to be installed and that LD_LIBRARY_PATH points to the
|
||||
directory where the lib will be found when curl is run with a
|
||||
ldap:// URL.
|
||||
|
||||
J<>rn Hartroth (31 August 1999)
|
||||
- Made the Mingw32 makefiles into single files.
|
||||
- Made file:// work for Win32. The same code is now used for unix as well for
|
||||
performance reasons.
|
||||
|
||||
Douglas E. Wegscheid (30 August 1999)
|
||||
- Patched the Mingw32 makefiles for SSL builds.
|
||||
|
||||
Matthew Clarke (30 August 1999)
|
||||
- Made a cool patch for configure.in to allow --with-ssl to specify the
|
||||
root dir of the openssl installation, as in
|
||||
|
||||
./configure --with-ssl=/usr/ssl_here
|
||||
|
||||
- Corrected the 'reconf' script to work better with some shells.
|
||||
|
||||
J<>rn Hartroth (26 August 1999)
|
||||
- Fixed the Mingw32 makefiles in lib/ and corrected the file.c for win32
|
||||
compiles.
|
||||
|
||||
Version 5.11
|
||||
|
||||
Daniel (25 August 1999)
|
||||
- John Weismiller pointed out a bug in the header-line
|
||||
realloc() system in download.c.
|
||||
|
||||
- I added lib/file.[ch] to offer a first, simple, file:// support. It
|
||||
probably won't do much good on win32 system at this point, but I see it
|
||||
as a start.
|
||||
|
||||
- Made the release archives get a Makefile in the root dir, which can be
|
||||
used to start the compiling/building process easier. I haven't really
|
||||
changed any INSTALL text yet, I wanted to get some feed-back on this
|
||||
first.
|
||||
|
||||
Daniel (17 August 1999)
|
||||
- Another Location: bug. Curl didn't do proper relative locations if the
|
||||
original URL had cgi-parameters that contained a slash. Nusu's page
|
||||
again.
|
||||
|
||||
- Corrected the NO_PROXY usage. It is a list of substrings that if one of
|
||||
them matches the tail of the host name it should connect to, curl should
|
||||
not use a proxy to connect there. Pointed out to me by Douglas
|
||||
E. Wegscheid. I also changed the README text a little regarding this.
|
||||
|
||||
Daniel (16 August 1999)
|
||||
- Fixed a memory bug with http-servers that sent Location: to a Location:
|
||||
page. Nusu's page showed this too.
|
||||
|
||||
- Made cookies work a lot better. Setting the same cookie name several times
|
||||
used to add more cookies instead of replacing the former one which it
|
||||
should've. Nusu <nus at intergorj.ro> brought me an URL that made this
|
||||
painfully visible...
|
||||
|
||||
Troy (15 August 1999)
|
||||
- Brought new .spec files as well as a patch for configure.in that lets the
|
||||
configure script find the openssl files better, even when the include
|
||||
files are in /usr/include/openssl
|
||||
|
||||
Version 5.10
|
||||
|
||||
Daniel (13 August 1999)
|
||||
- SSL_CTX_set_default_passwd_cb() has been modified in the 0.9.4 version of
|
||||
OpenSSL. Now why couldn't they simply add a *new* function instead of
|
||||
modifying the parameters of an already existing function? This way, we get
|
||||
a compiler warning if compiling with 0.9.4 but not with earlier. So, I had
|
||||
to come up with a #if construction that deals with this...
|
||||
|
||||
- Made curl output the SSL version number get displayed properly with 0.9.4.
|
||||
|
||||
Troy (12 August 1999)
|
||||
- Added MingW32 (GCC-2.95) support under Win32. The INSTALL file was also
|
||||
a bit rearranged.
|
||||
|
||||
Daniel (12 August 1999)
|
||||
- I had to copy a good <arpa/telnet.h> include file into the curl source
|
||||
tree to enable the silly win32 systems to compile. The distribution rights
|
||||
allows us to do that as long as the file remains unmodified.
|
||||
|
||||
- I corrected a few minor things that made the compiler complain when
|
||||
-Wall -pedantic was used.
|
||||
|
||||
- I'm moving the official curl web page to http://curl.haxx.nu. I think it
|
||||
will make it easier to remember as it is a lot shorter and less cryptic.
|
||||
The old one still works and shows the same info.
|
||||
|
||||
Daniel (11 August 1999)
|
||||
- Albert Chin-A-Young mailed me another correction for NROFF in the
|
||||
configure.in that is supposed to be better for IRIX users.
|
||||
|
||||
Daniel (10 August 1999)
|
||||
- Albert Chin-A-Young helped me with some stupid Makefile things, as well as
|
||||
some fiddling with the getdate.c stuff that he had problems with under
|
||||
HP-UX v10. getdate.y will now be compiled into getdate.c if the appropriate
|
||||
yacc or bison is found by the configure script. Since this is slightly new,
|
||||
we need to test the output getdate.c with win32 systems to make sure it
|
||||
still compiles there.
|
||||
|
||||
Daniel (5 August 1999)
|
||||
- I've just setup a new mailing list with the intention to keep discussions
|
||||
around libcurl development in it. I mainly expect it to be for thoughts and
|
||||
brainstorming around a "next generation" library, rather than nitpicking
|
||||
about the current implementation or details in the current libcurl.
|
||||
|
||||
To join our happy bunch of future-looking geeks, enter 'subscribe
|
||||
<address>' in the body of a mail and send it to
|
||||
libcurl-request@listserv.fts.frontec.se. Curl bug reports, the usual curl
|
||||
talk and everything else should still be kept in this mailing list. I've
|
||||
started to archive this mailing list and have put the libcurl web page at
|
||||
www.fts.frontec.se/~dast/libcurl/.
|
||||
|
||||
- Stefan Kanthak contacted me regarding a few problems in the configure
|
||||
script which he discovered when trying to make curl compile and build under
|
||||
Siemens SINIX-Z V5.42B2004!
|
||||
|
||||
- Marcus Klein very accurately informed me that src/version.h was not present
|
||||
in the CVS repository. Oh, how silly...
|
||||
|
||||
- Linus Nielsen rewrote the telnet:// part and now curl offers limited telnet
|
||||
support. If you run curl like 'curl telnet://host' you'll get all output on
|
||||
the screen and curl will read input from stdin. You'll be able to login and
|
||||
run commands etc, but since the output is buffered, expect to get a little
|
||||
weird output.
|
||||
|
||||
This is still in its infancy and it might get changed. We need your
|
||||
feed-back and input in how this is best done.
|
||||
|
||||
WIN32 NOTE: I bet we'll get problems when trying to compile the current
|
||||
lib/telnet.c on win32, but I think we can sort them out in time.
|
||||
|
||||
- David Sanderson reported that FORCE_ALLOCA_H or HAVE_ALLOCA_H must be
|
||||
defined for getdate.c to compile properly on HP-UX 11.0. I updated the
|
||||
configure script to check for alloca.h which should make it.
|
||||
|
||||
Daniel (4 August 1999)
|
||||
- I finally got to understand Marcus Klein's ftp download resume problem,
|
||||
which turns out to be due to different outputs from different ftp
|
||||
servers. It makes ftp download resuming a little trickier, but I've made
|
||||
some modifications I really believe will work for most ftp servers and I do
|
||||
hope you report if you have problems with this!
|
||||
|
||||
- Added text about file transfer resuming to README.curl.
|
||||
|
||||
Daniel (2 August 1999)
|
||||
- Applied a progress-bar patch from Lars J. Aas. It offers
|
||||
a new styled progress bar enabled with -#/--progress-bar.
|
||||
|
||||
T. Yamada <tai at imasy.or.jp> (30 July 1999)
|
||||
- It breaks with segfault when 1) curl is using .netrc to obtain
|
||||
username/password (option '-n'), and 2) is automatically redirected to
|
||||
another location (option '-L').
|
||||
|
||||
There is a small bug in lib/url.c (block starting from line 641), which
|
||||
tries to take out username/password from user- supplied command-line
|
||||
argument ('-u' option). This block is never executed on first attempt since
|
||||
CONF_USERPWD bit isn't set at first, but curl later turns it on when it
|
||||
checks for CONF_NETRC bit. So when curl tries to redo everything due to
|
||||
redirection, it segfaults trying to access *data->userpwd.
|
||||
|
||||
Version 5.9.1
|
||||
|
||||
Daniel (30 July 1999)
|
||||
- Steve Walch pointed out that there is a memory leak in the formdata
|
||||
functions. I added a FormFree() function that is now used and supposed to
|
||||
correct this flaw.
|
||||
|
||||
- Mark Wotton reported:
|
||||
'curl -L https://www.cwa.com.au/' core dumps. I managed to cure this by
|
||||
correcting the cleanup procedure. The bug seems to be gone with my OpenSSL
|
||||
0.9.2b, although still occurs when I run the ~100 years old SSLeay 0.8.0. I
|
||||
don't know whether it is curl or SSLeay that is to blame for that.
|
||||
|
||||
- Marcus Klein:
|
||||
Reported an FTP upload resume bug that I really can't repeat nor understand.
|
||||
I leave it here so that it won't be forgotten.
|
||||
|
||||
Daniel (29 July 1999)
|
||||
- Costya Shulyupin suggested support for longer URLs when following Location:
|
||||
and I could only agree and fix it!
|
||||
|
||||
- Leigh Purdie found a problem in the upload/POST department. It turned out
|
||||
that http.c accidentaly cleared the pointer instead of the byte counter
|
||||
when supposed to.
|
||||
|
||||
- Costya Shulyupin pointed out a problem with port numbers and Location:. If
|
||||
you had a server at a non-standard port that redirected to an URL using a
|
||||
standard port number, curl still used that first port number.
|
||||
|
||||
- Ralph Beckmann pointed out a problem when using both CONF_FOLLOWLOCATION
|
||||
and CONF_FAILONERROR simultaneously. Since the CONF_FAILONERROR exits on
|
||||
the 302-code that the follow location header outputs it will never show any
|
||||
html on location: pages. I have now made it look for >=400 codes if
|
||||
CONF_FOLLOWLOCATION is set.
|
||||
|
||||
- 'struct slist' is now renamed to 'struct curl_slist' (as suggested by Ralph
|
||||
Beckmann).
|
||||
|
||||
- Joshua Swink and Rick Welykochy were the first to point out to me that the
|
||||
latest OpenSSL package now have moved the standard include path. It is now
|
||||
in /usr/local/ssl/include/openssl and I have now modified the --enable-ssl
|
||||
option for the configure script to use that as the primary path, and I
|
||||
leave the former path too to work with older packages of OpenSSL too.
|
||||
|
||||
Daniel (9 June 1999)
|
||||
- I finally understood the IRIX problem and now it seem to compile on it!
|
||||
I am gonna remove those #define strcasecmp() things once and for all now.
|
||||
|
||||
Daniel (4 June 1999)
|
||||
- I adjusted the FTP reply 227 parser to make the PASV command work better
|
||||
with more ftp servers. Appearantly the Roxen Challanger server replied
|
||||
something curl 5.9 could deal with! :-( Reported by Ashley Reid-Montanaro
|
||||
and Mark Butler brought a solution for it.
|
||||
|
||||
Daniel (26 May 1999)
|
||||
- Rearranged. README is new, the old one is now README.curl and I added a
|
||||
README.libcurl with text I got from Ralph Beckmann.
|
||||
|
||||
- I also updated the INSTALL text.
|
||||
|
||||
Daniel (25 May 1999)
|
||||
- David Jonathan Lowsky correctly pointed out that curl didn't properly deal
|
||||
with form posting where the variable shouldn't have any content, as in curl
|
||||
-F "form=" www.site.com. It was now fixed.
|
||||
|
||||
Version 5.9
|
||||
|
||||
Daniel (22 May 1999)
|
||||
- I've got a bug report from Aaron Scarisbrick in which he states he has some
|
||||
problems with -L under FreeBSD 3.0. I have previously got another bug
|
||||
report from Stefan Grether which points at an error with similar sympthoms
|
||||
when using win32. I made the allocation of the new url string a bit faster
|
||||
and different, don't know if it actually improves anything though...
|
||||
|
||||
Daniel (20 May 1999)
|
||||
- Made the cookie parser deal with CRLF newlines too.
|
||||
|
||||
Daniel (19 May 1999)
|
||||
- Download() didn't properly deal with failing return codes from the sread()
|
||||
function. Adam Coyne found the problem in the win32 version, and Troy Engel
|
||||
helped me out isolating it.
|
||||
|
||||
Daniel (16 May 1999)
|
||||
- Richard Adams pointed out a bug I introduced in 5.8. --dump-header doesn't
|
||||
work anymore! :-/ I fixed it now.
|
||||
|
||||
- After a suggestion by Joshua Swink I added -S / --show-error to force curl
|
||||
to display the error message in case of an error, even if -s/--silent was
|
||||
used.
|
||||
|
||||
Daniel (10 May 1999)
|
||||
- I moved the stuff concerning HTTP, DICT and TELNET it their own source
|
||||
files now. It is a beginning on my clean-up of the sources to make them
|
||||
layer all those protocols better to enable more to be added easier in the
|
||||
future!
|
||||
|
||||
- Leon Breedt sent me some files I've not put into the main curl
|
||||
archive. They're for creating the Debian package thingie. He also sent me a
|
||||
debian package that I've made available for download at the web page
|
||||
|
||||
Daniel (9 May 1999)
|
||||
- Made it compile on cygwin too.
|
||||
|
||||
Troy Engel (7 May 1999)
|
||||
- Brought a series of patches to allow curl to compile smoothly on MSVC++ 6
|
||||
again!
|
||||
|
||||
Daniel (6 May 1999)
|
||||
- I changed the #ifdef HAVE_STRFTIME placement for the -z code so that it
|
||||
will be easier to discover systems that don't have that function and thus
|
||||
can't use -z successfully. Made the strftime() get used if WIN32 is defined
|
||||
too.
|
||||
|
||||
Version 5.8
|
||||
|
||||
Daniel (5 May 1999)
|
||||
- I've had it with this autoconf/automake mess. It seems to work allright
|
||||
for most people who don't have automake installed, but for those who have
|
||||
there are problems all over.
|
||||
|
||||
I've got like five different bug reports on this only the last
|
||||
week... Claudio Neves and Federico Bianchi and root <duggerj001 at
|
||||
hawaii.rr.com> are some of them reporting this.
|
||||
|
||||
Currently, I have no really good fix since I want to use automake myself to
|
||||
generate the Makefile.in files. I've found out that the @SHELL@-problems
|
||||
can often be fixed by manually invoking 'automake' in the archive root
|
||||
before you run ./configure... I've hacked my maketgz script now to fiddle
|
||||
a bit with this and my tests seem to work better than before at least!
|
||||
|
||||
Daniel (4 May 1999)
|
||||
- mkhelp.pl has been doing badly lately. I corrected a case problem in
|
||||
the regexes.
|
||||
|
||||
- I've now remade the -o option to not touch the file unless it needs to.
|
||||
I had to do this to make -z option really fine, since now you can make a
|
||||
curl fetch and use a local copy's time when downloading to that file, as
|
||||
in:
|
||||
|
||||
curl -z dump -o dump remote.site.com/file.html
|
||||
|
||||
This will only get the file if the remote one is newer than the local.
|
||||
I'm aware that this alters previous behaviour a little. Some scripts out
|
||||
there may depend on that the file is always touched...
|
||||
|
||||
- Corrected a bug in the SSLv2/v3 selection.
|
||||
|
||||
- Felix von Leitner requested that curl should be able to send
|
||||
"If-Modified-Since" headers, which indeed is a fair idea. I implemented it
|
||||
right away! Try -z <expression> where expression is a full GNU date
|
||||
expression or a file name to get the date from!
|
||||
|
||||
Stephan Lagerholm (30 Apr 1999)
|
||||
- Pointed out a problem with the src/Makefile for FreeBSD. The RM variable
|
||||
isn't set and causes the make to fail.
|
||||
|
||||
Daniel (26 April 1999)
|
||||
- Am I silly or what? Irving Wolfe pointed out to me that the curl version
|
||||
number was not set properly. Hasn't been since 5.6. This was due to a bug
|
||||
in my maketgz script!
|
||||
|
||||
David Eriksson (25 Apr 1999)
|
||||
- Found a bug in cookies.c that made it crash at times.
|
||||
|
||||
Version 5.7.1
|
||||
|
||||
Doug Kaufman (23 Apr 1999)
|
||||
- Brought two sunos 4 fixes. One of them being the hostip.c fix mentioned
|
||||
below and the other one a correction in include/stdcheaders.h
|
||||
|
||||
- Added a paragraph about compiling with the US-version of openssl to the
|
||||
INSTALL file.
|
||||
|
||||
Daniel
|
||||
- New mailing list address. Info updated on the web page as well as in the
|
||||
README file
|
||||
|
||||
Greg Onufer (20 Apr 1999)
|
||||
- hostip.c didn't compile properly on SunOS 5.5.1.
|
||||
It needs an #include <sys/types.h>
|
||||
|
||||
Version 5.7
|
||||
|
||||
Daniel (Apr 20 1999)
|
||||
- Decided to upload a non-beta version right now!
|
||||
|
||||
- Made curl support any-length HTTP headers. The destination buffer is now
|
||||
simply enlarged every time it turns out to be too small!
|
||||
|
||||
- Added the FAQ file to the archive. Still a bit smallish, but it is a
|
||||
start.
|
||||
|
||||
Eric Thelin (15 Apr 1999)
|
||||
- Made -D accept '-' instead of filename to write to stdout.
|
||||
|
||||
Version 5.6.3beta
|
||||
|
||||
Daniel (Apr 12 1999)
|
||||
|
||||
- Changed two #ifdef WIN32 to better #ifdef <errorcode> when connect()ing
|
||||
in url.c and ftp.c. Makes cygwin32 deal with them better too. We should
|
||||
try to get some decent win32-replacement there. Anyone?
|
||||
|
||||
- The old -3/--crlf option is now ONLY --crlf!
|
||||
|
||||
- I changed the "SSL fix" to a more lame one, but that doesn't remove as
|
||||
much functionality. Now I've enabled the lib to select what SSL version it
|
||||
should try first. Appearantly some older SSL-servers don't like when you
|
||||
talk v3 with them so you need to be able to force curl to talk v2 from the
|
||||
start. The fix dated April 6 and posted on the mailing list forced curl to
|
||||
use v2 at all times using a modern OpenSSL version, but we don't really
|
||||
want such a crippled solution.
|
||||
|
||||
- Marc Boucher sent me a patch that corrected a math error for the
|
||||
"Curr.Speed" progress meter.
|
||||
|
||||
- Eric Thelin sent me a patch that enables '-K -' to read a config file from
|
||||
stdin.
|
||||
|
||||
- I found out we didn't close the file properly before so I added it!
|
||||
|
||||
Daniel (Apr 9 1999)
|
||||
- Yu Xin pointed out a problem with ftp download resume. It didn't work at
|
||||
all! ;-O
|
||||
|
||||
Daniel (Apr 6 1999)
|
||||
- Corrected the version string part generated for the SSL version.
|
||||
|
||||
- I found a way to make some other SSL page work with openssl 0.9.1+ that
|
||||
previously didn't (ssleay 0.8.0 works with it though!). Trying to get
|
||||
some real info from the OpenSSL guys to see how I should do to behave the
|
||||
best way. SSLeay 0.8.0 shouldn't be that much in use anyway these days!
|
||||
|
||||
Version 5.6.2beta
|
||||
|
||||
Daniel (Apr 4 1999)
|
||||
- Finally have curl more cookie "aware". Now read carefully. This is how
|
||||
it works.
|
||||
To make curl read cookies from an already existing file, in plain header-
|
||||
format (like from the headers of a previous fetch) invoke curl with the
|
||||
-b flag like:
|
||||
|
||||
curl -b file http://site/foo.html
|
||||
|
||||
Curl will then use all cookies it finds matching. The old style that sets
|
||||
a single cookie with -b is still supported and is used if the string
|
||||
following -b includes a '=' letter, as in "-b name=daniel".
|
||||
|
||||
To make curl read the cookies sent in combination with a location: (which
|
||||
sites often do) point curl to read a non-existing file at first (i.e
|
||||
to start with no existing cookies), like:
|
||||
|
||||
curl -b nowhere http://site/setcookieandrelocate.html
|
||||
|
||||
- Added a paragraph in the TODO file about the SSL problems recently
|
||||
reported. Evidently, some kind of SSL-problem curl may need to address.
|
||||
|
||||
- Better "Location:" following.
|
||||
|
||||
Douglas E. Wegscheid (Tue, 30 Mar 1999)
|
||||
- A subsecond display patch.
|
||||
|
||||
Daniel (Mar 14 1999)
|
||||
- I've separated the version number of libcurl and curl now. To make
|
||||
things a little easier, I decided to start the curl numbering from
|
||||
5.6 and the former version number known as "curl" is now the one
|
||||
set for libcurl.
|
||||
|
||||
- Removed the 'enable-no-pass' from configure, I doubt anyone wanted
|
||||
that.
|
||||
|
||||
- Made lots of tiny adjustments to compile smoothly with cygwin under
|
||||
win32. It's a killer for porting this to win32, bye bye VC++! ;-)
|
||||
Compiles and builds out-of-the-box now. See the new wordings in
|
||||
INSTALL for details.
|
||||
|
||||
- Beginning experiments with downloading multiple document from a http
|
||||
server while remaining connected.
|
||||
|
||||
Version 5.6beta
|
||||
|
||||
Daniel (Mar 13 1999)
|
||||
- Since I've changed so much, I thought I'd just go ahead and implement the
|
||||
suggestion from Douglas E. Wegscheid. -D or --dump-header is now storing
|
||||
HTTP headers separately in the specified file.
|
||||
|
||||
- Added new text to INSTALL on what to do to build this on win32 now.
|
||||
|
||||
- Aaargh. I had to take a step back and prefix the shared #include files
|
||||
in the sources with "../include/" to please VC++...
|
||||
|
||||
Daniel (Mar 12 1999)
|
||||
- Split the url.c source into many tiny sources for better readability
|
||||
and smaller size.
|
||||
|
||||
Daniel (Mar 11 1999)
|
||||
- Started to change stuff for a move to make libcurl and a more separate
|
||||
curl application that uses the libcurl. Made the libcurl sources into
|
||||
the new lib directory while the curl application will remain in src as
|
||||
before. New makefiles, adjusted configure script and so.
|
||||
|
||||
libcurl.a built quickly and easily. I better make a better interface to
|
||||
the lib functions though.
|
||||
|
||||
The new root dir include/ is supposed to contain the public information
|
||||
about the new libcurl. It is a little ugly so far :-)
|
||||
|
||||
|
||||
Daniel (Mar 1 1999)
|
||||
- Todd Kaufmann sent me a good link to Netscape's cookie spec as well as the
|
||||
info that RFC 2109 specifies how to use them. The link is now in the
|
||||
README and the RFC in the RESOURCES.
|
||||
|
||||
Daniel (Feb 23 1999)
|
||||
- Finally made configure accept --with-ssl to look for SSL libs and includes
|
||||
in the "standard" place /usr/local/ssl...
|
||||
|
||||
Daniel (Feb 22 1999)
|
||||
- Verified that curl linked fine with OpenSSL 0.9.1c which seems to be
|
||||
the most recent.
|
||||
|
||||
Henri Gomez (Fri Feb 5 1999)
|
||||
- Sent in an updated curl-ssl.spec. I still miss the script that builds an
|
||||
RPM automatically...
|
||||
|
||||
Version 5.5.1
|
||||
|
||||
Mark Butler (27 Jan 1999)
|
||||
- Corrected problems in Download().
|
||||
|
||||
Danitel Stenberg (25 Jan 1999)
|
||||
- Jeremie Petit pointed out a few flaws in the source that prevented it from
|
||||
compile warning free with the native compiler under Digital Unix v4.0d.
|
||||
|
||||
Version 5.5
|
||||
|
||||
Daniel Stenberg (15 Jan 1999)
|
||||
- Added Bjorns small text to the README about the DICT protocol.
|
||||
|
||||
Daniel Stenberg (11 Jan 1999)
|
||||
- <jswink at softcom.net> reported about the win32-versioin: "Doesn't use
|
||||
ALL_PROXY environment variable". Turned out to be because of the static-
|
||||
buffer nature of the win32 environment variable calls!
|
||||
|
||||
Bjorn Reese (10 Jan 1999)
|
||||
- I have attached a simple addition for the DICT protocol (RFC 2229).
|
||||
It performs dictionary lookups. The output still needs to be better
|
||||
formatted.
|
||||
|
||||
To test it try (the exact format, and more examples are described in
|
||||
the RFC)
|
||||
|
||||
dict://dict.org/m:hello
|
||||
dict://dict.org/m:hello::soundex
|
||||
|
||||
|
||||
Vicente Garcia (10 Jan 1999)
|
||||
- Corrected the progress meter for files larger than 20MB.
|
||||
|
||||
Daniel Stenberg (7 Jan 1999)
|
||||
- Corrected the -t and -T help texts. They claimed to be FTP only.
|
||||
|
||||
Version 5.4
|
||||
|
||||
Daniel Stenberg
|
||||
(7 Jan 1999)
|
||||
- Irving Wolfe reported that curl -s didn't always supress the progress
|
||||
reporting. It was the form post that autoamtically always switched it on
|
||||
again. This is now corrected!
|
||||
|
||||
(4 Jan 1999)
|
||||
- Andreas Kostyrka suggested I'd add PUT and he helped me out to test it. If
|
||||
you use -t or -T now on a http or https server, PUT will be used for file
|
||||
upload.
|
||||
|
||||
I removed the former use of -T with HTTP. I doubt anyone ever really used
|
||||
that.
|
||||
|
||||
(4 Jan 1999)
|
||||
- Erik Jacobsen found a width bug in the mprintf() function. I corrected it
|
||||
now.
|
||||
|
||||
(4 Jan 1999)
|
||||
- As John V. Chow pointed out to me, curl accepted very limited URL sizes. It
|
||||
should now accept path parts that are up to at least 4096 bytes.
|
||||
|
||||
- Somehow I screwed up when applying the AIX fix from Gilbert Ramirez, so
|
||||
I redid that now.
|
||||
|
1381
CHANGES.2000
1381
CHANGES.2000
File diff suppressed because it is too large
Load Diff
1957
CHANGES.2001
1957
CHANGES.2001
File diff suppressed because it is too large
Load Diff
1504
CHANGES.2002
1504
CHANGES.2002
File diff suppressed because it is too large
Load Diff
1572
CHANGES.2003
1572
CHANGES.2003
File diff suppressed because it is too large
Load Diff
1994
CHANGES.2004
1994
CHANGES.2004
File diff suppressed because it is too large
Load Diff
1183
CHANGES.2005
1183
CHANGES.2005
File diff suppressed because it is too large
Load Diff
2
COPYING
2
COPYING
@@ -1,6 +1,6 @@
|
||||
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.
|
||||
|
||||
|
121
Makefile.dist
121
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
|
||||
# you should have received as part of this distribution. The terms
|
||||
@@ -21,6 +21,8 @@
|
||||
# $Id$
|
||||
###########################################################################
|
||||
|
||||
VC=vc6
|
||||
|
||||
all:
|
||||
./configure
|
||||
make
|
||||
@@ -73,112 +75,120 @@ mingw32-ssl:
|
||||
$(MAKE) -C lib -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:
|
||||
$(MAKE) -C lib -f Makefile.m32 clean
|
||||
$(MAKE) -C src -f Makefile.m32 clean
|
||||
|
||||
vc-clean:
|
||||
cd lib
|
||||
nmake -f Makefile.vc6 clean
|
||||
nmake -f Makefile.$(VC) clean
|
||||
cd ..\src
|
||||
nmake -f Makefile.vc6 clean
|
||||
nmake -f Makefile.$(VC) clean
|
||||
|
||||
vc-all:
|
||||
cd lib
|
||||
nmake -f Makefile.vc6 cfg=release
|
||||
nmake -f Makefile.vc6 cfg=release-ssl
|
||||
nmake -f Makefile.vc6 cfg=release-zlib
|
||||
nmake -f Makefile.vc6 cfg=release-ssl-zlib
|
||||
nmake -f Makefile.vc6 cfg=release-ssl-dll
|
||||
nmake -f Makefile.vc6 cfg=release-zlib-dll
|
||||
nmake -f Makefile.vc6 cfg=release-ssl-dll-zlib-dll
|
||||
nmake -f Makefile.vc6 cfg=release-dll
|
||||
nmake -f Makefile.vc6 cfg=release-dll-ssl-dll
|
||||
nmake -f Makefile.vc6 cfg=release-dll-zlib-dll
|
||||
nmake -f Makefile.vc6 cfg=release-dll-ssl-dll-zlib-dll
|
||||
nmake -f Makefile.vc6 cfg=debug
|
||||
nmake -f Makefile.vc6 cfg=debug-ssl
|
||||
nmake -f Makefile.vc6 cfg=debug-zlib
|
||||
nmake -f Makefile.vc6 cfg=debug-ssl-zlib
|
||||
nmake -f Makefile.vc6 cfg=debug-ssl-dll
|
||||
nmake -f Makefile.vc6 cfg=debug-zlib-dll
|
||||
nmake -f Makefile.vc6 cfg=debug-ssl-dll-zlib-dll
|
||||
nmake -f Makefile.vc6 cfg=debug-dll
|
||||
nmake -f Makefile.vc6 cfg=debug-dll-ssl-dll
|
||||
nmake -f Makefile.vc6 cfg=debug-dll-zlib-dll
|
||||
nmake -f Makefile.vc6 cfg=debug-dll-ssl-dll-zlib-dll
|
||||
nmake -f Makefile.$(VC) cfg=release
|
||||
nmake -f Makefile.$(VC) cfg=release-ssl
|
||||
nmake -f Makefile.$(VC) cfg=release-zlib
|
||||
nmake -f Makefile.$(VC) cfg=release-ssl-zlib
|
||||
nmake -f Makefile.$(VC) cfg=release-ssl-dll
|
||||
nmake -f Makefile.$(VC) cfg=release-zlib-dll
|
||||
nmake -f Makefile.$(VC) cfg=release-ssl-dll-zlib-dll
|
||||
nmake -f Makefile.$(VC) cfg=release-dll
|
||||
nmake -f Makefile.$(VC) cfg=release-dll-ssl-dll
|
||||
nmake -f Makefile.$(VC) cfg=release-dll-zlib-dll
|
||||
nmake -f Makefile.$(VC) cfg=release-dll-ssl-dll-zlib-dll
|
||||
nmake -f Makefile.$(VC) cfg=debug
|
||||
nmake -f Makefile.$(VC) cfg=debug-ssl
|
||||
nmake -f Makefile.$(VC) cfg=debug-zlib
|
||||
nmake -f Makefile.$(VC) cfg=debug-ssl-zlib
|
||||
nmake -f Makefile.$(VC) cfg=debug-ssl-dll
|
||||
nmake -f Makefile.$(VC) cfg=debug-zlib-dll
|
||||
nmake -f Makefile.$(VC) cfg=debug-ssl-dll-zlib-dll
|
||||
nmake -f Makefile.$(VC) cfg=debug-dll
|
||||
nmake -f Makefile.$(VC) cfg=debug-dll-ssl-dll
|
||||
nmake -f Makefile.$(VC) cfg=debug-dll-zlib-dll
|
||||
nmake -f Makefile.$(VC) cfg=debug-dll-ssl-dll-zlib-dll
|
||||
|
||||
vc:
|
||||
cd lib
|
||||
nmake /f Makefile.vc6 cfg=release
|
||||
nmake /f Makefile.$(VC) cfg=release
|
||||
cd ..\src
|
||||
nmake /f Makefile.vc6
|
||||
nmake /f Makefile.$(VC)
|
||||
|
||||
vc-zlib:
|
||||
cd lib
|
||||
nmake /f Makefile.vc6 cfg=release-zlib
|
||||
nmake /f Makefile.$(VC) cfg=release-zlib
|
||||
cd ..\src
|
||||
nmake /f Makefile.vc6 cfg=release-zlib
|
||||
nmake /f Makefile.$(VC) cfg=release-zlib
|
||||
|
||||
vc-ssl:
|
||||
cd lib
|
||||
nmake /f Makefile.vc6 cfg=release-ssl
|
||||
nmake /f Makefile.$(VC) cfg=release-ssl
|
||||
cd ..\src
|
||||
nmake /f Makefile.vc6 cfg=release-ssl
|
||||
nmake /f Makefile.$(VC) cfg=release-ssl
|
||||
|
||||
vc-ssl-zlib:
|
||||
cd lib
|
||||
nmake /f Makefile.vc6 cfg=release-ssl-zlib
|
||||
nmake /f Makefile.$(VC) cfg=release-ssl-zlib
|
||||
cd ..\src
|
||||
nmake /f Makefile.vc6 cfg=release-ssl-zlib
|
||||
nmake /f Makefile.$(VC) cfg=release-ssl-zlib
|
||||
|
||||
vc-ssl-dll:
|
||||
cd lib
|
||||
nmake /f Makefile.vc6 cfg=release-ssl-dll
|
||||
nmake /f Makefile.$(VC) cfg=release-ssl-dll
|
||||
cd ..\src
|
||||
nmake /f Makefile.vc6 cfg=release-ssl-dll
|
||||
nmake /f Makefile.$(VC) cfg=release-ssl-dll
|
||||
|
||||
vc-dll-ssl-dll:
|
||||
cd lib
|
||||
nmake /f Makefile.vc6 cfg=release-dll-ssl-dll
|
||||
nmake /f Makefile.$(VC) cfg=release-dll-ssl-dll
|
||||
cd ..\src
|
||||
nmake /f Makefile.vc6 cfg=release-dll-ssl-dll
|
||||
nmake /f Makefile.$(VC) cfg=release-dll-ssl-dll
|
||||
|
||||
vc-dll:
|
||||
cd lib
|
||||
nmake /f Makefile.vc6 cfg=release-dll
|
||||
nmake /f Makefile.$(VC) cfg=release-dll
|
||||
cd ..\src
|
||||
nmake /f Makefile.vc6 cfg=release-dll
|
||||
nmake /f Makefile.$(VC) cfg=release-dll
|
||||
|
||||
vc-dll-zlib-dll:
|
||||
cd lib
|
||||
nmake /f Makefile.vc6 cfg=release-dll-zlib-dll
|
||||
nmake /f Makefile.$(VC) cfg=release-dll-zlib-dll
|
||||
cd ..\src
|
||||
nmake /f Makefile.vc6 cfg=release-dll-zlib-dll
|
||||
nmake /f Makefile.$(VC) cfg=release-dll-zlib-dll
|
||||
|
||||
vc-dll-ssl-dll-zlib-dll:
|
||||
cd lib
|
||||
nmake /f Makefile.vc6 cfg=release-dll-ssl-dll-zlib-dll
|
||||
nmake /f Makefile.$(VC) cfg=release-dll-ssl-dll-zlib-dll
|
||||
cd ..\src
|
||||
nmake /f Makefile.vc6 cfg=release-dll-ssl-dll-zlib-dll
|
||||
nmake /f Makefile.$(VC) cfg=release-dll-ssl-dll-zlib-dll
|
||||
|
||||
vc-ssl-dll-zlib-dll:
|
||||
cd lib
|
||||
nmake /f Makefile.vc6 cfg=release-ssl-dll-zlib-dll
|
||||
nmake /f Makefile.$(VC) cfg=release-ssl-dll-zlib-dll
|
||||
cd ..\src
|
||||
nmake /f Makefile.vc6 cfg=release-ssl-dll-zlib-dll
|
||||
nmake /f Makefile.$(VC) cfg=release-ssl-dll-zlib-dll
|
||||
|
||||
vc-zlib-dll:
|
||||
cd lib
|
||||
nmake /f Makefile.vc6 cfg=release-zlib-dll
|
||||
nmake /f Makefile.$(VC) cfg=release-zlib-dll
|
||||
cd ..\src
|
||||
nmake /f Makefile.vc6 cfg=release-zlib-dll
|
||||
nmake /f Makefile.$(VC) cfg=release-zlib-dll
|
||||
|
||||
vc-sspi:
|
||||
cd lib
|
||||
nmake /f Makefile.vc6 cfg=release WINDOWS_SSPI=1
|
||||
nmake /f Makefile.$(VC) cfg=release WINDOWS_SSPI=1
|
||||
cd ..\src
|
||||
nmake /f Makefile.vc6 cfg=release WINDOWS_SSPI=1
|
||||
nmake /f Makefile.$(VC) cfg=release WINDOWS_SSPI=1
|
||||
|
||||
djgpp:
|
||||
$(MAKE) -C lib -f Makefile.dj
|
||||
@@ -212,6 +222,10 @@ netware-ssl-zlib:
|
||||
$(MAKE) -C lib -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:
|
||||
$(MAKE) -C lib -f Makefile.netware WITH_ZLIB=1
|
||||
$(MAKE) -C src -f Makefile.netware WITH_ZLIB=1
|
||||
@@ -220,6 +234,10 @@ netware-clean:
|
||||
$(MAKE) -C lib -f Makefile.netware clean
|
||||
$(MAKE) -C src -f Makefile.netware clean
|
||||
|
||||
netware-install:
|
||||
$(MAKE) -C lib -f Makefile.netware install
|
||||
$(MAKE) -C src -f Makefile.netware install
|
||||
|
||||
unix: all
|
||||
|
||||
unix-ssl: ssl
|
||||
@@ -227,3 +245,8 @@ unix-ssl: ssl
|
||||
linux: all
|
||||
|
||||
linux-ssl: ssl
|
||||
|
||||
vc8:
|
||||
echo "generate VC8 makefiles"
|
||||
sed -e "s#/GX /DWIN32 /YX#/EHsc /DWIN32#" -e 's#/GZ#/RTC1#' -e 's/wsock32.lib/wsock32.lib bufferoverflowu.lib/g' -e 's/VC6/VC8/g' lib/Makefile.vc6 > lib/Makefile.vc8
|
||||
sed -e "s#/GX /DWIN32 /YX#/EHsc /DWIN32#" -e 's#/GZ#/RTC1#' -e 's/wsock32.lib/wsock32.lib bufferoverflowu.lib/g' -e 's/VC6/VC8/g' src/Makefile.vc6 > src/Makefile.vc8
|
||||
|
113
RELEASE-NOTES
113
RELEASE-NOTES
@@ -1,57 +1,94 @@
|
||||
Curl and libcurl 7.15.5
|
||||
Curl and libcurl 7.16.3
|
||||
|
||||
Public curl release number: 95
|
||||
Releases counted from the very beginning: 122
|
||||
Available command line options: 114
|
||||
Available curl_easy_setopt() options: 133
|
||||
Public curl release number: 99
|
||||
Releases counted from the very beginning: 126
|
||||
Available command line options: 118
|
||||
Available curl_easy_setopt() options: 141
|
||||
Number of public functions in libcurl: 54
|
||||
Amount of public web site mirrors: 33
|
||||
Number of known libcurl bindings: 32
|
||||
Number of contributors: 506
|
||||
Amount of public web site mirrors: 38
|
||||
Number of known libcurl bindings: 35
|
||||
Number of contributors: 554
|
||||
|
||||
This release includes the following changes:
|
||||
|
||||
o added --ftp-ssl-reqd
|
||||
o modified the prototype for the socket callback set with
|
||||
CURLMOPT_SOCKETFUNCTION
|
||||
o added curl_multi_assign()
|
||||
o added CURLOPT_FTP_ALTERNATIVE_TO_USER and --ftp-alternative-to-user
|
||||
o added a vcproj file for building libcurl
|
||||
o added curl_formget()
|
||||
o added CURLOPT_MAX_SEND_SPEED_LARGE and CURLOPT_MAX_RECV_SPEED_LARGE
|
||||
o added configure --enable-hidden-symbols
|
||||
o Made -K on a file that couldn't be read cause a warning to be displayed
|
||||
|
||||
o added curl_multi_socket_action()
|
||||
o deprecated curl_multi_socket()
|
||||
o uses less memory in non-pipelined use cases
|
||||
o CURLOPT_HTTP200ALIASES matched transfers assume HTTP 1.0 compliance
|
||||
o more than one test harness can run at the same time without conflict
|
||||
o SFTP now supports quote commands before a transfer
|
||||
o CURLMOPT_MAXCONNECTS added to curl_multi_setopt()
|
||||
o upload resume works for file:// URLs
|
||||
o asynchronous name resolves now require c-ares 1.4.0 or later
|
||||
o added SOCKS test cases
|
||||
o CURLOPT_FTP_CREATE_MISSING_DIRS and --ftp-create-dirs now work for SFTP
|
||||
operations as well
|
||||
|
||||
This release includes the following bugfixes:
|
||||
|
||||
o chunked encoding when custom header "Transfer-Encoding: chunked" is set
|
||||
o Curl_strerror() crash on unknown errors
|
||||
o changing Content-Type when doing formposts
|
||||
o added CURL_EXTERN to a few recent multi functions that lacked them
|
||||
o splay-tree related problems for internal expire time handling
|
||||
o FTP ASCII CRLF counter reset
|
||||
o cookie parser now compares paths case sensitive
|
||||
o an easy handle with shared DNS cache added to a multi handle caused a crash
|
||||
o couldn't override the Proxy-Connection: header for non-CONNECT requests
|
||||
o curl_multi_fdset() could wrongly return -1 as max_fd value
|
||||
o if2up too long interface name memory leak
|
||||
o test case 534 started to fail 2007-04-13 due to the existance of a
|
||||
new host on the net with the same silly domain the test was using
|
||||
for a host which was supposed not to exist.
|
||||
o test suite SSL certificate works better with newer stunnel
|
||||
o internal progress meter update frequency back to once per second
|
||||
o avoid some unnecessary calls to function gettimeofday
|
||||
o a double-free in the SSL-layer
|
||||
o GnuTLS free of NULL credentials
|
||||
o NSS-fix for closing down SSL
|
||||
o bad warning from configure when gnutls was selected
|
||||
o compilation on VMS 64-bit mode
|
||||
o SCP/SFTP downloads could hang on the last bytes of a transfer
|
||||
o curl_easy_duphandle() crash
|
||||
o curl -V / curl_version*() works even when GnuTLS is used on a system without
|
||||
a good random source
|
||||
o curl_multi_socket() not "noticing" newly added handles
|
||||
o lack of Content-Length and chunked encoding now requires HTTP 1.1 as well
|
||||
to be treated as without response body
|
||||
o connection cache growth in multi handles
|
||||
o better handling of out of memory conditions
|
||||
o overwriting an uploaded file with sftp now truncates it first
|
||||
o SFTP quote commands chmod, chown, chgrp can now set a value of 0
|
||||
o TFTP connect timouts less than 5 seconds
|
||||
o improved curl -w for TFTP transfers
|
||||
o memory leak when failed OpenSSL certificate CN field checking
|
||||
o memory leak when OpenSSL failed PKCS #12 parsing
|
||||
o FPL-SSL when built with NSS
|
||||
o out-of-boundary write in Curl_select()
|
||||
o -s/--silent can now be used to toggle off the silence again
|
||||
o builds fine on 64bit HP-UX
|
||||
o multi interface HTTP CONNECT glitch
|
||||
o list FTP root directories when login dir is not root
|
||||
o no longer slows down when getting very many URLs on the same command line
|
||||
o lock share before decreasing dirty counter
|
||||
o no-body FTP requests on re-used connections
|
||||
|
||||
This release includes the following known bugs:
|
||||
|
||||
o see docs/KNOWN_BUGS (http://curl.haxx.se/docs/knownbugs.html)
|
||||
|
||||
Other curl-related news:
|
||||
|
||||
o yassl 1.3.7 can now be used with libcurl as an optional TLS library for
|
||||
HTTPS/FTPS support: http://www.yassl.com/
|
||||
o cURLpp 0.6.0 was released: http://rrette.com/curlpp.html
|
||||
o pycurl-7.15.4 was released: http://pycurl.sf.net
|
||||
o PycURL 7.16.2.1 was released: http://pycurl.sf.net/
|
||||
o TclCurl 7.16.2 was released:
|
||||
http://personal1.iddeo.es/andresgarci/tclcurl/english/
|
||||
|
||||
New curl mirrors:
|
||||
|
||||
o
|
||||
o http://curl.spegulo.be is a new mirror in Belgium
|
||||
o http://curl.piotrkosoft.net is a new mirror in Poland
|
||||
o http://curl.smudge-it.net is a new mirror in St Louis, MO, USA
|
||||
o http://curl.askapache.com is a new mirror in Indiana, USA
|
||||
|
||||
This release would not have looked like this without help, code, reports and
|
||||
advice from friends like these:
|
||||
|
||||
Dan Fandrich, Peter Silva, Arve Knudsen, Michael Wallner, Toshiyuki Maezawa,
|
||||
Ingmar Runge, Ates Goral, David McCreedy, Jari Sundell, Georg Horn,
|
||||
Gisle Vanem, Yang Tse, Michael Jerris, Dan Nelson, Yves Lejeune,
|
||||
Maciej Karpiuk, Mark Lentczner
|
||||
Song Ma, Dan Fandrich, Yang Tse, Jay Austin, Robert Iakobashvil,
|
||||
James Housley, Daniel Black, Steve Little, Sonia Subramanian, Peter O'Gorman,
|
||||
Frank Hempel, Michael Wallner, Jeff Pohlmeyer, Tobias Rundstr<74>m,
|
||||
Anders Gustafsson, James Bursa, Kristian Gunstone, Feng Tu,
|
||||
Andre Guibert de Bruet, Rob Crittenden, Rich Rauenzahn, Tom Regner,
|
||||
Dave Vasilevsky, Shmulik Regev, Robson Braga Araujo, Adam Piggott,
|
||||
Gerrit Bruchh<68>user
|
||||
|
||||
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
|
||||
# you should have received as part of this distribution. The terms
|
||||
@@ -685,7 +685,7 @@ AC_DEFUN([CURL_CHECK_FUNC_RECV], [
|
||||
])
|
||||
#
|
||||
if test "$curl_cv_recv" = "yes"; then
|
||||
AC_CACHE_CHECK([types of arguments and return type for recv],
|
||||
AC_CACHE_CHECK([types of args and return type for recv],
|
||||
[curl_cv_func_recv_args], [
|
||||
curl_cv_func_recv_args="unknown"
|
||||
for recv_retv in 'int' 'ssize_t'; do
|
||||
@@ -815,7 +815,7 @@ AC_DEFUN([CURL_CHECK_FUNC_SEND], [
|
||||
])
|
||||
#
|
||||
if test "$curl_cv_send" = "yes"; then
|
||||
AC_CACHE_CHECK([types of arguments and return type for send],
|
||||
AC_CACHE_CHECK([types of args and return type for send],
|
||||
[curl_cv_func_send_args], [
|
||||
curl_cv_func_send_args="unknown"
|
||||
for send_retv in 'int' 'ssize_t'; do
|
||||
@@ -976,6 +976,107 @@ AC_DEFUN([CURL_CHECK_MSG_NOSIGNAL], [
|
||||
]) # 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 -------------------------------------------------
|
||||
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])
|
||||
dnl The shared library extension variable name changes from version to
|
||||
dnl version of libtool. Try a few names then just set one statically.
|
||||
test -z "$shared_ext" && shared_ext="$shrext_cmds"
|
||||
test -z "$shared_ext" && eval shared_ext=\"$shrext_cmds\"
|
||||
test -z "$shared_ext" && shared_ext="$std_shrext"
|
||||
test -z "$shared_ext" && shared_ext="$shrext"
|
||||
test -z "$shared_ext" && shared_ext=".so"
|
||||
|
||||
@@ -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/^.* //'`
|
||||
DLGUESSLIB=`name=$2 eval echo "$libname_spec"`
|
||||
DLGUESSFILE=`libname="$DLGUESSLIB" release="" major="" versuffix="" eval echo "$LIBNAME_LINK_SPEC"`
|
||||
dnl Last resort in case libtool knows nothing about shared libs on this platform
|
||||
test -z "$DLGUESSFILE" && DLGUESSFILE="$DLGUESSLIB$shared_ext"
|
||||
|
||||
dnl Synthesize a likely dynamic library name in case we can't find an actual one
|
||||
SO_NAME_SPEC="$soname_spec"
|
||||
dnl soname_spec undefined when identical to the 1st entry in library_names_spec
|
||||
test -z "$SO_NAME_SPEC" && SO_NAME_SPEC=`echo "$library_names_spec" | $SED 's/ .*$//'`
|
||||
DLGUESSSOFILE=`libname="$DLGUESSLIB" release="" major="" versuffix="" eval echo "$SO_NAME_SPEC"`
|
||||
dnl Last resort in case libtool knows nothing about shared libs on this platform
|
||||
test -z "$DLGUESSSOFILE" && DLGUESSSOFILE="$DLGUESSFILE"
|
||||
|
||||
if test "$cross_compiling" = yes; then
|
||||
dnl Can't look at filesystem when cross-compiling
|
||||
@@ -1814,3 +1920,137 @@ else
|
||||
AC_MSG_WARN([`missing' script is too old or missing])
|
||||
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
|
||||
])
|
||||
|
||||
|
12
ares/AUTHORS
12
ares/AUTHORS
@@ -14,3 +14,15 @@ Henrik Stoerner
|
||||
Yang Tse
|
||||
Nick Mathewson
|
||||
Alexander Lazic
|
||||
Andreas Rieke
|
||||
Guilherme Balena Versiani
|
||||
Brad Spencer
|
||||
Ravi Pratap
|
||||
William Ahern
|
||||
Bram Matthys
|
||||
Michael Wallner
|
||||
Vlad Dinulescu
|
||||
Brad House
|
||||
Shmulik Regev
|
||||
Ashish Sharma
|
||||
Brad Spencer
|
||||
|
141
ares/CHANGES
141
ares/CHANGES
@@ -1,5 +1,146 @@
|
||||
Changelog for the c-ares project
|
||||
|
||||
Version 1.4.0 (June 8, 2007)
|
||||
|
||||
* June 4 2007 (Daniel Stenberg)
|
||||
|
||||
- James Bursa reported a major memory problem when resolving multi-IP names
|
||||
and I found and fixed the problem. It was added by Ashish Sharma's patch
|
||||
two days ago.
|
||||
|
||||
When I then tried to verify multiple entries in /etc/hosts after my fix, I
|
||||
got another segfault and decided this code was not ripe for inclusion and I
|
||||
reverted the patch.
|
||||
|
||||
* June 2 2007
|
||||
|
||||
- Brad Spencer found and fixed three flaws in the code, found with the new
|
||||
gcc 4.2.0 warning: -Waddress
|
||||
|
||||
- Brad House fixed VS2005 compiler warnings due to time_t being 64bit.
|
||||
He also made recent Microsoft compilers use _strdup() instead of strdup().
|
||||
|
||||
- Brad House's man pages for ares_save_options() and ares_destroy_options()
|
||||
were added.
|
||||
|
||||
- Ashish Sharma provided a patch for supporting multiple entries in the
|
||||
/etc/hosts file. Patch edited for coding style and functionality by me
|
||||
(Daniel).
|
||||
|
||||
* May 30 2007
|
||||
|
||||
- Shmulik Regev brought cryptographically secure transaction IDs:
|
||||
|
||||
The c-ares library implementation uses a DNS "Transaction ID" field that is
|
||||
seeded with a pseudo random number (based on gettimeofday) which is
|
||||
incremented (++) between consecutive calls and is therefore rather
|
||||
predictable. In general, predictability of DNS Transaction ID is a well
|
||||
known security problem (e.g.
|
||||
http://bak.spc.org/dms/archive/dns_id_attack.txt) and makes a c-ares based
|
||||
implementation vulnerable to DNS poisoning. Credit goes to Amit Klein
|
||||
(Trusteer) for identifying this problem.
|
||||
|
||||
The patch I wrote changes the implementation to use a more secure way of
|
||||
generating unique IDs. It starts by obtaining a key with reasonable entropy
|
||||
which is used with an RC4 stream to generate the cryptographically secure
|
||||
transaction IDs.
|
||||
|
||||
Note that the key generation code (in ares_init:randomize_key) has two
|
||||
versions, the Windows specific one uses a cryptographically safe function
|
||||
provided (but undocumented :) by the operating system (described at
|
||||
http://blogs.msdn.com/michael_howard/archive/2005/01/14/353379.aspx). The
|
||||
default implementation is a bit naive and uses the standard 'rand'
|
||||
function. Surely a better way to generate random keys exists for other
|
||||
platforms.
|
||||
|
||||
The patch can be tested by using the adig utility and using the '-s' option.
|
||||
|
||||
- Brad House added ares_save_options() and ares_destroy_options() that can be
|
||||
used to keep options for later re-usal when ares_init_options() is used.
|
||||
|
||||
Problem: Calling ares_init() for each lookup can be unnecessarily resource
|
||||
intensive. On windows, it must LoadLibrary() or search the registry
|
||||
on each call to ares_init(). On unix, it must read and parse
|
||||
multiple files to obtain the necessary configuration information. In
|
||||
a single-threaded environment, it would make sense to only
|
||||
ares_init() once, but in a heavily multi-threaded environment, it is
|
||||
undesirable to ares_init() and ares_destroy() for each thread created
|
||||
and track that.
|
||||
|
||||
Solution: Create ares_save_options() and ares_destroy_options() functions to
|
||||
retrieve and free options obtained from an initialized channel. The
|
||||
options populated can be used to pass back into ares_init_options(),
|
||||
it should populate all needed fields and not retrieve any information
|
||||
from the system. Probably wise to destroy the cache every minute or
|
||||
so to prevent the data from becoming stale.
|
||||
|
||||
- Daniel S added ares_process_fd() to allow applications to ask for processing
|
||||
on specific sockets and thus avoiding select() and associated
|
||||
functions/macros. This function will be used by upcoming libcurl releases
|
||||
for this very reason. It also made me export the ares_socket_t type in the
|
||||
public ares.h header file, since ares_process_fd() uses that type for two of
|
||||
the arguments.
|
||||
|
||||
* May 25 2007
|
||||
|
||||
- Ravi Pratap fixed a flaw in the init_by_resolv_conf() function for windows
|
||||
that could cause it to return a bad return code.
|
||||
|
||||
* April 16 2007
|
||||
|
||||
- Yang Tse: Provide ares_getopt() command-line parser function as a source
|
||||
code helper function, not belonging to the actual c-ares library.
|
||||
|
||||
* February 19 2007
|
||||
|
||||
- Vlad Dinulescu added ares_parse_ns_reply().
|
||||
|
||||
* February 13 2007
|
||||
|
||||
- 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 2006
|
||||
|
||||
- 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 2006
|
||||
|
||||
- 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
|
||||
|
||||
- Brad Spencer did
|
||||
|
||||
o made ares_version.h use extern "C" for c++ compilers
|
||||
o fixed compiler warnings in ares_getnameinfo.c
|
||||
o fixed a buffer position init for TCP reads
|
||||
|
||||
* August 3 2006
|
||||
|
||||
- Ravi Pratap fixed ares_getsock() to actually return the proper bitmap and
|
||||
|
@@ -11,7 +11,7 @@ MSVCFILES = vc/adig/adig.dep vc/adig/adig.dsp vc/vc.dsw vc/ahost/ahost.dep \
|
||||
# adig and ahost are just sample programs and thus not mentioned with the
|
||||
# regular sources and headers
|
||||
EXTRA_DIST = CHANGES README.cares Makefile.inc adig.c ahost.c $(man_MANS) \
|
||||
$(MSVCFILES) AUTHORS config-win32.h
|
||||
$(MSVCFILES) AUTHORS config-win32.h RELEASE-NOTES
|
||||
|
||||
|
||||
VER=-version-info 1:0:0
|
||||
@@ -59,7 +59,7 @@ libcares_la_SOURCES = $(CSOURCES) $(HHEADERS)
|
||||
# where to install the c-ares headers
|
||||
libcares_ladir = $(includedir)
|
||||
# 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
|
||||
dist-hook:
|
||||
|
@@ -2,39 +2,62 @@
|
||||
# c-ares Makefile for djgpp/gcc/Watt-32.
|
||||
# By Gisle Vanem <giva@bgnett.no> 2004.
|
||||
#
|
||||
.SUFFIXES: .exe
|
||||
# $Id$
|
||||
|
||||
TOPDIR = ..
|
||||
|
||||
include ../packages/DOS/common.dj
|
||||
|
||||
include Makefile.inc
|
||||
|
||||
WATT32_ROOT = $(subst \,/,$(WATT_ROOT))
|
||||
|
||||
CC = gcc
|
||||
CFLAGS = -O2 -Wall -DWATT32 -Dselect=select_s -DHAVE_AF_INET6 \
|
||||
-DHAVE_PF_INET6 -DHAVE_IOCTLSOCKET -DHAVE_STRUCT_IN6_ADDR \
|
||||
-DHAVE_STRUCT_SOCKADDR_IN6 -DHAVE_STRUCT_ADDRINFO \
|
||||
-DHAVE_ARPA_NAMESER_H -DNS_INADDRSZ=4 \
|
||||
-DHAVE_SOCKADDR_IN6_SIN6_SCOPE_ID -I$(WATT32_ROOT)/inc
|
||||
CFLAGS += -DWATT32 -DHAVE_AF_INET6 -DHAVE_PF_INET6 -DHAVE_FIONBIO \
|
||||
-DHAVE_STRUCT_IN6_ADDR -DHAVE_SOCKADDR_IN6_SIN6_SCOPE_ID \
|
||||
-DHAVE_SYS_TIME_H -DHAVE_STRUCT_SOCKADDR_IN6 -DHAVE_STRUCT_ADDRINFO \
|
||||
-DHAVE_SIGNAL_H -DHAVE_SIG_ATOMIC_T -DRETSIGTYPE='void' -DHAVE_PROCESS_H \
|
||||
-DHAVE_ARPA_NAMESER_H -DNS_INADDRSZ=4 -DHAVE_RECV -DHAVE_SEND \
|
||||
-DSEND_TYPE_ARG1='int' -DSEND_QUAL_ARG2='const' \
|
||||
-DSEND_TYPE_ARG2='void*' -DSEND_TYPE_ARG3='int' \
|
||||
-DSEND_TYPE_ARG4='int' -DSEND_TYPE_RETV='int' \
|
||||
-DRECV_TYPE_ARG1='int' -DRECV_TYPE_ARG2='void*' \
|
||||
-DRECV_TYPE_ARG3='int' -DRECV_TYPE_ARG4='int' \
|
||||
-DRECV_TYPE_RETV='int' -DHAVE_STRUCT_TIMEVAL \
|
||||
-Dselect=select_s -UHAVE_CONFIG_H
|
||||
|
||||
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
|
||||
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))
|
||||
|
||||
all: $(OBJ_DIR) libcares.a ahost.exe adig.exe
|
||||
@echo Welcome to c-ares.
|
||||
|
||||
$(OBJ_DIR):
|
||||
- mkdir $(OBJ_DIR)
|
||||
|
||||
libcares.a: $(OBJECTS)
|
||||
ar rs $@ $?
|
||||
|
||||
ahost.exe: ahost.c libcares.a
|
||||
ahost.exe: ahost.c $(OBJ_DIR)/ares_getopt.o $(OBJ_HACK)
|
||||
$(CC) $(LDFLAGS) $(CFLAGS) -o $@ $^ $(EX_LIBS)
|
||||
|
||||
adig.exe: adig.c libcares.a
|
||||
adig.exe: adig.c $(OBJ_DIR)/ares_getopt.o $(OBJ_HACK)
|
||||
$(CC) $(LDFLAGS) $(CFLAGS) -o $@ $^ $(EX_LIBS)
|
||||
|
||||
clean:
|
||||
@@ -44,12 +67,5 @@ vclean realclean: clean
|
||||
rm -f ahost.exe adig.exe depend.dj
|
||||
- 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
|
||||
|
||||
|
@@ -5,15 +5,18 @@ ares_gethostbyname.c ares_strerror.c ares_cancel.c ares_init.c \
|
||||
ares_timeout.c ares_destroy.c ares_mkquery.c ares_version.c \
|
||||
ares_expand_name.c ares_parse_a_reply.c windows_port.c \
|
||||
ares_expand_string.c ares_parse_ptr_reply.c ares_parse_aaaa_reply.c \
|
||||
ares_getnameinfo.c inet_net_pton.c bitncmp.c inet_ntop.c
|
||||
ares_getnameinfo.c inet_net_pton.c bitncmp.c inet_ntop.c \
|
||||
ares_parse_ns_reply.c
|
||||
|
||||
HHEADERS = ares.h ares_private.h setup.h ares_dns.h ares_version.h \
|
||||
nameser.h inet_net_pton.h inet_ntop.h ares_ipv6.h bitncmp.h \
|
||||
setup_once.h
|
||||
|
||||
MANPAGES= ares_destroy.3 ares_expand_name.3 ares_expand_string.3 ares_fds.3 \
|
||||
ares_free_hostent.3 ares_free_string.3 ares_gethostbyaddr.3 \
|
||||
ares_gethostbyname.3 ares_init.3 ares_init_options.3 ares_mkquery.3 \
|
||||
ares_parse_a_reply.3 ares_parse_ptr_reply.3 ares_process.3 \
|
||||
ares_query.3 ares_search.3 ares_send.3 ares_strerror.3 ares_timeout.3 \
|
||||
ares_version.3 ares_cancel.3 ares_parse_aaaa_reply.3 ares_getnameinfo.3
|
||||
ares_free_hostent.3 ares_free_string.3 ares_gethostbyaddr.3 \
|
||||
ares_gethostbyname.3 ares_init.3 ares_init_options.3 ares_mkquery.3 \
|
||||
ares_parse_a_reply.3 ares_parse_ptr_reply.3 ares_process.3 \
|
||||
ares_query.3 ares_search.3 ares_send.3 ares_strerror.3 ares_timeout.3 \
|
||||
ares_version.3 ares_cancel.3 ares_parse_aaaa_reply.3 ares_getnameinfo.3 \
|
||||
ares_getsock.3 ares_parse_ns_reply.3 \
|
||||
ares_destroy_options.3 ares_save_options.3
|
||||
|
@@ -5,27 +5,30 @@
|
||||
## Use: make -f Makefile.m32 [demos]
|
||||
##
|
||||
## Quick hack by Guenter; comments to: /dev/nul
|
||||
|
||||
CC = gcc
|
||||
RANLIB = ranlib
|
||||
|
||||
#
|
||||
########################################################
|
||||
## Nothing more to do below this line!
|
||||
|
||||
LIB=libcares.a
|
||||
CC=gcc
|
||||
CFLAGS=-O2 -Wall
|
||||
LDFLAGS=-s
|
||||
LIBS=-lwsock32
|
||||
LIB = libcares.a
|
||||
|
||||
MANPAGES := $(patsubst %.c,%.o,$(wildcard ares_*.3))
|
||||
CC = gcc
|
||||
LD = gcc
|
||||
RANLIB = ranlib
|
||||
#RM = rm -f
|
||||
|
||||
OBJS := $(patsubst %.c,%.o,$(wildcard ares_*.c))
|
||||
OBJS += windows_port.o inet_ntop.o inet_net_pton.o bitncmp.o
|
||||
CFLAGS = -O2 -Wall
|
||||
LDFLAGS = -s
|
||||
LIBS = -lwsock32
|
||||
|
||||
$(LIB): ${OBJS}
|
||||
ar cru $@ ${OBJS}
|
||||
${RANLIB} $@
|
||||
# Makefile.inc provides the CSOURCES and HHEADERS defines
|
||||
include Makefile.inc
|
||||
|
||||
OBJLIB := $(patsubst %.c,%.o,$(strip $(CSOURCES)))
|
||||
|
||||
|
||||
$(LIB): $(OBJLIB)
|
||||
ar cru $@ $^
|
||||
$(RANLIB) $@
|
||||
|
||||
all: $(LIB) demos
|
||||
|
||||
@@ -34,16 +37,13 @@ demos: adig.exe ahost.exe
|
||||
tags:
|
||||
etags *.[ch]
|
||||
|
||||
adig.exe: adig.o $(LIB)
|
||||
${CC} ${LDFLAGS} -o $@ adig.o $(LIB) ${LIBS}
|
||||
%.exe: %.o ares_getopt.o $(LIB)
|
||||
$(LD) $(LDFLAGS) -o $@ $^ $(LIBS)
|
||||
|
||||
ahost.exe: ahost.o $(LIB)
|
||||
${CC} ${LDFLAGS} -o $@ ahost.o $(LIB) ${LIBS}
|
||||
|
||||
${OBJS}: ares.h ares_dns.h ares_private.h
|
||||
$(OBJLIB): ares.h ares_dns.h ares_private.h
|
||||
|
||||
.c.o:
|
||||
${CC} -c ${CFLAGS} $<
|
||||
$(CC) $(CFLAGS) -c $<
|
||||
|
||||
check:
|
||||
|
||||
@@ -61,8 +61,8 @@ install:
|
||||
done)
|
||||
|
||||
clean:
|
||||
rm -f ${OBJS} $(LIB) adig.o adig.exe ahost.o ahost.exe
|
||||
$(RM) ares_getopt.o $(OBJLIB) $(LIB) adig.exe ahost.exe
|
||||
|
||||
distclean: clean
|
||||
rm -f config.cache config.log config.status Makefile
|
||||
$(RM) config.cache config.log config.status Makefile
|
||||
|
||||
|
@@ -1,9 +1,10 @@
|
||||
#################################################################
|
||||
# $Id$
|
||||
#
|
||||
## Makefile for building libares.lib (NetWare version - gnu make)
|
||||
## Makefile for building libcares (NetWare version - gnu make)
|
||||
## Use: make -f Makefile.netware
|
||||
##
|
||||
## Comments to: Guenter Knauf <eflash@gmx.net>
|
||||
## Comments to: Guenter Knauf http://www.gknw.de/phpbb
|
||||
#
|
||||
#################################################################
|
||||
|
||||
@@ -18,9 +19,9 @@ endif
|
||||
|
||||
# Edit the vars below to change NLM target settings.
|
||||
TARGETS = adig.nlm ahost.nlm
|
||||
LTARGET = libcares.lib
|
||||
LTARGET = libcares.$(LIBEXT)
|
||||
VERSION = $(LIBCARES_VERSION)
|
||||
COPYR = Copyright (C) 1996 - 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
|
||||
MTSAFE = YES
|
||||
STACK = 64000
|
||||
@@ -69,9 +70,11 @@ CFLAGS = $(OPT) -D$(DB) -DNETWARE -DHAVE_CONFIG_H -nostdinc
|
||||
|
||||
ifeq ($(CC),mwccnlm)
|
||||
LD = mwldnlm
|
||||
LDFLAGS = -nostdlib $(PRELUDE) $(OBJS) $(<:.def=.o) -o $@ -commandfile
|
||||
LDFLAGS = -nostdlib $(PRELUDE) $(OBJEXE) $(<:.def=.o) -o $@ -commandfile
|
||||
AR = mwldnlm
|
||||
ARFLAGS = -type library -w nocmdline $(OBJDIR)/*.o -o
|
||||
ARFLAGS = -nostdlib -type library -o
|
||||
LIBEXT = lib
|
||||
#RANLIB =
|
||||
CFLAGS += -msgstyle gcc -gccinc -inline off -opt nointrinsics -proc 586
|
||||
CFLAGS += -relax_pointers
|
||||
#CFLAGS += -w on
|
||||
@@ -88,6 +91,8 @@ LD = nlmconv
|
||||
LDFLAGS = -T
|
||||
AR = ar
|
||||
ARFLAGS = -cq
|
||||
LIBEXT = a
|
||||
RANLIB = ranlib
|
||||
CFLAGS += -fno-builtin -fpcc-struct-return -fno-strict-aliasing
|
||||
CFLAGS += -Wall -Wno-format -Wno-uninitialized # -pedantic
|
||||
ifeq ($(LIBARCH),LIBC)
|
||||
@@ -129,7 +134,8 @@ endif
|
||||
# Makefile.inc provides the CSOURCES and HHEADERS defines
|
||||
include Makefile.inc
|
||||
|
||||
OBJS := $(patsubst %.c,$(OBJDIR)/%.o,$(strip $(CSOURCES)))
|
||||
OBJLIB := $(patsubst %.c,$(OBJDIR)/%.o,$(strip $(CSOURCES)))
|
||||
OBJEXE = $(OBJLIB) $(OBJDIR)/ares_getopt.o
|
||||
|
||||
.PHONY: lib nlm prebuild dist install clean
|
||||
|
||||
@@ -140,7 +146,7 @@ nlm: prebuild $(TARGETS)
|
||||
prebuild: $(OBJDIR) $(OBJDIR)/version.inc config.h arpa/nameser.h
|
||||
|
||||
dist: all
|
||||
-$(RM) $(OBJS) $(OBJDIR)/*.map $(OBJDIR)/*.ncv
|
||||
-$(RM) $(OBJLIB) $(OBJDIR)/*.map $(OBJDIR)/*.ncv
|
||||
-$(RM) $(OBJDIR)/*.def $(OBJDIR)/*.xdc $(OBJDIR)/version.inc
|
||||
|
||||
install: $(INSTDIR) all
|
||||
@@ -155,12 +161,15 @@ clean:
|
||||
-$(RM) -r $(OBJDIR)
|
||||
-$(RM) -r arpa
|
||||
|
||||
%.lib: $(OBJS)
|
||||
%.$(LIBEXT): $(OBJLIB)
|
||||
@echo Creating $@
|
||||
@-$(RM) $@
|
||||
@$(AR) $(ARFLAGS) $@ $^
|
||||
ifdef RANLIB
|
||||
@$(RANLIB) $@
|
||||
endif
|
||||
|
||||
%.nlm: $(OBJDIR)/%.def $(OBJDIR)/%.o $(OBJDIR)/%.xdc $(OBJS)
|
||||
%.nlm: $(OBJDIR)/%.def $(OBJDIR)/%.o $(OBJDIR)/%.xdc $(OBJEXE)
|
||||
@echo Linking $@
|
||||
@-$(RM) $@
|
||||
@$(LD) $(LDFLAGS) $<
|
||||
@@ -244,7 +253,7 @@ ifdef IMPORTS
|
||||
@echo $(DL)import $(IMPORTS)$(DL) >> $@
|
||||
endif
|
||||
ifeq ($(LD),nlmconv)
|
||||
@echo $(DL)input $(OBJS)$(DL) >> $@
|
||||
@echo $(DL)input $(OBJEXE)$(DL) >> $@
|
||||
@echo $(DL)input $(PRELUDE)$(DL) >> $@
|
||||
@echo $(DL)output $(notdir $(@:.def=.nlm))$(DL) >> $@
|
||||
endif
|
||||
@@ -255,6 +264,9 @@ config.h: Makefile.netware
|
||||
@echo $(DL)** Do not edit this file - it is created by make!$(DL) >> $@
|
||||
@echo $(DL)** All your changes will be lost!!$(DL) >> $@
|
||||
@echo $(DL)*/$(DL) >> $@
|
||||
@echo $(DL)#ifndef NETWARE$(DL) >> $@
|
||||
@echo $(DL)#error This $(notdir $@) is created for NetWare platform!$(DL) >> $@
|
||||
@echo $(DL)#endif$(DL) >> $@
|
||||
@echo $(DL)#define OS "i586-pc-NetWare"$(DL) >> $@
|
||||
@echo $(DL)#define VERSION "$(LIBCARES_VERSION_STR)"$(DL) >> $@
|
||||
@echo $(DL)#define PACKAGE_BUGREPORT "a suitable curl mailing list => http://curl.haxx.se/mail/"$(DL) >> $@
|
||||
@@ -281,6 +293,8 @@ config.h: Makefile.netware
|
||||
@echo $(DL)#define HAVE_SEND 1$(DL) >> $@
|
||||
@echo $(DL)#define HAVE_SETJMP_H 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_STDINT_H 1$(DL) >> $@
|
||||
@echo $(DL)#define HAVE_STDLIB_H 1$(DL) >> $@
|
||||
@@ -316,9 +330,10 @@ config.h: Makefile.netware
|
||||
@echo $(DL)#define TIME_WITH_SYS_TIME 1$(DL) >> $@
|
||||
@echo $(DL)#define HAVE_AF_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_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_IN_ADDR 4$(DL) >> $@
|
||||
ifdef NW_WINSOCK
|
||||
@@ -329,6 +344,11 @@ else
|
||||
@echo $(DL)#define HAVE_SYS_SOCKIO_H 1$(DL) >> $@
|
||||
@echo $(DL)#define HAVE_NETDB_H 1$(DL) >> $@
|
||||
endif
|
||||
@echo $(DL)#ifdef __GNUC__$(DL) >> $@
|
||||
@echo $(DL)#define HAVE_VARIADIC_MACROS_GCC 1$(DL) >> $@
|
||||
@echo $(DL)#else$(DL) >> $@
|
||||
@echo $(DL)#define HAVE_VARIADIC_MACROS_C99 1$(DL) >> $@
|
||||
@echo $(DL)#endif$(DL) >> $@
|
||||
ifdef OLD_NOVELLSDK
|
||||
@echo $(DL)#define socklen_t int$(DL) >> $@
|
||||
endif
|
||||
|
@@ -67,6 +67,7 @@ OBJECTS = $(OBJ_DIR)\ares_fds.obj \
|
||||
$(OBJ_DIR)\ares_expand_name.obj \
|
||||
$(OBJ_DIR)\ares_parse_a_reply.obj \
|
||||
$(OBJ_DIR)\ares_parse_aaaa_reply.obj \
|
||||
$(OBJ_DIR)\ares_parse_ns_reply.obj \
|
||||
$(OBJ_DIR)\windows_port.obj \
|
||||
$(OBJ_DIR)\ares_expand_string.obj \
|
||||
$(OBJ_DIR)\ares_parse_ptr_reply.obj \
|
||||
@@ -75,6 +76,7 @@ OBJECTS = $(OBJ_DIR)\ares_fds.obj \
|
||||
$(OBJ_DIR)\inet_ntop.obj
|
||||
|
||||
all: $(OBJ_DIR) cares.lib cares.dll cares_imp.lib ahost.exe adig.exe
|
||||
@echo Welcome to c-ares library and examples
|
||||
|
||||
$(OBJ_DIR):
|
||||
mkdir $(OBJ_DIR)
|
||||
@@ -105,6 +107,7 @@ $(DEF_FILE): $(OBJECTS) Makefile.VC6
|
||||
@echo ares_mkquery >> $@
|
||||
@echo ares_parse_a_reply >> $@
|
||||
@echo ares_parse_ptr_reply >> $@
|
||||
@echo ares_parse_ns_reply >> $@
|
||||
@echo ares_process >> $@
|
||||
@echo ares_query >> $@
|
||||
@echo ares_search >> $@
|
||||
@@ -121,11 +124,11 @@ $(DEF_FILE): $(OBJECTS) Makefile.VC6
|
||||
@echo ares_gettimeofday >> $@
|
||||
@echo ares_parse_aaaa_reply >> $@
|
||||
|
||||
ahost.exe: $(OBJ_DIR) $(OBJ_DIR)\ahost.obj cares_imp.lib
|
||||
link $(LDFLAGS) -out:$@ $(OBJ_DIR)\ahost.obj cares_imp.lib $(EX_LIBS)
|
||||
ahost.exe: $(OBJ_DIR) $(OBJ_DIR)\ahost.obj $(OBJ_DIR)\ares_getopt.obj cares_imp.lib
|
||||
link $(LDFLAGS) -out:$@ $(OBJ_DIR)\ahost.obj $(OBJ_DIR)\ares_getopt.obj cares_imp.lib $(EX_LIBS)
|
||||
|
||||
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)
|
||||
adig.exe: $(OBJ_DIR) $(OBJ_DIR)\adig.obj $(OBJ_DIR)\ares_getopt.obj cares_imp.lib
|
||||
link $(LDFLAGS) -out:$@ $(OBJ_DIR)\adig.obj $(OBJ_DIR)\ares_getopt.obj cares_imp.lib $(EX_LIBS)
|
||||
|
||||
clean:
|
||||
- del $(OBJ_DIR)\*.obj *.ilk *.pdb *.pbt *.pbi *.pbo *._xe *.map
|
||||
@@ -142,56 +145,89 @@ vclean realclean: clean
|
||||
#
|
||||
$(OBJ_DIR)\ares_fds.obj: ares_fds.c setup.h setup_once.h ares.h ares_private.h \
|
||||
ares_ipv6.h
|
||||
|
||||
$(OBJ_DIR)\ares_process.obj: ares_process.c setup.h setup_once.h nameser.h \
|
||||
ares.h ares_dns.h ares_private.h ares_ipv6.h
|
||||
|
||||
$(OBJ_DIR)\ares_free_hostent.obj: ares_free_hostent.c setup.h setup_once.h \
|
||||
ares.h ares_private.h ares_ipv6.h
|
||||
|
||||
$(OBJ_DIR)\ares_query.obj: ares_query.c setup.h setup_once.h nameser.h \
|
||||
ares.h ares_dns.h ares_private.h ares_ipv6.h
|
||||
|
||||
$(OBJ_DIR)\ares__close_sockets.obj: ares__close_sockets.c setup.h setup_once.h \
|
||||
ares.h ares_private.h ares_ipv6.h
|
||||
|
||||
$(OBJ_DIR)\ares_free_string.obj: ares_free_string.c setup.h setup_once.h ares.h
|
||||
|
||||
$(OBJ_DIR)\ares_search.obj: ares_search.c setup.h setup_once.h nameser.h \
|
||||
ares.h ares_private.h ares_ipv6.h
|
||||
|
||||
$(OBJ_DIR)\ares__get_hostent.obj: ares__get_hostent.c setup.h setup_once.h \
|
||||
ares.h ares_private.h ares_ipv6.h inet_net_pton.h
|
||||
|
||||
$(OBJ_DIR)\ares_gethostbyaddr.obj: ares_gethostbyaddr.c setup.h setup_once.h \
|
||||
nameser.h ares.h ares_private.h ares_ipv6.h inet_net_pton.h
|
||||
|
||||
$(OBJ_DIR)\ares_send.obj: ares_send.c setup.h setup_once.h nameser.h ares.h \
|
||||
ares_dns.h ares_private.h ares_ipv6.h
|
||||
|
||||
$(OBJ_DIR)\ares__read_line.obj: ares__read_line.c setup.h setup_once.h ares.h \
|
||||
ares_private.h ares_ipv6.h
|
||||
|
||||
$(OBJ_DIR)\ares_gethostbyname.obj: ares_gethostbyname.c setup.h setup_once.h \
|
||||
nameser.h ares.h ares_private.h ares_ipv6.h inet_net_pton.h bitncmp.h
|
||||
|
||||
$(OBJ_DIR)\ares_strerror.obj: ares_strerror.c setup.h setup_once.h ares.h
|
||||
|
||||
$(OBJ_DIR)\ares_cancel.obj: ares_cancel.c setup.h setup_once.h ares.h \
|
||||
ares_private.h ares_ipv6.h
|
||||
|
||||
$(OBJ_DIR)\ares_init.obj: ares_init.c setup.h setup_once.h nameser.h ares.h \
|
||||
ares_private.h ares_ipv6.h inet_net_pton.h
|
||||
|
||||
$(OBJ_DIR)\ares_timeout.obj: ares_timeout.c setup.h setup_once.h ares.h \
|
||||
ares_private.h ares_ipv6.h
|
||||
|
||||
$(OBJ_DIR)\ares_destroy.obj: ares_destroy.c setup.h setup_once.h ares.h \
|
||||
ares_private.h ares_ipv6.h
|
||||
|
||||
$(OBJ_DIR)\ares_mkquery.obj: ares_mkquery.c setup.h setup_once.h nameser.h \
|
||||
ares.h ares_dns.h
|
||||
|
||||
$(OBJ_DIR)\ares_version.obj: ares_version.c setup.h setup_once.h ares_version.h
|
||||
|
||||
$(OBJ_DIR)\ares_expand_name.obj: ares_expand_name.c setup.h setup_once.h \
|
||||
nameser.h ares.h ares_private.h ares_ipv6.h
|
||||
|
||||
$(OBJ_DIR)\ares_parse_a_reply.obj: ares_parse_a_reply.c setup.h setup_once.h \
|
||||
nameser.h ares.h ares_dns.h ares_private.h ares_ipv6.h
|
||||
|
||||
$(OBJ_DIR)\windows_port.obj: windows_port.c setup.h setup_once.h nameser.h \
|
||||
ares.h ares_private.h ares_ipv6.h
|
||||
|
||||
$(OBJ_DIR)\ares_expand_string.obj: ares_expand_string.c setup.h setup_once.h \
|
||||
nameser.h ares.h ares_private.h ares_ipv6.h
|
||||
|
||||
$(OBJ_DIR)\ares_parse_ptr_reply.obj: ares_parse_ptr_reply.c setup.h \
|
||||
setup_once.h nameser.h ares.h ares_dns.h ares_private.h ares_ipv6.h
|
||||
|
||||
$(OBJ_DIR)\ares_parse_aaaa_reply.obj: ares_parse_aaaa_reply.c setup.h \
|
||||
setup_once.h nameser.h ares.h ares_dns.h inet_net_pton.h ares_private.h \
|
||||
ares_ipv6.h
|
||||
|
||||
$(OBJ_DIR)\ares_parse_ns_reply.obj: ares_parse_ns_reply.c setup.h \
|
||||
setup_once.h nameser.h ares.h ares_dns.h ares_private.h ares_ipv6.h
|
||||
|
||||
$(OBJ_DIR)\ares_getnameinfo.obj: ares_getnameinfo.c setup.h setup_once.h \
|
||||
nameser.h ares.h ares_private.h ares_ipv6.h inet_ntop.h
|
||||
|
||||
$(OBJ_DIR)\inet_net_pton.obj: inet_net_pton.c setup.h setup_once.h nameser.h \
|
||||
ares_ipv6.h inet_net_pton.h
|
||||
|
||||
$(OBJ_DIR)\bitncmp.obj: bitncmp.c bitncmp.h
|
||||
|
||||
$(OBJ_DIR)\inet_ntop.obj: inet_ntop.c setup.h setup_once.h nameser.h \
|
||||
ares_ipv6.h inet_ntop.h
|
||||
|
||||
$(OBJ_DIR)\ares_getopt.obj: ares_getopt.c ares_getopt.h
|
||||
|
9
ares/RELEASE-NOTES
Normal file
9
ares/RELEASE-NOTES
Normal file
@@ -0,0 +1,9 @@
|
||||
This is what's new and changed in the c-ares 1.4.1 release:
|
||||
|
||||
o
|
||||
|
||||
Thanks go to these friendly people for their efforts and contributions:
|
||||
|
||||
|
||||
|
||||
Have fun!
|
@@ -663,7 +663,7 @@ AC_DEFUN([CURL_CHECK_FUNC_RECV], [
|
||||
])
|
||||
#
|
||||
if test "$curl_cv_recv" = "yes"; then
|
||||
AC_CACHE_CHECK([types of arguments and return type for recv],
|
||||
AC_CACHE_CHECK([types of args and return type for recv],
|
||||
[curl_cv_func_recv_args], [
|
||||
curl_cv_func_recv_args="unknown"
|
||||
for recv_retv in 'int' 'ssize_t'; do
|
||||
@@ -793,7 +793,7 @@ AC_DEFUN([CURL_CHECK_FUNC_SEND], [
|
||||
])
|
||||
#
|
||||
if test "$curl_cv_send" = "yes"; then
|
||||
AC_CACHE_CHECK([types of arguments and return type for send],
|
||||
AC_CACHE_CHECK([types of args and return type for send],
|
||||
[curl_cv_func_send_args], [
|
||||
curl_cv_func_send_args="unknown"
|
||||
for send_retv in 'int' 'ssize_t'; do
|
||||
@@ -954,6 +954,107 @@ AC_DEFUN([CURL_CHECK_MSG_NOSIGNAL], [
|
||||
]) # 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 -------------------------------------------------
|
||||
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 -------------------------------------------------
|
||||
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
|
||||
#include <arpa/inet.h>
|
||||
#endif
|
||||
|
||||
#endif
|
||||
]) dnl AC_CHECK_TYPE
|
||||
]) dnl AC_DEFUN
|
||||
|
||||
|
||||
dnl **********************************************************************
|
||||
dnl CURL_DETECT_ICC ([ACTION-IF-YES])
|
||||
dnl
|
||||
dnl check if this is the Intel ICC compiler, and if so run the ACTION-IF-YES
|
||||
dnl sets the $ICC variable to "yes" or "no"
|
||||
dnl **********************************************************************
|
||||
AC_DEFUN([CURL_DETECT_ICC],
|
||||
[
|
||||
ICC="no"
|
||||
AC_MSG_CHECKING([for icc in use])
|
||||
if test "$GCC" = "yes"; then
|
||||
dnl check if this is icc acting as gcc in disguise
|
||||
AC_EGREP_CPP([^__INTEL_COMPILER], [__INTEL_COMPILER],
|
||||
dnl action if the text is found, this it has not been replaced by the
|
||||
dnl cpp
|
||||
ICC="no",
|
||||
dnl the text was not found, it was replaced by the cpp
|
||||
ICC="yes"
|
||||
AC_MSG_RESULT([yes])
|
||||
[$1]
|
||||
)
|
||||
fi
|
||||
if test "$ICC" = "no"; then
|
||||
# this is not ICC
|
||||
AC_MSG_RESULT([no])
|
||||
fi
|
||||
])
|
||||
|
||||
dnl We create a function for detecting which compiler we use and then set as
|
||||
dnl pendantic compiler options as possible for that particular compiler. The
|
||||
dnl options are only used for debug-builds.
|
||||
@@ -1231,6 +1322,10 @@ dnl is changed.
|
||||
|
||||
AC_DEFUN([CURL_CC_DEBUG_OPTS],
|
||||
[
|
||||
if test "z$ICC" = "z"; then
|
||||
CURL_DETECT_ICC
|
||||
fi
|
||||
|
||||
if test "$GCC" = "yes"; then
|
||||
|
||||
dnl figure out gcc version!
|
||||
@@ -1241,58 +1336,73 @@ AC_DEFUN([CURL_CC_DEBUG_OPTS],
|
||||
gccnum=`(expr $num1 "*" 100 + $num2) 2>/dev/null`
|
||||
AC_MSG_RESULT($gccver)
|
||||
|
||||
AC_MSG_CHECKING([if this is icc in disguise])
|
||||
AC_EGREP_CPP([^__INTEL_COMPILER], [__INTEL_COMPILER],
|
||||
dnl action if the text is found, this it has not been replaced by the
|
||||
dnl cpp
|
||||
ICC="no"
|
||||
AC_MSG_RESULT([no]),
|
||||
dnl the text was not found, it was replaced by the cpp
|
||||
ICC="yes"
|
||||
AC_MSG_RESULT([yes])
|
||||
)
|
||||
|
||||
if test "$ICC" = "yes"; then
|
||||
dnl this is icc, not gcc.
|
||||
|
||||
dnl ICC warnings we ignore:
|
||||
dnl * 279 warns on static conditions in while expressions
|
||||
dnl * 269 warns on our "%Od" printf formatters for curl_off_t output:
|
||||
dnl "invalid format string conversion"
|
||||
dnl * 279 warns on static conditions in while expressions
|
||||
dnl * 981 warns on "operands are evaluated in unspecified order"
|
||||
dnl * 1418 "external definition with no prior declaration"
|
||||
dnl * 1419 warns on "external declaration in primary source file"
|
||||
dnl which we know and do on purpose.
|
||||
|
||||
WARN="-wd279,269"
|
||||
WARN="-wd279,269,981,1418,1419"
|
||||
|
||||
if test "$gccnum" -gt "600"; then
|
||||
dnl icc 6.0 and older doesn't have the -Wall flag
|
||||
WARN="-Wall $WARN"
|
||||
fi
|
||||
else dnl $ICC = yes
|
||||
dnl
|
||||
WARN="-W -Wall -Wwrite-strings -pedantic -Wno-long-long -Wundef -Wpointer-arith -Wnested-externs -Winline -Wmissing-declarations -Wmissing-prototypes -Wsign-compare"
|
||||
dnl this is a set of options we believe *ALL* gcc versions support:
|
||||
WARN="-W -Wall -Wwrite-strings -pedantic -Wpointer-arith -Wnested-externs -Winline -Wmissing-prototypes"
|
||||
|
||||
dnl -Wcast-align is a bit too annoying ;-)
|
||||
dnl -Wcast-align is a bit too annoying on all gcc versions ;-)
|
||||
|
||||
if test "$gccnum" -ge "207"; then
|
||||
dnl gcc 2.7 or later
|
||||
WARN="$WARN -Wmissing-declarations"
|
||||
fi
|
||||
|
||||
if test "$gccnum" -gt "295"; then
|
||||
dnl only if the compiler is newer than 2.95 since we got lots of
|
||||
dnl "`_POSIX_C_SOURCE' is not defined" in system headers with
|
||||
dnl gcc 2.95.4 on FreeBSD 4.9!
|
||||
WARN="$WARN -Wundef -Wno-long-long -Wsign-compare"
|
||||
fi
|
||||
|
||||
if test "$gccnum" -ge "296"; then
|
||||
dnl gcc 2.96 or later
|
||||
WARN="$WARN -Wfloat-equal"
|
||||
fi
|
||||
|
||||
if test "$gccnum" -gt "296"; then
|
||||
dnl this option does not exist in 2.96
|
||||
WARN="$WARN -Wno-format-nonliteral"
|
||||
fi
|
||||
if test "$gccnum" -gt "296"; then
|
||||
dnl this option does not exist in 2.96
|
||||
WARN="$WARN -Wno-format-nonliteral"
|
||||
fi
|
||||
|
||||
dnl -Wunreachable-code seems totally unreliable on my gcc 3.3.2 on
|
||||
dnl on i686-Linux as it gives us heaps with false positives
|
||||
if test "$gccnum" -ge "303"; then
|
||||
dnl gcc 3.3 and later
|
||||
WARN="$WARN -Wendif-labels -Wstrict-prototypes"
|
||||
fi
|
||||
dnl -Wunreachable-code seems totally unreliable on my gcc 3.3.2 on
|
||||
dnl on i686-Linux as it gives us heaps with false positives.
|
||||
dnl Also, on gcc 4.0.X it is totally unbearable and complains all
|
||||
dnl over making it unusable for generic purposes. Let's not use it.
|
||||
|
||||
if test "$gccnum" -ge "303"; then
|
||||
dnl gcc 3.3 and later
|
||||
WARN="$WARN -Wendif-labels -Wstrict-prototypes"
|
||||
fi
|
||||
|
||||
if test "$gccnum" -ge "304"; then
|
||||
# try these on gcc 3.4
|
||||
WARN="$WARN -Wdeclaration-after-statement"
|
||||
fi
|
||||
|
||||
for flag in $CPPFLAGS; do
|
||||
case "$flag" in
|
||||
-I*)
|
||||
dnl include path
|
||||
dnl Include path, provide a -isystem option for the same dir
|
||||
dnl to prevent warnings in those dirs. The -isystem was not very
|
||||
dnl reliable on earlier gcc versions.
|
||||
add=`echo $flag | sed 's/^-I/-isystem /g'`
|
||||
WARN="$WARN $add"
|
||||
;;
|
||||
@@ -1303,6 +1413,12 @@ AC_DEFUN([CURL_CC_DEBUG_OPTS],
|
||||
|
||||
CFLAGS="$CFLAGS $WARN"
|
||||
|
||||
AC_MSG_NOTICE([Added this set of compiler options: $WARN])
|
||||
|
||||
else dnl $GCC = yes
|
||||
|
||||
AC_MSG_NOTICE([Added no extra compiler options])
|
||||
|
||||
fi dnl $GCC = yes
|
||||
|
||||
dnl strip off optimizer flags
|
||||
@@ -1415,39 +1531,3 @@ else
|
||||
fi
|
||||
])
|
||||
|
||||
# Prevent libtool for checking how to run C++ compiler and check for other
|
||||
# tools we don't want to use. We do this by m4-defining the _LT_AC_TAGCONFIG
|
||||
# variable to the code to run, as by default it uses a much more complicated
|
||||
# approach. The code below that is actually added seems to be used for cases
|
||||
# where configure has trouble figuring out what C compiler to use but where
|
||||
# the installed libtool has an idea.
|
||||
#
|
||||
# This function is a re-implemented version of the Paolo Bonzini fix posted to
|
||||
# the c-ares mailing list by Bram Matthys on May 6 2006. My version removes
|
||||
# redundant code but also adds the LTCFLAGS check that wasn't in that patch.
|
||||
#
|
||||
# Some code in this function was extracted from the generated configure script.
|
||||
#
|
||||
# CARES_CLEAR_LIBTOOL_TAGS
|
||||
AC_DEFUN([CARES_CLEAR_LIBTOOL_TAGS],
|
||||
[m4_define([_LT_AC_TAGCONFIG], [
|
||||
if test -f "$ltmain"; then
|
||||
if test ! -f "${ofile}"; then
|
||||
AC_MSG_WARN([output file `$ofile' does not exist])
|
||||
fi
|
||||
|
||||
if test -z "$LTCC"; then
|
||||
eval "`$SHELL ${ofile} --config | grep '^LTCC='`"
|
||||
if test -z "$LTCC"; then
|
||||
AC_MSG_WARN([output file `$ofile' does not look like a libtool
|
||||
script])
|
||||
else
|
||||
AC_MSG_WARN([using `LTCC=$LTCC', extracted from `$ofile'])
|
||||
fi
|
||||
fi
|
||||
if test -z "$LTCFLAGS"; then
|
||||
eval "`$SHELL ${ofile} --config | grep '^LTCFLAGS='`"
|
||||
fi
|
||||
fi
|
||||
])]
|
||||
)
|
||||
|
50
ares/adig.c
50
ares/adig.c
@@ -1,4 +1,6 @@
|
||||
/* Copyright 1998 by the Massachusetts Institute of Technology.
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this
|
||||
* software and its documentation for any purpose and without
|
||||
@@ -14,21 +16,21 @@
|
||||
*/
|
||||
|
||||
#include "setup.h"
|
||||
#include <sys/types.h>
|
||||
|
||||
#ifdef WIN32
|
||||
#if defined(WIN32) && !defined(WATT32)
|
||||
#include "nameser.h"
|
||||
#else
|
||||
#ifdef HAVE_SYS_TIME_H
|
||||
#include <sys/time.h>
|
||||
#endif
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <arpa/nameser.h>
|
||||
#ifdef HAVE_UNISTD_H
|
||||
#include <unistd.h>
|
||||
#include <netdb.h>
|
||||
#endif
|
||||
#ifdef HAVE_GETOPT_H
|
||||
#include <getopt.h>
|
||||
#include <netdb.h>
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
@@ -40,25 +42,17 @@
|
||||
#include "ares.h"
|
||||
#include "ares_dns.h"
|
||||
#include "inet_ntop.h"
|
||||
#include "ares_getopt.h"
|
||||
|
||||
#ifdef WATT32
|
||||
#undef WIN32 /* Redefined in MingW headers */
|
||||
#endif
|
||||
|
||||
#ifndef INADDR_NONE
|
||||
#define INADDR_NONE 0xffffffff
|
||||
#endif
|
||||
|
||||
/* Mac OS X portability check */
|
||||
#ifndef T_SRV
|
||||
#define T_SRV 33 /* server selection */
|
||||
#endif
|
||||
|
||||
#ifndef optind
|
||||
extern int optind;
|
||||
extern char *optarg;
|
||||
#endif
|
||||
|
||||
struct nv {
|
||||
const char *name;
|
||||
int value;
|
||||
@@ -153,8 +147,8 @@ int main(int argc, char **argv)
|
||||
fd_set read_fds, write_fds;
|
||||
struct timeval *tvp, tv;
|
||||
|
||||
#ifdef WIN32
|
||||
WORD wVersionRequested = MAKEWORD(1,1);
|
||||
#ifdef USE_WINSOCK
|
||||
WORD wVersionRequested = MAKEWORD(USE_WINSOCK,USE_WINSOCK);
|
||||
WSADATA wsaData;
|
||||
WSAStartup(wVersionRequested, &wsaData);
|
||||
#endif
|
||||
@@ -162,10 +156,16 @@ int main(int argc, char **argv)
|
||||
options.flags = ARES_FLAG_NOCHECKRESP;
|
||||
options.servers = NULL;
|
||||
options.nservers = 0;
|
||||
while ((c = getopt(argc, argv, "f:s:c:t:T:U:")) != -1)
|
||||
while ((c = ares_getopt(argc, argv, "df:s:c:t:T:U:")) != -1)
|
||||
{
|
||||
switch (c)
|
||||
{
|
||||
case 'd':
|
||||
#ifdef WATT32
|
||||
dbug_init();
|
||||
#endif
|
||||
break;
|
||||
|
||||
case 'f':
|
||||
/* Add a flag. */
|
||||
for (i = 0; i < nflags; i++)
|
||||
@@ -225,7 +225,7 @@ int main(int argc, char **argv)
|
||||
|
||||
case 'T':
|
||||
/* Set the TCP port number. */
|
||||
if (!isdigit((unsigned char)*optarg))
|
||||
if (!ISDIGIT(*optarg))
|
||||
usage();
|
||||
options.tcp_port = (unsigned short)strtol(optarg, NULL, 0);
|
||||
optmask |= ARES_OPT_TCP_PORT;
|
||||
@@ -233,7 +233,7 @@ int main(int argc, char **argv)
|
||||
|
||||
case 'U':
|
||||
/* Set the UDP port number. */
|
||||
if (!isdigit((unsigned char)*optarg))
|
||||
if (!ISDIGIT(*optarg))
|
||||
usage();
|
||||
options.udp_port = (unsigned short)strtol(optarg, NULL, 0);
|
||||
optmask |= ARES_OPT_UDP_PORT;
|
||||
@@ -277,7 +277,7 @@ int main(int argc, char **argv)
|
||||
break;
|
||||
tvp = ares_timeout(channel, NULL, &tv);
|
||||
count = select(nfds, &read_fds, &write_fds, NULL, tvp);
|
||||
if (count < 0 && errno != EINVAL)
|
||||
if (count < 0 && SOCKERRNO != EINVAL)
|
||||
{
|
||||
perror("select");
|
||||
return 1;
|
||||
@@ -286,6 +286,11 @@ int main(int argc, char **argv)
|
||||
}
|
||||
|
||||
ares_destroy(channel);
|
||||
|
||||
#ifdef USE_WINSOCK
|
||||
WSACleanup();
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -543,8 +548,9 @@ static const unsigned char *display_rr(const unsigned char *aptr,
|
||||
if (p + 20 > aptr + dlen)
|
||||
return NULL;
|
||||
printf("\t\t\t\t\t\t( %lu %lu %lu %lu %lu )",
|
||||
DNS__32BIT(p), DNS__32BIT(p+4), DNS__32BIT(p+8),
|
||||
DNS__32BIT(p+12), DNS__32BIT(p+16));
|
||||
(unsigned long)DNS__32BIT(p), (unsigned long)DNS__32BIT(p+4),
|
||||
(unsigned long)DNS__32BIT(p+8), (unsigned long)DNS__32BIT(p+12),
|
||||
(unsigned long)DNS__32BIT(p+16));
|
||||
break;
|
||||
|
||||
case T_TXT:
|
||||
|
33
ares/ahost.c
33
ares/ahost.c
@@ -16,34 +16,29 @@
|
||||
*/
|
||||
|
||||
#include "setup.h"
|
||||
#include <sys/types.h>
|
||||
|
||||
#ifdef WIN32
|
||||
#else
|
||||
#if !defined(WIN32) || defined(WATT32)
|
||||
#ifdef HAVE_SYS_TIME_H
|
||||
#include <sys/time.h>
|
||||
#endif
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <netdb.h>
|
||||
#ifdef HAVE_UNISTD_H
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#ifdef HAVE_GETOPT_H
|
||||
#include <getopt.h>
|
||||
#endif
|
||||
|
||||
#include "ares.h"
|
||||
#include "ares_dns.h"
|
||||
#include "inet_ntop.h"
|
||||
#include "inet_net_pton.h"
|
||||
|
||||
#ifndef INADDR_NONE
|
||||
#define INADDR_NONE 0xffffffff
|
||||
#endif
|
||||
#include "ares_getopt.h"
|
||||
|
||||
#ifndef HAVE_STRUCT_IN6_ADDR
|
||||
struct in6_addr
|
||||
@@ -64,16 +59,21 @@ int main(int argc, char **argv)
|
||||
struct in_addr addr4;
|
||||
struct in6_addr addr6;
|
||||
|
||||
#ifdef WIN32
|
||||
WORD wVersionRequested = MAKEWORD(1,1);
|
||||
#ifdef USE_WINSOCK
|
||||
WORD wVersionRequested = MAKEWORD(USE_WINSOCK,USE_WINSOCK);
|
||||
WSADATA wsaData;
|
||||
WSAStartup(wVersionRequested, &wsaData);
|
||||
#endif
|
||||
|
||||
while ((c = getopt(argc,argv,"t:h")) != -1)
|
||||
while ((c = ares_getopt(argc,argv,"dt:h")) != -1)
|
||||
{
|
||||
switch (c)
|
||||
{
|
||||
case 'd':
|
||||
#ifdef WATT32
|
||||
dbug_init();
|
||||
#endif
|
||||
break;
|
||||
case 't':
|
||||
if (!strcasecmp(optarg,"a"))
|
||||
addr_family = AF_INET;
|
||||
@@ -134,6 +134,11 @@ int main(int argc, char **argv)
|
||||
}
|
||||
|
||||
ares_destroy(channel);
|
||||
|
||||
#ifdef USE_WINSOCK
|
||||
WSACleanup();
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
29
ares/ares.h
29
ares/ares.h
@@ -31,7 +31,7 @@
|
||||
#include <netinet/in.h>
|
||||
#include <sys/socket.h>
|
||||
#include <tcp.h>
|
||||
#elif defined(WIN32) && !defined(__CYGWIN__)
|
||||
#elif defined(WIN32)
|
||||
#include <winsock2.h>
|
||||
#include <windows.h>
|
||||
#else
|
||||
@@ -94,6 +94,7 @@ extern "C" {
|
||||
#define ARES_OPT_DOMAINS (1 << 7)
|
||||
#define ARES_OPT_LOOKUPS (1 << 8)
|
||||
#define ARES_OPT_SOCK_STATE_CB (1 << 9)
|
||||
#define ARES_OPT_SORTLIST (1 << 10)
|
||||
|
||||
/* Nameinfo flag values */
|
||||
#define ARES_NI_NOFQDN (1 << 0)
|
||||
@@ -136,6 +137,22 @@ extern "C" {
|
||||
#define ARES_GETSOCK_WRITABLE(bits,num) (bits & (1 << ((num) + \
|
||||
ARES_GETSOCK_MAXNUM)))
|
||||
|
||||
|
||||
/*
|
||||
* Typedef our socket type
|
||||
*/
|
||||
|
||||
#ifndef ares_socket_typedef
|
||||
#ifdef WIN32
|
||||
typedef SOCKET ares_socket_t;
|
||||
#define ARES_SOCKET_BAD INVALID_SOCKET
|
||||
#else
|
||||
typedef int ares_socket_t;
|
||||
#define ARES_SOCKET_BAD -1
|
||||
#endif
|
||||
#define ares_socket_typedef
|
||||
#endif /* ares_socket_typedef */
|
||||
|
||||
#ifdef WIN32
|
||||
typedef void (*ares_sock_state_cb)(void *data,
|
||||
SOCKET socket,
|
||||
@@ -148,6 +165,8 @@ typedef void (*ares_sock_state_cb)(void *data,
|
||||
int writable);
|
||||
#endif
|
||||
|
||||
struct apattern;
|
||||
|
||||
struct ares_options {
|
||||
int flags;
|
||||
int timeout;
|
||||
@@ -162,6 +181,8 @@ struct ares_options {
|
||||
char *lookups;
|
||||
ares_sock_state_cb sock_state_cb;
|
||||
void *sock_state_cb_data;
|
||||
struct apattern *sortlist;
|
||||
int nsort;
|
||||
};
|
||||
|
||||
struct hostent;
|
||||
@@ -179,6 +200,8 @@ typedef void (*ares_nameinfo_callback)(void *arg, int status,
|
||||
int ares_init(ares_channel *channelptr);
|
||||
int ares_init_options(ares_channel *channelptr, struct ares_options *options,
|
||||
int optmask);
|
||||
int ares_save_options(ares_channel channel, struct ares_options *options, int *optmask);
|
||||
void ares_destroy_options(struct ares_options *options);
|
||||
void ares_destroy(ares_channel channel);
|
||||
void ares_cancel(ares_channel channel);
|
||||
void ares_send(ares_channel channel, const unsigned char *qbuf, int qlen,
|
||||
@@ -200,6 +223,8 @@ int ares_getsock(ares_channel channel, int *socks, int numsocks);
|
||||
struct timeval *ares_timeout(ares_channel channel, struct timeval *maxtv,
|
||||
struct timeval *tv);
|
||||
void ares_process(ares_channel channel, fd_set *read_fds, fd_set *write_fds);
|
||||
void ares_process_fd(ares_channel channel, ares_socket_t read_fd,
|
||||
ares_socket_t write_fd);
|
||||
|
||||
int ares_mkquery(const char *name, int dnsclass, int type, unsigned short id,
|
||||
int rd, unsigned char **buf, int *buflen);
|
||||
@@ -213,6 +238,8 @@ int ares_parse_aaaa_reply(const unsigned char *abuf, int alen,
|
||||
struct hostent **host);
|
||||
int ares_parse_ptr_reply(const unsigned char *abuf, int alen, const void *addr,
|
||||
int addrlen, int family, struct hostent **host);
|
||||
int ares_parse_ns_reply(const unsigned char *abuf, int alen,
|
||||
struct hostent **host);
|
||||
void ares_free_string(void *str);
|
||||
void ares_free_hostent(struct hostent *host);
|
||||
const char *ares_strerror(int code);
|
||||
|
@@ -16,7 +16,6 @@
|
||||
*/
|
||||
|
||||
#include "setup.h"
|
||||
#include <sys/types.h>
|
||||
|
||||
#if !defined(WIN32) || defined(WATT32)
|
||||
#include <sys/socket.h>
|
||||
@@ -54,7 +53,7 @@ int ares__get_hostent(FILE *fp, int family, struct hostent **host)
|
||||
|
||||
/* Get the address part. */
|
||||
p = line;
|
||||
while (*p && !isspace((unsigned char)*p))
|
||||
while (*p && !ISSPACE(*p))
|
||||
p++;
|
||||
if (!*p)
|
||||
continue;
|
||||
@@ -76,12 +75,12 @@ int ares__get_hostent(FILE *fp, int family, struct hostent **host)
|
||||
|
||||
/* Get the canonical hostname. */
|
||||
p++;
|
||||
while (isspace((unsigned char)*p))
|
||||
while (ISSPACE(*p))
|
||||
p++;
|
||||
if (!*p)
|
||||
continue;
|
||||
q = p;
|
||||
while (*q && !isspace((unsigned char)*q))
|
||||
while (*q && !ISSPACE(*q))
|
||||
q++;
|
||||
end_at_hostname = (*q == 0);
|
||||
*q = 0;
|
||||
@@ -92,13 +91,13 @@ int ares__get_hostent(FILE *fp, int family, struct hostent **host)
|
||||
{
|
||||
/* Count the aliases. */
|
||||
p = q + 1;
|
||||
while (isspace((unsigned char)*p))
|
||||
while (ISSPACE(*p))
|
||||
p++;
|
||||
while (*p)
|
||||
{
|
||||
while (*p && !isspace((unsigned char)*p))
|
||||
while (*p && !ISSPACE(*p))
|
||||
p++;
|
||||
while (isspace((unsigned char)*p))
|
||||
while (ISSPACE(*p))
|
||||
p++;
|
||||
naliases++;
|
||||
}
|
||||
@@ -128,12 +127,12 @@ int ares__get_hostent(FILE *fp, int family, struct hostent **host)
|
||||
if (!end_at_hostname)
|
||||
{
|
||||
p = canonical + strlen(canonical) + 1;
|
||||
while (isspace((unsigned char)*p))
|
||||
while (ISSPACE(*p))
|
||||
p++;
|
||||
while (*p)
|
||||
{
|
||||
q = p;
|
||||
while (*q && !isspace((unsigned char)*q))
|
||||
while (*q && !ISSPACE(*q))
|
||||
q++;
|
||||
hostent->h_aliases[naliases] = malloc(q - p + 1);
|
||||
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);
|
||||
hostent->h_aliases[naliases][q - p] = 0;
|
||||
p = q;
|
||||
while (isspace((unsigned char)*p))
|
||||
while (ISSPACE(*p))
|
||||
p++;
|
||||
naliases++;
|
||||
}
|
||||
@@ -184,6 +183,7 @@ int ares__get_hostent(FILE *fp, int family, struct hostent **host)
|
||||
free(hostent->h_addr_list);
|
||||
free(hostent);
|
||||
}
|
||||
*host = NULL;
|
||||
return ARES_ENOMEM;
|
||||
}
|
||||
|
||||
|
@@ -39,7 +39,10 @@ void ares_cancel(ares_channel channel)
|
||||
channel->queries = NULL;
|
||||
if (!(channel->flags & ARES_FLAG_STAYOPEN))
|
||||
{
|
||||
for (i = 0; i < channel->nservers; i++)
|
||||
ares__close_sockets(channel, &channel->servers[i]);
|
||||
if (channel->servers)
|
||||
{
|
||||
for (i = 0; i < channel->nservers; i++)
|
||||
ares__close_sockets(channel, &channel->servers[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -20,28 +20,55 @@
|
||||
#include "ares.h"
|
||||
#include "ares_private.h"
|
||||
|
||||
void ares_destroy_options(struct ares_options *options)
|
||||
{
|
||||
int i;
|
||||
|
||||
free(options->servers);
|
||||
for (i = 0; i < options->ndomains; i++)
|
||||
free(options->domains[i]);
|
||||
free(options->domains);
|
||||
if(options->sortlist)
|
||||
free(options->sortlist);
|
||||
free(options->lookups);
|
||||
}
|
||||
|
||||
void ares_destroy(ares_channel channel)
|
||||
{
|
||||
int i;
|
||||
struct query *query;
|
||||
|
||||
for (i = 0; i < channel->nservers; i++)
|
||||
ares__close_sockets(channel, &channel->servers[i]);
|
||||
free(channel->servers);
|
||||
for (i = 0; i < channel->ndomains; i++)
|
||||
free(channel->domains[i]);
|
||||
free(channel->domains);
|
||||
if (!channel)
|
||||
return;
|
||||
|
||||
if (channel->servers) {
|
||||
for (i = 0; i < channel->nservers; i++)
|
||||
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)
|
||||
free(channel->sortlist);
|
||||
free(channel->lookups);
|
||||
while (channel->queries)
|
||||
{
|
||||
query = channel->queries;
|
||||
channel->queries = query->next;
|
||||
query->callback(query->arg, ARES_EDESTRUCTION, NULL, 0);
|
||||
|
||||
if (channel->lookups)
|
||||
free(channel->lookups);
|
||||
|
||||
while (channel->queries) {
|
||||
query = channel->queries;
|
||||
channel->queries = query->next;
|
||||
query->callback(query->arg, ARES_EDESTRUCTION, NULL, 0);
|
||||
if (query->tcpbuf)
|
||||
free(query->tcpbuf);
|
||||
if (query->skip_server)
|
||||
free(query->skip_server);
|
||||
free(query);
|
||||
}
|
||||
free(query);
|
||||
}
|
||||
|
||||
free(channel);
|
||||
}
|
||||
|
39
ares/ares_destroy_options.3
Normal file
39
ares/ares_destroy_options.3
Normal file
@@ -0,0 +1,39 @@
|
||||
.\" $Id$
|
||||
.\"
|
||||
.\" 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_DESTROY_OPTIONS 3 "1 June 2007"
|
||||
.SH NAME
|
||||
ares_destroy_options \- Destroy options initialized with ares_save_options
|
||||
.SH SYNOPSIS
|
||||
.nf
|
||||
.B #include <ares.h>
|
||||
.PP
|
||||
.B void ares_destroy_options(struct ares_options *\fIoptions\fP)
|
||||
.fi
|
||||
.SH DESCRIPTION
|
||||
The
|
||||
.B ares_destroy_options
|
||||
function destroys the options struct identified by
|
||||
.IR options ,
|
||||
freeing all memory allocated by ares_save_options.
|
||||
|
||||
.SH SEE ALSO
|
||||
.BR ares_save_options (3),
|
||||
.BR ares_init_options (3)
|
||||
.SH AUTHOR
|
||||
Brad House
|
||||
.br
|
||||
Copyright 1998 by the Massachusetts Institute of Technology.
|
@@ -21,12 +21,13 @@
|
||||
#define DNS__16BIT(p) (((p)[0] << 8) | (p)[1])
|
||||
#define DNS__32BIT(p) (((p)[0] << 24) | ((p)[1] << 16) | \
|
||||
((p)[2] << 8) | (p)[3])
|
||||
#define DNS__SET16BIT(p, v) (((p)[0] = ((v) >> 8) & 0xff), \
|
||||
((p)[1] = (v) & 0xff))
|
||||
#define DNS__SET32BIT(p, v) (((p)[0] = ((v) >> 24) & 0xff), \
|
||||
((p)[1] = ((v) >> 16) & 0xff), \
|
||||
((p)[2] = ((v) >> 8) & 0xff), \
|
||||
((p)[3] = (v) & 0xff))
|
||||
|
||||
#define DNS__SET16BIT(p, v) (((p)[0] = (unsigned char)(((v) >> 8) & 0xff)), \
|
||||
((p)[1] = (unsigned char)((v) & 0xff)))
|
||||
#define DNS__SET32BIT(p, v) (((p)[0] = (unsigned char)(((v) >> 24) & 0xff)), \
|
||||
((p)[1] = (unsigned char)(((v) >> 16) & 0xff)), \
|
||||
((p)[2] = (unsigned char)(((v) >> 8) & 0xff)), \
|
||||
((p)[3] = (unsigned char)((v) & 0xff)))
|
||||
|
||||
#if 0
|
||||
/* we cannot use this approach on systems where we can't access 16/32 bit
|
||||
@@ -53,19 +54,19 @@
|
||||
#define DNS_HEADER_ARCOUNT(h) DNS__16BIT((h) + 10)
|
||||
|
||||
/* Macros for constructing a DNS header */
|
||||
#define DNS_HEADER_SET_QID(h, v) DNS__SET16BIT(h, v)
|
||||
#define DNS_HEADER_SET_QR(h, v) ((h)[2] |= (((v) & 0x1) << 7))
|
||||
#define DNS_HEADER_SET_OPCODE(h, v) ((h)[2] |= (((v) & 0xf) << 3))
|
||||
#define DNS_HEADER_SET_AA(h, v) ((h)[2] |= (((v) & 0x1) << 2))
|
||||
#define DNS_HEADER_SET_TC(h, v) ((h)[2] |= (((v) & 0x1) << 1))
|
||||
#define DNS_HEADER_SET_RD(h, v) ((h)[2] |= (((v) & 0x1)))
|
||||
#define DNS_HEADER_SET_RA(h, v) ((h)[3] |= (((v) & 0x1) << 7))
|
||||
#define DNS_HEADER_SET_Z(h, v) ((h)[3] |= (((v) & 0x7) << 4))
|
||||
#define DNS_HEADER_SET_RCODE(h, v) ((h)[3] |= (((v) & 0xf)))
|
||||
#define DNS_HEADER_SET_QDCOUNT(h, v) DNS__SET16BIT((h) + 4, v)
|
||||
#define DNS_HEADER_SET_ANCOUNT(h, v) DNS__SET16BIT((h) + 6, v)
|
||||
#define DNS_HEADER_SET_NSCOUNT(h, v) DNS__SET16BIT((h) + 8, v)
|
||||
#define DNS_HEADER_SET_ARCOUNT(h, v) DNS__SET16BIT((h) + 10, v)
|
||||
#define DNS_HEADER_SET_QID(h, v) DNS__SET16BIT(h, v)
|
||||
#define DNS_HEADER_SET_QR(h, v) ((h)[2] |= (unsigned char)(((v) & 0x1) << 7))
|
||||
#define DNS_HEADER_SET_OPCODE(h, v) ((h)[2] |= (unsigned char)(((v) & 0xf) << 3))
|
||||
#define DNS_HEADER_SET_AA(h, v) ((h)[2] |= (unsigned char)(((v) & 0x1) << 2))
|
||||
#define DNS_HEADER_SET_TC(h, v) ((h)[2] |= (unsigned char)(((v) & 0x1) << 1))
|
||||
#define DNS_HEADER_SET_RD(h, v) ((h)[2] |= (unsigned char)((v) & 0x1))
|
||||
#define DNS_HEADER_SET_RA(h, v) ((h)[3] |= (unsigned char)(((v) & 0x1) << 7))
|
||||
#define DNS_HEADER_SET_Z(h, v) ((h)[3] |= (unsigned char)(((v) & 0x7) << 4))
|
||||
#define DNS_HEADER_SET_RCODE(h, v) ((h)[3] |= (unsigned char)((v) & 0xf))
|
||||
#define DNS_HEADER_SET_QDCOUNT(h, v) DNS__SET16BIT((h) + 4, v)
|
||||
#define DNS_HEADER_SET_ANCOUNT(h, v) DNS__SET16BIT((h) + 6, v)
|
||||
#define DNS_HEADER_SET_NSCOUNT(h, v) DNS__SET16BIT((h) + 8, v)
|
||||
#define DNS_HEADER_SET_ARCOUNT(h, v) DNS__SET16BIT((h) + 10, v)
|
||||
|
||||
/* Macros for parsing the fixed part of a DNS question */
|
||||
#define DNS_QUESTION_TYPE(q) DNS__16BIT(q)
|
||||
|
@@ -16,7 +16,6 @@
|
||||
*/
|
||||
|
||||
#include "setup.h"
|
||||
#include <sys/types.h>
|
||||
|
||||
#if defined(WIN32) && !defined(WATT32)
|
||||
#include "nameser.h"
|
||||
|
@@ -16,7 +16,6 @@
|
||||
*/
|
||||
|
||||
#include "setup.h"
|
||||
#include <sys/types.h>
|
||||
|
||||
#if defined(WIN32) && !defined(WATT32)
|
||||
#include "nameser.h"
|
||||
|
@@ -16,7 +16,6 @@
|
||||
*/
|
||||
|
||||
#include "setup.h"
|
||||
#include <sys/types.h>
|
||||
|
||||
#ifdef HAVE_SYS_TIME_H
|
||||
#include <sys/time.h>
|
||||
|
@@ -29,11 +29,12 @@ void ares_free_hostent(struct hostent *host)
|
||||
{
|
||||
char **p;
|
||||
|
||||
free(host->h_name);
|
||||
free((char *)(host->h_name));
|
||||
for (p = host->h_aliases; *p; p++)
|
||||
free(*p);
|
||||
free(host->h_aliases);
|
||||
free(host->h_addr_list[0]);
|
||||
free(host->h_addr_list[0]); /* no matter if there is one or many entries,
|
||||
there is only one malloc for all of them */
|
||||
free(host->h_addr_list);
|
||||
free(host);
|
||||
}
|
||||
|
@@ -15,7 +15,6 @@
|
||||
* without express or implied warranty.
|
||||
*/
|
||||
#include "setup.h"
|
||||
#include <sys/types.h>
|
||||
|
||||
#if defined(WIN32) && !defined(WATT32)
|
||||
#include "nameser.h"
|
||||
@@ -186,6 +185,7 @@ static int file_lookup(union ares_addr *addr, int family, struct hostent **host)
|
||||
{
|
||||
FILE *fp;
|
||||
int status;
|
||||
int error;
|
||||
|
||||
#ifdef WIN32
|
||||
char PATH_HOSTS[MAX_PATH];
|
||||
@@ -218,7 +218,22 @@ static int file_lookup(union ares_addr *addr, int family, struct hostent **host)
|
||||
|
||||
fp = fopen(PATH_HOSTS, "r");
|
||||
if (!fp)
|
||||
return ARES_ENOTFOUND;
|
||||
{
|
||||
error = ERRNO;
|
||||
switch(error)
|
||||
{
|
||||
case ENOENT:
|
||||
case ESRCH:
|
||||
return ARES_ENOTFOUND;
|
||||
default:
|
||||
DEBUGF(fprintf(stderr, "fopen() failed with error: %d %s\n",
|
||||
error, strerror(error)));
|
||||
DEBUGF(fprintf(stderr, "Error opening file: %s\n",
|
||||
PATH_HOSTS));
|
||||
*host = NULL;
|
||||
return ARES_EFILE;
|
||||
}
|
||||
}
|
||||
while ((status = ares__get_hostent(fp, family, host)) == ARES_SUCCESS)
|
||||
{
|
||||
if (family != (*host)->h_addrtype)
|
||||
|
@@ -16,7 +16,6 @@
|
||||
*/
|
||||
|
||||
#include "setup.h"
|
||||
#include <sys/types.h>
|
||||
|
||||
#if defined(WIN32) && !defined(WATT32)
|
||||
#include "nameser.h"
|
||||
@@ -239,7 +238,7 @@ static int fake_hostent(const char *name, int family, ares_host_callback callbac
|
||||
hostent.h_addr_list = addrs;
|
||||
callback(arg, ARES_SUCCESS, &hostent);
|
||||
|
||||
free(hostent.h_name);
|
||||
free((char *)(hostent.h_name));
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -248,6 +247,7 @@ static int file_lookup(const char *name, int family, struct hostent **host)
|
||||
FILE *fp;
|
||||
char **alias;
|
||||
int status;
|
||||
int error;
|
||||
|
||||
#ifdef WIN32
|
||||
char PATH_HOSTS[MAX_PATH];
|
||||
@@ -280,8 +280,22 @@ static int file_lookup(const char *name, int family, struct hostent **host)
|
||||
|
||||
fp = fopen(PATH_HOSTS, "r");
|
||||
if (!fp)
|
||||
return ARES_ENOTFOUND;
|
||||
|
||||
{
|
||||
error = ERRNO;
|
||||
switch(error)
|
||||
{
|
||||
case ENOENT:
|
||||
case ESRCH:
|
||||
return ARES_ENOTFOUND;
|
||||
default:
|
||||
DEBUGF(fprintf(stderr, "fopen() failed with error: %d %s\n",
|
||||
error, strerror(error)));
|
||||
DEBUGF(fprintf(stderr, "Error opening file: %s\n",
|
||||
PATH_HOSTS));
|
||||
*host = NULL;
|
||||
return ARES_EFILE;
|
||||
}
|
||||
}
|
||||
while ((status = ares__get_hostent(fp, family, host)) == ARES_SUCCESS)
|
||||
{
|
||||
if (strcasecmp((*host)->h_name, name) == 0)
|
||||
|
@@ -15,8 +15,6 @@
|
||||
* without express or implied warranty.
|
||||
*/
|
||||
#include "setup.h"
|
||||
#include <sys/types.h>
|
||||
#include <ctype.h>
|
||||
|
||||
#if defined(WIN32) && !defined(WATT32)
|
||||
#include "nameser.h"
|
||||
@@ -110,7 +108,8 @@ void ares_getnameinfo(ares_channel channel, const struct sockaddr *sa, socklen_t
|
||||
port = addr->sin_port;
|
||||
else
|
||||
port = addr6->sin6_port;
|
||||
service = lookup_service(port, flags, buf, sizeof(buf));
|
||||
service = lookup_service((unsigned short)(port & 0xffff),
|
||||
flags, buf, sizeof(buf));
|
||||
callback(arg, ARES_SUCCESS, NULL, service);
|
||||
return;
|
||||
}
|
||||
@@ -151,7 +150,8 @@ void ares_getnameinfo(ares_channel channel, const struct sockaddr *sa, socklen_t
|
||||
}
|
||||
/* They also want a service */
|
||||
if (flags & ARES_NI_LOOKUPSERVICE)
|
||||
service = lookup_service(port, flags, srvbuf, sizeof(srvbuf));
|
||||
service = lookup_service((unsigned short)(port & 0xffff),
|
||||
flags, srvbuf, sizeof(srvbuf));
|
||||
callback(arg, ARES_SUCCESS, ipbuf, service);
|
||||
return;
|
||||
}
|
||||
@@ -220,7 +220,8 @@ static void nameinfo_callback(void *arg, int status, struct hostent *host)
|
||||
*end = 0;
|
||||
}
|
||||
}
|
||||
niquery->callback(niquery->arg, ARES_SUCCESS, host->h_name, service);
|
||||
niquery->callback(niquery->arg, ARES_SUCCESS, (char *)(host->h_name),
|
||||
service);
|
||||
return;
|
||||
}
|
||||
/* We couldn't find the host, but it's OK, we can use the IP */
|
||||
@@ -264,11 +265,11 @@ static char *lookup_service(unsigned short port, int flags,
|
||||
char tmpbuf[4096];
|
||||
|
||||
if (port)
|
||||
{
|
||||
{
|
||||
if (flags & ARES_NI_NUMERICSERV)
|
||||
sep = NULL;
|
||||
else
|
||||
{
|
||||
{
|
||||
if (flags & ARES_NI_UDP)
|
||||
proto = "udp";
|
||||
else if (flags & ARES_NI_SCTP)
|
||||
@@ -288,21 +289,21 @@ static char *lookup_service(unsigned short port, int flags,
|
||||
#elif GETSERVBYPORT_R_ARGS == 4
|
||||
if (getservbyport_r(port, proto, &se, (void *)tmpbuf) != 0)
|
||||
sep = NULL;
|
||||
#else
|
||||
#else
|
||||
/* Lets just hope the OS uses TLS! */
|
||||
sep = getservbyport(port, proto);
|
||||
#endif
|
||||
#else
|
||||
#endif
|
||||
#else
|
||||
/* Lets just hope the OS uses TLS! */
|
||||
sep = getservbyport(port, proto);
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
}
|
||||
if (sep && sep->s_name)
|
||||
/* get service name */
|
||||
strcpy(tmpbuf, sep->s_name);
|
||||
else
|
||||
/* get port as a string */
|
||||
sprintf(tmpbuf, "%u", ntohs(port));
|
||||
sprintf(tmpbuf, "%u", (unsigned int)ntohs(port));
|
||||
if (strlen(tmpbuf) < buflen)
|
||||
/* return it if buffer big enough */
|
||||
strcpy(buf, tmpbuf);
|
||||
@@ -319,6 +320,9 @@ static char *lookup_service(unsigned short port, int flags,
|
||||
static void append_scopeid(struct sockaddr_in6 *addr6, unsigned int flags,
|
||||
char *buf, size_t buflen)
|
||||
{
|
||||
#ifdef HAVE_IF_INDEXTONAME
|
||||
int is_ll, is_mcll;
|
||||
#endif
|
||||
char fmt_u[] = "%u";
|
||||
char fmt_lu[] = "%lu";
|
||||
char tmpbuf[IF_NAMESIZE + 2];
|
||||
@@ -328,9 +332,10 @@ static void append_scopeid(struct sockaddr_in6 *addr6, unsigned int flags,
|
||||
tmpbuf[0] = '%';
|
||||
|
||||
#ifdef HAVE_IF_INDEXTONAME
|
||||
is_ll = IN6_IS_ADDR_LINKLOCAL(&addr6->sin6_addr);
|
||||
is_mcll = IN6_IS_ADDR_MC_LINKLOCAL(&addr6->sin6_addr);
|
||||
if ((flags & ARES_NI_NUMERICSCOPE) ||
|
||||
(!IN6_IS_ADDR_LINKLOCAL(&addr6->sin6_addr)
|
||||
&& !IN6_IS_ADDR_MC_LINKLOCAL(&addr6->sin6_addr)))
|
||||
(!is_ll && !is_mcll))
|
||||
{
|
||||
sprintf(&tmpbuf[1], fmt, addr6->sin6_scope_id);
|
||||
}
|
||||
@@ -356,6 +361,7 @@ static void append_scopeid(struct sockaddr_in6 *addr6, unsigned int flags,
|
||||
static char *ares_striendstr(const char *s1, const char *s2)
|
||||
{
|
||||
const char *c1, *c2, *c1_begin;
|
||||
int lo1, lo2;
|
||||
size_t s1_len = strlen(s1), s2_len = strlen(s2);
|
||||
|
||||
/* If the substr is longer than the full str, it can't match */
|
||||
@@ -368,7 +374,9 @@ static char *ares_striendstr(const char *s1, const char *s2)
|
||||
c2 = s2;
|
||||
while (c2 < s2+s2_len)
|
||||
{
|
||||
if (tolower(*c1) != tolower(*c2))
|
||||
lo1 = tolower(*c1);
|
||||
lo2 = tolower(*c2);
|
||||
if (lo1 != lo2)
|
||||
return NULL;
|
||||
else
|
||||
{
|
||||
|
123
ares/ares_getopt.c
Normal file
123
ares/ares_getopt.c
Normal file
@@ -0,0 +1,123 @@
|
||||
/*
|
||||
* Original file name getopt.c Initial import into the c-ares source tree
|
||||
* on 2007-04-11. Lifted from version 5.2 of the 'Open Mash' project with
|
||||
* the modified BSD license, BSD license without the advertising clause.
|
||||
*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
/*
|
||||
* getopt.c --
|
||||
*
|
||||
* Standard UNIX getopt function. Code is from BSD.
|
||||
*
|
||||
* Copyright (c) 1987-2001 The Regents of the University of California.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* A. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
* B. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
* C. Neither the names of the copyright holders nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from this
|
||||
* software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS
|
||||
* IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
||||
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
/* #if !defined(lint)
|
||||
* static char sccsid[] = "@(#)getopt.c 8.2 (Berkeley) 4/2/94";
|
||||
* #endif
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include "ares_getopt.h"
|
||||
|
||||
int opterr = 1, /* if error message should be printed */
|
||||
optind = 1, /* index into parent argv vector */
|
||||
optopt, /* character checked for validity */
|
||||
optreset; /* reset getopt */
|
||||
char *optarg; /* argument associated with option */
|
||||
|
||||
#define BADCH (int)'?'
|
||||
#define BADARG (int)':'
|
||||
#define EMSG (char *)""
|
||||
|
||||
/*
|
||||
* ares_getopt --
|
||||
* Parse argc/argv argument vector.
|
||||
*/
|
||||
int
|
||||
ares_getopt(int nargc, char * const nargv[], const char *ostr)
|
||||
{
|
||||
static char *place = EMSG; /* option letter processing */
|
||||
char *oli; /* option letter list index */
|
||||
|
||||
if (optreset || !*place) { /* update scanning pointer */
|
||||
optreset = 0;
|
||||
if (optind >= nargc || *(place = nargv[optind]) != '-') {
|
||||
place = EMSG;
|
||||
return (EOF);
|
||||
}
|
||||
if (place[1] && *++place == '-') { /* found "--" */
|
||||
++optind;
|
||||
place = EMSG;
|
||||
return (EOF);
|
||||
}
|
||||
} /* option letter okay? */
|
||||
if ((optopt = (int)*place++) == (int)':' ||
|
||||
!(oli = strchr(ostr, optopt))) {
|
||||
/*
|
||||
* if the user didn't specify '-' as an option,
|
||||
* assume it means EOF.
|
||||
*/
|
||||
if (optopt == (int)'-')
|
||||
return (EOF);
|
||||
if (!*place)
|
||||
++optind;
|
||||
if (opterr && *ostr != ':')
|
||||
(void)fprintf(stderr,
|
||||
"%s: illegal option -- %c\n", __FILE__, optopt);
|
||||
return (BADCH);
|
||||
}
|
||||
if (*++oli != ':') { /* don't need argument */
|
||||
optarg = NULL;
|
||||
if (!*place)
|
||||
++optind;
|
||||
}
|
||||
else { /* need an argument */
|
||||
if (*place) /* no white space */
|
||||
optarg = place;
|
||||
else if (nargc <= ++optind) { /* no arg */
|
||||
place = EMSG;
|
||||
if (*ostr == ':')
|
||||
return (BADARG);
|
||||
if (opterr)
|
||||
(void)fprintf(stderr,
|
||||
"%s: option requires an argument -- %c\n",
|
||||
__FILE__, optopt);
|
||||
return (BADCH);
|
||||
}
|
||||
else /* white space */
|
||||
optarg = nargv[optind];
|
||||
place = EMSG;
|
||||
++optind;
|
||||
}
|
||||
return (optopt); /* dump back option letter */
|
||||
}
|
41
ares/ares_getopt.h
Normal file
41
ares/ares_getopt.h
Normal file
@@ -0,0 +1,41 @@
|
||||
#ifndef ARES_GETOPT_H
|
||||
#define ARES_GETOPT_H
|
||||
|
||||
/*
|
||||
* Copyright (c) 1987-2001 The Regents of the University of California.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* A. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
* B. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
* C. Neither the names of the copyright holders nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from this
|
||||
* software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS
|
||||
* IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
||||
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
|
||||
int ares_getopt(int nargc, char * const nargv[], const char *ostr);
|
||||
|
||||
extern char *optarg;
|
||||
extern int optind;
|
||||
extern int opterr;
|
||||
|
||||
|
||||
#endif /* ARES_GETOPT_H */
|
@@ -1,6 +1,6 @@
|
||||
/* $Id$ */
|
||||
|
||||
/* Copyright 2005 by Daniel Stenberg.
|
||||
/* Copyright (C) 2005 - 2007, Daniel Stenberg
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software and its
|
||||
* documentation for any purpose and without fee is hereby granted, provided
|
||||
@@ -14,7 +14,6 @@
|
||||
*/
|
||||
|
||||
#include "setup.h"
|
||||
#include <sys/types.h>
|
||||
|
||||
#ifdef HAVE_SYS_TIME_H
|
||||
#include <sys/time.h>
|
||||
@@ -39,7 +38,9 @@ int ares_getsock(ares_channel channel,
|
||||
if (!channel->queries)
|
||||
return 0;
|
||||
|
||||
for (i = 0; i < channel->nservers; i++)
|
||||
for (i = 0;
|
||||
(i < channel->nservers) && (sockindex < ARES_GETSOCK_MAXNUM);
|
||||
i++)
|
||||
{
|
||||
server = &channel->servers[i];
|
||||
if (server->udp_socket != ARES_SOCKET_BAD)
|
||||
@@ -56,13 +57,12 @@ int ares_getsock(ares_channel channel,
|
||||
break;
|
||||
socks[sockindex] = server->tcp_socket;
|
||||
bitmap |= ARES_GETSOCK_READABLE(setbits, sockindex);
|
||||
sockindex++;
|
||||
|
||||
if (server->qhead) {
|
||||
if (server->qhead)
|
||||
/* then the tcp socket is also writable! */
|
||||
bitmap |= ARES_GETSOCK_WRITABLE(setbits, sockindex-1);
|
||||
}
|
||||
bitmap |= ARES_GETSOCK_WRITABLE(setbits, sockindex);
|
||||
|
||||
sockindex++;
|
||||
}
|
||||
}
|
||||
return bitmap;
|
||||
|
444
ares/ares_init.c
444
ares/ares_init.c
@@ -16,7 +16,6 @@
|
||||
*/
|
||||
|
||||
#include "setup.h"
|
||||
#include <sys/types.h>
|
||||
|
||||
#if defined(WIN32) && !defined(WATT32)
|
||||
#include "nameser.h"
|
||||
@@ -43,6 +42,9 @@
|
||||
#ifdef HAVE_UNISTD_H
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
#ifdef HAVE_PROCESS_H
|
||||
#include <process.h> /* Some have getpid() here */
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
@@ -59,7 +61,7 @@
|
||||
#undef WIN32 /* Redefined in MingW/MSVC headers */
|
||||
#endif
|
||||
|
||||
static int init_by_options(ares_channel channel, struct ares_options *options,
|
||||
static int init_by_options(ares_channel channel, const struct ares_options *options,
|
||||
int optmask);
|
||||
static int init_by_environment(ares_channel channel);
|
||||
static int init_by_resolv_conf(ares_channel channel);
|
||||
@@ -70,6 +72,8 @@ static int config_nameserver(struct server_state **servers, int *nservers,
|
||||
static int set_search(ares_channel channel, const char *str);
|
||||
static int set_options(ares_channel channel, const char *str);
|
||||
static const char *try_option(const char *p, const char *q, const char *opt);
|
||||
static void init_id_key(rc4_key* key,int key_data_len);
|
||||
|
||||
#ifndef WIN32
|
||||
static int sortlist_alloc(struct apattern **sortlist, int *nsort, struct apattern *pat);
|
||||
static int ip_addr(const char *s, int len, struct in_addr *addr);
|
||||
@@ -82,6 +86,12 @@ static int config_sortlist(struct apattern **sortlist, int *nsort,
|
||||
static char *try_config(char *s, const char *opt);
|
||||
#endif
|
||||
|
||||
#define ARES_CONFIG_CHECK(x) (x->lookups && x->nsort > -1 && \
|
||||
x->nservers > -1 && \
|
||||
x->ndomains > -1 && \
|
||||
x->ndots > -1 && x->timeout > -1 && \
|
||||
x->tries > -1)
|
||||
|
||||
int ares_init(ares_channel *channelptr)
|
||||
{
|
||||
return ares_init_options(channelptr, NULL, 0);
|
||||
@@ -91,9 +101,9 @@ int ares_init_options(ares_channel *channelptr, struct ares_options *options,
|
||||
int optmask)
|
||||
{
|
||||
ares_channel channel;
|
||||
int i, status;
|
||||
int i;
|
||||
int status = ARES_SUCCESS;
|
||||
struct server_state *server;
|
||||
struct timeval tv;
|
||||
|
||||
#ifdef CURLDEBUG
|
||||
const char *env = getenv("CARES_MEMDEBUG");
|
||||
@@ -106,8 +116,10 @@ int ares_init_options(ares_channel *channelptr, struct ares_options *options,
|
||||
#endif
|
||||
|
||||
channel = malloc(sizeof(struct ares_channeldata));
|
||||
if (!channel)
|
||||
if (!channel) {
|
||||
*channelptr = NULL;
|
||||
return ARES_ENOMEM;
|
||||
}
|
||||
|
||||
/* Set everything to distinguished values so we know they haven't
|
||||
* been set yet.
|
||||
@@ -125,22 +137,42 @@ int ares_init_options(ares_channel *channelptr, struct ares_options *options,
|
||||
channel->queries = NULL;
|
||||
channel->domains = NULL;
|
||||
channel->sortlist = NULL;
|
||||
channel->servers = NULL;
|
||||
channel->sock_state_cb = NULL;
|
||||
channel->sock_state_cb_data = NULL;
|
||||
|
||||
/* Initialize configuration by each of the four sources, from highest
|
||||
* precedence to lowest.
|
||||
*/
|
||||
|
||||
if (status == ARES_SUCCESS) {
|
||||
status = init_by_options(channel, options, optmask);
|
||||
if (status == ARES_SUCCESS)
|
||||
if (status != ARES_SUCCESS)
|
||||
DEBUGF(fprintf(stderr, "Error: init_by_options failed: %s\n",
|
||||
ares_strerror(status)));
|
||||
}
|
||||
if (status == ARES_SUCCESS) {
|
||||
status = init_by_environment(channel);
|
||||
if (status == ARES_SUCCESS)
|
||||
if (status != ARES_SUCCESS)
|
||||
DEBUGF(fprintf(stderr, "Error: init_by_environment failed: %s\n",
|
||||
ares_strerror(status)));
|
||||
}
|
||||
if (status == ARES_SUCCESS) {
|
||||
status = init_by_resolv_conf(channel);
|
||||
if (status == ARES_SUCCESS)
|
||||
if (status != ARES_SUCCESS)
|
||||
DEBUGF(fprintf(stderr, "Error: init_by_resolv_conf failed: %s\n",
|
||||
ares_strerror(status)));
|
||||
}
|
||||
if (status == ARES_SUCCESS) {
|
||||
status = init_by_defaults(channel);
|
||||
if (status != ARES_SUCCESS)
|
||||
DEBUGF(fprintf(stderr, "Error: init_by_defaults failed: %s\n",
|
||||
ares_strerror(status)));
|
||||
}
|
||||
if (status != ARES_SUCCESS)
|
||||
{
|
||||
/* Something failed; clean up memory we may have allocated. */
|
||||
if (channel->nservers != -1)
|
||||
if (channel->servers)
|
||||
free(channel->servers);
|
||||
if (channel->domains)
|
||||
{
|
||||
@@ -172,22 +204,85 @@ int ares_init_options(ares_channel *channelptr, struct ares_options *options,
|
||||
server->qtail = NULL;
|
||||
}
|
||||
|
||||
/* Choose a somewhat random query ID. The main point is to avoid
|
||||
* collisions with stale queries. An attacker trying to spoof a DNS
|
||||
* answer also has to guess the query ID, but it's only a 16-bit
|
||||
* field, so there's not much to be done about that.
|
||||
*/
|
||||
gettimeofday(&tv, NULL);
|
||||
channel->next_id = (unsigned short)
|
||||
(tv.tv_sec ^ tv.tv_usec ^ getpid()) & 0xffff;
|
||||
init_id_key(&channel->id_key, ARES_ID_KEY_LEN);
|
||||
|
||||
channel->next_id = ares__generate_new_id(&channel->id_key);
|
||||
channel->queries = NULL;
|
||||
|
||||
*channelptr = channel;
|
||||
return ARES_SUCCESS;
|
||||
}
|
||||
|
||||
static int init_by_options(ares_channel channel, struct ares_options *options,
|
||||
/* Save options from initialized channel */
|
||||
int ares_save_options(ares_channel channel, struct ares_options *options,
|
||||
int *optmask)
|
||||
{
|
||||
int i;
|
||||
|
||||
/* Zero everything out */
|
||||
memset(options, 0, sizeof(struct ares_options));
|
||||
|
||||
if (!ARES_CONFIG_CHECK(channel))
|
||||
return ARES_ENODATA;
|
||||
|
||||
(*optmask) = (ARES_OPT_FLAGS|ARES_OPT_TIMEOUT|ARES_OPT_TRIES|ARES_OPT_NDOTS|
|
||||
ARES_OPT_UDP_PORT|ARES_OPT_TCP_PORT|ARES_OPT_SOCK_STATE_CB|
|
||||
ARES_OPT_SERVERS|ARES_OPT_DOMAINS|ARES_OPT_LOOKUPS|
|
||||
ARES_OPT_SORTLIST);
|
||||
|
||||
/* Copy easy stuff */
|
||||
options->flags = channel->flags;
|
||||
options->timeout = channel->timeout;
|
||||
options->tries = channel->tries;
|
||||
options->ndots = channel->ndots;
|
||||
options->udp_port = channel->udp_port;
|
||||
options->tcp_port = channel->tcp_port;
|
||||
options->sock_state_cb = channel->sock_state_cb;
|
||||
options->sock_state_cb_data = channel->sock_state_cb_data;
|
||||
|
||||
/* Copy servers */
|
||||
options->servers =
|
||||
malloc(channel->nservers * sizeof(struct server_state));
|
||||
if (!options->servers && channel->nservers != 0)
|
||||
return ARES_ENOMEM;
|
||||
for (i = 0; i < channel->nservers; i++)
|
||||
options->servers[i] = channel->servers[i].addr;
|
||||
options->nservers = channel->nservers;
|
||||
|
||||
/* copy domains */
|
||||
options->domains = malloc(channel->ndomains * sizeof(char *));
|
||||
if (!options->domains)
|
||||
return ARES_ENOMEM;
|
||||
for (i = 0; i < channel->ndomains; i++)
|
||||
{
|
||||
options->ndomains = i;
|
||||
options->domains[i] = strdup(channel->domains[i]);
|
||||
if (!options->domains[i])
|
||||
return ARES_ENOMEM;
|
||||
}
|
||||
options->ndomains = channel->ndomains;
|
||||
|
||||
/* copy lookups */
|
||||
options->lookups = strdup(channel->lookups);
|
||||
if (!options->lookups)
|
||||
return ARES_ENOMEM;
|
||||
|
||||
/* copy sortlist */
|
||||
options->sortlist = malloc(channel->nsort * sizeof(struct apattern));
|
||||
if (!options->sortlist)
|
||||
return ARES_ENOMEM;
|
||||
for (i = 0; i < channel->nsort; i++)
|
||||
{
|
||||
memcpy(&(options->sortlist[i]), &(channel->sortlist[i]),
|
||||
sizeof(struct apattern));
|
||||
}
|
||||
options->nsort = channel->nsort;
|
||||
|
||||
return ARES_SUCCESS;
|
||||
}
|
||||
|
||||
static int init_by_options(ares_channel channel,
|
||||
const struct ares_options *options,
|
||||
int optmask)
|
||||
{
|
||||
int i;
|
||||
@@ -214,12 +309,16 @@ static int init_by_options(ares_channel channel, struct ares_options *options,
|
||||
/* Copy the servers, if given. */
|
||||
if ((optmask & ARES_OPT_SERVERS) && channel->nservers == -1)
|
||||
{
|
||||
channel->servers =
|
||||
malloc(options->nservers * sizeof(struct server_state));
|
||||
if (!channel->servers && options->nservers != 0)
|
||||
return ARES_ENOMEM;
|
||||
for (i = 0; i < options->nservers; i++)
|
||||
channel->servers[i].addr = options->servers[i];
|
||||
/* Avoid zero size allocations at any cost */
|
||||
if (options->nservers > 0)
|
||||
{
|
||||
channel->servers =
|
||||
malloc(options->nservers * sizeof(struct server_state));
|
||||
if (!channel->servers)
|
||||
return ARES_ENOMEM;
|
||||
for (i = 0; i < options->nservers; i++)
|
||||
channel->servers[i].addr = options->servers[i];
|
||||
}
|
||||
channel->nservers = options->nservers;
|
||||
}
|
||||
|
||||
@@ -228,16 +327,20 @@ static int init_by_options(ares_channel channel, struct ares_options *options,
|
||||
*/
|
||||
if ((optmask & ARES_OPT_DOMAINS) && channel->ndomains == -1)
|
||||
{
|
||||
channel->domains = malloc(options->ndomains * sizeof(char *));
|
||||
if (!channel->domains && options->ndomains != 0)
|
||||
return ARES_ENOMEM;
|
||||
for (i = 0; i < options->ndomains; i++)
|
||||
{
|
||||
channel->ndomains = i;
|
||||
channel->domains[i] = strdup(options->domains[i]);
|
||||
if (!channel->domains[i])
|
||||
return ARES_ENOMEM;
|
||||
}
|
||||
/* Avoid zero size allocations at any cost */
|
||||
if (options->ndomains > 0)
|
||||
{
|
||||
channel->domains = malloc(options->ndomains * sizeof(char *));
|
||||
if (!channel->domains)
|
||||
return ARES_ENOMEM;
|
||||
for (i = 0; i < options->ndomains; i++)
|
||||
{
|
||||
channel->ndomains = i;
|
||||
channel->domains[i] = strdup(options->domains[i]);
|
||||
if (!channel->domains[i])
|
||||
return ARES_ENOMEM;
|
||||
}
|
||||
}
|
||||
channel->ndomains = options->ndomains;
|
||||
}
|
||||
|
||||
@@ -249,6 +352,19 @@ static int init_by_options(ares_channel channel, struct ares_options *options,
|
||||
return ARES_ENOMEM;
|
||||
}
|
||||
|
||||
/* copy sortlist */
|
||||
if ((optmask & ARES_OPT_SORTLIST) && channel->nsort == -1)
|
||||
{
|
||||
channel->sortlist = malloc(options->nsort * sizeof(struct apattern));
|
||||
if (!channel->sortlist)
|
||||
return ARES_ENOMEM;
|
||||
for (i = 0; i < options->nsort; i++)
|
||||
{
|
||||
memcpy(&(channel->sortlist[i]), &(options->sortlist[i]), sizeof(struct apattern));
|
||||
}
|
||||
channel->nsort = options->nsort;
|
||||
}
|
||||
|
||||
return ARES_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -373,7 +489,8 @@ static int get_iphlpapi_dns_info (char *ret_buf, size_t ret_size)
|
||||
printf ("DNS Servers:\n"
|
||||
" %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)
|
||||
{
|
||||
ret += sprintf (ret, "%s,", fi->DnsServerList.IpAddress.String);
|
||||
@@ -521,6 +638,10 @@ DhcpNameServer
|
||||
|
||||
if (status == ARES_SUCCESS)
|
||||
status = ARES_EOF;
|
||||
else
|
||||
/* Catch the case when all the above checks fail (which happens when there
|
||||
is no network card or the cable is unplugged) */
|
||||
status = ARES_EFILE;
|
||||
|
||||
#elif defined(__riscos__)
|
||||
|
||||
@@ -539,7 +660,7 @@ DhcpNameServer
|
||||
do {
|
||||
space = strchr(pos, ' ');
|
||||
if (space)
|
||||
*space = 0;
|
||||
*space = '\0';
|
||||
status = config_nameserver(&servers, &nservers, pos);
|
||||
if (status != ARES_SUCCESS)
|
||||
break;
|
||||
@@ -575,32 +696,51 @@ DhcpNameServer
|
||||
char *p;
|
||||
FILE *fp;
|
||||
int linesize;
|
||||
int error;
|
||||
|
||||
/* Don't read resolv.conf and friends if we don't have to */
|
||||
if (ARES_CONFIG_CHECK(channel))
|
||||
return ARES_SUCCESS;
|
||||
|
||||
fp = fopen(PATH_RESOLV_CONF, "r");
|
||||
if (!fp)
|
||||
return (errno == ENOENT) ? ARES_SUCCESS : ARES_EFILE;
|
||||
while ((status = ares__read_line(fp, &line, &linesize)) == ARES_SUCCESS)
|
||||
{
|
||||
if ((p = try_config(line, "domain")))
|
||||
status = config_domain(channel, p);
|
||||
else if ((p = try_config(line, "lookup")) && !channel->lookups)
|
||||
status = config_lookup(channel, p, "bind", "file");
|
||||
else if ((p = try_config(line, "search")))
|
||||
status = set_search(channel, p);
|
||||
else if ((p = try_config(line, "nameserver")) && channel->nservers == -1)
|
||||
status = config_nameserver(&servers, &nservers, p);
|
||||
else if ((p = try_config(line, "sortlist")) && channel->nsort == -1)
|
||||
status = config_sortlist(&sortlist, &nsort, p);
|
||||
else if ((p = try_config(line, "options")))
|
||||
status = set_options(channel, p);
|
||||
else
|
||||
status = ARES_SUCCESS;
|
||||
if (status != ARES_SUCCESS)
|
||||
break;
|
||||
if (fp) {
|
||||
while ((status = ares__read_line(fp, &line, &linesize)) == ARES_SUCCESS)
|
||||
{
|
||||
if ((p = try_config(line, "domain")) && channel->ndomains == -1)
|
||||
status = config_domain(channel, p);
|
||||
else if ((p = try_config(line, "lookup")) && !channel->lookups)
|
||||
status = config_lookup(channel, p, "bind", "file");
|
||||
else if ((p = try_config(line, "search")) && channel->ndomains == -1)
|
||||
status = set_search(channel, p);
|
||||
else if ((p = try_config(line, "nameserver")) && channel->nservers == -1)
|
||||
status = config_nameserver(&servers, &nservers, p);
|
||||
else if ((p = try_config(line, "sortlist")) && channel->nsort == -1)
|
||||
status = config_sortlist(&sortlist, &nsort, p);
|
||||
else if ((p = try_config(line, "options")))
|
||||
status = set_options(channel, p);
|
||||
else
|
||||
status = ARES_SUCCESS;
|
||||
if (status != ARES_SUCCESS)
|
||||
break;
|
||||
}
|
||||
fclose(fp);
|
||||
}
|
||||
else {
|
||||
error = ERRNO;
|
||||
switch(error) {
|
||||
case ENOENT:
|
||||
case ESRCH:
|
||||
status = ARES_EOF;
|
||||
break;
|
||||
default:
|
||||
DEBUGF(fprintf(stderr, "fopen() failed with error: %d %s\n",
|
||||
error, strerror(error)));
|
||||
DEBUGF(fprintf(stderr, "Error opening file: %s\n", PATH_RESOLV_CONF));
|
||||
status = ARES_EFILE;
|
||||
}
|
||||
}
|
||||
fclose(fp);
|
||||
|
||||
if (!channel->lookups) {
|
||||
if ((status == ARES_EOF) && (!channel->lookups)) {
|
||||
/* Many systems (Solaris, Linux, BSD's) use nsswitch.conf */
|
||||
fp = fopen("/etc/nsswitch.conf", "r");
|
||||
if (fp) {
|
||||
@@ -611,9 +751,23 @@ DhcpNameServer
|
||||
}
|
||||
fclose(fp);
|
||||
}
|
||||
else {
|
||||
error = ERRNO;
|
||||
switch(error) {
|
||||
case ENOENT:
|
||||
case ESRCH:
|
||||
status = ARES_EOF;
|
||||
break;
|
||||
default:
|
||||
DEBUGF(fprintf(stderr, "fopen() failed with error: %d %s\n",
|
||||
error, strerror(error)));
|
||||
DEBUGF(fprintf(stderr, "Error opening file: %s\n", "/etc/nsswitch.conf"));
|
||||
status = ARES_EFILE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!channel->lookups) {
|
||||
if ((status == ARES_EOF) && (!channel->lookups)) {
|
||||
/* Linux / GNU libc 2.x and possibly others have host.conf */
|
||||
fp = fopen("/etc/host.conf", "r");
|
||||
if (fp) {
|
||||
@@ -624,9 +778,23 @@ DhcpNameServer
|
||||
}
|
||||
fclose(fp);
|
||||
}
|
||||
else {
|
||||
error = ERRNO;
|
||||
switch(error) {
|
||||
case ENOENT:
|
||||
case ESRCH:
|
||||
status = ARES_EOF;
|
||||
break;
|
||||
default:
|
||||
DEBUGF(fprintf(stderr, "fopen() failed with error: %d %s\n",
|
||||
error, strerror(error)));
|
||||
DEBUGF(fprintf(stderr, "Error opening file: %s\n", "/etc/host.conf"));
|
||||
status = ARES_EFILE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!channel->lookups) {
|
||||
if ((status == ARES_EOF) && (!channel->lookups)) {
|
||||
/* Tru64 uses /etc/svc.conf */
|
||||
fp = fopen("/etc/svc.conf", "r");
|
||||
if (fp) {
|
||||
@@ -637,6 +805,20 @@ DhcpNameServer
|
||||
}
|
||||
fclose(fp);
|
||||
}
|
||||
else {
|
||||
error = ERRNO;
|
||||
switch(error) {
|
||||
case ENOENT:
|
||||
case ESRCH:
|
||||
status = ARES_EOF;
|
||||
break;
|
||||
default:
|
||||
DEBUGF(fprintf(stderr, "fopen() failed with error: %d %s\n",
|
||||
error, strerror(error)));
|
||||
DEBUGF(fprintf(stderr, "Error opening file: %s\n", "/etc/svc.conf"));
|
||||
status = ARES_EFILE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(line)
|
||||
@@ -710,7 +892,6 @@ static int init_by_defaults(ares_channel channel)
|
||||
if (gethostname(hostname, sizeof(hostname)) == -1
|
||||
|| !strchr(hostname, '.'))
|
||||
{
|
||||
channel->domains = malloc(0);
|
||||
channel->ndomains = 0;
|
||||
}
|
||||
else
|
||||
@@ -749,9 +930,9 @@ static int config_domain(ares_channel channel, char *str)
|
||||
|
||||
/* Set a single search domain. */
|
||||
q = str;
|
||||
while (*q && !isspace((unsigned char)*q))
|
||||
while (*q && !ISSPACE(*q))
|
||||
q++;
|
||||
*q = 0;
|
||||
*q = '\0';
|
||||
return set_search(channel, str);
|
||||
}
|
||||
|
||||
@@ -773,12 +954,12 @@ static int config_lookup(ares_channel channel, const char *str,
|
||||
if (*p == *bindch) *l++ = 'b';
|
||||
else *l++ = 'f';
|
||||
}
|
||||
while (*p && !isspace((unsigned char)*p) && (*p != ','))
|
||||
while (*p && !ISSPACE(*p) && (*p != ','))
|
||||
p++;
|
||||
while (*p && (isspace((unsigned char)*p) || (*p == ',')))
|
||||
while (*p && (ISSPACE(*p) || (*p == ',')))
|
||||
p++;
|
||||
}
|
||||
*l = 0;
|
||||
*l = '\0';
|
||||
channel->lookups = strdup(lookups);
|
||||
return (channel->lookups) ? ARES_SUCCESS : ARES_ENOMEM;
|
||||
}
|
||||
@@ -800,12 +981,12 @@ static int config_nameserver(struct server_state **servers, int *nservers,
|
||||
while (more)
|
||||
{
|
||||
more = 0;
|
||||
while (*p && !isspace(*p) && *p != ',')
|
||||
while (*p && !ISSPACE(*p) && *p != ',')
|
||||
p++;
|
||||
|
||||
if (*p)
|
||||
{
|
||||
*p = 0;
|
||||
*p = '\0';
|
||||
more = 1;
|
||||
}
|
||||
|
||||
@@ -860,40 +1041,40 @@ static int config_sortlist(struct apattern **sortlist, int *nsort,
|
||||
char ipbuf[16], ipbufpfx[32];
|
||||
/* Find just the IP */
|
||||
q = str;
|
||||
while (*q && *q != '/' && *q != ';' && !isspace((unsigned char)*q))
|
||||
while (*q && *q != '/' && *q != ';' && !ISSPACE(*q))
|
||||
q++;
|
||||
memcpy(ipbuf, str, (int)(q-str));
|
||||
ipbuf[(int)(q-str)] = 0;
|
||||
ipbuf[(int)(q-str)] = '\0';
|
||||
/* Find the prefix */
|
||||
if (*q == '/')
|
||||
{
|
||||
const char *str2 = q+1;
|
||||
while (*q && *q != ';' && !isspace((unsigned char)*q))
|
||||
while (*q && *q != ';' && !ISSPACE(*q))
|
||||
q++;
|
||||
memcpy(ipbufpfx, str, (int)(q-str));
|
||||
ipbufpfx[(int)(q-str)] = 0;
|
||||
ipbufpfx[(int)(q-str)] = '\0';
|
||||
str = str2;
|
||||
}
|
||||
else
|
||||
ipbufpfx[0] = 0;
|
||||
ipbufpfx[0] = '\0';
|
||||
/* Lets see if it is CIDR */
|
||||
/* First we'll try IPv6 */
|
||||
if ((bits = ares_inet_net_pton(AF_INET6, ipbufpfx ? ipbufpfx : ipbuf,
|
||||
if ((bits = ares_inet_net_pton(AF_INET6, ipbufpfx[0] ? ipbufpfx : ipbuf,
|
||||
&pat.addr.addr6,
|
||||
sizeof(pat.addr.addr6))) > 0)
|
||||
{
|
||||
pat.type = PATTERN_CIDR;
|
||||
pat.mask.bits = bits;
|
||||
pat.mask.bits = (unsigned short)bits;
|
||||
pat.family = AF_INET6;
|
||||
if (!sortlist_alloc(sortlist, nsort, &pat))
|
||||
return ARES_ENOMEM;
|
||||
}
|
||||
if (ipbufpfx &&
|
||||
if (ipbufpfx[0] &&
|
||||
(bits = ares_inet_net_pton(AF_INET, ipbufpfx, &pat.addr.addr4,
|
||||
sizeof(pat.addr.addr4))) > 0)
|
||||
{
|
||||
pat.type = PATTERN_CIDR;
|
||||
pat.mask.bits = bits;
|
||||
pat.mask.bits = (unsigned short)bits;
|
||||
pat.family = AF_INET;
|
||||
if (!sortlist_alloc(sortlist, nsort, &pat))
|
||||
return ARES_ENOMEM;
|
||||
@@ -901,10 +1082,10 @@ static int config_sortlist(struct apattern **sortlist, int *nsort,
|
||||
/* See if it is just a regular IP */
|
||||
else if (ip_addr(ipbuf, (int)(q-str), &pat.addr.addr4) == 0)
|
||||
{
|
||||
if (ipbufpfx)
|
||||
if (ipbufpfx[0])
|
||||
{
|
||||
memcpy(ipbuf, str, (int)(q-str));
|
||||
ipbuf[(int)(q-str)] = 0;
|
||||
ipbuf[(int)(q-str)] = '\0';
|
||||
if (ip_addr(ipbuf, (int)(q - str), &pat.mask.addr.addr4) != 0)
|
||||
natural_mask(&pat);
|
||||
}
|
||||
@@ -917,11 +1098,11 @@ static int config_sortlist(struct apattern **sortlist, int *nsort,
|
||||
}
|
||||
else
|
||||
{
|
||||
while (*q && *q != ';' && !isspace((unsigned char)*q))
|
||||
while (*q && *q != ';' && !ISSPACE(*q))
|
||||
q++;
|
||||
}
|
||||
str = q;
|
||||
while (isspace((unsigned char)*str))
|
||||
while (ISSPACE(*str))
|
||||
str++;
|
||||
}
|
||||
|
||||
@@ -939,6 +1120,7 @@ static int set_search(ares_channel channel, const char *str)
|
||||
for(n=0; n < channel->ndomains; n++)
|
||||
free(channel->domains[n]);
|
||||
free(channel->domains);
|
||||
channel->domains = NULL;
|
||||
channel->ndomains = -1;
|
||||
}
|
||||
|
||||
@@ -947,15 +1129,21 @@ static int set_search(ares_channel channel, const char *str)
|
||||
p = str;
|
||||
while (*p)
|
||||
{
|
||||
while (*p && !isspace((unsigned char)*p))
|
||||
while (*p && !ISSPACE(*p))
|
||||
p++;
|
||||
while (isspace((unsigned char)*p))
|
||||
while (ISSPACE(*p))
|
||||
p++;
|
||||
n++;
|
||||
}
|
||||
|
||||
if (!n)
|
||||
{
|
||||
channel->ndomains = 0;
|
||||
return ARES_SUCCESS;
|
||||
}
|
||||
|
||||
channel->domains = malloc(n * sizeof(char *));
|
||||
if (!channel->domains && n)
|
||||
if (!channel->domains)
|
||||
return ARES_ENOMEM;
|
||||
|
||||
/* Now copy the domains. */
|
||||
@@ -965,7 +1153,7 @@ static int set_search(ares_channel channel, const char *str)
|
||||
{
|
||||
channel->ndomains = n;
|
||||
q = p;
|
||||
while (*q && !isspace((unsigned char)*q))
|
||||
while (*q && !ISSPACE(*q))
|
||||
q++;
|
||||
channel->domains[n] = malloc(q - p + 1);
|
||||
if (!channel->domains[n])
|
||||
@@ -973,7 +1161,7 @@ static int set_search(ares_channel channel, const char *str)
|
||||
memcpy(channel->domains[n], p, q - p);
|
||||
channel->domains[n][q - p] = 0;
|
||||
p = q;
|
||||
while (isspace((unsigned char)*p))
|
||||
while (ISSPACE(*p))
|
||||
p++;
|
||||
n++;
|
||||
}
|
||||
@@ -990,7 +1178,7 @@ static int set_options(ares_channel channel, const char *str)
|
||||
while (*p)
|
||||
{
|
||||
q = p;
|
||||
while (*q && !isspace((unsigned char)*q))
|
||||
while (*q && !ISSPACE(*q))
|
||||
q++;
|
||||
val = try_option(p, q, "ndots:");
|
||||
if (val && channel->ndots == -1)
|
||||
@@ -1002,7 +1190,7 @@ static int set_options(ares_channel channel, const char *str)
|
||||
if (val && channel->tries == -1)
|
||||
channel->tries = atoi(val);
|
||||
p = q;
|
||||
while (isspace((unsigned char)*p))
|
||||
while (ISSPACE(*p))
|
||||
p++;
|
||||
}
|
||||
|
||||
@@ -1015,10 +1203,10 @@ static char *try_config(char *s, const char *opt)
|
||||
size_t len;
|
||||
|
||||
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;
|
||||
s += len;
|
||||
while (isspace((unsigned char)*s))
|
||||
while (ISSPACE(*s))
|
||||
s++;
|
||||
return s;
|
||||
}
|
||||
@@ -1078,3 +1266,79 @@ static void natural_mask(struct apattern *pat)
|
||||
pat->mask.addr.addr4.s_addr = htonl(IN_CLASSC_NET);
|
||||
}
|
||||
#endif
|
||||
/* initialize an rc4 key. If possible a cryptographically secure random key
|
||||
is generated using a suitable function (for example win32's RtlGenRandom as
|
||||
described in
|
||||
http://blogs.msdn.com/michael_howard/archive/2005/01/14/353379.aspx
|
||||
otherwise the code defaults to cross-platform albeit less secure mechanism
|
||||
using rand
|
||||
*/
|
||||
static void randomize_key(unsigned char* key,int key_data_len)
|
||||
{
|
||||
int randomized = 0;
|
||||
int counter=0;
|
||||
#ifdef WIN32
|
||||
HMODULE lib=LoadLibrary("ADVAPI32.DLL");
|
||||
if (lib) {
|
||||
BOOLEAN (APIENTRY *pfn)(void*, ULONG) =
|
||||
(BOOLEAN (APIENTRY *)(void*,ULONG))GetProcAddress(lib,"SystemFunction036");
|
||||
if (pfn && pfn(key,key_data_len) )
|
||||
randomized = 1;
|
||||
|
||||
FreeLibrary(lib);
|
||||
}
|
||||
#else /* !WIN32 */
|
||||
#ifdef RANDOM_FILE
|
||||
char buffer[256];
|
||||
FILE *f = fopen(RANDOM_FILE, "rb");
|
||||
if(f) {
|
||||
size_t i;
|
||||
size_t rc = fread(buffer, key_data_len, 1, f);
|
||||
for(i=0; i<rc && counter < key_data_len; i++)
|
||||
key[counter++]=buffer[i];
|
||||
fclose(f);
|
||||
}
|
||||
#endif
|
||||
#endif /* WIN32 */
|
||||
|
||||
if ( !randomized ) {
|
||||
for (;counter<key_data_len;counter++)
|
||||
key[counter]=rand() % 256;
|
||||
}
|
||||
}
|
||||
|
||||
static void init_id_key(rc4_key* key,int key_data_len)
|
||||
{
|
||||
unsigned char index1;
|
||||
unsigned char index2;
|
||||
unsigned char* state;
|
||||
short counter;
|
||||
unsigned char *key_data_ptr = 0;
|
||||
|
||||
key_data_ptr = calloc(1,key_data_len);
|
||||
randomize_key(key->state,key_data_len);
|
||||
state = &key->state[0];
|
||||
for(counter = 0; counter < 256; counter++)
|
||||
state[counter] = counter;
|
||||
key->x = 0;
|
||||
key->y = 0;
|
||||
index1 = 0;
|
||||
index2 = 0;
|
||||
for(counter = 0; counter < 256; counter++)
|
||||
{
|
||||
index2 = (key_data_ptr[index1] + state[counter] +
|
||||
index2) % 256;
|
||||
ARES_SWAP_BYTE(&state[counter], &state[index2]);
|
||||
|
||||
index1 = (index1 + 1) % key_data_len;
|
||||
}
|
||||
free(key_data_ptr);
|
||||
|
||||
}
|
||||
|
||||
short ares__generate_new_id(rc4_key* key)
|
||||
{
|
||||
short r;
|
||||
ares__rc4(key, (unsigned char *)&r, sizeof(r));
|
||||
return r;
|
||||
}
|
||||
|
@@ -16,7 +16,6 @@
|
||||
*/
|
||||
|
||||
#include "setup.h"
|
||||
#include <sys/types.h>
|
||||
|
||||
#if defined(WIN32) && !defined(WATT32)
|
||||
#include "nameser.h"
|
||||
@@ -115,7 +114,12 @@ int ares_mkquery(const char *name, int dnsclass, int type, unsigned short id,
|
||||
memset(q, 0, HFIXEDSZ);
|
||||
DNS_HEADER_SET_QID(q, id);
|
||||
DNS_HEADER_SET_OPCODE(q, QUERY);
|
||||
DNS_HEADER_SET_RD(q, (rd) ? 1 : 0);
|
||||
if (rd) {
|
||||
DNS_HEADER_SET_RD(q, 1);
|
||||
}
|
||||
else {
|
||||
DNS_HEADER_SET_RD(q, 0);
|
||||
}
|
||||
DNS_HEADER_SET_QDCOUNT(q, 1);
|
||||
|
||||
/* A name of "." is a screw case for the loop below, so adjust it. */
|
||||
@@ -141,7 +145,7 @@ int ares_mkquery(const char *name, int dnsclass, int type, unsigned short id,
|
||||
return ARES_EBADNAME;
|
||||
|
||||
/* Encode the length and copy the data. */
|
||||
*q++ = len;
|
||||
*q++ = (unsigned char)len;
|
||||
for (p = name; *p && *p != '.'; p++)
|
||||
{
|
||||
if (*p == '\\' && *(p + 1) != 0)
|
||||
|
@@ -16,7 +16,6 @@
|
||||
*/
|
||||
|
||||
#include "setup.h"
|
||||
#include <sys/types.h>
|
||||
|
||||
#if defined(WIN32) && !defined(WATT32)
|
||||
#include "nameser.h"
|
||||
|
@@ -16,7 +16,6 @@
|
||||
*/
|
||||
|
||||
#include "setup.h"
|
||||
#include <sys/types.h>
|
||||
|
||||
#if defined(WIN32) && !defined(WATT32)
|
||||
#include "nameser.h"
|
||||
|
66
ares/ares_parse_ns_reply.3
Normal file
66
ares/ares_parse_ns_reply.3
Normal file
@@ -0,0 +1,66 @@
|
||||
.\"
|
||||
.\" Copyright 1998 by the Massachusetts Institute of Technology.
|
||||
.\"
|
||||
.\" Permission to use, copy, modify, and distribute this
|
||||
.\" software and its documentation for any purpose and without
|
||||
.\" fee is hereby granted, provided that the above copyright
|
||||
.\" notice appear in all copies and that both that copyright
|
||||
.\" notice and this permission notice appear in supporting
|
||||
.\" documentation, and that the name of M.I.T. not be used in
|
||||
.\" advertising or publicity pertaining to distribution of the
|
||||
.\" software without specific, written prior permission.
|
||||
.\" M.I.T. makes no representations about the suitability of
|
||||
.\" this software for any purpose. It is provided "as is"
|
||||
.\" without express or implied warranty.
|
||||
.\"
|
||||
.TH ARES_PARSE_NS_REPLY 3 "10 February 2007"
|
||||
.SH NAME
|
||||
ares_parse_ns_reply \- Parse a reply to a DNS query of type NS into a hostent
|
||||
.SH SYNOPSIS
|
||||
.nf
|
||||
.B #include <ares.h>
|
||||
.PP
|
||||
.B int ares_parse_ns_reply(const unsigned char *\fIabuf\fP, int \fIalen\fP,
|
||||
.B struct hostent **\fIhost\fP);
|
||||
.fi
|
||||
.SH DESCRIPTION
|
||||
The
|
||||
.B ares_parse_ns_reply
|
||||
function parses the response to a query of type NS into a
|
||||
.BR "struct hostent" .
|
||||
The parameters
|
||||
.I abuf
|
||||
and
|
||||
.I alen
|
||||
give the contents of the response. The result is stored in allocated
|
||||
memory and a pointer to it stored into the variable pointed to by
|
||||
.IR host .
|
||||
The nameservers are stored into the
|
||||
.BR aliases
|
||||
field of the
|
||||
.IR host
|
||||
structure.
|
||||
It is the caller's responsibility to free the resulting host structure
|
||||
using
|
||||
.BR ares_free_hostent (3)
|
||||
when it is no longer needed.
|
||||
.SH RETURN VALUES
|
||||
.B ares_parse_ns_reply
|
||||
can return any of the following values:
|
||||
.TP 15
|
||||
.B ARES_SUCCESS
|
||||
The response was successfully parsed.
|
||||
.TP 15
|
||||
.B ARES_EBADRESP
|
||||
The response was malformatted.
|
||||
.TP 15
|
||||
.B ARES_ENODATA
|
||||
The response did not contain an answer to the query.
|
||||
.TP 15
|
||||
.B ARES_ENOMEM
|
||||
Memory was exhausted.
|
||||
.SH SEE ALSO
|
||||
.BR ares_query (3),
|
||||
.BR ares_free_hostent (3)
|
||||
.SH AUTHOR
|
||||
Written by Vlad Dinulescu <vlad.dinulescu@avira.com>, on behalf of AVIRA Gmbh http://www.avira.com
|
171
ares/ares_parse_ns_reply.c
Normal file
171
ares/ares_parse_ns_reply.c
Normal file
@@ -0,0 +1,171 @@
|
||||
/* Copyright 1998 by the Massachusetts Institute of Technology.
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this
|
||||
* software and its documentation for any purpose and without
|
||||
* fee is hereby granted, provided that the above copyright
|
||||
* notice appear in all copies and that both that copyright
|
||||
* notice and this permission notice appear in supporting
|
||||
* documentation, and that the name of M.I.T. not be used in
|
||||
* advertising or publicity pertaining to distribution of the
|
||||
* software without specific, written prior permission.
|
||||
* M.I.T. makes no representations about the suitability of
|
||||
* this software for any purpose. It is provided "as is"
|
||||
* without express or implied warranty.
|
||||
*/
|
||||
|
||||
/*
|
||||
* ares_parse_ns_reply created by Vlad Dinulescu <vlad.dinulescu@avira.com>
|
||||
* on behalf of AVIRA Gmbh - http://www.avira.com
|
||||
*/
|
||||
|
||||
#include "setup.h"
|
||||
|
||||
#if defined(WIN32) && !defined(WATT32)
|
||||
#include "nameser.h"
|
||||
#else
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <netdb.h>
|
||||
#include <arpa/nameser.h>
|
||||
#ifdef HAVE_ARPA_NAMESER_COMPAT_H
|
||||
#include <arpa/nameser_compat.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include "ares.h"
|
||||
#include "ares_dns.h"
|
||||
#include "ares_private.h"
|
||||
|
||||
int ares_parse_ns_reply( const unsigned char* abuf, int alen,
|
||||
struct hostent** host )
|
||||
{
|
||||
unsigned int qdcount, ancount;
|
||||
int status, i, rr_type, rr_class, rr_len;
|
||||
int nameservers_num;
|
||||
long len;
|
||||
const unsigned char *aptr;
|
||||
char* hostname, *rr_name, *rr_data, **nameservers;
|
||||
struct hostent *hostent;
|
||||
|
||||
/* Set *host to NULL for all failure cases. */
|
||||
*host = NULL;
|
||||
|
||||
/* Give up if abuf doesn't have room for a header. */
|
||||
if ( alen < HFIXEDSZ )
|
||||
return ARES_EBADRESP;
|
||||
|
||||
/* Fetch the question and answer count from the header. */
|
||||
qdcount = DNS_HEADER_QDCOUNT( abuf );
|
||||
ancount = DNS_HEADER_ANCOUNT( abuf );
|
||||
if ( qdcount != 1 )
|
||||
return ARES_EBADRESP;
|
||||
|
||||
/* Expand the name from the question, and skip past the question. */
|
||||
aptr = abuf + HFIXEDSZ;
|
||||
status = ares_expand_name( aptr, abuf, alen, &hostname, &len );
|
||||
if ( status != ARES_SUCCESS )
|
||||
return status;
|
||||
if ( aptr + len + QFIXEDSZ > abuf + alen )
|
||||
{
|
||||
free( hostname );
|
||||
return ARES_EBADRESP;
|
||||
}
|
||||
aptr += len + QFIXEDSZ;
|
||||
|
||||
/* Allocate nameservers array; ancount gives an upper bound */
|
||||
nameservers = malloc( ( ancount + 1 ) * sizeof( char * ) );
|
||||
if ( !nameservers )
|
||||
{
|
||||
free( hostname );
|
||||
return ARES_ENOMEM;
|
||||
}
|
||||
nameservers_num = 0;
|
||||
|
||||
/* Examine each answer resource record (RR) in turn. */
|
||||
for ( i = 0; i < ( int ) ancount; i++ )
|
||||
{
|
||||
/* Decode the RR up to the data field. */
|
||||
status = ares_expand_name( aptr, abuf, alen, &rr_name, &len );
|
||||
if ( status != ARES_SUCCESS )
|
||||
break;
|
||||
aptr += len;
|
||||
if ( aptr + RRFIXEDSZ > abuf + alen )
|
||||
{
|
||||
status = ARES_EBADRESP;
|
||||
break;
|
||||
}
|
||||
rr_type = DNS_RR_TYPE( aptr );
|
||||
rr_class = DNS_RR_CLASS( aptr );
|
||||
rr_len = DNS_RR_LEN( aptr );
|
||||
aptr += RRFIXEDSZ;
|
||||
|
||||
if ( rr_class == C_IN && rr_type == T_NS )
|
||||
{
|
||||
/* Decode the RR data and add it to the nameservers list */
|
||||
status = ares_expand_name( aptr, abuf, alen, &rr_data, &len );
|
||||
if ( status != ARES_SUCCESS )
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
nameservers[nameservers_num] = malloc(strlen(rr_data)+1);
|
||||
|
||||
if (nameservers[nameservers_num]==NULL)
|
||||
{
|
||||
free(rr_name);
|
||||
free(rr_data);
|
||||
status=ARES_ENOMEM;
|
||||
break;
|
||||
}
|
||||
strcpy(nameservers[nameservers_num],rr_data);
|
||||
free(rr_data);
|
||||
|
||||
nameservers_num++;
|
||||
}
|
||||
|
||||
free( rr_name );
|
||||
|
||||
aptr += rr_len;
|
||||
if ( aptr > abuf + alen )
|
||||
{
|
||||
status = ARES_EBADRESP;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if ( status == ARES_SUCCESS && nameservers_num == 0 )
|
||||
{
|
||||
status = ARES_ENODATA;
|
||||
}
|
||||
if ( status == ARES_SUCCESS )
|
||||
{
|
||||
/* We got our answer. Allocate memory to build the host entry. */
|
||||
nameservers[nameservers_num] = NULL;
|
||||
hostent = malloc( sizeof( struct hostent ) );
|
||||
if ( hostent )
|
||||
{
|
||||
hostent->h_addr_list = malloc( 1 * sizeof( char * ) );
|
||||
if ( hostent->h_addr_list )
|
||||
{
|
||||
/* Fill in the hostent and return successfully. */
|
||||
hostent->h_name = hostname;
|
||||
hostent->h_aliases = nameservers;
|
||||
hostent->h_addrtype = AF_INET;
|
||||
hostent->h_length = sizeof( struct in_addr );
|
||||
hostent->h_addr_list[0] = NULL;
|
||||
*host = hostent;
|
||||
return ARES_SUCCESS;
|
||||
}
|
||||
free( hostent );
|
||||
}
|
||||
status = ARES_ENOMEM;
|
||||
}
|
||||
for ( i = 0; i < nameservers_num; i++ )
|
||||
free( nameservers[i] );
|
||||
free( nameservers );
|
||||
free( hostname );
|
||||
return status;
|
||||
}
|
@@ -16,7 +16,6 @@
|
||||
*/
|
||||
|
||||
#include "setup.h"
|
||||
#include <sys/types.h>
|
||||
|
||||
#if defined(WIN32) && !defined(WATT32)
|
||||
#include "nameser.h"
|
||||
|
@@ -80,6 +80,8 @@
|
||||
|
||||
#endif
|
||||
|
||||
#define ARES_ID_KEY_LEN 31
|
||||
|
||||
#include "ares_ipv6.h"
|
||||
|
||||
struct send_request {
|
||||
@@ -156,6 +158,13 @@ struct apattern {
|
||||
unsigned short type;
|
||||
};
|
||||
|
||||
typedef struct rc4_key
|
||||
{
|
||||
unsigned char state[256];
|
||||
unsigned char x;
|
||||
unsigned char y;
|
||||
} rc4_key;
|
||||
|
||||
struct ares_channeldata {
|
||||
/* Configuration data */
|
||||
int flags;
|
||||
@@ -176,6 +185,8 @@ struct ares_channeldata {
|
||||
|
||||
/* ID to use for next query */
|
||||
unsigned short next_id;
|
||||
/* key to use when generating new ids */
|
||||
rc4_key id_key;
|
||||
|
||||
/* Active queries */
|
||||
struct query *queries;
|
||||
@@ -184,10 +195,15 @@ struct ares_channeldata {
|
||||
void *sock_state_cb_data;
|
||||
};
|
||||
|
||||
void ares__rc4(rc4_key* key,unsigned char *buffer_ptr, int buffer_len);
|
||||
void ares__send_query(ares_channel channel, struct query *query, time_t now);
|
||||
void ares__close_sockets(ares_channel channel, struct server_state *server);
|
||||
int ares__get_hostent(FILE *fp, int family, struct hostent **host);
|
||||
int ares__read_line(FILE *fp, char **buf, int *bufsize);
|
||||
short ares__generate_new_id(rc4_key* key);
|
||||
|
||||
#define ARES_SWAP_BYTE(a,b) \
|
||||
{ unsigned char swapByte = *(a); *(a) = *(b); *(b) = swapByte; }
|
||||
|
||||
#define SOCK_STATE_CALLBACK(c, s, r, w) \
|
||||
do { \
|
||||
|
@@ -24,16 +24,16 @@ ares_process \- Process events for name resolution
|
||||
.B void ares_process(ares_channel \fIchannel\fP, fd_set *\fIread_fds\fP,
|
||||
.B fd_set *\fIwrite_fds\fP)
|
||||
.fi
|
||||
.PP
|
||||
.B void ares_process_fd(ares_channel \fIchannel\fP,
|
||||
.B ares_socket_t \fIread_fd\fP,
|
||||
.B ares_socket_t \fIwrite_fd\fP)
|
||||
.fi
|
||||
.SH DESCRIPTION
|
||||
The
|
||||
.B ares_process
|
||||
function handles input/output events and timeouts associated with
|
||||
queries pending on the name service channel identified by
|
||||
The \fBares_process(3)\fP function handles input/output events and timeouts
|
||||
associated with queries pending on the name service channel identified by
|
||||
.IR channel .
|
||||
The file descriptor sets pointed to by
|
||||
.I read_fds
|
||||
and
|
||||
.I write_fds
|
||||
The file descriptor sets pointed to by \fIread_fds\fP and \fIwrite_fds\fP
|
||||
should have file descriptors set in them according to whether the file
|
||||
descriptors specified by \fIares_fds(3)\fP are ready for reading and writing.
|
||||
(The easiest way to determine this information is to invoke
|
||||
@@ -44,6 +44,11 @@ The
|
||||
.B ares_process
|
||||
function will invoke callbacks for pending queries if they complete
|
||||
successfully or fail.
|
||||
|
||||
\fBares_process_fd(3)\fP works the same way but acts and operates only on the
|
||||
specific file descriptors (sockets) you pass in to the function. Use
|
||||
ARES_SOCKET_BAD for "no action". This function is of course provided to allow
|
||||
users of c-ares to void select() in their applications and within c-ares.
|
||||
.SS EXAMPLE
|
||||
The following code fragment waits for all pending queries on a channel
|
||||
to complete:
|
||||
|
@@ -16,7 +16,6 @@
|
||||
*/
|
||||
|
||||
#include "setup.h"
|
||||
#include <sys/types.h>
|
||||
|
||||
#if defined(WIN32) && !defined(WATT32)
|
||||
#include "nameser.h"
|
||||
@@ -54,26 +53,17 @@
|
||||
#include "ares_dns.h"
|
||||
#include "ares_private.h"
|
||||
|
||||
#ifndef TRUE
|
||||
/* at least Solaris 7 does not have TRUE at this point */
|
||||
#define TRUE 1
|
||||
#endif
|
||||
|
||||
#if (defined(WIN32) || defined(WATT32)) && !defined(MSDOS)
|
||||
#define GET_ERRNO() WSAGetLastError()
|
||||
#else
|
||||
#define GET_ERRNO() errno
|
||||
#endif
|
||||
|
||||
static int try_again(int errnum);
|
||||
static void write_tcp_data(ares_channel channel, fd_set *write_fds,
|
||||
time_t now);
|
||||
static void read_tcp_data(ares_channel channel, fd_set *read_fds, time_t now);
|
||||
ares_socket_t write_fd, time_t now);
|
||||
static void read_tcp_data(ares_channel channel, fd_set *read_fds,
|
||||
ares_socket_t read_fd, time_t now);
|
||||
static void read_udp_packets(ares_channel channel, fd_set *read_fds,
|
||||
time_t now);
|
||||
ares_socket_t read_fd, time_t now);
|
||||
static void process_timeouts(ares_channel channel, time_t now);
|
||||
static void process_answer(ares_channel channel, unsigned char *abuf,
|
||||
int alen, int whichserver, int tcp, int now);
|
||||
int alen, int whichserver, int tcp, time_t now);
|
||||
static void handle_error(ares_channel channel, int whichserver, time_t now);
|
||||
static struct query *next_server(ares_channel channel, struct query *query, time_t now);
|
||||
static int open_tcp_socket(ares_channel channel, struct server_state *server);
|
||||
@@ -91,13 +81,31 @@ void ares_process(ares_channel channel, fd_set *read_fds, fd_set *write_fds)
|
||||
time_t now;
|
||||
|
||||
time(&now);
|
||||
write_tcp_data(channel, write_fds, now);
|
||||
read_tcp_data(channel, read_fds, now);
|
||||
read_udp_packets(channel, read_fds, now);
|
||||
write_tcp_data(channel, write_fds, ARES_SOCKET_BAD, now);
|
||||
read_tcp_data(channel, read_fds, ARES_SOCKET_BAD, now);
|
||||
read_udp_packets(channel, read_fds, ARES_SOCKET_BAD, now);
|
||||
process_timeouts(channel, now);
|
||||
}
|
||||
|
||||
/* Return 1 if the specified errno describes a readiness error, or 0
|
||||
/* Something interesting happened on the wire, or there was a timeout.
|
||||
* See what's up and respond accordingly.
|
||||
*/
|
||||
void ares_process_fd(ares_channel channel,
|
||||
ares_socket_t read_fd, /* use ARES_SOCKET_BAD or valid
|
||||
file descriptors */
|
||||
ares_socket_t write_fd)
|
||||
{
|
||||
time_t now;
|
||||
|
||||
time(&now);
|
||||
write_tcp_data(channel, NULL, write_fd, now);
|
||||
read_tcp_data(channel, NULL, read_fd, now);
|
||||
read_udp_packets(channel, NULL, read_fd, now);
|
||||
process_timeouts(channel, now);
|
||||
}
|
||||
|
||||
|
||||
/* Return 1 if the specified error number describes a readiness error, or 0
|
||||
* otherwise. This is mostly for HP-UX, which could return EAGAIN or
|
||||
* EWOULDBLOCK. See this man page
|
||||
*
|
||||
@@ -125,7 +133,10 @@ static int try_again(int errnum)
|
||||
/* If any TCP sockets select true for writing, write out queued data
|
||||
* we have for them.
|
||||
*/
|
||||
static void write_tcp_data(ares_channel channel, fd_set *write_fds, time_t now)
|
||||
static void write_tcp_data(ares_channel channel,
|
||||
fd_set *write_fds,
|
||||
ares_socket_t write_fd,
|
||||
time_t now)
|
||||
{
|
||||
struct server_state *server;
|
||||
struct send_request *sendreq;
|
||||
@@ -135,14 +146,27 @@ static void write_tcp_data(ares_channel channel, fd_set *write_fds, time_t now)
|
||||
ssize_t wcount;
|
||||
size_t n;
|
||||
|
||||
if(!write_fds && (write_fd == ARES_SOCKET_BAD))
|
||||
/* no possible action */
|
||||
return;
|
||||
|
||||
for (i = 0; i < channel->nservers; i++)
|
||||
{
|
||||
/* Make sure server has data to send and is selected in write_fds. */
|
||||
/* Make sure server has data to send and is selected in write_fds or
|
||||
write_fd. */
|
||||
server = &channel->servers[i];
|
||||
if (!server->qhead || server->tcp_socket == ARES_SOCKET_BAD
|
||||
|| !FD_ISSET(server->tcp_socket, write_fds))
|
||||
if (!server->qhead || server->tcp_socket == ARES_SOCKET_BAD)
|
||||
continue;
|
||||
|
||||
if(write_fds) {
|
||||
if(!FD_ISSET(server->tcp_socket, write_fds))
|
||||
continue;
|
||||
}
|
||||
else {
|
||||
if(server->tcp_socket != write_fd)
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Count the number of send queue items. */
|
||||
n = 0;
|
||||
for (sendreq = server->qhead; sendreq; sendreq = sendreq->next)
|
||||
@@ -160,11 +184,11 @@ static void write_tcp_data(ares_channel channel, fd_set *write_fds, time_t now)
|
||||
vec[n].iov_len = sendreq->len;
|
||||
n++;
|
||||
}
|
||||
wcount = (ssize_t)writev(server->tcp_socket, vec, n);
|
||||
wcount = (ssize_t)writev(server->tcp_socket, vec, (int)n);
|
||||
free(vec);
|
||||
if (wcount < 0)
|
||||
{
|
||||
if (!try_again(GET_ERRNO()))
|
||||
if (!try_again(SOCKERRNO))
|
||||
handle_error(channel, i, now);
|
||||
continue;
|
||||
}
|
||||
@@ -200,7 +224,7 @@ static void write_tcp_data(ares_channel channel, fd_set *write_fds, time_t now)
|
||||
scount = swrite(server->tcp_socket, sendreq->data, sendreq->len);
|
||||
if (scount < 0)
|
||||
{
|
||||
if (!try_again(GET_ERRNO()))
|
||||
if (!try_again(SOCKERRNO))
|
||||
handle_error(channel, i, now);
|
||||
continue;
|
||||
}
|
||||
@@ -229,20 +253,33 @@ static void write_tcp_data(ares_channel channel, fd_set *write_fds, time_t now)
|
||||
* allocate a buffer if we finish reading the length word, and process
|
||||
* a packet if we finish reading one.
|
||||
*/
|
||||
static void read_tcp_data(ares_channel channel, fd_set *read_fds, time_t now)
|
||||
static void read_tcp_data(ares_channel channel, fd_set *read_fds,
|
||||
ares_socket_t read_fd, time_t now)
|
||||
{
|
||||
struct server_state *server;
|
||||
int i;
|
||||
ssize_t count;
|
||||
|
||||
if(!read_fds && (read_fd == ARES_SOCKET_BAD))
|
||||
/* no possible action */
|
||||
return;
|
||||
|
||||
for (i = 0; i < channel->nservers; i++)
|
||||
{
|
||||
/* Make sure the server has a socket and is selected in read_fds. */
|
||||
server = &channel->servers[i];
|
||||
if (server->tcp_socket == ARES_SOCKET_BAD ||
|
||||
!FD_ISSET(server->tcp_socket, read_fds))
|
||||
if (server->tcp_socket == ARES_SOCKET_BAD)
|
||||
continue;
|
||||
|
||||
if(read_fds) {
|
||||
if(!FD_ISSET(server->tcp_socket, read_fds))
|
||||
continue;
|
||||
}
|
||||
else {
|
||||
if(server->tcp_socket != read_fd)
|
||||
continue;
|
||||
}
|
||||
|
||||
if (server->tcp_lenbuf_pos != 2)
|
||||
{
|
||||
/* We haven't yet read a length word, so read that (or
|
||||
@@ -253,7 +290,7 @@ static void read_tcp_data(ares_channel channel, fd_set *read_fds, time_t now)
|
||||
2 - server->tcp_lenbuf_pos);
|
||||
if (count <= 0)
|
||||
{
|
||||
if (!(count == -1 && try_again(GET_ERRNO())))
|
||||
if (!(count == -1 && try_again(SOCKERRNO)))
|
||||
handle_error(channel, i, now);
|
||||
continue;
|
||||
}
|
||||
@@ -280,7 +317,7 @@ static void read_tcp_data(ares_channel channel, fd_set *read_fds, time_t now)
|
||||
server->tcp_length - server->tcp_buffer_pos);
|
||||
if (count <= 0)
|
||||
{
|
||||
if (!(count == -1 && try_again(GET_ERRNO())))
|
||||
if (!(count == -1 && try_again(SOCKERRNO)))
|
||||
handle_error(channel, i, now);
|
||||
continue;
|
||||
}
|
||||
@@ -297,6 +334,7 @@ static void read_tcp_data(ares_channel channel, fd_set *read_fds, time_t now)
|
||||
free(server->tcp_buffer);
|
||||
server->tcp_buffer = NULL;
|
||||
server->tcp_lenbuf_pos = 0;
|
||||
server->tcp_buffer_pos = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -304,24 +342,36 @@ static void read_tcp_data(ares_channel channel, fd_set *read_fds, time_t now)
|
||||
|
||||
/* If any UDP sockets select true for reading, process them. */
|
||||
static void read_udp_packets(ares_channel channel, fd_set *read_fds,
|
||||
time_t now)
|
||||
ares_socket_t read_fd, time_t now)
|
||||
{
|
||||
struct server_state *server;
|
||||
int i;
|
||||
ssize_t count;
|
||||
unsigned char buf[PACKETSZ + 1];
|
||||
|
||||
if(!read_fds && (read_fd == ARES_SOCKET_BAD))
|
||||
/* no possible action */
|
||||
return;
|
||||
|
||||
for (i = 0; i < channel->nservers; i++)
|
||||
{
|
||||
/* Make sure the server has a socket and is selected in read_fds. */
|
||||
server = &channel->servers[i];
|
||||
|
||||
if (server->udp_socket == ARES_SOCKET_BAD ||
|
||||
!FD_ISSET(server->udp_socket, read_fds))
|
||||
if (server->udp_socket == ARES_SOCKET_BAD)
|
||||
continue;
|
||||
|
||||
if(read_fds) {
|
||||
if(!FD_ISSET(server->udp_socket, read_fds))
|
||||
continue;
|
||||
}
|
||||
else {
|
||||
if(server->udp_socket != read_fd)
|
||||
continue;
|
||||
}
|
||||
|
||||
count = sread(server->udp_socket, buf, sizeof(buf));
|
||||
if (count == -1 && try_again(GET_ERRNO()))
|
||||
if (count == -1 && try_again(SOCKERRNO))
|
||||
continue;
|
||||
else if (count <= 0)
|
||||
handle_error(channel, i, now);
|
||||
@@ -348,7 +398,7 @@ static void process_timeouts(ares_channel channel, time_t now)
|
||||
|
||||
/* Handle an answer from a server. */
|
||||
static void process_answer(ares_channel channel, unsigned char *abuf,
|
||||
int alen, int whichserver, int tcp, int now)
|
||||
int alen, int whichserver, int tcp, time_t now)
|
||||
{
|
||||
int id, tc, rcode;
|
||||
struct query *query;
|
||||
@@ -537,7 +587,7 @@ static int nonblock(ares_socket_t sockfd, /* operate on this */
|
||||
int flags;
|
||||
|
||||
flags = fcntl(sockfd, F_GETFL, 0);
|
||||
if (TRUE == nonblock)
|
||||
if (FALSE != nonblock)
|
||||
return fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);
|
||||
else
|
||||
return fcntl(sockfd, F_SETFL, flags & (~O_NONBLOCK));
|
||||
@@ -556,8 +606,12 @@ static int nonblock(ares_socket_t sockfd, /* operate on this */
|
||||
#endif
|
||||
|
||||
#if defined(HAVE_IOCTLSOCKET) && (SETBLOCK == 0)
|
||||
#ifdef WATT32
|
||||
char flags;
|
||||
#else
|
||||
/* Windows? */
|
||||
unsigned long flags;
|
||||
#endif
|
||||
flags = nonblock;
|
||||
|
||||
return ioctlsocket(sockfd, FIONBIO, &flags);
|
||||
@@ -608,9 +662,9 @@ static int open_tcp_socket(ares_channel channel, struct server_state *server)
|
||||
memset(&sockin, 0, sizeof(sockin));
|
||||
sockin.sin_family = AF_INET;
|
||||
sockin.sin_addr = server->addr;
|
||||
sockin.sin_port = channel->tcp_port;
|
||||
sockin.sin_port = (unsigned short)(channel->tcp_port & 0xffff);
|
||||
if (connect(s, (struct sockaddr *) &sockin, sizeof(sockin)) == -1) {
|
||||
int err = GET_ERRNO();
|
||||
int err = SOCKERRNO;
|
||||
|
||||
if (err != EINPROGRESS && err != EWOULDBLOCK) {
|
||||
closesocket(s);
|
||||
@@ -641,7 +695,7 @@ static int open_udp_socket(ares_channel channel, struct server_state *server)
|
||||
memset(&sockin, 0, sizeof(sockin));
|
||||
sockin.sin_family = AF_INET;
|
||||
sockin.sin_addr = server->addr;
|
||||
sockin.sin_port = channel->udp_port;
|
||||
sockin.sin_port = (unsigned short)(channel->udp_port & 0xffff);
|
||||
if (connect(s, (struct sockaddr *) &sockin, sizeof(sockin)) == -1)
|
||||
{
|
||||
closesocket(s);
|
||||
|
@@ -16,7 +16,6 @@
|
||||
*/
|
||||
|
||||
#include "setup.h"
|
||||
#include <sys/types.h>
|
||||
|
||||
#if defined(WIN32) && !defined(WATT32)
|
||||
#include "nameser.h"
|
||||
@@ -40,6 +39,64 @@ struct qquery {
|
||||
|
||||
static void qcallback(void *arg, int status, unsigned char *abuf, int alen);
|
||||
|
||||
void ares__rc4(rc4_key* key, unsigned char *buffer_ptr, int buffer_len)
|
||||
{
|
||||
unsigned char x;
|
||||
unsigned char y;
|
||||
unsigned char* state;
|
||||
unsigned char xorIndex;
|
||||
short counter;
|
||||
|
||||
x = key->x;
|
||||
y = key->y;
|
||||
|
||||
state = &key->state[0];
|
||||
for(counter = 0; counter < buffer_len; counter ++)
|
||||
{
|
||||
x = (x + 1) % 256;
|
||||
y = (state[x] + y) % 256;
|
||||
ARES_SWAP_BYTE(&state[x], &state[y]);
|
||||
|
||||
xorIndex = (state[x] + state[y]) % 256;
|
||||
|
||||
buffer_ptr[counter] ^= state[xorIndex];
|
||||
}
|
||||
key->x = x;
|
||||
key->y = y;
|
||||
}
|
||||
|
||||
static struct query* find_query_by_id(ares_channel channel, int id)
|
||||
{
|
||||
int qid;
|
||||
struct query* q;
|
||||
DNS_HEADER_SET_QID(((unsigned char*)&qid), id);
|
||||
|
||||
/* Find the query corresponding to this packet. */
|
||||
for (q = channel->queries; q; q = q->next)
|
||||
{
|
||||
if (q->qid == qid)
|
||||
return q;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
/* a unique query id is generated using an rc4 key. Since the id may already
|
||||
be used by a running query (as infrequent as it may be), a lookup is
|
||||
performed per id generation. In practice this search should happen only
|
||||
once per newly generated id
|
||||
*/
|
||||
static int generate_unique_id(ares_channel channel)
|
||||
{
|
||||
int id;
|
||||
|
||||
do {
|
||||
id = ares__generate_new_id(&channel->id_key);
|
||||
} while (find_query_by_id(channel,id));
|
||||
|
||||
return id;
|
||||
}
|
||||
|
||||
void ares_query(ares_channel channel, const char *name, int dnsclass,
|
||||
int type, ares_callback callback, void *arg)
|
||||
{
|
||||
@@ -51,13 +108,14 @@ void ares_query(ares_channel channel, const char *name, int dnsclass,
|
||||
rd = !(channel->flags & ARES_FLAG_NORECURSE);
|
||||
status = ares_mkquery(name, dnsclass, type, channel->next_id, rd, &qbuf,
|
||||
&qlen);
|
||||
channel->next_id++;
|
||||
if (status != ARES_SUCCESS)
|
||||
{
|
||||
callback(arg, status, NULL, 0);
|
||||
return;
|
||||
}
|
||||
|
||||
channel->next_id = generate_unique_id(channel);
|
||||
|
||||
/* Allocate and fill in the query structure. */
|
||||
qquery = malloc(sizeof(struct qquery));
|
||||
if (!qquery)
|
||||
|
49
ares/ares_save_options.3
Normal file
49
ares/ares_save_options.3
Normal file
@@ -0,0 +1,49 @@
|
||||
.\" $Id$
|
||||
.\"
|
||||
.\" 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_SAVE_OPTIONS 3 "1 June 2007"
|
||||
.SH NAME
|
||||
ares_save_options \- Save configuration values obtained from initialized ares_channel
|
||||
.SH SYNOPSIS
|
||||
.nf
|
||||
.B #include <ares.h>
|
||||
.PP
|
||||
.B void ares_save_options(ares_channel \fIchannel\fP, struct ares_options *\fIoptions\fP, int *\fIoptmask\fP)
|
||||
.fi
|
||||
.SH DESCRIPTION
|
||||
The
|
||||
.B ares_save_options
|
||||
function saves the channel data identified by
|
||||
.IR channel ,
|
||||
into the options struct identified by
|
||||
.IR options ,
|
||||
and saves the mask of options which are set to the integer
|
||||
pointer (passed by reference) identified by
|
||||
.IR optmask .
|
||||
|
||||
The resultant options and optmask are then able to be
|
||||
passed directly to ares_init_options. When the options
|
||||
are no longer needed, ares_destroy_options should be called
|
||||
to free any associated memory.
|
||||
|
||||
|
||||
.SH SEE ALSO
|
||||
.BR ares_destroy_options (3),
|
||||
.BR ares_init_options (3)
|
||||
.SH AUTHOR
|
||||
Brad House
|
||||
.br
|
||||
Copyright 1998 by the Massachusetts Institute of Technology.
|
@@ -20,6 +20,7 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
#include <errno.h>
|
||||
|
||||
#if defined(WIN32) && !defined(WATT32)
|
||||
#include "nameser.h"
|
||||
@@ -216,6 +217,7 @@ static int single_domain(ares_channel channel, const char *name, char **s)
|
||||
char *line = NULL;
|
||||
int linesize, status;
|
||||
const char *p, *q;
|
||||
int error;
|
||||
|
||||
/* If the name contains a trailing dot, then the single query is the name
|
||||
* sans the trailing dot.
|
||||
@@ -239,15 +241,15 @@ static int single_domain(ares_channel channel, const char *name, char **s)
|
||||
== ARES_SUCCESS)
|
||||
{
|
||||
if (strncasecmp(line, name, len) != 0 ||
|
||||
!isspace((unsigned char)line[len]))
|
||||
!ISSPACE(line[len]))
|
||||
continue;
|
||||
p = line + len;
|
||||
while (isspace((unsigned char)*p))
|
||||
while (ISSPACE(*p))
|
||||
p++;
|
||||
if (*p)
|
||||
{
|
||||
q = p + 1;
|
||||
while (*q && !isspace((unsigned char)*q))
|
||||
while (*q && !ISSPACE(*q))
|
||||
q++;
|
||||
*s = malloc(q - p + 1);
|
||||
if (*s)
|
||||
@@ -265,6 +267,23 @@ static int single_domain(ares_channel channel, const char *name, char **s)
|
||||
if (status != ARES_SUCCESS)
|
||||
return status;
|
||||
}
|
||||
else
|
||||
{
|
||||
error = ERRNO;
|
||||
switch(error)
|
||||
{
|
||||
case ENOENT:
|
||||
case ESRCH:
|
||||
break;
|
||||
default:
|
||||
DEBUGF(fprintf(stderr, "fopen() failed with error: %d %s\n",
|
||||
error, strerror(error)));
|
||||
DEBUGF(fprintf(stderr, "Error opening file: %s\n",
|
||||
hostaliases));
|
||||
*s = NULL;
|
||||
return ARES_EFILE;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -16,7 +16,6 @@
|
||||
*/
|
||||
|
||||
#include "setup.h"
|
||||
#include <sys/types.h>
|
||||
|
||||
#if defined(WIN32) && !defined(WATT32)
|
||||
#include "nameser.h"
|
||||
@@ -73,14 +72,14 @@ void ares_send(ares_channel channel, const unsigned char *qbuf, int qlen,
|
||||
}
|
||||
|
||||
/* Compute the query ID. Start with no timeout. */
|
||||
query->qid = DNS_HEADER_QID(qbuf);
|
||||
query->qid = (unsigned short)DNS_HEADER_QID(qbuf);
|
||||
query->timeout = 0;
|
||||
|
||||
/* Form the TCP query buffer by prepending qlen (as two
|
||||
* network-order bytes) to qbuf.
|
||||
*/
|
||||
query->tcpbuf[0] = (qlen >> 8) & 0xff;
|
||||
query->tcpbuf[1] = qlen & 0xff;
|
||||
query->tcpbuf[0] = (unsigned char)((qlen >> 8) & 0xff);
|
||||
query->tcpbuf[1] = (unsigned char)(qlen & 0xff);
|
||||
memcpy(query->tcpbuf + 2, qbuf, qlen);
|
||||
query->tcplen = qlen + 2;
|
||||
|
||||
|
@@ -41,9 +41,11 @@ const char *ares_strerror(int code)
|
||||
"Out of memory",
|
||||
"Channel is being destroyed",
|
||||
"Misformatted string",
|
||||
"Illegal flags specified"
|
||||
"Illegal flags specified",
|
||||
"Given hostname is not numeric",
|
||||
"Illegal hints flags specified"
|
||||
};
|
||||
|
||||
assert(code >= 0 && code < (int)(sizeof(errtext) / sizeof(*errtext)));
|
||||
DEBUGASSERT(code >= 0 && code < (int)(sizeof(errtext) / sizeof(*errtext)));
|
||||
return errtext[code];
|
||||
}
|
||||
|
@@ -16,7 +16,6 @@
|
||||
*/
|
||||
|
||||
#include "setup.h"
|
||||
#include <sys/types.h>
|
||||
|
||||
#ifdef HAVE_SYS_TIME_H
|
||||
#include <sys/time.h>
|
||||
@@ -32,7 +31,8 @@ struct timeval *ares_timeout(ares_channel channel, struct timeval *maxtv,
|
||||
{
|
||||
struct query *query;
|
||||
time_t now;
|
||||
int offset, min_offset;
|
||||
time_t offset, min_offset; /* these use time_t since some 32 bit systems
|
||||
still use 64 bit time_t! (like VS2005) */
|
||||
|
||||
/* No queries, no timeout (and no fetch of the current time). */
|
||||
if (!channel->queries)
|
||||
@@ -58,7 +58,7 @@ struct timeval *ares_timeout(ares_channel channel, struct timeval *maxtv,
|
||||
*/
|
||||
if (min_offset != -1 && (!maxtv || min_offset <= maxtv->tv_sec))
|
||||
{
|
||||
tvbuf->tv_sec = min_offset;
|
||||
tvbuf->tv_sec = (long)min_offset;
|
||||
tvbuf->tv_usec = 0;
|
||||
return tvbuf;
|
||||
}
|
||||
|
@@ -4,14 +4,22 @@
|
||||
#define ARES__VERSION_H
|
||||
|
||||
#define ARES_VERSION_MAJOR 1
|
||||
#define ARES_VERSION_MINOR 3
|
||||
#define ARES_VERSION_MINOR 4
|
||||
#define ARES_VERSION_PATCH 1
|
||||
#define ARES_VERSION ((ARES_VERSION_MAJOR<<16)|\
|
||||
(ARES_VERSION_MINOR<<8)|\
|
||||
(ARES_VERSION_PATCH))
|
||||
#define ARES_VERSION_STR "1.3.1"
|
||||
#define ARES_VERSION_STR "1.4.1-CVS"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
const char *ares_version(int *version);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
|
@@ -19,9 +19,7 @@
|
||||
|
||||
#ifndef HAVE_BITNCMP
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include "setup.h"
|
||||
#include "bitncmp.h"
|
||||
|
||||
/*
|
||||
|
@@ -3,7 +3,7 @@
|
||||
|
||||
/* $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
|
||||
* 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
|
||||
#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. */
|
||||
#if defined(__MINGW32__) || defined(__WATCOMC__) || defined(__LCC__) || \
|
||||
defined(__POCC__)
|
||||
@@ -47,6 +59,19 @@
|
||||
/* Define if you have the <ws2tcpip.h> header file. */
|
||||
#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 */
|
||||
/* ---------------------------------------------------------------- */
|
||||
@@ -54,24 +79,6 @@
|
||||
/* Define if you have the ioctlsocket function. */
|
||||
#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 HAVE_RECV 1
|
||||
|
||||
@@ -111,6 +118,39 @@
|
||||
/* Define to the function return type for send. */
|
||||
#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 */
|
||||
/* ---------------------------------------------------------------- */
|
||||
@@ -121,6 +161,9 @@
|
||||
/* Define this if you have struct sockaddr_storage */
|
||||
#define HAVE_STRUCT_SOCKADDR_STORAGE 1
|
||||
|
||||
/* Define this if you have struct timeval */
|
||||
#define HAVE_STRUCT_TIMEVAL 1
|
||||
|
||||
/* ---------------------------------------------------------------- */
|
||||
/* IPV6 COMPATIBILITY */
|
||||
/* ---------------------------------------------------------------- */
|
||||
|
@@ -7,6 +7,15 @@ AM_CONFIG_HEADER(config.h)
|
||||
AM_MAINTAINER_MODE
|
||||
AM_INIT_AUTOMAKE(c-ares, CVS)
|
||||
|
||||
dnl
|
||||
dnl Detect the canonical host and target build environment
|
||||
dnl
|
||||
|
||||
AC_CANONICAL_HOST
|
||||
dnl Get system canonical name
|
||||
AC_DEFINE_UNQUOTED(OS, "${host}", [cpu-machine-OS])
|
||||
|
||||
AC_AIX
|
||||
AC_PROG_CC
|
||||
AC_PROG_INSTALL
|
||||
|
||||
@@ -16,6 +25,7 @@ solaris*)
|
||||
;;
|
||||
esac
|
||||
|
||||
dnl support building of Windows DLLs
|
||||
AC_LIBTOOL_WIN32_DLL
|
||||
|
||||
dnl ************************************************************
|
||||
@@ -61,8 +71,31 @@ AC_HELP_STRING([--disable-debug],[Disable debug options]),
|
||||
AC_MSG_RESULT(no)
|
||||
)
|
||||
|
||||
dnl skip libtool C++ and Fortran compiler checks
|
||||
m4_ifdef([AC_PROG_CXX], [m4_undefine([AC_PROG_CXX])])
|
||||
m4_defun([AC_PROG_CXX],[])
|
||||
m4_ifdef([AC_PROG_F77], [m4_undefine([AC_PROG_F77])])
|
||||
m4_defun([AC_PROG_F77],[])
|
||||
|
||||
dnl skip libtool C++ and Fortran linker checks
|
||||
m4_ifdef([AC_LIBTOOL_CXX], [m4_undefine([AC_LIBTOOL_CXX])])
|
||||
m4_defun([AC_LIBTOOL_CXX],[])
|
||||
m4_ifdef([AC_LIBTOOL_F77], [m4_undefine([AC_LIBTOOL_F77])])
|
||||
m4_defun([AC_LIBTOOL_F77],[])
|
||||
|
||||
dnl force libtool to build static libraries with PIC on AMD64-linux
|
||||
AC_MSG_CHECKING([if arch-OS host is AMD64-linux (to build static libraries with PIC)])
|
||||
case $host in
|
||||
x86_64*linux*)
|
||||
AC_MSG_RESULT([yes])
|
||||
with_pic=yes
|
||||
;;
|
||||
*)
|
||||
AC_MSG_RESULT([no])
|
||||
;;
|
||||
esac
|
||||
|
||||
dnl libtool setup
|
||||
CARES_CLEAR_LIBTOOL_TAGS
|
||||
AC_PROG_LIBTOOL
|
||||
|
||||
AC_MSG_CHECKING([if we need -no-undefined])
|
||||
@@ -77,6 +110,13 @@ esac
|
||||
AC_MSG_RESULT($need_no_undefined)
|
||||
AM_CONDITIONAL(NO_UNDEFINED, test x$need_no_undefined = xyes)
|
||||
|
||||
dnl **********************************************************************
|
||||
dnl check if this is the Intel ICC compiler, and if so make it stricter
|
||||
dnl (convert warning 147 into an error) so that it properly can detect the
|
||||
dnl gethostbyname_r() version
|
||||
dnl **********************************************************************
|
||||
CURL_DETECT_ICC([CFLAGS="$CFLAGS -we 147"])
|
||||
|
||||
dnl **********************************************************************
|
||||
dnl Checks for libraries.
|
||||
dnl **********************************************************************
|
||||
@@ -198,6 +238,77 @@ AC_HELP_STRING([--enable-libgcc],[use libgcc when linking]),
|
||||
AC_MSG_RESULT(no)
|
||||
)
|
||||
|
||||
|
||||
dnl Default is to try the thread-safe versions of a few functions
|
||||
OPT_THREAD=on
|
||||
|
||||
dnl detect AIX 4.3 or later
|
||||
AC_MSG_CHECKING([AIX 4.3 or later])
|
||||
AC_PREPROC_IFELSE([
|
||||
#if defined(_AIX) && defined(_AIX43)
|
||||
printf("just fine");
|
||||
#else
|
||||
#error "this is not AIX 4.3 or later"
|
||||
#endif
|
||||
],
|
||||
[ AC_MSG_RESULT([yes])
|
||||
RECENTAIX=yes
|
||||
OPT_THREAD=off ],
|
||||
[ AC_MSG_RESULT([no]) ]
|
||||
)
|
||||
|
||||
AC_ARG_ENABLE(thread,dnl
|
||||
AC_HELP_STRING([--disable-thread],[don't look for thread-safe functions])
|
||||
AC_HELP_STRING([--enable-thread],[look for thread-safe functions]),
|
||||
[ case "$enableval" in
|
||||
no)
|
||||
OPT_THREAD=off
|
||||
AC_MSG_WARN(c-ares will not get built using thread-safe functions)
|
||||
;;
|
||||
*)
|
||||
;;
|
||||
esac
|
||||
]
|
||||
)
|
||||
|
||||
if test X"$OPT_THREAD" = Xoff
|
||||
then
|
||||
AC_DEFINE(DISABLED_THREADSAFE, 1,
|
||||
[Set to explicitly specify we don't want to use thread-safe functions])
|
||||
fi
|
||||
|
||||
dnl for recent AIX versions, we skip all the thread-safe checks above since
|
||||
dnl they claim a thread-safe libc using the standard API. But there are
|
||||
dnl some functions still not thread-safe. Check for these!
|
||||
|
||||
dnl Let's hope this split URL remains working:
|
||||
dnl http://publibn.boulder.ibm.com/doc_link/en_US/a_doc_lib/aixprggd/ \
|
||||
dnl genprogc/thread_quick_ref.htm
|
||||
|
||||
if test "x$RECENTAIX" = "xyes"; then
|
||||
|
||||
AC_DEFINE(_THREAD_SAFE, 1, [define this if you need it to compile thread-safe code])
|
||||
|
||||
dnl check if this is the IBM xlc compiler
|
||||
dnl Details thanks to => http://predef.sourceforge.net/
|
||||
AC_MSG_CHECKING([if this is the xlc compiler])
|
||||
AC_EGREP_CPP([^__xlC__], [__xlC__],
|
||||
dnl action if the text is found, this it has not been replaced by the
|
||||
dnl cpp
|
||||
XLC="no"
|
||||
AC_MSG_RESULT([no]),
|
||||
dnl the text was not found, it was replaced by the cpp
|
||||
XLC="yes"
|
||||
AC_MSG_RESULT([yes])
|
||||
CFLAGS="$CFLAGS -qthreaded"
|
||||
dnl AIX xlc has to have strict aliasing turned off. If not,
|
||||
dnl the optimizer assumes that pointers can only point to
|
||||
dnl an object of the same type.
|
||||
CFLAGS="$CFLAGS -qnoansialias"
|
||||
)
|
||||
fi
|
||||
|
||||
|
||||
dnl **********************************************************************
|
||||
dnl Back to "normal" configuring
|
||||
dnl **********************************************************************
|
||||
@@ -229,6 +340,8 @@ AC_CHECK_HEADERS(
|
||||
netdb.h \
|
||||
netinet/in.h \
|
||||
net/if.h \
|
||||
errno.h \
|
||||
stdbool.h \
|
||||
arpa/nameser.h \
|
||||
arpa/nameser_compat.h \
|
||||
arpa/inet.h,
|
||||
@@ -265,6 +378,7 @@ dnl Checks for typedefs, structures, and compiler characteristics.
|
||||
AC_C_CONST
|
||||
AC_TYPE_SIZE_T
|
||||
AC_HEADER_TIME
|
||||
CURL_CHECK_STRUCT_TIMEVAL
|
||||
|
||||
AC_CHECK_SIZEOF(size_t)
|
||||
AC_CHECK_SIZEOF(long)
|
||||
@@ -289,6 +403,19 @@ fi
|
||||
AC_CHECK_TYPE(ssize_t, ,
|
||||
AC_DEFINE(ssize_t, int, [the signed version of size_t]))
|
||||
|
||||
# check for bool type
|
||||
AC_CHECK_TYPE([bool],[
|
||||
AC_DEFINE(HAVE_BOOL_T, 1,
|
||||
[Define to 1 if bool is an available type.])
|
||||
], ,[
|
||||
#ifdef HAVE_SYS_TYPES_H
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
#ifdef HAVE_STDBOOL_H
|
||||
#include <stdbool.h>
|
||||
#endif
|
||||
])
|
||||
|
||||
# Check for socklen_t or equivalent
|
||||
CURL_CHECK_TYPE_SOCKLEN_T
|
||||
|
||||
@@ -296,6 +423,10 @@ TYPE_IN_ADDR_T
|
||||
|
||||
TYPE_SOCKADDR_STORAGE
|
||||
|
||||
TYPE_SIG_ATOMIC_T
|
||||
|
||||
AC_TYPE_SIGNAL
|
||||
|
||||
CURL_CHECK_FUNC_RECV
|
||||
|
||||
CURL_CHECK_FUNC_SEND
|
||||
@@ -654,4 +785,20 @@ AC_C_BIGENDIAN(
|
||||
[AC_MSG_WARN([couldn't figure out endianess, assuming little endian!])]
|
||||
)
|
||||
|
||||
dnl Check for user-specified random device
|
||||
AC_ARG_WITH(random,
|
||||
AC_HELP_STRING([--with-random=FILE],
|
||||
[read randomness from FILE (default=/dev/urandom)]),
|
||||
[ RANDOM_FILE="$withval" ],
|
||||
[
|
||||
dnl Check for random device
|
||||
AC_CHECK_FILE("/dev/urandom", [ RANDOM_FILE="/dev/urandom"] )
|
||||
]
|
||||
)
|
||||
if test -n "$RANDOM_FILE" && test X"$RANDOM_FILE" != Xno ; then
|
||||
AC_SUBST(RANDOM_FILE)
|
||||
AC_DEFINE_UNQUOTED(RANDOM_FILE, "$RANDOM_FILE",
|
||||
[a suitable file/device to read random data from])
|
||||
fi
|
||||
|
||||
AC_OUTPUT(Makefile)
|
||||
|
@@ -19,9 +19,6 @@
|
||||
|
||||
#include "setup.h"
|
||||
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
#if defined(WIN32) && !defined(WATT32)
|
||||
#include "nameser.h"
|
||||
#else
|
||||
@@ -66,6 +63,11 @@
|
||||
* note:
|
||||
* network byte order assumed. this means 192.5.5.240/28 has
|
||||
* 0b11110000 in its fourth octet.
|
||||
* note:
|
||||
* On Windows we store the error in the thread errno, not
|
||||
* in the winsock error code. This is to avoid loosing the
|
||||
* actual last winsock error. So use macro ERRNO to fetch the
|
||||
* errno this funtion sets when returning (-1), not SOCKERRNO.
|
||||
* author:
|
||||
* Paul Vixie (ISC), June 1996
|
||||
*/
|
||||
@@ -79,15 +81,14 @@ inet_net_pton_ipv4(const char *src, unsigned char *dst, size_t size)
|
||||
|
||||
ch = *src++;
|
||||
if (ch == '0' && (src[0] == 'x' || src[0] == 'X')
|
||||
&& isascii((unsigned char)(src[1]))
|
||||
&& isxdigit((unsigned char)(src[1]))) {
|
||||
&& ISXDIGIT(src[1])) {
|
||||
/* Hexadecimal: Eat nybble string. */
|
||||
if (size <= 0U)
|
||||
goto emsgsize;
|
||||
dirty = 0;
|
||||
src++; /* skip x or X. */
|
||||
while ((ch = *src++) != '\0' && isascii(ch) && isxdigit(ch)) {
|
||||
if (isupper(ch))
|
||||
while ((ch = *src++) != '\0' && ISXDIGIT(ch)) {
|
||||
if (ISUPPER(ch))
|
||||
ch = tolower(ch);
|
||||
n = (int)(strchr(xdigits, ch) - xdigits);
|
||||
if (dirty == 0)
|
||||
@@ -106,7 +107,7 @@ inet_net_pton_ipv4(const char *src, unsigned char *dst, size_t size)
|
||||
goto emsgsize;
|
||||
*dst++ = (unsigned char) (tmp << 4);
|
||||
}
|
||||
} else if (isascii(ch) && isdigit(ch)) {
|
||||
} else if (ISDIGIT(ch)) {
|
||||
/* Decimal: eat dotted digit string. */
|
||||
for (;;) {
|
||||
tmp = 0;
|
||||
@@ -117,7 +118,7 @@ inet_net_pton_ipv4(const char *src, unsigned char *dst, size_t size)
|
||||
if (tmp > 255)
|
||||
goto enoent;
|
||||
} while ((ch = *src++) != '\0' &&
|
||||
isascii(ch) && isdigit(ch));
|
||||
ISDIGIT(ch));
|
||||
if (size-- <= 0U)
|
||||
goto emsgsize;
|
||||
*dst++ = (unsigned char) tmp;
|
||||
@@ -126,15 +127,15 @@ inet_net_pton_ipv4(const char *src, unsigned char *dst, size_t size)
|
||||
if (ch != '.')
|
||||
goto enoent;
|
||||
ch = *src++;
|
||||
if (!isascii(ch) || !isdigit(ch))
|
||||
if (!ISDIGIT(ch))
|
||||
goto enoent;
|
||||
}
|
||||
} else
|
||||
goto enoent;
|
||||
|
||||
bits = -1;
|
||||
if (ch == '/' && isascii((unsigned char)(src[0])) &&
|
||||
isdigit((unsigned char)(src[0])) && dst > odst) {
|
||||
if (ch == '/' &&
|
||||
ISDIGIT(src[0]) && dst > odst) {
|
||||
/* CIDR width specifier. Nothing can follow it. */
|
||||
ch = *src++; /* Skip over the /. */
|
||||
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);
|
||||
bits *= 10;
|
||||
bits += n;
|
||||
} while ((ch = *src++) != '\0' && isascii(ch) && isdigit(ch));
|
||||
} while ((ch = *src++) != '\0' && ISDIGIT(ch));
|
||||
if (ch != '\0')
|
||||
goto enoent;
|
||||
if (bits > 32)
|
||||
@@ -187,11 +188,11 @@ inet_net_pton_ipv4(const char *src, unsigned char *dst, size_t size)
|
||||
return (bits);
|
||||
|
||||
enoent:
|
||||
errno = ENOENT;
|
||||
SET_ERRNO(ENOENT);
|
||||
return (-1);
|
||||
|
||||
emsgsize:
|
||||
errno = EMSGSIZE;
|
||||
SET_ERRNO(EMSGSIZE);
|
||||
return (-1);
|
||||
}
|
||||
|
||||
@@ -253,7 +254,7 @@ getv4(const char *src, unsigned char *dst, int *bitsp)
|
||||
if (ch == '.' || ch == '/') {
|
||||
if (dst - odst > 3) /* too many octets? */
|
||||
return (0);
|
||||
*dst++ = val;
|
||||
*dst++ = (unsigned char)val;
|
||||
if (ch == '/')
|
||||
return (getbits(src, bitsp));
|
||||
val = 0;
|
||||
@@ -266,7 +267,7 @@ getv4(const char *src, unsigned char *dst, int *bitsp)
|
||||
return (0);
|
||||
if (dst - odst > 3) /* too many octets? */
|
||||
return (0);
|
||||
*dst++ = val;
|
||||
*dst++ = (unsigned char)val;
|
||||
return (1);
|
||||
}
|
||||
|
||||
@@ -322,8 +323,8 @@ inet_net_pton_ipv6(const char *src, unsigned char *dst, size_t size)
|
||||
goto enoent;
|
||||
if (tp + NS_INT16SZ > endp)
|
||||
return (0);
|
||||
*tp++ = (unsigned char) (val >> 8) & 0xff;
|
||||
*tp++ = (unsigned char) val & 0xff;
|
||||
*tp++ = (unsigned char)((val >> 8) & 0xff);
|
||||
*tp++ = (unsigned char)(val & 0xff);
|
||||
saw_xdigit = 0;
|
||||
digits = 0;
|
||||
val = 0;
|
||||
@@ -343,8 +344,8 @@ inet_net_pton_ipv6(const char *src, unsigned char *dst, size_t size)
|
||||
if (saw_xdigit) {
|
||||
if (tp + NS_INT16SZ > endp)
|
||||
goto enoent;
|
||||
*tp++ = (unsigned char) (val >> 8) & 0xff;
|
||||
*tp++ = (unsigned char) val & 0xff;
|
||||
*tp++ = (unsigned char)((val >> 8) & 0xff);
|
||||
*tp++ = (unsigned char)(val & 0xff);
|
||||
}
|
||||
if (bits == -1)
|
||||
bits = 128;
|
||||
@@ -382,11 +383,11 @@ inet_net_pton_ipv6(const char *src, unsigned char *dst, size_t size)
|
||||
return (bits);
|
||||
|
||||
enoent:
|
||||
errno = ENOENT;
|
||||
SET_ERRNO(ENOENT);
|
||||
return (-1);
|
||||
|
||||
emsgsize:
|
||||
errno = EMSGSIZE;
|
||||
SET_ERRNO(EMSGSIZE);
|
||||
return (-1);
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
* or -1 if some failure occurred (check errno). ENOENT means it was
|
||||
* not a valid network specification.
|
||||
* note:
|
||||
* On Windows we store the error in the thread errno, not
|
||||
* in the winsock error code. This is to avoid loosing the
|
||||
* actual last winsock error. So use macro ERRNO to fetch the
|
||||
* errno this funtion sets when returning (-1), not SOCKERRNO.
|
||||
* author:
|
||||
* Paul Vixie (ISC), June 1996
|
||||
*/
|
||||
@@ -412,7 +418,7 @@ ares_inet_net_pton(int af, const char *src, void *dst, size_t size)
|
||||
case AF_INET6:
|
||||
return (inet_net_pton_ipv6(src, dst, size));
|
||||
default:
|
||||
errno = EAFNOSUPPORT;
|
||||
SET_ERRNO(EAFNOSUPPORT);
|
||||
return (-1);
|
||||
}
|
||||
}
|
||||
@@ -430,11 +436,11 @@ int ares_inet_pton(int af, const char *src, void *dst)
|
||||
size = sizeof(struct in6_addr);
|
||||
else
|
||||
{
|
||||
errno = EAFNOSUPPORT;
|
||||
SET_ERRNO(EAFNOSUPPORT);
|
||||
return -1;
|
||||
}
|
||||
result = ares_inet_net_pton(af, src, dst, size);
|
||||
if (result == -1 && errno == ENOENT)
|
||||
if (result == -1 && ERRNO == ENOENT)
|
||||
return 0;
|
||||
return (result > -1 ? 1 : -1);
|
||||
}
|
||||
|
@@ -18,8 +18,6 @@
|
||||
|
||||
#include "setup.h"
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
#if defined(WIN32) && !defined(WATT32)
|
||||
#include "nameser.h"
|
||||
#else
|
||||
@@ -68,6 +66,11 @@ static const char *inet_ntop6(const unsigned char *src, char *dst, size_t size);
|
||||
* convert a network format address to presentation format.
|
||||
* return:
|
||||
* pointer to presentation format address (`dst'), or NULL (see errno).
|
||||
* note:
|
||||
* On Windows we store the error in the thread errno, not
|
||||
* in the winsock error code. This is to avoid loosing the
|
||||
* actual last winsock error. So use macro ERRNO to fetch the
|
||||
* errno this funtion sets when returning NULL, not SOCKERRNO.
|
||||
* author:
|
||||
* Paul Vixie, 1996.
|
||||
*/
|
||||
@@ -81,7 +84,7 @@ ares_inet_ntop(int af, const void *src, char *dst, size_t size)
|
||||
case AF_INET6:
|
||||
return (inet_ntop6(src, dst, size));
|
||||
default:
|
||||
errno = EAFNOSUPPORT;
|
||||
SET_ERRNO(EAFNOSUPPORT);
|
||||
return (NULL);
|
||||
}
|
||||
/* NOTREACHED */
|
||||
@@ -106,7 +109,7 @@ inet_ntop4(const unsigned char *src, char *dst, size_t size)
|
||||
|
||||
if (SPRINTF((tmp, fmt, src[0], src[1], src[2], src[3])) > size)
|
||||
{
|
||||
errno = ENOSPC;
|
||||
SET_ERRNO(ENOSPC);
|
||||
return (NULL);
|
||||
}
|
||||
strcpy(dst, tmp);
|
||||
@@ -218,7 +221,7 @@ inet_ntop6(const unsigned char *src, char *dst, size_t size)
|
||||
*/
|
||||
if ((size_t)(tp - tmp) > size)
|
||||
{
|
||||
errno = ENOSPC;
|
||||
SET_ERRNO(ENOSPC);
|
||||
return (NULL);
|
||||
}
|
||||
strcpy(dst, tmp);
|
||||
|
@@ -18,11 +18,6 @@
|
||||
|
||||
#define MAXHOSTNAMELEN 256
|
||||
|
||||
#define EINPROGRESS WSAEINPROGRESS
|
||||
#define EWOULDBLOCK WSAEWOULDBLOCK
|
||||
#define EMSGSIZE WSAEMSGSIZE
|
||||
#define EAFNOSUPPORT WSAEAFNOSUPPORT
|
||||
|
||||
/* Structure for scatter/gather I/O. */
|
||||
struct iovec
|
||||
{
|
||||
@@ -30,7 +25,9 @@ struct iovec
|
||||
size_t iov_len; /* Length of data. */
|
||||
};
|
||||
|
||||
#ifndef __WATCOMC__
|
||||
#define getpid() _getpid()
|
||||
#endif
|
||||
|
||||
int ares_writev (SOCKET s, const struct iovec *vector, size_t count);
|
||||
#define writev(s,vect,count) ares_writev(s,vect,count)
|
||||
|
37
ares/setup.h
37
ares/setup.h
@@ -3,7 +3,7 @@
|
||||
|
||||
/* $Id$ */
|
||||
|
||||
/* Copyright (C) 2004 - 2005 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
|
||||
* documentation for any purpose and without fee is hereby granted, provided
|
||||
@@ -69,6 +69,22 @@
|
||||
# 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
|
||||
*/
|
||||
@@ -101,23 +117,11 @@
|
||||
#undef VERSION
|
||||
#undef PACKAGE
|
||||
|
||||
/*
|
||||
* Typedef our socket type
|
||||
*/
|
||||
|
||||
#if defined(WIN32) && !defined(WATT32)
|
||||
typedef SOCKET ares_socket_t;
|
||||
#define ARES_SOCKET_BAD INVALID_SOCKET
|
||||
#else
|
||||
typedef int ares_socket_t;
|
||||
#define ARES_SOCKET_BAD -1
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Assume a few thing unless they're set by configure
|
||||
*/
|
||||
|
||||
#if !defined(HAVE_SYS_TIME_H) && !defined(_MSC_VER)
|
||||
#if !defined(HAVE_SYS_TIME_H) && !defined(_MSC_VER) && !defined(__WATCOMC__)
|
||||
#define HAVE_SYS_TIME_H
|
||||
#endif
|
||||
|
||||
@@ -140,6 +144,11 @@ int ares_strcasecmp(const char *s1, const char *s2);
|
||||
same */
|
||||
#define strncasecmp(a,b,c) ares_strncasecmp(a,b,c)
|
||||
#define strcasecmp(a,b) ares_strcasecmp(a,b)
|
||||
#ifdef _MSC_VER
|
||||
# if _MSC_VER >= 1400
|
||||
# define strdup(a) _strdup(a)
|
||||
# endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* IPv6 compatibility */
|
||||
|
@@ -3,7 +3,7 @@
|
||||
|
||||
/* $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
|
||||
* 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
|
||||
* it as the fourth argument of send() and recv()
|
||||
* it as the fourth argument of function send()
|
||||
*/
|
||||
|
||||
#ifdef HAVE_MSG_NOSIGNAL
|
||||
@@ -64,12 +126,9 @@
|
||||
#define sread(x,y,z) (ssize_t)recv((RECV_TYPE_ARG1)(x), \
|
||||
(RECV_TYPE_ARG2)(y), \
|
||||
(RECV_TYPE_ARG3)(z), \
|
||||
(RECV_TYPE_ARG4)(SEND_4TH_ARG))
|
||||
(RECV_TYPE_ARG4)(0))
|
||||
#endif
|
||||
#else /* HAVE_RECV */
|
||||
#ifdef DJGPP
|
||||
#define sread(x,y,z) (ssize_t)read_s((int)(x), (char *)(y), (int)(z))
|
||||
#endif
|
||||
#ifndef sread
|
||||
/* */
|
||||
Error Missing_definition_of_macro_sread
|
||||
@@ -94,9 +153,6 @@
|
||||
(SEND_TYPE_ARG4)(SEND_4TH_ARG))
|
||||
#endif
|
||||
#else /* HAVE_SEND */
|
||||
#ifdef DJGPP
|
||||
#define swrite(x,y,z) (ssize_t)write_s((int)(x), (char *)(y), (int)(z))
|
||||
#endif
|
||||
#ifndef swrite
|
||||
/* */
|
||||
Error Missing_definition_of_macro_swrite
|
||||
@@ -105,5 +161,202 @@
|
||||
#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
|
||||
|
||||
|
||||
/*
|
||||
* Actually use __32_getpwuid() on 64-bit VMS builds for getpwuid()
|
||||
*/
|
||||
|
||||
#if defined(VMS) && \
|
||||
defined(__INITIAL_POINTER_SIZE) && (__INITIAL_POINTER_SIZE == 64)
|
||||
#define getpwuid __32_getpwuid
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* Macro argv_item_t hides platform details to code using it.
|
||||
*/
|
||||
|
||||
#ifdef VMS
|
||||
#define argv_item_t __char_ptr32
|
||||
#else
|
||||
#define argv_item_t char *
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* __SETUP_ONCE_H */
|
||||
|
||||
|
@@ -49,7 +49,7 @@ BSC32=bscmake.exe
|
||||
# ADD BASE BSC32 /nologo
|
||||
# ADD BSC32 /nologo
|
||||
LINK32=link.exe
|
||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
|
||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
|
||||
# ADD LINK32 wsock32.lib areslib.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /libpath:"..\areslib\Release"
|
||||
|
||||
!ELSEIF "$(CFG)" == "adig - Win32 Debug"
|
||||
@@ -65,15 +65,15 @@ LINK32=link.exe
|
||||
# PROP Intermediate_Dir "Debug"
|
||||
# PROP Ignore_Export_Lib 0
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
|
||||
# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
|
||||
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
|
||||
# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
|
||||
# ADD BASE RSC /l 0x409 /d "_DEBUG"
|
||||
# ADD RSC /l 0x409 /d "_DEBUG"
|
||||
BSC32=bscmake.exe
|
||||
# ADD BASE BSC32 /nologo
|
||||
# ADD BSC32 /nologo
|
||||
LINK32=link.exe
|
||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
|
||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
|
||||
# ADD LINK32 wsock32.lib areslib.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /libpath:"..\areslib\Debug"
|
||||
|
||||
!ENDIF
|
||||
@@ -91,12 +91,16 @@ SOURCE=..\..\adig.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\..\getopt.c
|
||||
SOURCE=..\..\ares_getopt.c
|
||||
# End Source File
|
||||
# End Group
|
||||
# Begin Group "Header Files"
|
||||
|
||||
# PROP Default_Filter "h;hpp;hxx;hm;inl"
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\..\ares_getopt.h
|
||||
# End Source File
|
||||
# End Group
|
||||
# Begin Group "Resource Files"
|
||||
|
||||
|
@@ -7,19 +7,19 @@
|
||||
CFG=ahost - Win32 Debug
|
||||
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
|
||||
!MESSAGE use the Export Makefile command and run
|
||||
!MESSAGE
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "ahost.mak".
|
||||
!MESSAGE
|
||||
!MESSAGE
|
||||
!MESSAGE You can specify a configuration when running NMAKE
|
||||
!MESSAGE by defining the macro CFG on the command line. For example:
|
||||
!MESSAGE
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "ahost.mak" CFG="ahost - Win32 Debug"
|
||||
!MESSAGE
|
||||
!MESSAGE
|
||||
!MESSAGE Possible choices for configuration are:
|
||||
!MESSAGE
|
||||
!MESSAGE
|
||||
!MESSAGE "ahost - Win32 Release" (based on "Win32 (x86) Console Application")
|
||||
!MESSAGE "ahost - Win32 Debug" (based on "Win32 (x86) Console Application")
|
||||
!MESSAGE
|
||||
!MESSAGE
|
||||
|
||||
# Begin Project
|
||||
# PROP AllowPerConfigDependencies 0
|
||||
@@ -48,7 +48,7 @@ BSC32=bscmake.exe
|
||||
# ADD BASE BSC32 /nologo
|
||||
# ADD BSC32 /nologo
|
||||
LINK32=link.exe
|
||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
|
||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
|
||||
# ADD LINK32 wsock32.lib areslib.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /libpath:"..\areslib\Release"
|
||||
|
||||
!ELSEIF "$(CFG)" == "ahost - Win32 Debug"
|
||||
@@ -63,18 +63,18 @@ LINK32=link.exe
|
||||
# PROP Output_Dir "Debug"
|
||||
# PROP Intermediate_Dir "Debug"
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
|
||||
# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FR /YX /FD /GZ /c
|
||||
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
|
||||
# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FR /YX /FD /GZ /c
|
||||
# ADD BASE RSC /l 0x409 /d "_DEBUG"
|
||||
# ADD RSC /l 0x409 /d "_DEBUG"
|
||||
BSC32=bscmake.exe
|
||||
# ADD BASE BSC32 /nologo
|
||||
# ADD BSC32 /nologo
|
||||
LINK32=link.exe
|
||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
|
||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
|
||||
# ADD LINK32 wsock32.lib areslib.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /libpath:"..\areslib\Debug"
|
||||
|
||||
!ENDIF
|
||||
!ENDIF
|
||||
|
||||
# Begin Target
|
||||
|
||||
@@ -87,10 +87,18 @@ LINK32=link.exe
|
||||
|
||||
SOURCE=..\..\ahost.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\..\ares_getopt.c
|
||||
# End Source File
|
||||
# End Group
|
||||
# Begin Group "Header Files"
|
||||
|
||||
# PROP Default_Filter "h;hpp;hxx;hm;inl"
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\..\ares_getopt.h
|
||||
# End Source File
|
||||
# End Group
|
||||
# Begin Group "Resource Files"
|
||||
|
||||
|
@@ -7,19 +7,19 @@
|
||||
CFG=areslib - Win32 Debug
|
||||
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
|
||||
!MESSAGE use the Export Makefile command and run
|
||||
!MESSAGE
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "areslib.mak".
|
||||
!MESSAGE
|
||||
!MESSAGE
|
||||
!MESSAGE You can specify a configuration when running NMAKE
|
||||
!MESSAGE by defining the macro CFG on the command line. For example:
|
||||
!MESSAGE
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "areslib.mak" CFG="areslib - Win32 Debug"
|
||||
!MESSAGE
|
||||
!MESSAGE
|
||||
!MESSAGE Possible choices for configuration are:
|
||||
!MESSAGE
|
||||
!MESSAGE
|
||||
!MESSAGE "areslib - Win32 Release" (based on "Win32 (x86) Static Library")
|
||||
!MESSAGE "areslib - Win32 Debug" (based on "Win32 (x86) Static Library")
|
||||
!MESSAGE
|
||||
!MESSAGE
|
||||
|
||||
# Begin Project
|
||||
# PROP AllowPerConfigDependencies 0
|
||||
@@ -74,7 +74,7 @@ LIB32=link.exe -lib
|
||||
# ADD BASE LIB32 /nologo
|
||||
# ADD LIB32 /nologo
|
||||
|
||||
!ENDIF
|
||||
!ENDIF
|
||||
|
||||
# Begin Target
|
||||
|
||||
@@ -129,6 +129,10 @@ SOURCE=..\..\ares_gethostbyname.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\..\ares_getsock.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\..\ares_init.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
@@ -20,6 +20,20 @@
|
||||
#include "ares.h"
|
||||
#include "ares_private.h"
|
||||
|
||||
#ifdef __WATCOMC__
|
||||
/*
|
||||
* Watcom needs a DllMain() in order to initialise the clib startup code.
|
||||
*/
|
||||
BOOL
|
||||
WINAPI DllMain (HINSTANCE hnd, DWORD reason, LPVOID reserved)
|
||||
{
|
||||
(void) hnd;
|
||||
(void) reason;
|
||||
(void) reserved;
|
||||
return (TRUE);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef __MINGW32__
|
||||
int
|
||||
ares_strncasecmp(const char *a, const char *b, int n)
|
||||
@@ -27,8 +41,8 @@ ares_strncasecmp(const char *a, const char *b, int n)
|
||||
int i;
|
||||
|
||||
for (i = 0; i < n; i++) {
|
||||
int c1 = isupper(a[i]) ? tolower(a[i]) : a[i];
|
||||
int c2 = isupper(b[i]) ? tolower(b[i]) : b[i];
|
||||
int c1 = ISUPPER(a[i]) ? tolower(a[i]) : a[i];
|
||||
int c2 = ISUPPER(b[i]) ? tolower(b[i]) : b[i];
|
||||
if (c1 != c2) return c1-c2;
|
||||
}
|
||||
return 0;
|
||||
@@ -91,7 +105,7 @@ ares_writev (ares_socket_t s, const struct iovec *vector, size_t count)
|
||||
buffer = bp = (char*) alloca (bytes);
|
||||
if (!buffer)
|
||||
{
|
||||
errno = ENOMEM;
|
||||
SET_ERRNO(ENOMEM);
|
||||
return (-1);
|
||||
}
|
||||
|
||||
|
@@ -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
|
||||
# you should have received as part of this distribution. The terms
|
||||
@@ -140,7 +140,7 @@ else
|
||||
libtoolize=`findtool $LIBTOOLIZE`
|
||||
fi
|
||||
|
||||
lt_pversion=`$libtool --version 2>/dev/null|head -n 1|sed -e 's/^[^0-9]*//g' -e 's/[- ].*//'`
|
||||
lt_pversion=`$libtool --version 2>/dev/null|head -n 2|sed -e 's/^[^0-9]*//g' -e 's/[- ].*//'`
|
||||
if test -z "$lt_pversion"; then
|
||||
echo "buildconf: libtool not found."
|
||||
echo " You need libtool version $LIBTOOL_WANTED_VERSION or newer installed"
|
||||
|
@@ -5,7 +5,6 @@ REM $Date$
|
||||
|
||||
REM create 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
|
||||
copy src\hugehelp.c.cvs src\hugehelp.c
|
||||
|
501
configure.ac
501
configure.ac
@@ -5,7 +5,7 @@
|
||||
# | (__| |_| | _ <| |___
|
||||
# \___|\___/|_| \_\_____|
|
||||
#
|
||||
# Copyright (C) 1998 - 2006, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
# Copyright (C) 1998 - 2007, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
#
|
||||
# This software is licensed as described in the file COPYING, which
|
||||
# you should have received as part of this distribution. The terms
|
||||
@@ -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/])
|
||||
|
||||
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
|
||||
terms of the curl license; see COPYING for more details])
|
||||
|
||||
@@ -78,6 +78,7 @@ AC_SUBST(PKGADD_VENDOR)
|
||||
dnl
|
||||
dnl initialize all the info variables
|
||||
curl_ssl_msg="no (--with-ssl / --with-gnutls)"
|
||||
curl_ssh_msg="no (--with-libssh2)"
|
||||
curl_zlib_msg="no (--with-zlib)"
|
||||
curl_krb4_msg="no (--with-krb4*)"
|
||||
curl_gss_msg="no (--with-gssapi)"
|
||||
@@ -89,6 +90,11 @@ dnl initialize all the info variables
|
||||
curl_verbose_msg="enabled (--disable-verbose)"
|
||||
curl_sspi_msg="no (--enable-sspi)"
|
||||
|
||||
dnl
|
||||
dnl Save anything in $LIBS for later
|
||||
dnl
|
||||
ALL_LIBS=$LIBS
|
||||
|
||||
dnl
|
||||
dnl Detect the canonical host and target build environment
|
||||
dnl
|
||||
@@ -106,9 +112,37 @@ AC_PROG_CC
|
||||
dnl check for how to do large files
|
||||
AC_SYS_LARGEFILE
|
||||
|
||||
dnl check for cygwin stuff
|
||||
dnl support building of Windows DLLs
|
||||
AC_LIBTOOL_WIN32_DLL
|
||||
|
||||
dnl skip libtool C++ and Fortran compiler checks
|
||||
m4_ifdef([AC_PROG_CXX], [m4_undefine([AC_PROG_CXX])])
|
||||
m4_defun([AC_PROG_CXX],[])
|
||||
m4_ifdef([AC_PROG_CXXCPP], [m4_undefine([AC_PROG_CXXCPP])])
|
||||
m4_defun([AC_PROG_CXXCPP],[true])
|
||||
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_CXXCPP], [m4_undefine([AC_LIBTOOL_CXXCPP])])
|
||||
m4_defun([AC_LIBTOOL_CXXCPP],[true])
|
||||
m4_ifdef([AC_LIBTOOL_F77], [m4_undefine([AC_LIBTOOL_F77])])
|
||||
m4_defun([AC_LIBTOOL_F77],[])
|
||||
|
||||
dnl force libtool to build static libraries with PIC on AMD64-linux
|
||||
AC_MSG_CHECKING([if arch-OS host is AMD64-linux (to build static libraries with PIC)])
|
||||
case $host in
|
||||
x86_64*linux*)
|
||||
AC_MSG_RESULT([yes])
|
||||
with_pic=yes
|
||||
;;
|
||||
*)
|
||||
AC_MSG_RESULT([no])
|
||||
;;
|
||||
esac
|
||||
|
||||
dnl libtool setup
|
||||
AC_PROG_LIBTOOL
|
||||
|
||||
@@ -157,10 +191,22 @@ case $host in
|
||||
;;
|
||||
esac
|
||||
|
||||
# Determine whether all dependent libraries must be specified when linking
|
||||
if test "X$enable_shared" = "Xyes" -a "X$link_all_deplibs" = "Xno"
|
||||
then
|
||||
REQUIRE_LIB_DEPS=no
|
||||
else
|
||||
REQUIRE_LIB_DEPS=yes
|
||||
fi
|
||||
AC_SUBST(REQUIRE_LIB_DEPS)
|
||||
|
||||
dnl The install stuff has already been taken care of by the automake stuff
|
||||
dnl AC_PROG_INSTALL
|
||||
AC_PROG_MAKE_SET
|
||||
|
||||
dnl check if there's a way to force code inline
|
||||
AC_C_INLINE
|
||||
|
||||
dnl **********************************************************************
|
||||
dnl Make sure that our checks for headers windows.h winsock.h winsock2.h
|
||||
dnl and ws2tcpip.h take precedence over any other further checks which
|
||||
@@ -373,6 +419,21 @@ then
|
||||
)
|
||||
fi
|
||||
|
||||
if test "$HAVE_GETHOSTBYNAME" != "1"
|
||||
then
|
||||
dnl This is for Minix 3.1
|
||||
AC_MSG_CHECKING([for gethostbyname for Minix 3])
|
||||
AC_TRY_LINK([
|
||||
/* Older Minix versions may need <net/gen/netdb.h> here instead */
|
||||
#include <netdb.h>],
|
||||
[gethostbyname("www.dummysite.com");],
|
||||
[ dnl worked!
|
||||
AC_MSG_RESULT([yes])
|
||||
HAVE_GETHOSTBYNAME="1"],
|
||||
AC_MSG_RESULT(no)
|
||||
)
|
||||
fi
|
||||
|
||||
if test "$HAVE_GETHOSTBYNAME" != "1"
|
||||
then
|
||||
dnl This is for eCos with a stubbed DNS implementation
|
||||
@@ -417,15 +478,20 @@ fi
|
||||
dnl socket lib?
|
||||
AC_CHECK_FUNC(connect, , [ AC_CHECK_LIB(socket, connect) ])
|
||||
|
||||
dnl dl lib?
|
||||
AC_CHECK_FUNC(dlclose, , [ AC_CHECK_LIB(dl, dlopen) ])
|
||||
dnl **********************************************************************
|
||||
dnl The preceding library checks are all potentially useful for test
|
||||
dnl servers (for providing networking support). Save the list of required
|
||||
dnl libraries at this point for use while linking those test servers.
|
||||
dnl **********************************************************************
|
||||
TEST_SERVER_LIBS=$LIBS
|
||||
|
||||
dnl **********************************************************************
|
||||
AC_MSG_CHECKING([whether to use libgcc])
|
||||
AC_ARG_ENABLE(libgcc,
|
||||
AC_HELP_STRING([--enable-libgcc],[use libgcc when linking]),
|
||||
[ case "$enableval" in
|
||||
yes)
|
||||
LIBS="$LIBS -lgcc"
|
||||
ALL_LIBS="$ALL_LIBS -lgcc"
|
||||
AC_MSG_RESULT(yes)
|
||||
;;
|
||||
*) AC_MSG_RESULT(no)
|
||||
@@ -434,6 +500,9 @@ AC_HELP_STRING([--enable-libgcc],[use libgcc when linking]),
|
||||
AC_MSG_RESULT(no)
|
||||
)
|
||||
|
||||
dnl dl lib?
|
||||
AC_CHECK_FUNC(dlclose, , [ AC_CHECK_LIB(dl, dlopen) ])
|
||||
|
||||
dnl **********************************************************************
|
||||
dnl Check for the name of dynamic OpenLDAP libraries
|
||||
dnl **********************************************************************
|
||||
@@ -747,7 +816,7 @@ AC_ARG_WITH(gssapi-includes,
|
||||
AC_ARG_WITH(gssapi-libs,
|
||||
AC_HELP_STRING([--with-gssapi-libs=DIR],
|
||||
[Specify location of GSSAPI libs]),
|
||||
[ GSSAPI_LIBS="-L$withval"
|
||||
[ GSSAPI_LIB_DIR="-L$withval"
|
||||
want_gss="yes" ]
|
||||
)
|
||||
|
||||
@@ -841,7 +910,7 @@ dnl Default to no CA bundle
|
||||
ca="no"
|
||||
AC_ARG_WITH(ssl,dnl
|
||||
AC_HELP_STRING([--with-ssl=PATH],[Where to look for OpenSSL, PATH points to the SSL installation (default: /usr/local/ssl); when possible, set the PKG_CONFIG_PATH environment variable instead of using this option])
|
||||
AC_HELP_STRING([--without-ssl], [disable SSL]),
|
||||
AC_HELP_STRING([--without-ssl], [disable OpenSSL]),
|
||||
OPT_SSL=$withval)
|
||||
|
||||
if test X"$OPT_SSL" != Xno; then
|
||||
@@ -1021,12 +1090,35 @@ if test X"$OPT_SSL" != Xno; then
|
||||
])
|
||||
|
||||
dnl these can only exist if openssl exists
|
||||
dnl yassl doesn't have SSL_get_shutdown
|
||||
|
||||
AC_CHECK_FUNCS( RAND_status \
|
||||
RAND_screen \
|
||||
RAND_egd \
|
||||
CRYPTO_cleanup_all_ex_data )
|
||||
CRYPTO_cleanup_all_ex_data \
|
||||
SSL_get_shutdown )
|
||||
|
||||
dnl Make an attempt to detect if this is actually yassl's headers and
|
||||
dnl OpenSSL emulation layer. We still leave everything else believing
|
||||
dnl and acting like OpenSSL.
|
||||
|
||||
AC_MSG_CHECKING([for yaSSL using OpenSSL compatibility mode])
|
||||
AC_TRY_COMPILE([
|
||||
#include <openssl/ssl.h>
|
||||
],[
|
||||
#if defined(YASSL_VERSION) && defined(OPENSSL_VERSION_NUMBER)
|
||||
int dummy = SSL_ERROR_NONE;
|
||||
#else
|
||||
Not the yaSSL OpenSSL compatibility header.
|
||||
#endif
|
||||
],[
|
||||
AC_MSG_RESULT([yes])
|
||||
AC_DEFINE_UNQUOTED(USE_YASSLEMUL, 1,
|
||||
[Define to 1 if using yaSSL in OpenSSL compatibility mode.])
|
||||
curl_ssl_msg="enabled (OpenSSL emulation by yaSSL)"
|
||||
],[
|
||||
AC_MSG_RESULT([no])
|
||||
])
|
||||
fi
|
||||
|
||||
if test "$OPENSSL_ENABLED" = "1"; then
|
||||
@@ -1043,6 +1135,152 @@ if test X"$OPT_SSL" != Xno; then
|
||||
|
||||
fi
|
||||
|
||||
dnl **********************************************************************
|
||||
dnl Check for the presence of ZLIB libraries and headers
|
||||
dnl **********************************************************************
|
||||
|
||||
dnl Check for & handle argument to --with-zlib.
|
||||
|
||||
_cppflags=$CPPFLAGS
|
||||
_ldflags=$LDFLAGS
|
||||
AC_ARG_WITH(zlib,
|
||||
AC_HELP_STRING([--with-zlib=PATH],[search for zlib in PATH])
|
||||
AC_HELP_STRING([--without-zlib],[disable use of zlib]),
|
||||
[OPT_ZLIB="$withval"])
|
||||
|
||||
if test "$OPT_ZLIB" = "no" ; then
|
||||
AC_MSG_WARN([zlib disabled])
|
||||
else
|
||||
if test "$OPT_ZLIB" = "yes" ; then
|
||||
OPT_ZLIB=""
|
||||
fi
|
||||
|
||||
if test -z "$OPT_ZLIB" ; then
|
||||
dnl check for the lib first without setting any new path, since many
|
||||
dnl people have it in the default path
|
||||
|
||||
AC_CHECK_LIB(z, inflateEnd,
|
||||
dnl libz found, set the variable
|
||||
[HAVE_LIBZ="1"],
|
||||
dnl if no lib found, try /usr/local
|
||||
[OPT_ZLIB="/usr/local"])
|
||||
|
||||
fi
|
||||
|
||||
dnl Add a nonempty path to the compiler flags
|
||||
if test -n "$OPT_ZLIB"; then
|
||||
CPPFLAGS="$CPPFLAGS -I$OPT_ZLIB/include"
|
||||
LDFLAGS="$LDFLAGS -L$OPT_ZLIB/lib$libsuff"
|
||||
fi
|
||||
|
||||
AC_CHECK_HEADER(zlib.h,
|
||||
[
|
||||
dnl zlib.h was found
|
||||
HAVE_ZLIB_H="1"
|
||||
dnl if the lib wasn't found already, try again with the new paths
|
||||
if test "$HAVE_LIBZ" != "1"; then
|
||||
AC_CHECK_LIB(z, gzread,
|
||||
[
|
||||
dnl the lib was found!
|
||||
HAVE_LIBZ="1"
|
||||
],
|
||||
[ CPPFLAGS=$_cppflags
|
||||
LDFLAGS=$_ldflags])
|
||||
fi
|
||||
],
|
||||
[
|
||||
dnl zlib.h was not found, restore the flags
|
||||
CPPFLAGS=$_cppflags
|
||||
LDFLAGS=$_ldflags]
|
||||
)
|
||||
|
||||
if test "$HAVE_LIBZ" = "1" && test "$HAVE_ZLIB_H" != "1"
|
||||
then
|
||||
AC_MSG_WARN([configure found only the libz lib, not the header file!])
|
||||
elif test "$HAVE_LIBZ" != "1" && test "$HAVE_ZLIB_H" = "1"
|
||||
then
|
||||
AC_MSG_WARN([configure found only the libz header file, not the lib!])
|
||||
elif test "$HAVE_LIBZ" = "1" && test "$HAVE_ZLIB_H" = "1"
|
||||
then
|
||||
dnl both header and lib were found!
|
||||
AC_SUBST(HAVE_LIBZ)
|
||||
AC_DEFINE(HAVE_ZLIB_H, 1, [if you have the zlib.h header file])
|
||||
AC_DEFINE(HAVE_LIBZ, 1, [if zlib is available])
|
||||
|
||||
CURL_LIBS="$CURL_LIBS -lz"
|
||||
LIBS="$LIBS -lz"
|
||||
|
||||
dnl replace 'HAVE_LIBZ' in the automake makefile.ams
|
||||
AMFIXLIB="1"
|
||||
AC_MSG_NOTICE([found both libz and libz.h header])
|
||||
curl_zlib_msg="enabled"
|
||||
fi
|
||||
fi
|
||||
|
||||
dnl set variable for use in automakefile(s)
|
||||
AM_CONDITIONAL(HAVE_LIBZ, test x"$AMFIXLIB" = x1)
|
||||
|
||||
dnl **********************************************************************
|
||||
dnl Check for the presence of LIBSSH2 libraries and headers
|
||||
dnl **********************************************************************
|
||||
|
||||
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 Check for the random seed preferences
|
||||
dnl **********************************************************************
|
||||
@@ -1121,6 +1359,7 @@ if test "$OPENSSL_ENABLED" != "1"; then
|
||||
[
|
||||
AC_DEFINE(USE_GNUTLS, 1, [if GnuTLS is enabled])
|
||||
AC_SUBST(USE_GNUTLS, [1])
|
||||
GNUTLS_ENABLED=1
|
||||
USE_GNUTLS="yes"
|
||||
curl_ssl_msg="enabled (GnuTLS)"
|
||||
],
|
||||
@@ -1146,13 +1385,85 @@ if test "$OPENSSL_ENABLED" != "1"; then
|
||||
|
||||
fi dnl GNUTLS not disabled
|
||||
|
||||
if test X"$USE_GNUTLS" != "Xyes"; then
|
||||
AC_MSG_WARN([SSL disabled, you will not be able to use HTTPS, FTPS, NTLM and more.])
|
||||
AC_MSG_WARN([Use --with-ssl or --with-gnutls to address this.])
|
||||
fi
|
||||
|
||||
fi dnl OPENSSL != 1
|
||||
|
||||
dnl ----------------------------------------------------
|
||||
dnl NSS. Only check if GnuTLS and OpenSSL are not enabled
|
||||
dnl ----------------------------------------------------
|
||||
|
||||
dnl Default to compiler & linker defaults for NSS files & libraries.
|
||||
OPT_NSS=no
|
||||
|
||||
AC_ARG_WITH(nss,dnl
|
||||
AC_HELP_STRING([--with-nss=PATH],[where to look for NSS, PATH points to the installation root (default: /usr/local/)])
|
||||
AC_HELP_STRING([--without-nss], [disable NSS detection]),
|
||||
OPT_NSS=$withval)
|
||||
|
||||
if test "$OPENSSL_ENABLED" != "1" -a "$GNUTLS_ENABLED" != "1"; then
|
||||
|
||||
if test X"$OPT_NSS" != Xno; then
|
||||
if test "x$OPT_NSS" = "xyes"; then
|
||||
check=`pkg-config --version 2>/dev/null`
|
||||
if test -n "$check"; then
|
||||
addlib=`pkg-config --libs nss`
|
||||
addcflags=`pkg-config --cflags nss`
|
||||
version=`pkg-config --modversion nss`
|
||||
nssprefix=`pkg-config --variable=prefix nss`
|
||||
fi
|
||||
else
|
||||
# Without pkg-config, we'll kludge in some defaults
|
||||
addlib="-lssl3 -lsmime3 -lnss3 -lplds4 -lplc4 -lnspr4 -lpthread -ldl"
|
||||
addcflags="-I$OPT_NSS/include"
|
||||
version="unknown"
|
||||
gtlsprefix=$OPT_GNUTLS
|
||||
fi
|
||||
if test -n "$addlib"; then
|
||||
|
||||
CLEANLIBS="$LIBS"
|
||||
CLEANCPPFLAGS="$CPPFLAGS"
|
||||
|
||||
LIBS="$LIBS $addlib"
|
||||
if test "$addcflags" != "-I/usr/include"; then
|
||||
CPPFLAGS="$CPPFLAGS $addcflags"
|
||||
fi
|
||||
|
||||
AC_CHECK_LIB(nss3, NSS_Initialize,
|
||||
[
|
||||
AC_DEFINE(USE_NSS, 1, [if NSS is enabled])
|
||||
AC_SUBST(USE_NSS, [1])
|
||||
USE_NSS="yes"
|
||||
NSS_ENABLED=1
|
||||
curl_ssl_msg="enabled (NSS)"
|
||||
],
|
||||
[
|
||||
LIBS="$CLEANLIBS"
|
||||
CPPFLAGS="$CLEANCPPFLAGS"
|
||||
])
|
||||
|
||||
if test "x$USE_NSS" = "xyes"; then
|
||||
AC_MSG_NOTICE([detected NSS version $version])
|
||||
|
||||
dnl when shared libs were found in a path that the run-time
|
||||
dnl linker doesn't search through, we need to add it to
|
||||
dnl LD_LIBRARY_PATH to prevent further configure tests to fail
|
||||
dnl due to this
|
||||
|
||||
LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$nssprefix/lib$libsuff"
|
||||
export LD_LIBRARY_PATH
|
||||
AC_MSG_NOTICE([Added $nssprefix/lib$libsuff to LD_LIBRARY_PATH])
|
||||
fi
|
||||
|
||||
fi
|
||||
|
||||
fi dnl NSS not disabled
|
||||
|
||||
fi dnl OPENSSL != 1 -a GNUTLS_ENABLED != 1
|
||||
|
||||
if test "x$OPENSSL_ENABLED$GNUTLS_ENABLED$NSS_ENABLED" = "x"; then
|
||||
AC_MSG_WARN([SSL disabled, you will not be able to use HTTPS, FTPS, NTLM and more.])
|
||||
AC_MSG_WARN([Use --with-ssl, --with-gnutls or --with-nss to address this.])
|
||||
fi
|
||||
|
||||
dnl **********************************************************************
|
||||
dnl Check for the CA bundle
|
||||
dnl **********************************************************************
|
||||
@@ -1182,93 +1493,10 @@ fi dnl only done if some kind of SSL was enabled
|
||||
|
||||
AM_CONDITIONAL(CABUNDLE, test x$ca != xno)
|
||||
|
||||
|
||||
|
||||
|
||||
dnl **********************************************************************
|
||||
dnl Check for the presence of ZLIB libraries and headers
|
||||
dnl Check for the presence of IDN libraries and headers
|
||||
dnl **********************************************************************
|
||||
|
||||
dnl Check for & handle argument to --with-zlib.
|
||||
|
||||
_cppflags=$CPPFLAGS
|
||||
_ldflags=$LDFLAGS
|
||||
AC_ARG_WITH(zlib,
|
||||
AC_HELP_STRING([--with-zlib=PATH],[search for zlib in PATH])
|
||||
AC_HELP_STRING([--without-zlib],[disable use of zlib]),
|
||||
[OPT_ZLIB="$withval"])
|
||||
|
||||
if test "$OPT_ZLIB" = "no" ; then
|
||||
AC_MSG_WARN([zlib disabled])
|
||||
else
|
||||
if test "$OPT_ZLIB" = "yes" ; then
|
||||
OPT_ZLIB=""
|
||||
fi
|
||||
|
||||
if test -z "$OPT_ZLIB" ; then
|
||||
dnl check for the lib first without setting any new path, since many
|
||||
dnl people have it in the default path
|
||||
|
||||
AC_CHECK_LIB(z, inflateEnd,
|
||||
dnl libz found, set the variable
|
||||
[HAVE_LIBZ="1"],
|
||||
dnl if no lib found, try /usr/local
|
||||
[OPT_ZLIB="/usr/local"])
|
||||
|
||||
fi
|
||||
|
||||
dnl Add a nonempty path to the compiler flags
|
||||
if test -n "$OPT_ZLIB"; then
|
||||
CPPFLAGS="$CPPFLAGS -I$OPT_ZLIB/include"
|
||||
LDFLAGS="$LDFLAGS -L$OPT_ZLIB/lib$libsuff"
|
||||
fi
|
||||
|
||||
AC_CHECK_HEADER(zlib.h,
|
||||
[
|
||||
dnl zlib.h was found
|
||||
HAVE_ZLIB_H="1"
|
||||
dnl if the lib wasn't found already, try again with the new paths
|
||||
if test "$HAVE_LIBZ" != "1"; then
|
||||
AC_CHECK_LIB(z, gzread,
|
||||
[
|
||||
dnl the lib was found!
|
||||
HAVE_LIBZ="1"
|
||||
],
|
||||
[ CPPFLAGS=$_cppflags
|
||||
LDFLAGS=$_ldflags])
|
||||
fi
|
||||
],
|
||||
[
|
||||
dnl zlib.h was not found, restore the flags
|
||||
CPPFLAGS=$_cppflags
|
||||
LDFLAGS=$_ldflags]
|
||||
)
|
||||
|
||||
if test "$HAVE_LIBZ" = "1" && test "$HAVE_ZLIB_H" != "1"
|
||||
then
|
||||
AC_MSG_WARN([configure found only the libz lib, not the header file!])
|
||||
elif test "$HAVE_LIBZ" != "1" && test "$HAVE_ZLIB_H" = "1"
|
||||
then
|
||||
AC_MSG_WARN([configure found only the libz header file, not the lib!])
|
||||
elif test "$HAVE_LIBZ" = "1" && test "$HAVE_ZLIB_H" = "1"
|
||||
then
|
||||
dnl both header and lib were found!
|
||||
AC_SUBST(HAVE_LIBZ)
|
||||
AC_DEFINE(HAVE_ZLIB_H, 1, [if you have the zlib.h header file])
|
||||
AC_DEFINE(HAVE_LIBZ, 1, [if zlib is available])
|
||||
|
||||
LIBS="$LIBS -lz"
|
||||
|
||||
dnl replace 'HAVE_LIBZ' in the automake makefile.ams
|
||||
AMFIXLIB="1"
|
||||
AC_MSG_NOTICE([found both libz and libz.h header])
|
||||
curl_zlib_msg="enabled"
|
||||
fi
|
||||
fi
|
||||
|
||||
dnl set variable for use in automakefile(s)
|
||||
AM_CONDITIONAL(HAVE_LIBZ, test x"$AMFIXLIB" = x1)
|
||||
|
||||
AC_MSG_CHECKING([whether to build with libidn])
|
||||
AC_ARG_WITH(libidn,
|
||||
AC_HELP_STRING([--with-libidn=PATH],[Enable libidn usage])
|
||||
@@ -1397,6 +1625,10 @@ if test "x$RECENTAIX" = "xyes"; then
|
||||
XLC="yes"
|
||||
AC_MSG_RESULT([yes])
|
||||
CFLAGS="$CFLAGS -qthreaded"
|
||||
dnl AIX xlc has to have strict aliasing turned off. If not,
|
||||
dnl the optimizer assumes that pointers can only point to
|
||||
dnl an object of the same type.
|
||||
CFLAGS="$CFLAGS -qnoansialias"
|
||||
)
|
||||
|
||||
|
||||
@@ -1413,7 +1645,7 @@ if test x$cross_compiling != xyes; then
|
||||
|
||||
if test x$checkfor_gmtime_r = xyes; then
|
||||
|
||||
dnl if gmtime_r was found, verify that it actuall works, as (at least) HPUX
|
||||
dnl if gmtime_r was found, verify that it actually works, as (at least) HPUX
|
||||
dnl 10.20 is known to have a buggy one. If it doesn't work, disable use of
|
||||
dnl it.
|
||||
|
||||
@@ -1496,6 +1728,7 @@ AC_CHECK_HEADERS(
|
||||
libgen.h \
|
||||
locale.h \
|
||||
errno.h \
|
||||
stdbool.h \
|
||||
arpa/tftp.h \
|
||||
sys/filio.h \
|
||||
setjmp.h,
|
||||
@@ -1525,8 +1758,11 @@ dnl default includes
|
||||
|
||||
dnl Checks for typedefs, structures, and compiler characteristics.
|
||||
AC_C_CONST
|
||||
CURL_CHECK_VARIADIC_MACROS
|
||||
AC_TYPE_SIZE_T
|
||||
AC_HEADER_TIME
|
||||
CURL_CHECK_STRUCT_TIMEVAL
|
||||
CURL_VERIFY_RUNTIMELIBS
|
||||
|
||||
AC_CHECK_SIZEOF(curl_off_t, ,[
|
||||
#include <stdio.h>
|
||||
@@ -1555,6 +1791,19 @@ fi
|
||||
AC_CHECK_TYPE(ssize_t, ,
|
||||
AC_DEFINE(ssize_t, int, [the signed version of size_t]))
|
||||
|
||||
# check for bool type
|
||||
AC_CHECK_TYPE([bool],[
|
||||
AC_DEFINE(HAVE_BOOL_T, 1,
|
||||
[Define to 1 if bool is an available type.])
|
||||
], ,[
|
||||
#ifdef HAVE_SYS_TYPES_H
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
#ifdef HAVE_STDBOOL_H
|
||||
#include <stdbool.h>
|
||||
#endif
|
||||
])
|
||||
|
||||
# Check for socklen_t or equivalent
|
||||
CURL_CHECK_TYPE_SOCKLEN_T
|
||||
|
||||
@@ -1562,6 +1811,10 @@ TYPE_IN_ADDR_T
|
||||
|
||||
TYPE_SOCKADDR_STORAGE
|
||||
|
||||
TYPE_SIG_ATOMIC_T
|
||||
|
||||
AC_TYPE_SIGNAL
|
||||
|
||||
AC_FUNC_SELECT_ARGTYPES
|
||||
|
||||
CURL_CHECK_FUNC_RECV
|
||||
@@ -1572,7 +1825,7 @@ CURL_CHECK_MSG_NOSIGNAL
|
||||
|
||||
dnl Checks for library functions.
|
||||
dnl AC_PROG_GCC_TRADITIONAL
|
||||
AC_TYPE_SIGNAL
|
||||
|
||||
dnl AC_FUNC_VPRINTF
|
||||
case $host in
|
||||
*msdosdjgpp)
|
||||
@@ -1616,7 +1869,8 @@ AC_CHECK_FUNCS( strtoll \
|
||||
getprotobyname \
|
||||
getrlimit \
|
||||
setrlimit \
|
||||
fork,
|
||||
fork \
|
||||
setmode,
|
||||
dnl if found
|
||||
[],
|
||||
dnl if not found, $ac_func is the name we check for
|
||||
@@ -1799,10 +2053,10 @@ fi
|
||||
dnl set variable for use in automakefile(s)
|
||||
AM_CONDITIONAL(USE_MANUAL, test x"$USE_MANUAL" = x1)
|
||||
|
||||
AC_MSG_CHECKING([whether to enable ares])
|
||||
AC_MSG_CHECKING([whether to enable c-ares])
|
||||
AC_ARG_ENABLE(ares,
|
||||
AC_HELP_STRING([--enable-ares=PATH],[Enable ares for name lookups])
|
||||
AC_HELP_STRING([--disable-ares],[Disable ares for name lookups]),
|
||||
AC_HELP_STRING([--enable-ares=PATH],[Enable c-ares for name lookups])
|
||||
AC_HELP_STRING([--disable-ares],[Disable c-ares for name lookups]),
|
||||
[ case "$enableval" in
|
||||
no)
|
||||
AC_MSG_RESULT(no)
|
||||
@@ -1810,10 +2064,10 @@ AC_HELP_STRING([--disable-ares],[Disable ares for name lookups]),
|
||||
*) AC_MSG_RESULT(yes)
|
||||
|
||||
if test "x$IPV6_ENABLED" = "x1"; then
|
||||
AC_MSG_NOTICE([ares may not work properly with ipv6])
|
||||
AC_MSG_NOTICE([c-ares may not work properly with ipv6])
|
||||
fi
|
||||
|
||||
AC_DEFINE(USE_ARES, 1, [Define if you want to enable ares support])
|
||||
AC_DEFINE(USE_ARES, 1, [Define if you want to enable c-ares support])
|
||||
dnl substitute HAVE_ARES for curl-config and similar
|
||||
HAVE_ARES="1"
|
||||
AC_SUBST(HAVE_ARES)
|
||||
@@ -1858,7 +2112,8 @@ void curl_domalloc() { }
|
||||
int main(void)
|
||||
{
|
||||
ares_channel channel;
|
||||
ares_cancel(channel);
|
||||
ares_cancel(channel); /* added in 1.2.0 */
|
||||
ares_process_fd(channel, 0, 0); /* added in 1.4.0 */
|
||||
return 0;
|
||||
}
|
||||
],
|
||||
@@ -1892,19 +2147,26 @@ AC_HELP_STRING([--disable-verbose],[Disable verbose strings]),
|
||||
AC_MSG_RESULT(yes)
|
||||
)
|
||||
|
||||
CURL_CHECK_NATIVE_WINDOWS
|
||||
|
||||
dnl ************************************************************
|
||||
dnl enable SSPI support
|
||||
dnl
|
||||
AC_MSG_CHECKING([whether to enable SSPI support (win32 builds only)])
|
||||
AC_MSG_CHECKING([whether to enable SSPI support (Windows native builds only)])
|
||||
AC_ARG_ENABLE(sspi,
|
||||
AC_HELP_STRING([--enable-sspi],[Enable SSPI])
|
||||
AC_HELP_STRING([--disable-sspi],[Disable SSPI]),
|
||||
[ case "$enableval" in
|
||||
yes)
|
||||
AC_MSG_RESULT(yes)
|
||||
AC_DEFINE(USE_WINDOWS_SSPI, 1, [to enable SSPI support])
|
||||
AC_SUBST(USE_WINDOWS_SSPI)
|
||||
curl_sspi_msg="yes"
|
||||
if test "$ac_cv_native_windows" = "yes"; then
|
||||
AC_MSG_RESULT(yes)
|
||||
AC_DEFINE(USE_WINDOWS_SSPI, 1, [to enable SSPI support])
|
||||
AC_SUBST(USE_WINDOWS_SSPI)
|
||||
curl_sspi_msg="yes"
|
||||
else
|
||||
AC_MSG_RESULT(no)
|
||||
AC_MSG_WARN([--enable-sspi Ignored. Only supported on native Windows builds.])
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
AC_MSG_RESULT(no)
|
||||
@@ -2030,9 +2292,23 @@ if test "x$ws2" = "xyes"; then
|
||||
dnl end.
|
||||
|
||||
LIBS="$LIBS -lws2_32"
|
||||
TEST_SERVER_LIBS="$TEST_SERVER_LIBS -lws2_32"
|
||||
|
||||
fi
|
||||
|
||||
dnl
|
||||
dnl All the library dependencies put into $LIB apply to libcurl only.
|
||||
dnl Those in $CURL_LIBS apply to the curl command-line client only.
|
||||
dnl Those in $TEST_SERVER_LIBS apply to test servers only.
|
||||
dnl Those in $ALL_LIBS apply to all targets, including test targets.
|
||||
dnl
|
||||
LIBCURL_LIBS=$LIBS
|
||||
|
||||
AC_SUBST(LIBCURL_LIBS)
|
||||
AC_SUBST(CURL_LIBS)
|
||||
AC_SUBST(TEST_SERVER_LIBS)
|
||||
LIBS=$ALL_LIBS dnl LIBS is a magic variable that's used for every link
|
||||
|
||||
AM_CONDITIONAL(CROSSCOMPILING, test x$cross_compiling = xyes)
|
||||
|
||||
AC_CONFIG_FILES([Makefile \
|
||||
@@ -2074,6 +2350,7 @@ AC_MSG_NOTICE([Configured to build curl/libcurl:
|
||||
Install prefix: ${prefix}
|
||||
Compiler: ${CC}
|
||||
SSL support: ${curl_ssl_msg}
|
||||
SSH support: ${curl_ssh_msg}
|
||||
zlib support: ${curl_zlib_msg}
|
||||
krb4 support: ${curl_krb4_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
|
||||
# you should have received as part of this distribution. The terms
|
||||
@@ -181,8 +181,17 @@ while test $# -gt 0; do
|
||||
;;
|
||||
|
||||
--libs)
|
||||
echo -L@libdir@ -lcurl @LDFLAGS@ @LIBS@
|
||||
;;
|
||||
if test "X@libdir@" != "X/usr/lib"; then
|
||||
CURLLIBDIR="-L@libdir@ "
|
||||
else
|
||||
CURLLIBDIR=""
|
||||
fi
|
||||
if test "X@REQUIRE_LIB_DEPS@" = "Xyes"; then
|
||||
echo ${CURLLIBDIR}-lcurl @LDFLAGS@ @LIBCURL_LIBS@ @LIBS@
|
||||
else
|
||||
echo ${CURLLIBDIR}-lcurl @LDFLAGS@ @LIBS@
|
||||
fi
|
||||
;;
|
||||
|
||||
*)
|
||||
echo "unknown option: $1"
|
||||
|
@@ -142,8 +142,8 @@ Rexx
|
||||
|
||||
Ruby
|
||||
|
||||
Written by Hirotaka Matsuyuki
|
||||
http://www.d1.dion.ne.jp/~matuyuki/ruby.html
|
||||
Written by Ross Bamford
|
||||
http://curb.rubyforge.org/
|
||||
|
||||
Scheme
|
||||
|
||||
@@ -155,6 +155,11 @@ S-Lang
|
||||
S-Lang binding written by John E Davis
|
||||
http://www.jedsoft.org/slang/modules/curl.html
|
||||
|
||||
Smalltalk
|
||||
|
||||
Smalltalk binding written by Danil Osipchuk
|
||||
http://www.squeaksource.com/CurlPlugin/
|
||||
|
||||
SPL
|
||||
|
||||
SPL binding written by Clifford Wolf
|
||||
@@ -177,7 +182,7 @@ Q
|
||||
wxWidgets
|
||||
|
||||
Written by Casey O'Donnell
|
||||
http://homepage.mac.com/codonnell/wxcurldav/
|
||||
http://wxcode.sourceforge.net/components/wxcurl/
|
||||
|
||||
XBLite
|
||||
|
||||
|
@@ -17,7 +17,9 @@ Join the Community
|
||||
you start sending patches! We prefer patches and discussions being held on
|
||||
the mailing list(s), not sent to individuals.
|
||||
|
||||
The License Issue
|
||||
We also hang out on IRC in #curl on irc.freenode.net
|
||||
|
||||
License
|
||||
|
||||
When contributing with code, you agree to put your changes and new code under
|
||||
the same license curl and libcurl is already using unless stated and agreed
|
||||
@@ -43,9 +45,10 @@ The License Issue
|
||||
|
||||
What To Read
|
||||
|
||||
Source code, the man pages, the INTERNALS document, the TODO, the most recent
|
||||
CHANGES. Just lurking on the libcurl mailing list is gonna give you a lot of
|
||||
insights on what's going on right now. Asking there is a good idea too.
|
||||
Source code, the man pages, the INTERNALS document, TODO, KNOWN_BUGS, the
|
||||
most recent CHANGES. Just lurking on the libcurl mailing list is gonna give
|
||||
you a lot of insights on what's going on right now. Asking there is a good
|
||||
idea too.
|
||||
|
||||
Naming
|
||||
|
||||
@@ -170,3 +173,21 @@ How To Make a Patch
|
||||
|
||||
http://gnuwin32.sourceforge.net/packages/patch.htm
|
||||
http://gnuwin32.sourceforge.net/packages/diffutils.htm
|
||||
|
||||
How to get your patches into the libcurl sources
|
||||
|
||||
1. Submit your patch to the curl-library mailing list
|
||||
|
||||
2. Make the patch against as recent sources as possible.
|
||||
|
||||
3. Make sure your patch adheres to the source indent and coding style of
|
||||
already existing source code. Failing to do so just adds more work for me.
|
||||
|
||||
4. Respond to replies on the list about the patch and answer questions and/or
|
||||
fix nits/flaws. This is very important. I will take lack of replies as a
|
||||
sign that you're not very anxious to get your patch accepted and I tend to
|
||||
simply drop such patches from my TODO list.
|
||||
|
||||
5. If you've followed the above mentioned paragraphs and your patch still
|
||||
hasn't been incorporated after some weeks, consider resubmitting them to
|
||||
the list.
|
||||
|
@@ -1,11 +1,11 @@
|
||||
Date: May 15, 2006
|
||||
Date: February 11, 2007
|
||||
Author: Daniel Stenberg <daniel@haxx.se>
|
||||
URL: http://curl.haxx.se/legal/distro-dilemma.html
|
||||
|
||||
Condition
|
||||
|
||||
This document is written to describe the situation as it is right
|
||||
now. libcurl 7.15.3 is currently the latest version available. Things may of
|
||||
This document is written to describe the situation as it is right now.
|
||||
libcurl 7.16.1 is currently the latest version available. Things may of
|
||||
course change in the future.
|
||||
|
||||
This document reflects my view and understanding of these things. Please tell
|
||||
@@ -48,24 +48,34 @@ Part of the Operating System
|
||||
Debian does however not take this stance and has officially(?) claimed that
|
||||
OpenSSL is not a required part of the Debian operating system
|
||||
|
||||
Some people claim that this paragraph cannot be exploited this way by a Linux
|
||||
distro, but I am not a lawyer and that is a discussion left outside of this
|
||||
document.
|
||||
|
||||
GnuTLS
|
||||
|
||||
With the release of libcurl 7.14.0 (May 2005), libcurl can now get built to
|
||||
use GnuTLS instead of OpenSSL. GnuTLS is an LGPL[7] licensed library that
|
||||
offers a matching set of features as OpenSSL does. Now, you can build and
|
||||
distribute an TLS/SSL capable libcurl without including any Original BSD
|
||||
licensed code.
|
||||
Since May 2005 libcurl can get built to use GnuTLS instead of OpenSSL. GnuTLS
|
||||
is an LGPL[7] licensed library that offers a matching set of features as
|
||||
OpenSSL does. Now, you can build and distribute an TLS/SSL capable libcurl
|
||||
without including any Original BSD licensed code.
|
||||
|
||||
I believe Debian is the first distro to provide libcurl/GnutTLS packages.
|
||||
I believe Debian is the first (only?) distro that provides libcurl/GnutTLS
|
||||
packages.
|
||||
|
||||
GnuTLS vs OpenSSL
|
||||
yassl
|
||||
|
||||
While these two libraries offer similar features, they are not equal. Both
|
||||
libraries have features the other one lacks. libcurl does not (yet) offer a
|
||||
standardized stable ABI if you decide to switch from using libcurl-openssl to
|
||||
libcurl-gnutls or vice versa. The GnuTLS support is very recent in libcurl
|
||||
and it has not been tested nor used very extensively, while the OpenSSL
|
||||
equivalent code has been used and thus matured for more than seven (7) years.
|
||||
libcurl can get also get built to use yassl for the TLS/SSL layer. yassl is a
|
||||
GPL[3] licensed library.
|
||||
|
||||
|
||||
GnuTLS vs OpenSSL vs yassl
|
||||
|
||||
While these three libraries offer similar features, they are not equal.
|
||||
libcurl does not (yet) offer a standardized stable ABI if you decide to
|
||||
switch from using libcurl-openssl to libcurl-gnutls or vice versa. The GnuTLS
|
||||
and yassl support is very recent in libcurl and it has not been tested nor
|
||||
used very extensively, while the OpenSSL equivalent code has been used and
|
||||
thus matured since 1999.
|
||||
|
||||
GnuTLS
|
||||
- LGPL licensened
|
||||
@@ -82,7 +92,12 @@ GnuTLS vs OpenSSL
|
||||
- provides crypto functions libcurl uses for NTLM
|
||||
- libcurl can do non-blocking connects with it in 7.15.4 and later
|
||||
|
||||
The Better License, Original BSD or LGPL?
|
||||
yassl
|
||||
- GPL licensed
|
||||
- much untested and unproven in the real work by (lib)curl users so we don't
|
||||
know a lot about restrictions or benefits from using this
|
||||
|
||||
The Better License, Original BSD, GPL or LGPL?
|
||||
|
||||
It isn't obvious or without debate to any objective interested party that
|
||||
either of these licenses are the "better" or even the "preferred" one in a
|
||||
@@ -91,8 +106,8 @@ The Better License, Original BSD or LGPL?
|
||||
Instead, I think we should accept the fact that the SSL/TLS libraries and
|
||||
their different licenses will fit different applications and their authors
|
||||
differently depending on the applications' licenses and their general usage
|
||||
pattern (considering how LGPL libraries for example can be burdensome for
|
||||
embedded systems usage).
|
||||
pattern (considering how GPL and LGPL libraries for example can be burdensome
|
||||
for embedded systems usage).
|
||||
|
||||
In Debian land, there seems to be a common opinion that LGPL is "maximally
|
||||
compatible" with apps while Original BSD is not. Like this:
|
||||
@@ -101,8 +116,8 @@ The Better License, Original BSD or LGPL?
|
||||
|
||||
More SSL Libraries
|
||||
|
||||
In libcurl, there's no stopping us here. There are at least a few more Open
|
||||
Source/Free SSL/TLS libraries and we would very much like to support them as
|
||||
In libcurl, there's no stopping us here. There are more Open Source/Free
|
||||
SSL/TLS libraries out there and we would very much like to support them as
|
||||
well, to offer application authors an even wider scope of choice.
|
||||
|
||||
Application Angle of this Problem
|
||||
@@ -137,7 +152,7 @@ Project cURL Angle of this Problem
|
||||
Distro Angle of this Problem
|
||||
|
||||
To my knowledge there is only one distro that ships libcurl built with either
|
||||
one of the SSL libs supported.
|
||||
OpenSSL or GnuTLS.
|
||||
|
||||
Debian Linux is now (since mid September 2005) providing two different
|
||||
libcurl packages, one for libcurl built with OpenSSL and one built with
|
||||
@@ -145,56 +160,6 @@ Distro Angle of this Problem
|
||||
single system simultaneously. This has been said to be a transitional system
|
||||
not desired to keep in the long run.
|
||||
|
||||
Fixing the Only Problem
|
||||
|
||||
The only problem is thus for distributions that want to offer libcurl
|
||||
versions built with more than one SSL/TLS library.
|
||||
|
||||
Since multiple libcurl binaries using different names are ruled out, we need
|
||||
to come up with a way to have one single libcurl that someone uses different
|
||||
underlying libraries. The best(?) approach currently suggested involves this:
|
||||
|
||||
A new intermediate library (named lib2 so far in the discussions) with the
|
||||
single purpose of providing libcurl with SSL/TLS capabilities. It would have
|
||||
a unified API and ABI no matter what underlying library it would use.
|
||||
|
||||
There would be one lib2 binary provided for each supported SSL/TLS library.
|
||||
For example: lib2-openssl, lib2-gnutls, lib2-yassl, lib2-matrixssl and
|
||||
lib2-nossl. Yes, take note of the last one that provides the lib2 ABI but
|
||||
that lacks the actual powers.
|
||||
|
||||
When libcurl is built and linked, it will be linked against a lib2 with the
|
||||
set ABI.
|
||||
|
||||
When you link an app against libcurl, it would also need to provide one of
|
||||
the (many) lib2 libs to decide what approach that fits the app. An app that
|
||||
doesn't want SSL at all would still need to link with the lib2-nossl lib.
|
||||
|
||||
GPL apps can pick the lib2-gnutls, others may pick the lib2-openssl.
|
||||
|
||||
This concept works equally well both for shared and static libraries.
|
||||
|
||||
A positive side effect of this approach could be a more generic "de facto"
|
||||
standard API for SSL/TLS libraries.
|
||||
|
||||
When Will This Happen
|
||||
|
||||
This is not a problem in curl, it doesn't solve any actual technical problems
|
||||
in our project. Don't hold your breath for this to happen very soon (if at
|
||||
all) unless you step forward and contribute.
|
||||
|
||||
The suggestion that is outlined above is still only a suggestion. Feel free
|
||||
to bring a better idea!
|
||||
|
||||
Also, to keep in mind: I don't want this new concept to have too much of an
|
||||
impact on the existing code. Preferably it should be possible to build the
|
||||
code like today (without the use of lib2), should you decide to ignore the
|
||||
problems outlined in this document.
|
||||
|
||||
Work on this was suggested by Richard Atterer:
|
||||
|
||||
http://curl.haxx.se/mail/lib-2005-09/0066.html
|
||||
|
||||
Footnotes
|
||||
|
||||
[1] = http://www.xfree86.org/3.3.6/COPYRIGHT2.html#6
|
||||
|
63
docs/FAQ
63
docs/FAQ
@@ -1,4 +1,4 @@
|
||||
Updated: November 2, 2005 (http://curl.haxx.se/docs/faq.html)
|
||||
Updated: February 11, 2007 (http://curl.haxx.se/docs/faq.html)
|
||||
_ _ ____ _
|
||||
___| | | | _ \| |
|
||||
/ __| | | | |_) | |
|
||||
@@ -114,10 +114,10 @@ FAQ
|
||||
libcurl
|
||||
|
||||
A free and easy-to-use client-side URL transfer library, supporting FTP,
|
||||
FTPS, HTTP, HTTPS, TELNET, DICT, FILE and LDAP. libcurl supports
|
||||
HTTPS certificates, HTTP POST, HTTP PUT, FTP uploading, kerberos, HTTP
|
||||
form based upload, proxies, cookies, user+password authentication, file
|
||||
transfer resume, http proxy tunneling and more!
|
||||
FTPS, HTTP, HTTPS, SCP, SFTP, TFTP, TELNET, DICT, FILE and LDAP. libcurl
|
||||
supports HTTPS certificates, HTTP POST, HTTP PUT, FTP uploading, kerberos,
|
||||
HTTP form based upload, proxies, cookies, user+password authentication,
|
||||
file transfer resume, http proxy tunneling and more!
|
||||
|
||||
libcurl is highly portable, it builds and works identically on numerous
|
||||
platforms, including Solaris, NetBSD, FreeBSD, OpenBSD, Darwin, HPUX,
|
||||
@@ -132,7 +132,8 @@ FAQ
|
||||
A command line tool for getting or sending files using URL syntax.
|
||||
|
||||
Since curl uses libcurl, it supports a range of common Internet protocols,
|
||||
currently including HTTP, HTTPS, FTP, FTPS, LDAP, DICT, TELNET and FILE.
|
||||
currently including HTTP, HTTPS, FTP, FTPS, SCP, SFTP, TFTP, LDAP, DICT,
|
||||
TELNET and FILE.
|
||||
|
||||
We pronounce curl and cURL with an initial k sound: [kurl].
|
||||
|
||||
@@ -156,7 +157,7 @@ FAQ
|
||||
|
||||
1.3 What is curl not?
|
||||
|
||||
Curl is *not* a wget clone. That is a common misconception. Never, during
|
||||
Curl is not a wget clone. That is a common misconception. Never, during
|
||||
curl's development, have we intended curl to replace wget or compete on its
|
||||
market. Curl is targeted at single-shot file transfers.
|
||||
|
||||
@@ -171,9 +172,10 @@ FAQ
|
||||
Curl is not a PHP tool, even though it works perfectly well when used from
|
||||
or with PHP (when using the PHP/CURL module).
|
||||
|
||||
Curl is not a single-OS program. Curl exists, compiles, builds and runs
|
||||
under a wide range of operating systems, including all modern Unixes (and a
|
||||
bunch of older ones too), Windows, Amiga, BeOS, OS/2, OS X, QNX etc.
|
||||
Curl is not a program for a single operating system. Curl exists, compiles,
|
||||
builds and runs under a wide range of operating systems, including all
|
||||
modern Unixes (and a bunch of older ones too), Windows, Amiga, BeOS, OS/2,
|
||||
OS X, QNX etc.
|
||||
|
||||
1.4 When will you make curl do XXXX ?
|
||||
|
||||
@@ -211,7 +213,7 @@ FAQ
|
||||
improvements and have them inserted in the main sources (of course on the
|
||||
condition that developers agree on that the fixes are good).
|
||||
|
||||
The full list of the more than 450 contributors is found in the docs/THANKS
|
||||
The full list of the more than 530 contributors is found in the docs/THANKS
|
||||
file.
|
||||
|
||||
curl is developed by a community, with Daniel at the wheel.
|
||||
@@ -287,13 +289,13 @@ FAQ
|
||||
|
||||
Some facts to use as input to the math:
|
||||
|
||||
curl packages have been downloaded from the curl.haxx.se site well over a
|
||||
million times. curl is installed by default with most Linux
|
||||
curl packages are downloaded from the curl.haxx.se and mirrors almost one
|
||||
million times per year. curl is installed by default with most Linux
|
||||
distributions. curl is installed by default with Mac OS X. curl and libcurl
|
||||
as used by numerous applications that include libcurl binaries in their
|
||||
distribution packages (like Adobe Acrobat Reader and Google Earth).
|
||||
|
||||
More than 40 known named companies use curl in commercial environments and
|
||||
More than 60 known named companies use curl in commercial environments and
|
||||
products. More than 100 known named open source projects depend on
|
||||
(lib)curl.
|
||||
|
||||
@@ -305,6 +307,9 @@ FAQ
|
||||
based web servers. A guess is that a fair amount of these Linux
|
||||
installations have curl installed.
|
||||
|
||||
All this taken together, there is no doubt that there are millions of
|
||||
(lib)curl users.
|
||||
|
||||
http://curl.haxx.se/docs/companies.html
|
||||
http://curl.haxx.se/docs/programs.html
|
||||
http://curl.haxx.se/libcurl/using/apps.html
|
||||
@@ -338,8 +343,6 @@ FAQ
|
||||
./configure places the -L/usr/local/ssl/lib early enough in the command
|
||||
line to make things work
|
||||
|
||||
Solution submitted by: Bob Allison <allisonb@users.sourceforge.net>
|
||||
|
||||
2.1.2 only the libssl lib is missing
|
||||
|
||||
If all include files and the libcrypto lib is present, with only the
|
||||
@@ -355,10 +358,10 @@ FAQ
|
||||
|
||||
2.2 Does curl work/build with other SSL libraries?
|
||||
|
||||
Curl has been written to use OpenSSL or GnuTLS, although there should not be
|
||||
many problems using a different library. If anyone does "port" curl to use a
|
||||
different SSL library, we are of course very interested in getting the
|
||||
patch!
|
||||
Curl has been written to use OpenSSL, GnuTLS, yassl or NSS, although there
|
||||
should not be many problems using a different library. If anyone does "port"
|
||||
curl to use a different SSL library, we are of course very interested in
|
||||
getting the patch!
|
||||
|
||||
2.3 Where can I find a copy of LIBEAY32.DLL?
|
||||
|
||||
@@ -464,10 +467,12 @@ FAQ
|
||||
install and use them, in the libcurl section of the curl web site:
|
||||
http://curl.haxx.se/libcurl/
|
||||
|
||||
In February 2003, there are interfaces available for the following
|
||||
languages: Basic, C, C++, Cocoa, Dylan, Euphoria, Java, Lua, Object-Pascal,
|
||||
Pascal, Perl, PHP, PostgreSQL, Python, Rexx, Ruby, Scheme and Tcl. By the
|
||||
time you read this, additional ones may have appeared!
|
||||
In February 2007, there are interfaces available for the following
|
||||
languages: Ada95, Basic, C, C++, Ch, Cocoa, D, Dylan, Euphoria, Ferite,
|
||||
Gambas, glib/GTK+, Java, Lisp, Lua, Mono, .NET, Object-Pascal, O'Caml,
|
||||
Pascal, Perl, PHP, PostgreSQL, Python, R, Rexx, Ruby, Scheme, S-Lang,
|
||||
Smalltalk, SPL, Tcl, Visual Basic, Q, wxwidgets and XBLite. By the time you
|
||||
read this, additional ones may have appeared!
|
||||
|
||||
3.10 What about SOAP, WebDAV, XML-RPC or similar protocols over HTTP?
|
||||
|
||||
@@ -750,7 +755,9 @@ FAQ
|
||||
4.9 Curl can't authenticate to the server that requires NTLM?
|
||||
|
||||
This is supported in curl 7.10.6 or later. No earlier curl version knows
|
||||
of this magic.
|
||||
of this magic. Later versions require the OpenSSL or Microsoft Windows
|
||||
libraries to provide this functionality. Using GnuTLS or NSS libraries will
|
||||
not provide NTLM authentication functionality in curl.
|
||||
|
||||
NTLM is a Microsoft proprietary protocol. Proprietary formats are evil. You
|
||||
should not use such ones.
|
||||
@@ -839,6 +846,8 @@ FAQ
|
||||
|
||||
http://www.gnu.org/software/gnutls/manual/html_node/Multi_002dthreaded-applications.html
|
||||
|
||||
No special locking is needed with a NSS-powered libcurl. NSS is thread-safe.
|
||||
|
||||
5.2 How can I receive all data into a large memory chunk?
|
||||
|
||||
[ See also the examples/getinmemory.c source ]
|
||||
@@ -896,8 +905,6 @@ FAQ
|
||||
Similarly, if you use CURLOPT_READDATA you must also specify
|
||||
CURLOPT_READFUNCTION.
|
||||
|
||||
(Provided by Joel DeYoung and Bob Schader)
|
||||
|
||||
5.6 What about Keep-Alive or persistent connections?
|
||||
|
||||
curl and libcurl have excellent support for persistent connections when
|
||||
@@ -916,8 +923,6 @@ FAQ
|
||||
options to the command line compiler. /MD (linking against MSVCRT dll) seems
|
||||
to be the most commonly used option.
|
||||
|
||||
(Provided by Andrew Francis)
|
||||
|
||||
When building an application that uses the static libcurl library, you must
|
||||
add -DCURL_STATICLIB to your CFLAGS. Otherwise the linker will look for
|
||||
dynamic import symbols. If you get linker error like "unknown symbol
|
||||
|
@@ -33,6 +33,7 @@ libcurl supports
|
||||
- supports large files (>2GB and >4GB) both upload/download
|
||||
- replacable memory functions (malloc, free, realloc, etc)
|
||||
- asynchronous name resolving (*6)
|
||||
- both a push and a pull style interface
|
||||
|
||||
HTTP
|
||||
- HTTP/1.1 compliant (optionally uses 1.0)
|
||||
@@ -40,6 +41,7 @@ HTTP
|
||||
- PUT
|
||||
- HEAD
|
||||
- POST
|
||||
- Pipelining
|
||||
- multipart formpost (RFC1867-style)
|
||||
- authentication: Basic, Digest, NTLM(*1), GSS-Negotiate/Negotiate(*3) and
|
||||
SPNEGO (*4) to server and proxy
|
||||
@@ -87,7 +89,6 @@ FTP
|
||||
- via http-proxy
|
||||
- all operations can be tunneled through a http-proxy
|
||||
- customizable to retrieve file modification date
|
||||
- third party transfers
|
||||
- no dir depth limit
|
||||
|
||||
FTPS (*1)
|
||||
@@ -95,6 +96,13 @@ FTPS (*1)
|
||||
- explicit "AUTH TSL" and "AUTH SSL" usage to "upgrade" plain ftp://
|
||||
connection to use SSL for both or one of the connections
|
||||
|
||||
SCP (*8)
|
||||
- both password and public key auth
|
||||
|
||||
SFTP (*8)
|
||||
- both password and public key auth
|
||||
- with custom commands sent before/after the transfer
|
||||
|
||||
TFTP
|
||||
- download / upload
|
||||
|
||||
@@ -117,10 +125,11 @@ FILE
|
||||
FOOTNOTES
|
||||
=========
|
||||
|
||||
*1 = requires OpenSSL or GnuTLS
|
||||
*1 = requires OpenSSL, GnuTLS, NSS or yassl
|
||||
*2 = requires OpenLDAP
|
||||
*3 = requires a GSSAPI-compliant library, such as Heimdal or similar.
|
||||
*4 = requires FBopenssl
|
||||
*5 = requires a krb4 library, such as the MIT one or similar.
|
||||
*6 = requires c-ares
|
||||
*7 = requires OpenSSL specificly, as GnuTLS only supports SSLv3 and TLSv1
|
||||
*7 = requires OpenSSL or NSS, as GnuTLS only supports SSLv3 and TLSv1
|
||||
*8 = requires libssh2
|
||||
|
172
docs/INSTALL
172
docs/INSTALL
@@ -16,7 +16,6 @@ Installing Binary Packages
|
||||
|
||||
UNIX
|
||||
====
|
||||
|
||||
A normal unix installation is made in three or four steps (after you've
|
||||
unpacked the source archive):
|
||||
|
||||
@@ -52,12 +51,12 @@ UNIX
|
||||
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:
|
||||
|
||||
./configure --with-ssl
|
||||
./configure --with-ssl
|
||||
|
||||
If you have OpenSSL installed somewhere else (for example, /opt/OpenSSL,)
|
||||
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
|
||||
have OpenSSL installed in your system, you can run configure like this:
|
||||
@@ -141,19 +140,55 @@ UNIX
|
||||
yassl with its OpenSSL emulation enabled and point to that directory root
|
||||
with configure --with-ssl.
|
||||
|
||||
To build with NSS support instead of OpenSSL for SSL/TLS, note that
|
||||
you need to use both --without-ssl and --with-nss.
|
||||
|
||||
|
||||
Win32
|
||||
=====
|
||||
|
||||
Building Windows DLLs and C run-time (CRT) linkage issues
|
||||
---------------------------------------------------------
|
||||
|
||||
As a general rule, building a DLL with static CRT linkage is highly
|
||||
discouraged, and intermixing CRTs in the same app is something to
|
||||
avoid at any cost.
|
||||
|
||||
Reading and comprehension of Microsoft Knowledge Base articles
|
||||
KB94248 and KB140584 is a must for any Windows developer. Especially
|
||||
important is full understanding if you are not going to follow the
|
||||
advice given above.
|
||||
|
||||
KB94248 - How To Use the C Run-Time
|
||||
http://support.microsoft.com/kb/94248/en-us
|
||||
|
||||
KB140584 - How to link with the correct C Run-Time (CRT) library
|
||||
http://support.microsoft.com/kb/140584/en-us
|
||||
|
||||
If your app is misbehaving in some strange way, or it is suffering
|
||||
from memory corruption, before asking for further help, please try
|
||||
first to rebuild every single library your app uses as well as your
|
||||
app using the debug multithreaded dynamic C runtime.
|
||||
|
||||
MingW32
|
||||
-------
|
||||
|
||||
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.
|
||||
|
||||
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
|
||||
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
|
||||
------
|
||||
@@ -184,7 +219,7 @@ Win32
|
||||
documentation on how to compile zlib. Define the ZLIB_PATH environment
|
||||
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.
|
||||
|
||||
@@ -198,7 +233,7 @@ Win32
|
||||
Before running nmake define the OPENSSL_PATH environment variable with
|
||||
the root/base directory of OpenSSL, for example:
|
||||
|
||||
set OPENSSL_PATH=c:\openssl-0.9.7d
|
||||
set OPENSSL_PATH=c:\openssl-0.9.8d
|
||||
|
||||
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
|
||||
@@ -292,7 +327,6 @@ Win32
|
||||
|
||||
IBM OS/2
|
||||
========
|
||||
|
||||
Building under OS/2 is not much different from building under unix.
|
||||
You need:
|
||||
|
||||
@@ -320,6 +354,7 @@ IBM OS/2
|
||||
If you're getting huge binaries, probably your makefiles have the -g in
|
||||
CFLAGS.
|
||||
|
||||
|
||||
VMS
|
||||
===
|
||||
(The VMS section is in whole contributed by the friendly Nico Baggus)
|
||||
@@ -390,6 +425,7 @@ VMS
|
||||
13-jul-2001
|
||||
N. Baggus
|
||||
|
||||
|
||||
QNX
|
||||
===
|
||||
(This section was graciously brought to us by David Bentham)
|
||||
@@ -441,17 +477,16 @@ AmigaOS
|
||||
|
||||
NetWare
|
||||
=======
|
||||
|
||||
To compile curl.nlm / libcurl.nlm you need:
|
||||
- either any gcc / nlmconv, or CodeWarrior 7 PDK 4 or later.
|
||||
- gnu make and awk running on the platform you compile on;
|
||||
native Win32 versions can be downloaded from:
|
||||
http://www.gknw.com/development/prgtools/
|
||||
http://www.gknw.net/development/prgtools/
|
||||
- recent Novell LibC SDK available from:
|
||||
http://developer.novell.com/ndk/libc.htm
|
||||
- optional zlib sources (at the moment only dynamic linking with zlib.imp);
|
||||
sources with NetWare Makefile can be obtained from:
|
||||
http://www.gknw.com/mirror/zlib/
|
||||
http://www.gknw.net/mirror/zlib/
|
||||
- optional OpenSSL sources (version 0.9.8 or later which builds with BSD);
|
||||
|
||||
Set a search path to your compiler, linker and tools; on Linux make
|
||||
@@ -465,14 +500,112 @@ NetWare
|
||||
with 'OSTYPE=linux-rh9-gnu' and the detection in the Makefile worked...
|
||||
Any help in testing appreciated!
|
||||
Builds automatically created 8 times a day from current CVS are here:
|
||||
http://www.gknw.com/mirror/curl/autobuilds/
|
||||
http://www.gknw.net/mirror/curl/autobuilds/
|
||||
the status of these builds can be viewed at the autobuild table:
|
||||
http://curl.haxx.se/auto/
|
||||
|
||||
|
||||
eCos
|
||||
====
|
||||
curl does not use the eCos build system, so you must first build eCos
|
||||
separately, then link curl to the resulting eCos library. Here's a sample
|
||||
configure line to do so on an x86 Linux box targeting x86:
|
||||
|
||||
GCCLIB=`gcc -print-libgcc-file-name` && \
|
||||
CFLAGS="-D__ECOS=1 -nostdinc -I$ECOS_INSTALL/include \
|
||||
-I`dirname $GCCLIB`/include" \
|
||||
LDFLAGS="-nostdlib -Wl,--gc-sections -Wl,-static \
|
||||
-L$ECOS_INSTALL/lib -Ttarget.ld -ltarget" \
|
||||
./configure --host=i386 --disable-shared \
|
||||
--without-ssl --without-zlib --disable-manual --disable-ldap
|
||||
|
||||
In most cases, eCos users will be using libcurl from within a custom
|
||||
embedded application. Using the standard 'curl' executable from
|
||||
within eCos means facing the limitation of the standard eCos C
|
||||
startup code which does not allow passing arguments in main(). To
|
||||
run 'curl' from eCos and have it do something useful, you will need
|
||||
to either modify the eCos startup code to pass in some arguments, or
|
||||
modify the curl application itself to retrieve its arguments from
|
||||
some location set by the bootloader or hard-code them.
|
||||
|
||||
Something like the following patch could be used to hard-code some
|
||||
arguments. The MTAB_ENTRY line mounts a RAM disk as the root filesystem
|
||||
(without mounting some kind of filesystem, eCos errors out all file
|
||||
operations which curl does not take to well). The next section synthesizes
|
||||
some command-line arguments for curl to use, in this case to direct curl
|
||||
to read further arguments from a file. It then creates that file on the
|
||||
RAM disk and places within it a URL to download: a file: URL that
|
||||
just happens to point to the configuration file itself. The results
|
||||
of running curl in this way is the contents of the configuration file
|
||||
printed to the console.
|
||||
|
||||
--- src/main.c 19 Jul 2006 19:09:56 -0000 1.363
|
||||
+++ src/main.c 24 Jul 2006 21:37:23 -0000
|
||||
@@ -4286,11 +4286,31 @@
|
||||
}
|
||||
|
||||
|
||||
+#ifdef __ECOS
|
||||
+#include <cyg/fileio/fileio.h>
|
||||
+MTAB_ENTRY( testfs_mte1,
|
||||
+ "/",
|
||||
+ "ramfs",
|
||||
+ "",
|
||||
+ 0);
|
||||
+#endif
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
int res;
|
||||
struct Configurable config;
|
||||
+#ifdef __ECOS
|
||||
+ char *args[] = {"ecos-curl", "-K", "curlconf.txt"};
|
||||
+ FILE *f;
|
||||
+ argc = sizeof(args)/sizeof(args[0]);
|
||||
+ argv = args;
|
||||
+
|
||||
+ f = fopen("curlconf.txt", "w");
|
||||
+ if (f) {
|
||||
+ fprintf(f, "--url file:curlconf.txt");
|
||||
+ fclose(f);
|
||||
+ }
|
||||
+#endif
|
||||
memset(&config, 0, sizeof(struct Configurable));
|
||||
|
||||
config.errors = stderr; /* default errors to stderr */
|
||||
|
||||
|
||||
Minix
|
||||
=====
|
||||
curl can be compiled on Minix 3 using gcc or ACK (starting with
|
||||
ver. 3.1.3). The gcc and bash packages must be installed first.
|
||||
The default heap size allocated to bash is inadequate for running
|
||||
configure and will result in out of memory errors. Increase it with
|
||||
the command:
|
||||
|
||||
chmem =2048000 /usr/local/bin/bash
|
||||
|
||||
Make sure gcc and bash are in the PATH with the command:
|
||||
|
||||
export PATH=/usr/gnu/bin:$PATH
|
||||
|
||||
then configure curl with a command like this:
|
||||
|
||||
./configure CC=gcc GREP=grep AR=/usr/gnu/bin/gar --disable-ldap
|
||||
|
||||
Then simply run 'make'.
|
||||
|
||||
To compile with the ACK C compiler:
|
||||
|
||||
chmem =1024000 /usr/lib/em_cemcom.ansi
|
||||
chmem =512000 /usr/lib/i386/as
|
||||
./configure CC=cc LD=cc GREP=grep CPPFLAGS=-D_POSIX_SOURCE=1 \
|
||||
--disable-ldap
|
||||
make
|
||||
|
||||
|
||||
CROSS COMPILE
|
||||
=============
|
||||
|
||||
(This section was graciously brought to us by Jim Duey, with additions by
|
||||
Dan Fandrich)
|
||||
|
||||
@@ -518,9 +651,9 @@ CROSS COMPILE
|
||||
|
||||
./configure --host=ARCH-OS
|
||||
|
||||
|
||||
REDUCING SIZE
|
||||
=============
|
||||
|
||||
There are a number of configure options that can be used to reduce the
|
||||
size of libcurl for embedded applications where binary size is an
|
||||
important factor. First, be sure to set the CFLAGS variable when
|
||||
@@ -542,7 +675,7 @@ REDUCING SIZE
|
||||
--disable-crypto-auth (disables HTTP cryptographic authentication)
|
||||
--disable-ipv6 (disables support for IPv6)
|
||||
--disable-verbose (eliminates debugging strings and error code strings)
|
||||
--enable-hidden-symbols (eliminates unneeded symbols in library)
|
||||
--enable-hidden-symbols (eliminates unneeded symbols in the shared library)
|
||||
--without-libidn (disables support for the libidn DNS library)
|
||||
--without-ssl (disables support for SSL/TLS)
|
||||
--without-zlib (disables support for on-the-fly decompression)
|
||||
@@ -553,7 +686,7 @@ REDUCING SIZE
|
||||
Be sure also to strip debugging symbols from your binaries after
|
||||
compiling using 'strip' (or the appropriate variant if cross-compiling).
|
||||
If space is really tight, you may be able to remove some unneeded
|
||||
sections of the library using the -R option to objcopy (e.g. the
|
||||
sections of the shared library using the -R option to objcopy (e.g. the
|
||||
.comment section).
|
||||
|
||||
Using these techniques it is possible to create an HTTP-only shared
|
||||
@@ -589,6 +722,7 @@ PORTS
|
||||
- PowerPC Linux
|
||||
- PowerPC Mac OS 9
|
||||
- PowerPC Mac OS X
|
||||
- SuperH4 Linux 2.6.X
|
||||
- SINIX-Z v5
|
||||
- Sparc Linux
|
||||
- Sparc Solaris 2.4, 2.5, 2.5.1, 2.6, 7, 8, 9, 10
|
||||
@@ -597,12 +731,15 @@ PORTS
|
||||
- StrongARM/ARM7/ARM9 Linux 2.4, 2.6
|
||||
- StrongARM NetBSD 1.4.1
|
||||
- Ultrix 4.3a
|
||||
- UNICOS 9.0
|
||||
- i386 BeOS
|
||||
- i386 DOS
|
||||
- i386 eCos 1.3.1
|
||||
- i386 Esix 4.1
|
||||
- i386 FreeBSD
|
||||
- i386 HURD
|
||||
- i386 Linux 1.3, 2.0, 2.2, 2.3, 2.4, 2.6
|
||||
- i386 MINIX 3.1
|
||||
- i386 NetBSD
|
||||
- i386 Novell NetWare
|
||||
- i386 OS/2
|
||||
@@ -627,3 +764,6 @@ OpenSSL http://www.openssl.org
|
||||
MingW http://www.mingw.org
|
||||
OpenLDAP http://www.openldap.org
|
||||
Zlib http://www.gzip.org/zlib/
|
||||
libssh2 http://www.libssh2.org
|
||||
|
||||
|
||||
|
@@ -3,7 +3,36 @@ join in and help us correct one or more of these! Also be sure to check the
|
||||
changelog of the current development status, as one or more of these problems
|
||||
may have been fixed since this was written!
|
||||
|
||||
34. The SOCKS connection codes don't properly acknowledge (connect) timeouts.
|
||||
44. --ftp-method nocwd does not handle URLs ending with a slash properly (it
|
||||
should list the contents of that directory). See test case 351.
|
||||
|
||||
43. There seems to be a problem when connecting to the Microsoft telnet server.
|
||||
http://curl.haxx.se/bug/view.cgi?id=1720605
|
||||
|
||||
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
|
||||
|
||||
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
|
||||
bad when used with the multi interface.
|
||||
|
||||
34. The SOCKS4 connection codes don't properly acknowledge (connect) timeouts.
|
||||
Also see #12. According to bug #1556528, even the SOCKS5 connect code does
|
||||
not do it right: http://curl.haxx.se/bug/view.cgi?id=1556528,
|
||||
|
||||
33. Doing multi-pass HTTP authentication on a non-default port does not work.
|
||||
This happens because the multi-pass code abuses the redirect following code
|
||||
@@ -39,17 +68,14 @@ may have been fixed since this was written!
|
||||
"system context" will make it use wrong(?) user name - at least when compared
|
||||
to what winhttp does. See http://curl.haxx.se/bug/view.cgi?id=1281867
|
||||
|
||||
25. When doing a CONNECT request with curl it doesn't properly handle if the
|
||||
proxy closes the connection within the authentication "negotiation phase".
|
||||
Like if you do HTTPS or similar over a proxy and you use perhaps
|
||||
--proxy-anyauth. There's work in progress on this problem, and a recent
|
||||
patch was posted here: http://curl.haxx.se/mail/lib-2005-08/0074.html
|
||||
23. SOCKS-related problems:
|
||||
A) libcurl doesn't support SOCKS for IPv6.
|
||||
B) libcurl doesn't support FTPS over a SOCKS proxy.
|
||||
C) We don't have any test cases for SOCKS proxy.
|
||||
E) libcurl doesn't support active FTP over a SOCKS proxy
|
||||
|
||||
23. We don't support SOCKS for IPv6. We don't support FTPS over a SOCKS proxy.
|
||||
We don't have any test cases for SOCKS proxy. We probably have even more
|
||||
bugs and lack of features when a SOCKS proxy is used. And there seem to be a
|
||||
problem with SOCKS when doing FTP: See
|
||||
http://curl.haxx.se/bug/view.cgi?id=1371540
|
||||
We probably have even more bugs and lack of features when a SOCKS proxy is
|
||||
used.
|
||||
|
||||
22. Sending files to a FTP server using curl on VMS, might lead to curl
|
||||
complaining on "unaligned file size" on completion. The problem is related
|
||||
@@ -68,9 +94,6 @@ may have been fixed since this was written!
|
||||
|
||||
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>,
|
||||
<password>, and <fpath> components, encoded as "%00". The problem is that
|
||||
curl_unescape does not detect this, but instead returns a shortened C
|
||||
@@ -92,10 +115,7 @@ may have been fixed since this was written!
|
||||
|
||||
12. When connecting to a SOCKS proxy, the (connect) timeout is not properly
|
||||
acknowledged after the actual TCP connect (during the SOCKS "negotiate"
|
||||
phase). Pointed out by Lucas. Fix: need to select() and timeout properly.
|
||||
|
||||
11. Using configure --disable-[protocol] may cause 'make test' to fail for
|
||||
tests using the disabled protocol(s).
|
||||
phase).
|
||||
|
||||
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
|
||||
|
@@ -16,7 +16,7 @@ clause). You may still build your own copies that use them all, but
|
||||
distributing them as binaries would be to violate the GPL license - unless you
|
||||
accompany your license with an exception[2]. This particular problem was
|
||||
addressed when the Modified BSD license was created, which does not have the
|
||||
annoncement clause that collides with GPL.
|
||||
announcement clause that collides with GPL.
|
||||
|
||||
libcurl http://curl.haxx.se/docs/copyright.html
|
||||
|
||||
@@ -28,7 +28,7 @@ libcurl http://curl.haxx.se/docs/copyright.html
|
||||
OpenSSL http://www.openssl.org/source/license.html
|
||||
|
||||
(May be used for SSL/TLS support) Uses an Original BSD-style license
|
||||
with an announement clause that makes it "incompatible" with GPL. You
|
||||
with an announcement clause that makes it "incompatible" with GPL. You
|
||||
are not allowed to ship binaries that link with OpenSSL that includes
|
||||
GPL code (unless that specific GPL code includes an exception for
|
||||
OpenSSL - a habit that is growing more and more common). If OpenSSL's
|
||||
@@ -47,6 +47,14 @@ yassl http://www.yassl.com/
|
||||
(May be used for SSL/TLS support) Uses the GPL[1] license. If this is
|
||||
a problem for you, consider using OpenSSL or GnuTLS instead.
|
||||
|
||||
NSS http://www.mozilla.org/projects/security/pki/nss/
|
||||
|
||||
(May be used for SSL/TLS support) Is covered by the MPL[4] license,
|
||||
the GPL[1] license and the LGPL[3] license. You may choose to license
|
||||
the code under MPL terms, GPL terms, or LGPL terms. These licenses
|
||||
grant you different permissions and impose different obligations. You
|
||||
should select the license that best meets your needs.
|
||||
|
||||
c-ares http://daniel.haxx.se/projects/c-ares/license.html
|
||||
|
||||
(Used for asynchronous name resolves) Uses an MIT license that is very
|
||||
@@ -88,10 +96,10 @@ fbopenssl
|
||||
that it uses the OpenSSL license and thus shares the same issues as
|
||||
described for OpenSSL above.
|
||||
|
||||
libidn http://www.gnu.org/licenses/lgpl.html
|
||||
libidn http://josefsson.org/libidn/
|
||||
|
||||
(Used for IDNA support) Uses the GNU Lesser General Public
|
||||
License. LGPL is a variation of GPL with slightly less aggressive
|
||||
License [3]. LGPL is a variation of GPL with slightly less aggressive
|
||||
"copyleft". This license requires more requirements to be met when
|
||||
distributing binaries, see the license for details. Also note that if
|
||||
you distribute a binary that includes this library, you must also
|
||||
@@ -104,9 +112,15 @@ OpenLDAP http://www.openldap.org/software/release/license.html
|
||||
libcurl uses OpenLDAP as a shared library only, I have not heard of
|
||||
anyone that ships OpenLDAP linked with libcurl in an app.
|
||||
|
||||
libssh2 http://www.libssh2.org/
|
||||
|
||||
(Used for scp and sftp support) libssh2 uses a Modified BSD-style
|
||||
license.
|
||||
|
||||
[1] = GPL - GNU General Public License: http://www.gnu.org/licenses/gpl.html
|
||||
[2] = http://www.fsf.org/licenses/gpl-faq.html#GPLIncompatibleLibs details on
|
||||
how to write such an exception to the GPL
|
||||
[3] = LGPL - GNU Lesser General Public License:
|
||||
http://www.gnu.org/licenses/lgpl.html
|
||||
[4] = MPL - Mozilla Public License:
|
||||
http://www.mozilla.org/MPL/
|
||||
|
51
docs/MANUAL
51
docs/MANUAL
@@ -7,7 +7,7 @@ LATEST VERSION
|
||||
|
||||
SIMPLE USAGE
|
||||
|
||||
Get the main page from netscape's web-server:
|
||||
Get the main page from Netscape's web-server:
|
||||
|
||||
curl http://www.netscape.com/
|
||||
|
||||
@@ -31,6 +31,24 @@ SIMPLE USAGE
|
||||
|
||||
curl ftp://cool.haxx.se/ http://www.weirdserver.com:8000/
|
||||
|
||||
Get a file off an FTPS server:
|
||||
|
||||
curl ftps://files.are.secure.com/secrets.txt
|
||||
|
||||
or use the more appropriate FTPS way to get the same file:
|
||||
|
||||
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
|
||||
|
||||
Get a web page and store in a local file:
|
||||
@@ -64,11 +82,14 @@ USING PASSWORDS
|
||||
It is just like for FTP, but you may also want to specify and use
|
||||
SSL-specific options for certificates etc.
|
||||
|
||||
Note that using FTPS:// as prefix is the "implicit" way as described in the
|
||||
standards while the recommended "explicit" way is done by using FTP:// and
|
||||
the --ftp-ssl option.
|
||||
|
||||
HTTP
|
||||
|
||||
The HTTP URL doesn't support user and password in the URL string. Curl
|
||||
does support that anyway to provide a ftp-style interface and thus you can
|
||||
pick a file like:
|
||||
Curl also supports user and password in HTTP URLs, thus you can pick a file
|
||||
like:
|
||||
|
||||
curl http://name:passwd@machine.domain/full/path/to/file
|
||||
|
||||
@@ -105,6 +126,8 @@ PROXY
|
||||
|
||||
curl -U user:passwd -x my-proxy:888 http://www.get.this/
|
||||
|
||||
curl also supports SOCKS4 and SOCKS5 proxies with --socks4 and --socks5.
|
||||
|
||||
See also the environment variables Curl support that offer further proxy
|
||||
control.
|
||||
|
||||
@@ -685,9 +708,9 @@ TIME CONDITIONS
|
||||
curl -z -local.html http://remote.server.com/remote.html
|
||||
|
||||
You can specify a "free text" date as condition. Tell curl to only download
|
||||
the file if it was updated since yesterday:
|
||||
the file if it was updated since January 12, 2012:
|
||||
|
||||
curl -z yesterday http://remote.server.com/remote.html
|
||||
curl -z "Jan 12 2012" http://remote.server.com/remote.html
|
||||
|
||||
Curl will then accept a wide range of date formats. You always make the date
|
||||
check the other way around by prepending it with a dash '-'.
|
||||
@@ -846,6 +869,22 @@ PERSISTENT CONNECTIONS
|
||||
transfers faster. If you use a http proxy for file transfers, practically
|
||||
all transfers will be persistent.
|
||||
|
||||
MULTIPLE TRANSFERS WITH A SINGLE COMMAND LINE
|
||||
|
||||
As is mentioned above, you can download multiple files with one command line
|
||||
by simply adding more URLs. If you want those to get saved to a local file
|
||||
instead of just printed to stdout, you need to add one save option for each
|
||||
URL you specify. Note that this also goes for the -O option.
|
||||
|
||||
For example: get two files and use -O for the first and a custom file
|
||||
name for the second:
|
||||
|
||||
curl -O http://url.com/file.txt ftp://ftp.com/moo.exe -o moo.jpg
|
||||
|
||||
You can also upload multiple files in a similar fashion:
|
||||
|
||||
curl -T local1 ftp://ftp.com/moo.exe -T local2 ftp://ftp.com/moo2.txt
|
||||
|
||||
MAILING LISTS
|
||||
|
||||
For your convenience, we have several open mailing lists to discuss curl,
|
||||
|
48
docs/THANKS
48
docs/THANKS
@@ -4,6 +4,7 @@
|
||||
|
||||
If you have contributed but are missing here, please let us know!
|
||||
|
||||
Adam D. Moss
|
||||
Adrian Schuur
|
||||
Alan Pinstein
|
||||
Albert Chin-A-Young
|
||||
@@ -17,6 +18,7 @@ Alexander Kourakos
|
||||
Alexander Krasnostavsky
|
||||
Alexander Lazic
|
||||
Alexander Zhuravlev
|
||||
Alexey Simak
|
||||
Alexis Carvalho
|
||||
Amol Pattekar
|
||||
Andi Jahja
|
||||
@@ -26,6 +28,7 @@ Andreas Olsson
|
||||
Andreas Rieke
|
||||
Andres Garcia
|
||||
Andrew Benham
|
||||
Andrew Biggs
|
||||
Andrew Bushnell
|
||||
Andrew Francis
|
||||
Andrew Fuller
|
||||
@@ -36,18 +39,23 @@ Angus Mackay
|
||||
Antoine Calando
|
||||
Anton Kalmykov
|
||||
Arkadiusz Miskiewicz
|
||||
Armel Asselin
|
||||
Arve Knudsen
|
||||
Ates Goral
|
||||
Augustus Saunders
|
||||
Avery Fay
|
||||
Ben Greear
|
||||
Ben Madsen
|
||||
Benjamin Gerard
|
||||
Bernard Leak
|
||||
Bertrand Demiddelaer
|
||||
Bjorn Reese
|
||||
Bj<EFBFBD>rn Stenberg
|
||||
Bob Schader
|
||||
Bogdan Nicula
|
||||
Brad Burdick
|
||||
Bradford Bruce
|
||||
Brendan Jurd
|
||||
Brent Beardsley
|
||||
Brian Akins
|
||||
Brian Dessent
|
||||
@@ -67,6 +75,7 @@ Christian Robottom Reis
|
||||
Christophe Demory
|
||||
Christophe Legry
|
||||
Christopher R. Palmer
|
||||
Ciprian Badescu
|
||||
Clarence Gardner
|
||||
Clifford Wolf
|
||||
Cody Jones
|
||||
@@ -81,8 +90,10 @@ Damien Adant
|
||||
Dan Becker
|
||||
Dan C
|
||||
Dan Fandrich
|
||||
Dan Nelson
|
||||
Dan Torop
|
||||
Dan Zitter
|
||||
Daniel Johnson
|
||||
Daniel Stenberg
|
||||
Daniel at touchtunes
|
||||
Darryl House
|
||||
@@ -114,7 +125,9 @@ Dimitris Sarris
|
||||
Dinar
|
||||
Dirk Eddelbuettel
|
||||
Dirk Manske
|
||||
Dmitriy Sergeyev
|
||||
Dmitry Bartsevich
|
||||
Dmitry Rechkin
|
||||
Dolbneff A.V
|
||||
Domenico Andreoli
|
||||
Dominick Meglio
|
||||
@@ -124,6 +137,7 @@ Douglas E. Wegscheid
|
||||
Douglas R. Horner
|
||||
Dov Murik
|
||||
Duane Cathey
|
||||
Duncan Mac-Vicar Prett
|
||||
Dustin Boswell
|
||||
Dylan Ellicott
|
||||
Dylan Salisbury
|
||||
@@ -145,6 +159,7 @@ Erwan Legrand
|
||||
Erwin Authried
|
||||
Eugene Kotlyarov
|
||||
Evan Jordan
|
||||
Eygene Ryabinkin
|
||||
Fabrizio Ammollo
|
||||
Fedor Karpelevitch
|
||||
Felix von Leitner
|
||||
@@ -180,6 +195,7 @@ Gwenole Beauchesne
|
||||
G<EFBFBD>tz Babin-Ebell
|
||||
G<EFBFBD>nter Knauf
|
||||
Hamish Mackenzie
|
||||
Hang Kin Lau
|
||||
Hanno Kranzhoff
|
||||
Hans Steegers
|
||||
Hardeep Singh
|
||||
@@ -189,11 +205,13 @@ Henrik Storner
|
||||
Hzhijun
|
||||
Ian Ford
|
||||
Ian Gulliver
|
||||
Ian Turner
|
||||
Ian Wilkes
|
||||
Ignacio Vazquez-Abrams
|
||||
Igor Polyakov
|
||||
Ilguiz Latypov
|
||||
Ilja van Sprundel
|
||||
Ingmar Runge
|
||||
Ingo Ralf Blum
|
||||
Ingo Wilken
|
||||
Jacky Lam
|
||||
@@ -203,11 +221,14 @@ James Clancy
|
||||
James Cone
|
||||
James Gallagher
|
||||
James Griffiths
|
||||
James Housley
|
||||
James MacMillan
|
||||
Jamie Lokier
|
||||
Jamie Newton
|
||||
Jamie Wilkinson
|
||||
Jan Kunder
|
||||
Jared Lundell
|
||||
Jari Sundell
|
||||
Jason S. Priebe
|
||||
Jaz Fresh
|
||||
Jean Jacques Drouin
|
||||
@@ -239,6 +260,7 @@ Jonas Forsman
|
||||
Jonatan Lander
|
||||
Jonathan Hseu
|
||||
Jongki Suwandi
|
||||
Jose Kahan
|
||||
Josh Kapell
|
||||
Juan F. Codagnone
|
||||
Juan Ignacio Herv<72>s
|
||||
@@ -247,6 +269,7 @@ Jukka Pihl
|
||||
Julian Noble
|
||||
Jun-ichiro itojun Hagino
|
||||
Jurij Smakov
|
||||
Justin Fletcher
|
||||
J<EFBFBD>rg Mueller-Tolk
|
||||
J<EFBFBD>rn Hartroth
|
||||
Kai Sommerfeld
|
||||
@@ -292,7 +315,9 @@ Lucas Adamski
|
||||
Lukasz Czekierda
|
||||
Luke Call
|
||||
Luong Dinh Dung
|
||||
Maciej Karpiuk
|
||||
Maciej W. Rozycki
|
||||
Manfred Schwarb
|
||||
Marc Boucher
|
||||
Marcelo Juchem
|
||||
Marcin Konicki
|
||||
@@ -301,18 +326,22 @@ Marcus Webster
|
||||
Mario Schroeder
|
||||
Mark Butler
|
||||
Mark Eichin
|
||||
Mark Lentczner
|
||||
Markus Koetter
|
||||
Markus Moeller
|
||||
Markus Oberhumer
|
||||
Martijn Koster
|
||||
Martin C. Martin
|
||||
Martin Hedenfalk
|
||||
Martin Skinner
|
||||
Marty Kuhrt
|
||||
Maruko
|
||||
Massimiliano Ziccardi
|
||||
Mathias Axelsson
|
||||
Mats Lidell
|
||||
Matt Kraai
|
||||
Matt Veenstra
|
||||
Matt Witherspoon
|
||||
Matthew Blain
|
||||
Matthew Clarke
|
||||
Maurice Barnum
|
||||
@@ -321,6 +350,7 @@ Mettgut Jamalla
|
||||
Michael Benedict
|
||||
Michael Curtis
|
||||
Michael Jahn
|
||||
Michael Jerris
|
||||
Michael Mealling
|
||||
Michael Wallner
|
||||
Michal Bonino
|
||||
@@ -330,28 +360,33 @@ Mihai Ionescu
|
||||
Mikael Sennerholm
|
||||
Mike Bytnar
|
||||
Mike Dobbs
|
||||
Mike Protts
|
||||
Miklos Nemeth
|
||||
Mitz Wark
|
||||
Mohamed Lrhazi
|
||||
Mohun Biswas
|
||||
Moonesamy
|
||||
Nathan O'Sullivan
|
||||
Nathanael Nerode
|
||||
Naveen Noel
|
||||
Neil Dunbar
|
||||
Neil Spring
|
||||
Nic Roets
|
||||
Nick Gimbrone
|
||||
Nick Humfrey
|
||||
Nick Zitzmann
|
||||
Nico Baggus
|
||||
Nicolas Berloquin
|
||||
Nicolas Croiset
|
||||
Nicolas Fran<61>ois
|
||||
Niels van Tongeren
|
||||
Nikita Schmidt
|
||||
Nir Soffer
|
||||
Nis Jorgensen
|
||||
Nodak Sodak
|
||||
Norbert Novotny
|
||||
Ofer
|
||||
Olaf Stueben
|
||||
Olaf St<53>ben
|
||||
Oren Tirosh
|
||||
P R Schaffner
|
||||
@@ -371,6 +406,7 @@ Peter Bray
|
||||
Peter Forret
|
||||
Peter Heuchert
|
||||
Peter Pentchev
|
||||
Peter Silva
|
||||
Peter Su
|
||||
Peter Sylvester
|
||||
Peter Todd
|
||||
@@ -390,6 +426,7 @@ Ralph Beckmann
|
||||
Ralph Mitchell
|
||||
Ramana Mokkapati
|
||||
Randy McMurchy
|
||||
Ravi Pratap
|
||||
Reinout van Schouwen
|
||||
Renaud Chaillat
|
||||
Renaud Duhaut
|
||||
@@ -406,8 +443,13 @@ Richard Gorton
|
||||
Richard Prescott
|
||||
Rick Jones
|
||||
Rick Richardson
|
||||
Rob Crittenden
|
||||
Rob Jones
|
||||
Rob Stanzel
|
||||
Robert A. Monat
|
||||
Robert D. Young
|
||||
Robert Foreman
|
||||
Robert Iakobashvili
|
||||
Robert Olson
|
||||
Robert Weaver
|
||||
Robin Kay
|
||||
@@ -434,6 +476,7 @@ Scott Davis
|
||||
Sebastien Willemijns
|
||||
Sergio Ballestrero
|
||||
Seshubabu Pasam
|
||||
Sh Diao
|
||||
Shard
|
||||
Shawn Poulson
|
||||
Shmulik Regev
|
||||
@@ -444,6 +487,7 @@ Simon Liu
|
||||
Spiridonoff A.V
|
||||
Stadler Stephan
|
||||
Stefan Esser
|
||||
Stefan Krause
|
||||
Stefan Ulrich
|
||||
Stephan Bergmann
|
||||
Stephen Kick
|
||||
@@ -481,6 +525,7 @@ Tomas Szepe
|
||||
Tomasz Lacki
|
||||
Tommy Tam
|
||||
Ton Voon
|
||||
Toon Verwaest
|
||||
Tor Arntsen
|
||||
Torsten Foertsch
|
||||
Toshiyuki Maezawa
|
||||
@@ -490,6 +535,8 @@ Troy Engel
|
||||
Tupone Alfredo
|
||||
Ulf H<>rnhammar
|
||||
Ulrich Zadow
|
||||
Venkat Akella
|
||||
Victor Snezhko
|
||||
Vilmos Nebehaj
|
||||
Vincent Bronner
|
||||
Vincent Penquerc'h
|
||||
@@ -506,6 +553,7 @@ Wojciech Zwiefka
|
||||
Xavier Bouchoux
|
||||
Yang Tse
|
||||
Yarram Sunil
|
||||
Yves Lejeune
|
||||
Zvi Har'El
|
||||
nk
|
||||
swalkaus at yahoo.com
|
||||
|
30
docs/TODO
30
docs/TODO
@@ -43,10 +43,6 @@ TODO
|
||||
powered libcurl the default build (which of course would require that we'd
|
||||
bundle the c-ares source code in the libcurl source code releases).
|
||||
|
||||
* Support CONNECT 407 responses that kill the connection and expect the
|
||||
client to reconnect to complete the authentication. Currently libcurl
|
||||
assumes that a proxy connection will be kept alive.
|
||||
|
||||
* Make the curl/*.h headers include the proper system includes based on what
|
||||
was present at the time when configure was run. Currently, the sys/select.h
|
||||
header is for example included by curl/multi.h only on specific platforms
|
||||
@@ -115,10 +111,6 @@ TODO
|
||||
|
||||
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
|
||||
never been reported as causing trouble to anyone, but should be considered
|
||||
to use the HTTP version the user has chosen.
|
||||
@@ -165,18 +157,14 @@ TODO
|
||||
Clark)
|
||||
|
||||
* Make curl's SSL layer capable of using other free SSL libraries. Such as
|
||||
Mozilla Security Services
|
||||
(http://www.mozilla.org/projects/security/pki/nss/), MatrixSSL
|
||||
(http://www.matrixssl.org/) or yaSSL (http://yassl.com/). At least the
|
||||
latter two could be alternatives for those looking to reduce the footprint
|
||||
of libcurl built with OpenSSL or GnuTLS.
|
||||
MatrixSSL (http://www.matrixssl.org/).
|
||||
|
||||
* Peter Sylvester's patch for SRP on the TLS layer.
|
||||
Awaits OpenSSL support for this, no need to support this in libcurl before
|
||||
there's an OpenSSL release that does it.
|
||||
|
||||
* make the configure --with-ssl option first check for OpenSSL and then for
|
||||
GnuTLS if OpenSSL wasn't detected.
|
||||
* make the configure --with-ssl option first check for OpenSSL, then GnuTLS,
|
||||
then NSS...
|
||||
|
||||
GnuTLS
|
||||
|
||||
@@ -192,8 +180,8 @@ TODO
|
||||
|
||||
* 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
|
||||
SSL_peak() way we use with OpenSSL.
|
||||
* Add a way to check if the connection seems to be alive, to correspond to
|
||||
the SSL_peak() way we use with OpenSSL.
|
||||
|
||||
LDAP
|
||||
|
||||
@@ -205,10 +193,6 @@ TODO
|
||||
|
||||
* 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
|
||||
most probably use an existing rsync library, such as librsync.
|
||||
|
||||
@@ -277,6 +261,10 @@ TODO
|
||||
|
||||
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
|
||||
two users run 'make test' at once.
|
||||
|
||||
|
231
docs/curl.1
231
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
|
||||
.\" * you should have received as part of this distribution. The terms
|
||||
@@ -21,7 +21,7 @@
|
||||
.\" * $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
|
||||
curl \- transfer a URL
|
||||
.SH SYNOPSIS
|
||||
@@ -30,13 +30,13 @@ curl \- transfer a URL
|
||||
.SH DESCRIPTION
|
||||
.B curl
|
||||
is a tool to transfer data from or to a server, using one of the supported
|
||||
protocols (HTTP, HTTPS, FTP, FTPS, TFTP, DICT, TELNET, LDAP or FILE).
|
||||
The command is designed to work without user interaction.
|
||||
protocols (HTTP, HTTPS, FTP, FTPS, SCP, SFTP, TFTP, DICT, TELNET, LDAP or
|
||||
FILE). The command is designed to work without user interaction.
|
||||
|
||||
curl offers a busload of useful tricks like proxy support, user
|
||||
authentication, ftp upload, HTTP post, SSL (https:) connections, cookies, file
|
||||
transfer resume and more. As you will see below, the amount of features will
|
||||
make your head spin!
|
||||
authentication, ftp upload, HTTP post, SSL connections, cookies, file transfer
|
||||
resume and more. As you will see below, the amount of features will make your
|
||||
head spin!
|
||||
|
||||
curl is powered by libcurl for all transfer-related features. See
|
||||
.BR libcurl (3)
|
||||
@@ -167,6 +167,10 @@ difference.
|
||||
must be using valid ciphers. Read up on SSL cipher list details on this URL:
|
||||
\fIhttp://www.openssl.org/docs/apps/ciphers.html\fP
|
||||
|
||||
NSS ciphers are done differently than OpenSSL and GnuTLS. The full list of
|
||||
NSS ciphers is in the NSSCipherSuite entry at this URL:
|
||||
\fIhttp://directory.fedora.redhat.com/docs/mod_nss.html#Directives\fP
|
||||
|
||||
If this option is used several times, the last one will override the others.
|
||||
.IP "--compressed"
|
||||
(HTTP) Request a compressed response using one of the algorithms libcurl
|
||||
@@ -212,7 +216,8 @@ local directory hierarchy as needed. This option creates the dirs mentioned
|
||||
with the -o option, nothing else. If the -o file name uses no dir or if the
|
||||
dirs it mentions already exist, no dir will be created.
|
||||
|
||||
To create remote directories when using FTP, try \fI--ftp-create-dirs\fP.
|
||||
To create remote directories when using FTP or SFTP, try
|
||||
\fI--ftp-create-dirs\fP.
|
||||
.IP "--crlf"
|
||||
(FTP) Convert LF to CRLF in upload. Useful for MVS (OS/390).
|
||||
|
||||
@@ -312,25 +317,29 @@ run curl.
|
||||
|
||||
If this option is used several times, each occurrence will toggle this on/off.
|
||||
.IP "--egd-file <file>"
|
||||
(HTTPS) Specify the path name to the Entropy Gathering Daemon socket. The
|
||||
socket is used to seed the random engine for SSL connections. See also the
|
||||
(SSL) Specify the path name to the Entropy Gathering Daemon socket. The socket
|
||||
is used to seed the random engine for SSL connections. See also the
|
||||
\fI--random-file\fP option.
|
||||
.IP "-E/--cert <certificate[:password]>"
|
||||
(HTTPS)
|
||||
Tells curl to use the specified certificate file when getting a file
|
||||
with HTTPS. The certificate must be in PEM format.
|
||||
If the optional password isn't specified, it will be queried for on
|
||||
the terminal. Note that this certificate is the private key and the private
|
||||
certificate concatenated!
|
||||
(SSL) 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
|
||||
password isn't specified, it will be queried for on the terminal. Note that
|
||||
this option assumes a \&"certificate" file that is the private key and the
|
||||
private certificate concatenated! See \fI--cert\fP and \fI--key\fP to specify
|
||||
them independently.
|
||||
|
||||
If curl is built against the NSS SSL library then this option tells
|
||||
curl the nickname of the certificate to use within the NSS database defined
|
||||
by --cacert.
|
||||
|
||||
If this option is used several times, the last one will be used.
|
||||
.IP "--cert-type <type>"
|
||||
(SSL) Tells curl what certificate type the provided certificate is in. PEM,
|
||||
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.
|
||||
.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
|
||||
be in PEM format.
|
||||
|
||||
@@ -342,12 +351,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
|
||||
Current Working Directory, or in any folder along your PATH.
|
||||
|
||||
If curl is built against the NSS SSL library then this option tells
|
||||
curl the directory that the NSS certificate database resides in.
|
||||
|
||||
If this option is used several times, the last one will be used.
|
||||
.IP "--capath <CA certificate directory>"
|
||||
(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
|
||||
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
|
||||
certificates.
|
||||
|
||||
@@ -359,6 +371,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
|
||||
will prevent curl from outputting that and return error 22.
|
||||
|
||||
This method is not fail-safe and there are occasions where non-successful
|
||||
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.
|
||||
.IP "--ftp-account [data]"
|
||||
(FTP) When an FTP server asks for "account data" after user name and password
|
||||
@@ -367,7 +383,7 @@ has been provided, this data is sent off using the ACCT command. (Added in
|
||||
|
||||
If this option is used twice, the second will override the previous use.
|
||||
.IP "--ftp-create-dirs"
|
||||
(FTP) When an FTP URL/operation uses a path that doesn't currently exist on
|
||||
(FTP) When an FTP or SFTP URL/operation uses a path that doesn't currently exist on
|
||||
the server, the standard behavior of curl is to fail. Using this option, curl
|
||||
will instead attempt to create missing directories.
|
||||
|
||||
@@ -395,7 +411,6 @@ in 7.11.0)
|
||||
|
||||
If this option is used several times, the following occurrences make no
|
||||
difference.
|
||||
|
||||
.IP "--ftp-alternative-to-user <command>"
|
||||
(FTP) If authenticating with the USER and PASS commands fails, send this
|
||||
command. When connecting to Tumbleweed's Secure Transport server over FTPS
|
||||
@@ -412,9 +427,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
|
||||
address.
|
||||
.IP "--ftp-ssl"
|
||||
(FTP) Try to use SSL/TLS for the FTP connection.
|
||||
Reverts to a non-secure connection if the server doesn't support SSL/TLS.
|
||||
(Added in 7.11.0)
|
||||
(FTP) Try to use SSL/TLS for the FTP connection. Reverts to a non-secure
|
||||
connection if the server doesn't support SSL/TLS. See also
|
||||
\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.
|
||||
.IP "--ftp-ssl-reqd"
|
||||
@@ -423,6 +445,22 @@ Terminates the connection if the server doesn't support SSL/TLS.
|
||||
(Added in 7.15.5)
|
||||
|
||||
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>"
|
||||
(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
|
||||
@@ -489,9 +527,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
|
||||
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
|
||||
set headers without knowing perfectly well what you're doing. Replacing an
|
||||
internal header with one without content on the right side of the colon will
|
||||
prevent that header from appearing.
|
||||
set headers without knowing perfectly well what you're doing. Remove an
|
||||
internal header by giving a replacement without content on the right side of
|
||||
the colon, as in: -H \&"Host:".
|
||||
|
||||
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
|
||||
@@ -540,23 +578,27 @@ and transfers. All SSL connections are attempted to be made secure by using
|
||||
the CA certificate bundle installed by default. This makes all connections
|
||||
considered "insecure" to fail unless \fI-k/--insecure\fP is used.
|
||||
|
||||
See this online resource for further details:
|
||||
\fBhttp://curl.haxx.se/docs/sslcerts.html\fP
|
||||
|
||||
If this option is used twice, the second time will again disable it.
|
||||
.IP "--key <key>"
|
||||
(SSL) Private key file name. Allows you to provide your private key in this
|
||||
(SSL/SSH) Private key file name. Allows you to provide your private key in this
|
||||
separate file.
|
||||
|
||||
If this option is used several times, the last one will be used.
|
||||
.IP "--key-type <type>"
|
||||
(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.
|
||||
.IP "--krb4 <level>"
|
||||
(FTP) Enable kerberos4 authentication and use. The level must be entered and
|
||||
(FTP) Enable Kerberos4 authentication and use. The level must be entered and
|
||||
should be one of 'clear', 'safe', 'confidential' or 'private'. Should you use
|
||||
a level that is not one of these, 'private' will instead be used.
|
||||
|
||||
This option requires that the library was built with kerberos4 support. This
|
||||
This option requires that the library was built with Kerberos4 support. This
|
||||
is not very common. Use \fI-V/--version\fP to see if your curl supports it.
|
||||
|
||||
If this option is used several times, the last one will be used.
|
||||
@@ -567,9 +609,11 @@ used as if they were written on the actual command line. Options and their
|
||||
parameters must be specified on the same config file line. If the parameter is
|
||||
to contain white spaces, the parameter must be enclosed within quotes. If the
|
||||
first column of a config line is a '#' character, the rest of the line will be
|
||||
treated as a comment.
|
||||
treated as a comment. Only write one option per physical line in the config
|
||||
file.
|
||||
|
||||
Specify the filename as '-' to make curl read the file from stdin.
|
||||
Specify the filename to -K/--config as '-' to make curl read the file from
|
||||
stdin.
|
||||
|
||||
Note that to be able to specify a URL in the config file, you need to specify
|
||||
it using the \fI--url\fP option, and not by simply writing the URL on its own
|
||||
@@ -577,7 +621,8 @@ line. So, it could look similar to this:
|
||||
|
||||
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
|
||||
config file and uses it if found. The default config file is checked for in
|
||||
@@ -592,6 +637,28 @@ resort the '%USERPROFILE%\Application Data'.
|
||||
2) On windows, if there is no _curlrc file in the home dir, it checks for one
|
||||
in the same dir the executable curl is placed. On unix-like systems, it will
|
||||
simply try to load .curlrc from the determined home dir.
|
||||
|
||||
.nf
|
||||
# --- Example file ---
|
||||
# this is a comment
|
||||
url = "curl.haxx.se"
|
||||
output = "curlhere.html"
|
||||
user-agent = "superagent/1.0"
|
||||
|
||||
# and fetch another URL too
|
||||
url = "curl.haxx.se/docs/manpage.html"
|
||||
-O
|
||||
referer = "http://nowhereatall.com/"
|
||||
# --- End of example file ---
|
||||
.fi
|
||||
|
||||
This option can be used multiple times to load multiple config files.
|
||||
.IP "--libcurl <file>"
|
||||
Append this option to any ordinary curl command line, and you will get a
|
||||
libcurl-using source code written to the file that does the equivalent
|
||||
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>"
|
||||
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
|
||||
@@ -601,6 +668,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
|
||||
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
|
||||
precedence and might cripple the rate-limiting slightly, to help keeping the
|
||||
speed-limit logic working.
|
||||
@@ -619,7 +690,7 @@ subdirectories and symbolic links.
|
||||
|
||||
If this option is used twice, the second will again disable list only.
|
||||
.IP "--local-port <num>[-num]"
|
||||
Set a prefered number or range of local port numbers to use for the
|
||||
Set a preferred number or range of local port numbers to use for the
|
||||
connection(s). Note that port numbers by nature is a scarce resource that
|
||||
will be busy at times so setting this range to something too narrow might
|
||||
cause unnecessary connection setup failures. (Added in 7.15.2)
|
||||
@@ -634,6 +705,11 @@ able to intercept the user+password. See also \fI--location-trusted\fP on how
|
||||
to change this. You can limit the amount of redirects to follow by using the
|
||||
\fI--max-redirs\fP option.
|
||||
|
||||
When curl follows a redirect and the request is not a plain GET (for example
|
||||
POST or PUT), it will do the following request with a GET if the HTTP response
|
||||
was 301, 302, or 303. If the response code was any other 3xx code, curl will
|
||||
re-send the following request using the same unmodified method.
|
||||
|
||||
If this option is used twice, the second will again disable location following.
|
||||
.IP "--location-trusted"
|
||||
(HTTP/HTTPS) Like \fI-L/--location\fP, but will allow sending the name +
|
||||
@@ -705,6 +781,15 @@ will output the data in chunks, not necessarily exactly when the data arrives.
|
||||
Using this option will disable that buffering.
|
||||
|
||||
If this option is used twice, the second will again switch on buffering.
|
||||
.IP "--no-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"
|
||||
(HTTP) Enables NTLM authentication. The NTLM authentication method was
|
||||
designed by Microsoft and is used by IIS web servers. It is a proprietary
|
||||
@@ -746,7 +831,7 @@ nothing else.
|
||||
|
||||
You may use this option as many times as you have number of URLs.
|
||||
.IP "--pass <phrase>"
|
||||
(SSL) Pass phrase for the private key
|
||||
(SSL/SSH) Pass phrase for the private key
|
||||
|
||||
If this option is used several times, the last one will be used.
|
||||
.IP "--proxy-anyauth"
|
||||
@@ -781,9 +866,14 @@ CONNECT request and requires that the proxy allows direct connect to the
|
||||
remote port number curl wants to tunnel through to.
|
||||
|
||||
If this option is used twice, the second will again disable proxy tunnel.
|
||||
.IP "--pubkey <key>"
|
||||
(SSH) Public key file name. Allows you to provide your public key in this
|
||||
separate file.
|
||||
|
||||
If this option is used several times, the last one will be used.
|
||||
.IP "-P/--ftp-port <address>"
|
||||
(FTP) Reverses the initiator/listener roles when connecting with ftp. This
|
||||
switch makes Curl use the PORT command instead of PASV. In practice, PORT
|
||||
switch makes Curl use the PORT command instead of PASV. In practise, PORT
|
||||
tells the server to connect to the client's specified address and port, while
|
||||
PASV asks the server for an ip address and port to connect to. <address>
|
||||
should be one of:
|
||||
@@ -807,18 +897,22 @@ If used as the first parameter on the command line, the \fIcurlrc\fP config
|
||||
file will not be read and used. See the \fI-K/--config\fP for details on the
|
||||
default config file search path.
|
||||
.IP "-Q/--quote <command>"
|
||||
(FTP) Send an arbitrary command to the remote FTP server. Quote commands are
|
||||
sent BEFORE the transfer is taking place (just after the initial PWD command
|
||||
to be exact). To make commands take place after a successful transfer, prefix
|
||||
them with a dash '-'. To make commands get sent after libcurl has changed
|
||||
working directory, just before the transfer command(s), prefix the command
|
||||
with '+'. You may specify any amount of commands. If the server returns
|
||||
failure for one of the commands, the entire operation will be aborted. You
|
||||
must send syntactically correct FTP commands as RFC959 defines.
|
||||
(FTP/SFTP) Send an arbitrary command to the remote FTP or SFTP server. Quote
|
||||
commands are sent BEFORE the transfer is taking place (just after the
|
||||
initial PWD command in an FTP transfer, to be exact). To make commands
|
||||
take place after a successful transfer, prefix them with a dash '-'.
|
||||
To make commands get sent after libcurl has changed working directory,
|
||||
just before the transfer command(s), prefix the command with '+' (this
|
||||
is only supported for FTP). You may specify any number of commands. If
|
||||
the server returns failure for one of the commands, the entire operation
|
||||
will be aborted. You must send syntactically correct FTP commands as
|
||||
RFC959 defines to FTP servers, or one of the following commands (with
|
||||
appropriate arguments) to SFTP servers: chgrp, chmod, chown, ln, mkdir,
|
||||
rename, rm, rmdir, symlink.
|
||||
|
||||
This option can be used multiple times.
|
||||
.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.
|
||||
See also the \fI--egd-file\fP option.
|
||||
.IP "-r/--range <range>"
|
||||
@@ -852,6 +946,10 @@ specifies two separate 100 bytes ranges(*)(H)
|
||||
(*) = NOTE that this will cause the server to reply with a multipart
|
||||
response!
|
||||
|
||||
Only digit characters (0-9) are valid in 'start' and 'stop' of range syntax
|
||||
\&'start-stop'. If a non-digit character is given in the range, the server's
|
||||
response will be indeterminable, depending on different server's configuration.
|
||||
|
||||
You should also be aware that many HTTP/1.1 servers do not have this feature
|
||||
enabled, so that when you attempt to get a range, you'll instead get the whole
|
||||
document.
|
||||
@@ -860,6 +958,11 @@ FTP range downloads only support the simple syntax 'start-stop' (optionally
|
||||
with one of the numbers omitted). It depends on the non-RFC command SIZE.
|
||||
|
||||
If this option is used several times, the last one will be used.
|
||||
.IP "--raw"
|
||||
When used, it disables all internal HTTP decoding of content or transfer
|
||||
encodings and instead makes them passed on unaltered, raw. (Added in 7.16.2)
|
||||
|
||||
If this option is used several times, each occurrence toggles this on/off.
|
||||
.IP "-R/--remote-time"
|
||||
When used, this will make libcurl attempt to figure out the timestamp of the
|
||||
remote file, and if that is available make the local file get that same
|
||||
@@ -968,6 +1071,9 @@ Enables a full trace dump of all incoming and outgoing data, including
|
||||
descriptive information, to the given output file. Use "-" as filename to have
|
||||
the output sent to stdout.
|
||||
|
||||
This option overrides previous uses of \fI-v/--verbose\fP or
|
||||
\fI--trace-ascii\fP.
|
||||
|
||||
If this option is used several times, the last one will be used.
|
||||
.IP "--trace-ascii <file>"
|
||||
Enables a full trace dump of all incoming and outgoing data, including
|
||||
@@ -978,6 +1084,8 @@ This is very similar to \fI--trace\fP, but leaves out the hex part and only
|
||||
shows the ASCII part of the dump. It makes smaller output that might be easier
|
||||
to read for untrained humans.
|
||||
|
||||
This option overrides previous uses of \fI-v/--verbose\fP or \fI--trace\fP.
|
||||
|
||||
If this option is used several times, the last one will be used.
|
||||
.IP "--trace-time"
|
||||
Prepends a time stamp to each trace or verbose line that curl displays.
|
||||
@@ -988,7 +1096,7 @@ If this option is used several times, each occurrence will toggle it on/off.
|
||||
Specify user and password to use for server authentication. Overrides
|
||||
\fI-n/--netrc\fP and \fI--netrc-optional\fP.
|
||||
|
||||
If you use an SSPI-enabled curl binary and do NTLM autentication, you can
|
||||
If you use an SSPI-enabled curl binary and do NTLM authentication, you can
|
||||
force curl to pick up the user name and password from your environment by
|
||||
simply specifying a single colon with this option: "-u :".
|
||||
|
||||
@@ -996,7 +1104,7 @@ If this option is used several times, the last one will be used.
|
||||
.IP "-U/--proxy-user <user:password>"
|
||||
Specify user and password to use for proxy authentication.
|
||||
|
||||
If you use an SSPI-enabled curl binary and do NTLM autentication, you can
|
||||
If you use an SSPI-enabled curl binary and do NTLM authentication, you can
|
||||
force curl to pick up the user name and password from your environment by
|
||||
simply specifying a single colon with this option: "-U :".
|
||||
|
||||
@@ -1019,7 +1127,9 @@ might be option you're looking for.
|
||||
If you think this option still doesn't give you enough details, consider using
|
||||
\fI--trace\fP or \fI--trace-ascii\fP instead.
|
||||
|
||||
If this option is used twice, the second will again disable verbose.
|
||||
This option overrides previous uses of \fI--trace-ascii\fP or \fI--trace\fP.
|
||||
|
||||
If this option is used twice, the second will do nothing extra.
|
||||
.IP "-V/--version"
|
||||
Displays information about curl and the libcurl version it uses.
|
||||
|
||||
@@ -1196,7 +1306,7 @@ not set.
|
||||
|
||||
If this option is used several times, the last one will be used.
|
||||
.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
|
||||
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
|
||||
@@ -1218,25 +1328,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
|
||||
internally preferred: HTTP 1.1.
|
||||
.IP "-1/--tlsv1"
|
||||
(HTTPS)
|
||||
(SSL)
|
||||
Forces curl to use TSL version 1 when negotiating with a remote TLS server.
|
||||
.IP "-2/--sslv2"
|
||||
(HTTPS)
|
||||
(SSL)
|
||||
Forces curl to use SSL version 2 when negotiating with a remote SSL server.
|
||||
.IP "-3/--sslv3"
|
||||
(HTTPS)
|
||||
(SSL)
|
||||
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"
|
||||
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
|
||||
@@ -1373,7 +1472,7 @@ Internal error. A function was called in a bad order.
|
||||
.IP 45
|
||||
Interface error. A specified outgoing interface could not be used.
|
||||
.IP 46
|
||||
Bad password entered. An error was signaled when the password was entered.
|
||||
Bad password entered. An error was signalled when the password was entered.
|
||||
.IP 47
|
||||
Too many redirects. When following redirects, curl hit the maximum amount.
|
||||
.IP 48
|
||||
|
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-debugcallback.c fileupload.c getinfo.c ftp3rdparty.c debug.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:
|
||||
@echo "done"
|
||||
|
@@ -26,9 +26,9 @@ want you do reorganize them like:
|
||||
$ `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
|
||||
applications/experiments. Even if the examples in this directory use that site
|
||||
as an example URL at some places, it doesn't mean that the URLs work or that
|
||||
we expect you to actually torture our web site with your tests! Thanks.
|
||||
applications/experiments. Even if some of the examples use that site as a URL
|
||||
at some places, it doesn't mean that the URLs work or that we expect you to
|
||||
actually torture our web site with your tests! Thanks.
|
||||
|
||||
EXAMPLES
|
||||
|
||||
@@ -43,9 +43,13 @@ fopen.c - fopen() layer that supports opening URLs and files
|
||||
ftp3rdparty.c - FTP 3rd party transfer
|
||||
ftpget.c - simple getting a file from FTP
|
||||
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
|
||||
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
|
||||
page using libxml
|
||||
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
|
||||
post-callback.c - send a HTTP POST using a callback
|
||||
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
|
||||
simple.c - the most simple download a URL source
|
||||
simplepost.c - HTTP POST
|
||||
simplessl.c - HTTPS example with certificates many options set
|
||||
synctime.c - Sync local time by extracing date from remote HTTP servers
|
||||
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 */
|
||||
|
||||
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(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);
|
||||
|
||||
|
@@ -84,6 +84,9 @@ int my_trace(CURL *handle, curl_infotype type,
|
||||
case CURLINFO_DATA_OUT:
|
||||
text = "=> Send data";
|
||||
break;
|
||||
case CURLINFO_SSL_DATA_OUT:
|
||||
text = "=> Send SSL data";
|
||||
break;
|
||||
case CURLINFO_HEADER_IN:
|
||||
text = "<= Recv header";
|
||||
break;
|
||||
@@ -93,9 +96,6 @@ int my_trace(CURL *handle, curl_infotype type,
|
||||
case CURLINFO_SSL_DATA_IN:
|
||||
text = "<= Recv SSL data";
|
||||
break;
|
||||
case CURLINFO_SSL_DATA_OUT:
|
||||
text = "<= Send SSL data";
|
||||
break;
|
||||
}
|
||||
|
||||
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 */
|
||||
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);
|
||||
|
||||
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;
|
||||
}
|
411
docs/examples/hiperfifo.c
Normal file
411
docs/examples/hiperfifo.c
Normal file
@@ -0,0 +1,411 @@
|
||||
/*****************************************************************************
|
||||
* _ _ ____ _
|
||||
* 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 int multi_timer_cb(CURLM *multi, long timeout_ms, GlobalInfo *g)
|
||||
{
|
||||
struct timeval timeout;
|
||||
|
||||
timeout.tv_sec = timeout_ms/1000;
|
||||
timeout.tv_usec = (timeout_ms%1000)*1000;
|
||||
fprintf(MSG_OUT, "multi_timer_cb: Setting timeout to %ld ms\n", timeout_ms);
|
||||
evtimer_add(&g->timer_event, &timeout);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* 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 <= 0 ) {
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* 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);
|
||||
curl_multi_setopt(g.multi, CURLMOPT_TIMERFUNCTION, multi_timer_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);
|
||||
event_dispatch();
|
||||
curl_multi_cleanup(g.multi);
|
||||
return 0;
|
||||
}
|
@@ -1,13 +1,16 @@
|
||||
# $Id$
|
||||
#
|
||||
# Adapted for djgpp / Watt-32 / DOS by
|
||||
# Gisle Vanem <giva@bgnett.no>
|
||||
#
|
||||
|
||||
include ../../packages/DOS/common.dj
|
||||
TOPDIR = ../..
|
||||
|
||||
CFLAGS += -I../../include -DFALSE=0 -DTRUE=1
|
||||
include $(TOPDIR)/packages/DOS/common.dj
|
||||
|
||||
LIBS = ../../lib/libcurl.a
|
||||
CFLAGS += -DFALSE=0 -DTRUE=1
|
||||
|
||||
LIBS = $(TOPDIR)/lib/libcurl.a
|
||||
|
||||
ifeq ($(USE_SSL),1)
|
||||
LIBS += $(OPENSSL_ROOT)/lib/libssl.a $(OPENSSL_ROOT)/lib/libcrypt.a
|
||||
@@ -15,20 +18,24 @@ endif
|
||||
|
||||
LIBS += $(WATT32_ROOT)/lib/libwatt.a $(ZLIB_ROOT)/libz.a
|
||||
|
||||
PROGRAMS = fopen.exe ftpget.exe ftpgetresp.exe ftpupload.exe \
|
||||
getinmemory.exe http-post.exe httpput.exe multi-app.exe \
|
||||
multi-double.exe multi-post.exe multi-single.exe \
|
||||
persistant.exe post-callback.exe postit2.exe \
|
||||
sepheaders.exe simple.exe simplessl.exe https.exe \
|
||||
ftp3rdparty.exe getinfo.exe anyauthput.exe \
|
||||
cookie_interface.exe
|
||||
CSOURCES = fopen.c ftpget.c ftpgetresp.c ftpupload.c getinmemory.c \
|
||||
http-post.c httpput.c https.c multi-app.c multi-double.c \
|
||||
multi-post.c multi-single.c persistant.c post-callback.c \
|
||||
postit2.c sepheaders.c simple.c simplepost.c simplessl.c \
|
||||
multi-debugcallback.c fileupload.c getinfo.c anyauthput.c \
|
||||
10-at-a-time.c # ftpuploadresume.c ftp3rdparty.c cookie_interface.c
|
||||
|
||||
PROGRAMS = $(CSOURCES:.c=.exe)
|
||||
|
||||
all: $(PROGRAMS)
|
||||
@echo Welcome to libcurl example program
|
||||
|
||||
%.exe: %.c
|
||||
$(CC) $(CFLAGS) -o $@ $^ $(LIBS)
|
||||
@echo
|
||||
|
||||
clean:
|
||||
rm -f $(PROGRAMS)
|
||||
clean vclean realclean:
|
||||
- rm -f $(PROGRAMS) depend.dj
|
||||
|
||||
-include depend.dj
|
||||
|
||||
|
@@ -80,6 +80,10 @@ int main(int argc, char **argv)
|
||||
/* get file descriptors from the transfers */
|
||||
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);
|
||||
|
||||
switch(rc) {
|
||||
|
@@ -153,6 +153,10 @@ int main(int argc, char **argv)
|
||||
/* get file descriptors from the transfers */
|
||||
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);
|
||||
|
||||
switch(rc) {
|
||||
|
@@ -71,6 +71,10 @@ int main(int argc, char **argv)
|
||||
/* get file descriptors from the transfers */
|
||||
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);
|
||||
|
||||
switch(rc) {
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user